{"source": "polkadot-docs", "page_id": "apps-architecture-app-delivery", "url": "https://developer.polkadot.com/apps/architecture/app-delivery/#publishing-and-opening", "page_title": "apps-architecture-app-delivery", "index": 0, "depth": 2, "title": "Publishing and opening", "anchor": "publishing-and-opening", "start_char": 720, "end_char": 1327, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bd6d37da41f78eca13593e316205f4e85d9933f524da64a7c2660e24c11c702", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Publishing and opening\n\nDelivery has a write side (publishing) and a read side (opening). The publisher\nuploads a bundle and binds a name to it once. Every visitor then resolves and\nfetches that bundle independently.\n\n```mermaid\nflowchart TD\n  A[Built static app] --> B[pad CLI prepares bundle]\n  B --> C[Upload content to Bulletin]\n  C --> D[Receive content CID]\n  D --> E{DotNS on Asset Hub}\n  E -->|not owned| G[register name]\n  E -->|owned| H[use existing name]\n  G --> I[write contenthash]\n  H --> I\n  I --> J[optional Browse listing]\n  J --> K[Live: name.dot in app + https://name.dev-dot.li]\n```"}
{"source": "polkadot-docs", "page_id": "apps-architecture-app-delivery", "url": "https://developer.polkadot.com/apps/architecture/app-delivery/#publishing-with-pad", "page_title": "apps-architecture-app-delivery", "index": 1, "depth": 2, "title": "Publishing with `pad`", "anchor": "publishing-with-pad", "start_char": 1327, "end_char": 2226, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bd6d37da41f78eca13593e316205f4e85d9933f524da64a7c2660e24c11c702", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Publishing with `pad`\n\nThe deploy CLI is [`@polkadot-community-foundation/polkadot-app-deploy`](https://www.npmjs.com/package/@polkadot-community-foundation/polkadot-app-deploy),\nwhich ships the `pad` binary (alongside `polkadot-app-deploy` and\n`polkadot-app-bootstrap`). `pad` selects a network with `--env devnet`. Once\nyour frontend is built, publishing it is a single command over the output\ndirectory:\n\n```bash\npad ./dist my-app.dot --env devnet --mnemonic \"$MNEMONIC\"\n```\n\nThe CLI merkleizes the build directory into a content-addressed DAG-PB\narchive, chunks it (~2 MiB) and uploads the blocks to Bulletin via\n`TransactionStorage.store_with_cid_config`. It then writes the resulting root\nCID as an ENS-style `contenthash` (`0xe301` + CIDv1) into the DotNS\n`ContentResolver` on Asset Hub. Re-publishing the same app skips unchanged\nblocks and updates the name to point at the new content."}
{"source": "polkadot-docs", "page_id": "apps-architecture-app-delivery", "url": "https://developer.polkadot.com/apps/architecture/app-delivery/#bulletin-storage-and-upload-authorization", "page_title": "apps-architecture-app-delivery", "index": 2, "depth": 3, "title": "Bulletin storage and upload authorization", "anchor": "bulletin-storage-and-upload-authorization", "start_char": 2226, "end_char": 3077, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bd6d37da41f78eca13593e316205f4e85d9933f524da64a7c2660e24c11c702", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Bulletin storage and upload authorization\n\nContent is stored on the Bulletin chain. Uploads work by authorization, not by\nfees: the uploading account needs an upload quota, but does not pay devnet\ntokens for each bundle. An authorizer grants the quota via\n`authorize_account`. The account that signs the deploy is the one that uploads,\nso that is the account that needs the quota.\n[Get storage authorization](../build/build-and-publish.md#get-storage-authorization)\nhas the practical steps. This is separate from the token\n[faucet](../reference/networks.md#faucet), which only provides native tokens\nfor fees.\n\nThe same authorization model applies to every write to Bulletin.\n[Storage & data](storage.md#how-storage-authorization-works) explains why\nwrites are gated, why this Devnet keeps it open, and that authorizations are\nfinite and expire."}
{"source": "polkadot-docs", "page_id": "apps-architecture-app-delivery", "url": "https://developer.polkadot.com/apps/architecture/app-delivery/#binding-the-dot-domain", "page_title": "apps-architecture-app-delivery", "index": 3, "depth": 3, "title": "Binding the `.dot` domain", "anchor": "binding-the-dot-domain", "start_char": 3077, "end_char": 3572, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bd6d37da41f78eca13593e316205f4e85d9933f524da64a7c2660e24c11c702", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Binding the `.dot` domain\n\nOnce the content CID exists, the CLI checks whether the signer owns the `.dot`\nname. If the name is available, it can register it. If the signer already owns\nit, the CLI updates the name's content hash. That one on-chain record is what\nturns a name into an app. [Naming (DotNS)](naming.md) explains ownership and\nresolution.\n\nA deploy config can also publish manifest records. Product apps use those\nrecords to describe executables, labels and icons to the host."}
{"source": "polkadot-docs", "page_id": "apps-architecture-app-delivery", "url": "https://developer.polkadot.com/apps/architecture/app-delivery/#opening-an-app-through-the-gateway", "page_title": "apps-architecture-app-delivery", "index": 4, "depth": 2, "title": "Opening an app through the gateway", "anchor": "opening-an-app-through-the-gateway", "start_char": 3572, "end_char": 4507, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bd6d37da41f78eca13593e316205f4e85d9933f524da64a7c2660e24c11c702", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Opening an app through the gateway\n\nThe web gateway at [https://dev-dot.li](https://dev-dot.li) is a loader that\nruns in the browser. There is no resolution server: the host shell reads the\nlabel from the subdomain, resolves it, fetches the content and renders it in a\nsandboxed iframe.\n\n```mermaid\nflowchart TD\n  U[User opens calculator.dev-dot.li] --> H[Gateway reads label]\n  H --> R[Resolve calculator.dot]\n  R --> C[Read contenthash]\n  C --> D[Decode to CID]\n  D --> IF[Render app in sandbox]\n  IF --> FE{Fetch content}\n  FE -->|Bulletin / light client| V[Verified path]\n  FE -->|IPFS gateway| T[Gateway path]\n  V --> RN[App talks to the host over TrUAPI]\n  T --> RN\n```\n\nThe rendered app talks to the host through a bridge for accounts, signing,\nchain connection and scoped storage. For the user, the same name works in both\nplaces: on the web it is `https://<label>.dev-dot.li`, and in the Polkadot app\nit is `<label>.dot`."}
{"source": "polkadot-docs", "page_id": "apps-architecture-app-delivery", "url": "https://developer.polkadot.com/apps/architecture/app-delivery/#common-blockers", "page_title": "apps-architecture-app-delivery", "index": 5, "depth": 2, "title": "Common blockers", "anchor": "common-blockers", "start_char": 4507, "end_char": 4839, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bd6d37da41f78eca13593e316205f4e85d9933f524da64a7c2660e24c11c702", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Common blockers\n\n- **Upload fails.** The deploy account may need Bulletin storage authorization.\n- **The name cannot be updated.** The signer must own the `.dot` domain.\n- **The app opens but has stale content.** Confirm the name's content hash points\n  to the latest CID and that the gateway is resolving the expected network."}
{"source": "polkadot-docs", "page_id": "apps-architecture-app-delivery", "url": "https://developer.polkadot.com/apps/architecture/app-delivery/#learn-more", "page_title": "apps-architecture-app-delivery", "index": 6, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 4839, "end_char": 5140, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bd6d37da41f78eca13593e316205f4e85d9933f524da64a7c2660e24c11c702", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [polkadot-app-deploy](https://github.com/Polkadot-Community-Foundation/polkadot-app-deploy): source for the `pad` CLI\n- [dotli-community](https://github.com/paritytech/dotli-community): the gateway loader\n- [Build & publish an app](../build/build-and-publish.md): publish one yourself"}
{"source": "polkadot-docs", "page_id": "apps-architecture-client", "url": "https://developer.polkadot.com/apps/architecture/client/#what-the-clients-do", "page_title": "apps-architecture-client", "index": 0, "depth": 2, "title": "What the clients do", "anchor": "what-the-clients-do", "start_char": 537, "end_char": 1355, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b22b5c91076b1637e4df9dd300c6a5b0bb6934c98b3a33a55b01059aa0eb4fec", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What the clients do\n\nFor users, the app is one place to hold keys, manage identity, use CASH,\nmessage other people and open `.dot` apps. For developers, it is the host your\nProduct relies on for accounts, signing, chain access, permissions and storage.\n\nThe native clients share the same features:\n\n| Client | Role |\n|--------|------|\n| Polkadot Android | Mobile app with local custody, identity, CASH, messaging, and app hosting |\n| Polkadot iOS | Mobile app with the same product surface for iOS users |\n| Polkadot Desktop/Web | Desktop app and web client for the same account and Product flows |\n\nThe Desktop build also runs as a web application, and the same Products are\nreachable through the web gateway at [dev-dot.li](https://dev-dot.li). Download\nlinks are in [More resources](../reference/resources.md)."}
{"source": "polkadot-docs", "page_id": "apps-architecture-client", "url": "https://developer.polkadot.com/apps/architecture/client/#wallet-and-account-management", "page_title": "apps-architecture-client", "index": 1, "depth": 2, "title": "Wallet and account management", "anchor": "wallet-and-account-management", "start_char": 1355, "end_char": 2603, "estimated_token_count": 273, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b22b5c91076b1637e4df9dd300c6a5b0bb6934c98b3a33a55b01059aa0eb4fec", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Wallet and account management\n\nOn mobile (Android and iOS), accounts are created and stored on the device, and\nthe app is self-custodial. Keys are held in the platform's hardware-backed\nsecure storage (the Android keystore, or the iOS Keychain). Recovery goes\nthrough the device's cloud backup: Google Drive on Android, iCloud on iOS.\nSigning happens on the phone. When a dApp or an in-app action needs a\nsignature, the app shows a modal, and the key on the device signs the payload\nonly after you approve.\n\nThe desktop/web client holds no keys of its own. It is a companion: you pair it\nwith your phone (by scanning a pairing code), and signing happens on the phone.\n\nNothing funds a new account automatically. On devnet (non-production) builds\nyou can top up your account with test tokens using the manual \"+\" (top-up)\naction. For native devnet tokens to pay transaction fees, use the faucet at\n<https://faucet.polkadot.io>.\n\nIdentity, chat and payments each live on specific parachains. The People Chain\ncarries your username, the chat statement store and CASH, which is held and\nsent through Coinage. Asset Hub holds other assets, such as pUSD and USDt, and\nthe DotNS contracts. The Bulletin Chain serves dApp content and chat\nattachments."}
{"source": "polkadot-docs", "page_id": "apps-architecture-client", "url": "https://developer.polkadot.com/apps/architecture/client/#the-app-browser", "page_title": "apps-architecture-client", "index": 2, "depth": 2, "title": "The app browser", "anchor": "the-app-browser", "start_char": 2603, "end_char": 3582, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b22b5c91076b1637e4df9dd300c6a5b0bb6934c98b3a33a55b01059aa0eb4fec", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The app browser\n\nThe in-app browser finds dApps by `.dot` domain, not by URL. It resolves the\nname through DotNS, fetches the referenced content archive from Bulletin or a\ngateway, and runs the archive in a sandboxed webview. The app then opens a\nTrUAPI channel, through which Products can ask the host for account, signing,\nchain, permission, storage, theme, notification, payment and navigation\nservices.\n\n```mermaid\nflowchart TD\n  U[User opens .dot domain] --> R[Resolve through DotNS]\n  R --> A[Fetch app bundle]\n  A --> S[Run in sandboxed webview]\n  S --> C[TrUAPI channel]\n  C --> H[Native host services]\n  H --> ACC[accounts / signing]\n  H --> CH[chain connection by genesis hash]\n  H --> PERM[device + remote permissions]\n  H --> PAY[payment / statement store / storage / theme / notifications]\n  ACC -->|on-device key| K[Hardware-backed keystore]\n```\n\nEach platform embeds the webview in its own native stack, but Products see the\nsame protocol, TrUAPI, everywhere."}
{"source": "polkadot-docs", "page_id": "apps-architecture-client", "url": "https://developer.polkadot.com/apps/architecture/client/#running-dapps-over-truapi", "page_title": "apps-architecture-client", "index": 3, "depth": 2, "title": "Running dApps over TrUAPI", "anchor": "running-dapps-over-truapi", "start_char": 3582, "end_char": 4701, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b22b5c91076b1637e4df9dd300c6a5b0bb6934c98b3a33a55b01059aa0eb4fec", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Running dApps over TrUAPI\n\nOnce the webview loads, the Product talks to the host over its TrUAPI channel.\nThe host decides which capabilities are available, checks permissions and\nhandles sensitive actions such as signing.\n\nA typical signing flow:\n\n1. The dApp asks the host, over TrUAPI, to sign a payload or raw bytes, or to\n   create a transaction.\n2. The native side receives the request and checks the product's granted\n   permissions.\n3. The app shows a signing modal for you to review and approve.\n4. On approval the key on the device signs, and the signature goes back to the\n   dApp. Broadcasting is gated inside the container.\n\nWhen you build a Product, you rarely call these primitives yourself. The\n[`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk)\nwraps TrUAPI. To test a Product end to end, use the\n[test host](../build/platform-services-sdk.md#test-without-the-real-host) in\n[`@parity/truapi-host`](https://www.npmjs.com/package/@parity/truapi-host): it\nruns the real TrUAPI core, embeds your product in an iframe, signs in dev\naccounts (Alice, Bob) and auto-signs requests."}
{"source": "polkadot-docs", "page_id": "apps-architecture-client", "url": "https://developer.polkadot.com/apps/architecture/client/#selecting-the-network", "page_title": "apps-architecture-client", "index": 4, "depth": 2, "title": "Selecting the network", "anchor": "selecting-the-network", "start_char": 4701, "end_char": 5710, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b22b5c91076b1637e4df9dd300c6a5b0bb6934c98b3a33a55b01059aa0eb4fec", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Selecting the network\n\nThe operators decide which network the app uses. Each client asks for the\nroles it needs (`people`, `bulletin`, `assetHub`), then gets the current RPC\nendpoints, DotNS contract addresses, gateway URLs and backend URLs from the\nDevnet configuration service. For users and app developers, this means\nProducts are not expected to hardcode any of those values.\n\n```mermaid\nflowchart TD\n  Channel[\"Selected Devnet channel\"] --> Config[\"Devnet configuration\"]\n  Config --> Roles[\"Resolve chain roles<br/>people / bulletin / assetHub\"]\n  Config --> Services[\"Resolve service URLs<br/>gateway / identity / storage\"]\n  Roles --> App[\"Active app environment\"]\n  Services --> App\n  App --> Products[\"Products use host + SDK<br/>without hardcoded endpoints\"]\n```\n\nIf the app cannot resolve a complete environment, it stops instead of\nguessing. Developer tools work the same way: the CLIs select a named network\npreset, and the preset supplies the chain and registry addresses for that\nnetwork."}
{"source": "polkadot-docs", "page_id": "apps-architecture-client", "url": "https://developer.polkadot.com/apps/architecture/client/#common-blockers", "page_title": "apps-architecture-client", "index": 5, "depth": 2, "title": "Common blockers", "anchor": "common-blockers", "start_char": 5710, "end_char": 6134, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b22b5c91076b1637e4df9dd300c6a5b0bb6934c98b3a33a55b01059aa0eb4fec", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Common blockers\n\n- A Product runs outside the host: host-only APIs need the Polkadot app or the\n  web gateway. Use the test host for local end-to-end tests.\n- A signing request is denied: the user must approve on the device, and the\n  Product must have the required permission.\n- The app cannot resolve the Devnet: the platform supplies the network\n  configuration, and endpoints hardcoded in Product code break easily."}
{"source": "polkadot-docs", "page_id": "apps-architecture-client", "url": "https://developer.polkadot.com/apps/architecture/client/#learn-more", "page_title": "apps-architecture-client", "index": 6, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 6134, "end_char": 6440, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b22b5c91076b1637e4df9dd300c6a5b0bb6934c98b3a33a55b01059aa0eb4fec", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- Client source and downloads: [More resources](../reference/resources.md)\n- [Test without the real host](../build/platform-services-sdk.md#test-without-the-real-host): drive a Product against the TrUAPI test host in CI\n- [Naming (DotNS)](naming.md): how the browser resolves a `.dot` domain"}
{"source": "polkadot-docs", "page_id": "apps-architecture-contracts", "url": "https://developer.polkadot.com/apps/architecture/contracts/#where-contracts-run", "page_title": "apps-architecture-contracts", "index": 0, "depth": 2, "title": "Where contracts run", "anchor": "where-contracts-run", "start_char": 386, "end_char": 1174, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9d7296861720535e47d330cc6b5d81bc7dc0ff366ff2aba19dd9f180169bc273", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where contracts run\n\n`pallet-revive` is the smart-contract environment on Asset Hub (para 1000).\nDotNS and application contracts run there. The EVM chain id is `420420417`, and\ncontract tooling that speaks Ethereum JSON-RPC (Hardhat, `cast`, viem) uses the\nETH-RPC endpoint listed in\n[Networks & endpoints](../reference/networks.md#ethereum-json-rpc).\n\nContracts can also read platform state through precompiles at fixed addresses.\nThe personhood precompile returns an account's personhood tier and a per-app\nalias (see [Identity & personhood](identity.md)), and ERC-20-style precompiles\nlet contracts read and transfer supported assets.\n\nAn account has to be mapped to its EVM address before it can sign PolkaVM\ntransactions on Asset Hub. An unmapped account fails on its first one."}
{"source": "polkadot-docs", "page_id": "apps-architecture-contracts", "url": "https://developer.polkadot.com/apps/architecture/contracts/#calling-contracts-from-an-app", "page_title": "apps-architecture-contracts", "index": 1, "depth": 2, "title": "Calling contracts from an app", "anchor": "calling-contracts-from-an-app", "start_char": 1174, "end_char": 1914, "estimated_token_count": 186, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9d7296861720535e47d330cc6b5d81bc7dc0ff366ff2aba19dd9f180169bc273", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Calling contracts from an app\n\nAt runtime, apps make typed calls with `@parity/product-sdk-contracts`, which\nis part of the [Product SDK](../reference/packages.md#product-sdk-family). You\nbuild a runtime from the Asset Hub chain client, then a contract handle from\nthe contract's address and ABI. Read-only `.query()` calls need no account, and\n`.tx()` calls are signed through the host wallet.\n`ensureContractAccountMapped` maps an account for `pallet-revive` when a call\nneeds it.\n[Use platform services from the SDK](../build/platform-services-sdk.md#call-smart-contracts)\nshows the code.\n\nNever print or commit signing seeds. Fund an account that sends contract\ntransactions from the network faucet at <https://faucet.polkadot.io>."}
{"source": "polkadot-docs", "page_id": "apps-architecture-contracts", "url": "https://developer.polkadot.com/apps/architecture/contracts/#common-blockers", "page_title": "apps-architecture-contracts", "index": 2, "depth": 2, "title": "Common blockers", "anchor": "common-blockers", "start_char": 1914, "end_char": 2123, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9d7296861720535e47d330cc6b5d81bc7dc0ff366ff2aba19dd9f180169bc273", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Common blockers\n\n- The account is not mapped: map it once with `dotns account map --env devnet`,\n  or call `ensureContractAccountMapped` from your app.\n- The account has no funds: get PAS from the faucet."}
{"source": "polkadot-docs", "page_id": "apps-architecture-contracts", "url": "https://developer.polkadot.com/apps/architecture/contracts/#learn-more", "page_title": "apps-architecture-contracts", "index": 3, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 2123, "end_char": 2460, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9d7296861720535e47d330cc6b5d81bc7dc0ff366ff2aba19dd9f180169bc273", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [pallet-revive](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive): the PolkaVM contract environment\n- [Use platform services from the SDK](../build/platform-services-sdk.md#call-smart-contracts): call a contract from your app\n- [Identity & personhood](identity.md): the personhood precompile"}
{"source": "polkadot-docs", "page_id": "apps-architecture-discovery", "url": "https://developer.polkadot.com/apps/architecture/discovery/#what-discovery-helps-you-do", "page_title": "apps-architecture-discovery", "index": 0, "depth": 2, "title": "What discovery helps you do", "anchor": "what-discovery-helps-you-do", "start_char": 755, "end_char": 1270, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5109b91a9c9af5bd5b256abedde26a47a911de3483b47b65ab2f76e6565f1651", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What discovery helps you do\n\nUsers use Browse to find apps. Developers use it to make a published app\nvisible after the app already has a `.dot` domain and a bundle. Browse is not a\nreplacement for DotNS or app delivery; it sits on top of them.\n\nThe system has three responsibilities:\n\n- Registry: records that a `.dot` label should appear in discovery.\n- Reader SDK: reads registry entries and joins them with DotNS metadata.\n- Client UI: renders cards and opens the selected app in the host or web\n  gateway."}
{"source": "polkadot-docs", "page_id": "apps-architecture-discovery", "url": "https://developer.polkadot.com/apps/architecture/discovery/#what-a-listing-actually-holds", "page_title": "apps-architecture-discovery", "index": 1, "depth": 2, "title": "What a listing actually holds", "anchor": "what-a-listing-actually-holds", "start_char": 1270, "end_char": 1997, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5109b91a9c9af5bd5b256abedde26a47a911de3483b47b65ab2f76e6565f1651", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What a listing actually holds\n\nA listing is created by publishing a `.dot` label to the Browse registry. The\nregistry stores only the minimum needed to enumerate apps. It does **not** store\nthe display name, description, icon, or app bundle.\n\nAll display metadata lives off-chain and is joined by labelhash at read time:\n\n- The human-readable label comes from DotNS.\n- The app bundle and display metadata come from the name's resolver records.\n- The root manifest provides the card content Browse shows to users.\n\nA valid manifest needs a display name, description, and icon:\n\n```json\n{\n  \"$v\": 1,\n  \"displayName\": \"Calculator\",\n  \"description\": \"A basic calculator.\",\n  \"icon\": { \"cid\": \"bafy...\", \"format\": \"png\" }\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-architecture-discovery", "url": "https://developer.polkadot.com/apps/architecture/discovery/#the-publish-permission-model", "page_title": "apps-architecture-discovery", "index": 2, "depth": 2, "title": "The publish permission model", "anchor": "the-publish-permission-model", "start_char": 1997, "end_char": 2876, "estimated_token_count": 247, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5109b91a9c9af5bd5b256abedde26a47a911de3483b47b65ab2f76e6565f1651", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The publish permission model\n\nWho is allowed to list an app is enforced on-chain:\n\n1. You must own the `.dot` domain.\n2. You need the required personhood status for the publish action.\n3. You must be under the publish rate limit for your personhood tier.\n\n| Personhood status | Meaning | Publishes per 24h |\n|---|---|---|\n| None | Not enough to publish | 0 |\n| Lite | Basic personhood | 1 |\n| Full | Stronger personhood | 5 |\n\nUnpublishing is simpler: if you own the name, you can remove it from Browse.\n\n```mermaid\nflowchart TD\n  A[Publish label] --> B{Own the .dot domain?}\n  B -- no --> E1[Cannot publish]\n  B -- yes --> C{Enough personhood?}\n  C -- no --> E2[Complete personhood flow]\n  C -- yes --> D{Under rate limit?}\n  D -- no --> E3[Wait for the window]\n  D -- yes --> R[Listing appears in Browse]\n```\n\nThe `pad` deploy CLI no longer lists apps as part of a deploy."}
{"source": "polkadot-docs", "page_id": "apps-architecture-discovery", "url": "https://developer.polkadot.com/apps/architecture/discovery/#how-a-listing-is-consumed", "page_title": "apps-architecture-discovery", "index": 3, "depth": 2, "title": "How a listing is consumed", "anchor": "how-a-listing-is-consumed", "start_char": 2876, "end_char": 4229, "estimated_token_count": 342, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5109b91a9c9af5bd5b256abedde26a47a911de3483b47b65ab2f76e6565f1651", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How a listing is consumed\n\nThe client builds the directory from the registry every time it loads:\n\n1. Enumerate: read published labels from the registry.\n2. Resolve labels: turn label identifiers back into `.dot` labels.\n3. Hydrate: read each name's content hash, manifest, and any available\n   attestation or certificate data.\n4. Render: build product cards from `displayName`, `description` and the icon\n   (fetched through the host's preimage manager, not a raw gateway URL), with\n   certificate badges.\n\nReading the directory needs no signer and sends no transactions. To open an\napp, Browse hands off: inside the Polkadot app it asks the host to navigate to\nthe `.dot` domain, and in a browser it opens the web gateway.\n\n```mermaid\nflowchart LR\n  P[\"Publisher.getPublished<br/>labelhashes\"] --> L[\"Registrar.labelOf<br/>labelhash to label\"]\n  L --> C[\"ContentResolver.contenthash<br/>drop non-live\"]\n  C --> M[\"ContentResolver.text manifest<br/>displayName/desc/icon\"]\n  M --> UI[Product cards]\n  UI -->|host| H[\"host navigates to label.dot\"]\n  UI -->|browser| W[\"open label.dev-dot.li\"]\n```\n\nThe registry stores only the labelhash, the publisher and a timestamp. So to\nchange an app's name, description or icon, you don't write to the registry at\nall. You update the DotNS `manifest` record, and the directory picks it up on\nthe next hydrate."}
{"source": "polkadot-docs", "page_id": "apps-architecture-discovery", "url": "https://developer.polkadot.com/apps/architecture/discovery/#common-blockers", "page_title": "apps-architecture-discovery", "index": 4, "depth": 2, "title": "Common blockers", "anchor": "common-blockers", "start_char": 4229, "end_char": 4365, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5109b91a9c9af5bd5b256abedde26a47a911de3483b47b65ab2f76e6565f1651", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Common blockers\n\n- **The app has no card metadata.** Update the DotNS manifest record with a\n  display name, description, and icon."}
{"source": "polkadot-docs", "page_id": "apps-architecture-discovery", "url": "https://developer.polkadot.com/apps/architecture/discovery/#learn-more", "page_title": "apps-architecture-discovery", "index": 5, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 4365, "end_char": 4560, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5109b91a9c9af5bd5b256abedde26a47a911de3483b47b65ab2f76e6565f1651", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [browse](https://github.com/paritytech/browse): source for the directory and its client\n- [App delivery](./app-delivery.md): the pipeline that writes the contenthash and manifest"}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#the-moving-parts", "page_title": "apps-architecture-identity", "index": 0, "depth": 2, "title": "The moving parts", "anchor": "the-moving-parts", "start_char": 551, "end_char": 2000, "estimated_token_count": 348, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The moving parts\n\nIdentity is spread over a few separately deployed components. The main source\nrepositories are under [github.com/paritytech](https://github.com/paritytech).\n\n| Component | Role | Source |\n| --- | --- | --- |\n| `identity-backend` | Stateful HTTP backend-for-frontend (BFF) for the Polkadot app, backed by Postgres (usernames, single-use/revocable refresh tokens, a registration queue, device attestations, and invitation tickets). Issues JWT sessions, registers usernames, manages invitation tickets. Holds no user keys. | [identity-backend-community](https://github.com/paritytech/identity-backend-community) |\n| `people-lite` pallet | On-chain registry of *Lite* people (attested usernames) on the People chain. | [individuality-community](https://github.com/paritytech/individuality-community) |\n| `proof-of-ink` pallet | On-chain *Full* personhood: applications, invitations, and evidence judging. | [individuality-community](https://github.com/paritytech/individuality-community) |\n| `personhood` precompile | A pallet-revive precompile that lets any PolkaVM contract read an account's personhood tier and a per-app alias. | [individuality-community](https://github.com/paritytech/individuality-community) |\n| `attestation-protocol` | An EAS-style, permissionless attestation suite (`SchemaRegistry` + `AttestationService`) for general claims. | [attestation-protocol](https://github.com/paritytech/attestation-protocol) |"}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#the-identity-backend-is-centralized-today", "page_title": "apps-architecture-identity", "index": 1, "depth": 3, "title": "The identity backend is centralized today", "anchor": "the-identity-backend-is-centralized-today", "start_char": 2000, "end_char": 2594, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### The identity backend is centralized today\n\nEvery other component above is on-chain. `identity-backend` is not: it is an\noperator-run HTTP service with its own database, and the Lite tier depends on\nit to attest devices, allocate usernames and submit the registration. It holds\nno user keys and cannot sign as a user, but it is a trusted party, and while it\nis down, username registration stops.\n\nThis is a devnet shortcut. Running this role in a decentralized way is\ndesirable future work, and the Devnet does not demonstrate it, so don't read\nthe current setup as the final architecture."}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#sessions-proving-the-device-not-the-person", "page_title": "apps-architecture-identity", "index": 2, "depth": 2, "title": "Sessions: proving the device, not the person", "anchor": "sessions-proving-the-device-not-the-person", "start_char": 2594, "end_char": 3435, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Sessions: proving the device, not the person\n\nBefore a client can register anything, it gets a JWT through a\ndevice-attestation handshake. The backend never sees a password. It checks that\nthe request comes from a genuine, unmodified copy of the app on a genuine\ndevice.\n\n1. The client requests a Challenge: a stateless, self-authenticating freshness\n   nonce that the server mints without storing anything.\n2. The client produces an Attestation: Apple App Attest on iOS, Google Play\n   Integrity or Android key attestation on Android, or a voucher secret for\n   out-of-band enrolment.\n3. The client `POST`s the Attestation and the echoed Challenge to\n   `/api/v1/auth/token`, and receives a JWT. `/auth/token/refresh` rotates it.\n\nSo a session proves the device and the app instance before the backend accepts\nidentity actions from it."}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#usernames-and-the-lite-tier", "page_title": "apps-architecture-identity", "index": 3, "depth": 2, "title": "Usernames and the Lite tier", "anchor": "usernames-and-the-lite-tier", "start_char": 3435, "end_char": 4993, "estimated_token_count": 323, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Usernames and the Lite tier\n\nA Lite person is an account with an attested, human-readable username. The\nclient asks for a base name, the backend allocates an available suffixed name,\nand the user signs the registration. The backend accepts and queues the request\n(returning `202 Accepted`), and a separate worker submits the attestation to\nthe People chain later. The backend never takes custody of the user's keys or\nsigns as the user.\n\nRegistration has limits. On iOS, Apple DeviceCheck limits the number of free\nregistrations per device: a device that has already registered gets a\n`PAYMENT_REQUIRED` response on further attempts.\n\nEach new username can also be reflected into the `.dot` naming system, so the\nsame readable identity works across the app and app discovery. Operator-run\ninfrastructure does that mirroring, and users and Product developers normally\ndon't interact with it directly.\n\n```mermaid\nsequenceDiagram\n    participant App as Polkadot app (device)\n    participant BFF as identity-backend (BFF)\n    participant Worker as Registration worker\n    participant People as People chain (people-lite)\n    participant AH as Asset Hub (dotns-gateway)\n    App->>BFF: POST /auth/token (App Attest / Play Integrity + Challenge)\n    BFF-->>App: JWT\n    App->>BFF: POST /usernames (base name + signed proof)\n    BFF-->>App: 202 Accepted (registration queued)\n    Worker->>People: Register Lite username attestation (async)\n    People-->>Worker: finalized (Lite person registered)\n    People-->>AH: username can be mirrored into .dot naming\n```"}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#full-personhood-and-invitation-tickets", "page_title": "apps-architecture-identity", "index": 4, "depth": 2, "title": "Full personhood and invitation tickets", "anchor": "full-personhood-and-invitation-tickets", "start_char": 4993, "end_char": 5551, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Full personhood and invitation tickets\n\nThe Full tier is stronger. It represents a person who has completed a\npersonhood flow, such as an invitation or a game-based proof. The backend can\nhelp users get the tickets or proofs they need to start those flows, but the\nstatus itself is recorded on-chain.\n\nWhether the Full tier is currently active on the deployed devnet depends on\noperator-privileged tasks (game scheduling and related runtime configuration).\nTreat a `None`/`Lite` result as the safe default, and don't assume Full\npersonhood is available."}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#how-apps-read-identity-status", "page_title": "apps-architecture-identity", "index": 5, "depth": 2, "title": "How apps read identity status", "anchor": "how-apps-read-identity-status", "start_char": 5551, "end_char": 6692, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How apps read identity status\n\nContracts don't ask the backend about personhood. Personhood state is reflected\nfrom the People chain to Asset Hub over XCM, and PolkaVM contracts read it there\nthrough the personhood precompile:\n\n```solidity\nstruct PersonhoodInfo { uint8 status; bytes32 contextAlias; }\n\n// status: 0 = None, 1 = Lite, 2 = Full\nfunction personhoodStatus(address account, bytes32 context)\n    external\n    view\n    returns (PersonhoodInfo memory);\n```\n\nThe returned `contextAlias` is a per-application pseudonym that protects the\nuser's privacy. The same person gets a different alias in a different context,\nso apps cannot link a user's activity across applications.\n\nFront-ends that run inside the Polkadot app or the web gateway at\n[https://dev-dot.li](https://dev-dot.li) get identity and host information\nthrough the developer packages:\n[`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk),\nwhich talks to the host over TrUAPI\n([`@parity/truapi`](https://www.npmjs.com/package/@parity/truapi)). Their own\nrepositories define exactly what those packages expose for username and\npersonhood status."}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#general-attestations", "page_title": "apps-architecture-identity", "index": 6, "depth": 2, "title": "General attestations", "anchor": "general-attestations", "start_char": 6692, "end_char": 6937, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## General attestations\n\nBeyond personhood, the attestation protocol provides reusable claim and schema\ncontracts on the PolkaVM Asset Hub. Use it when an app needs verifiable claims\nthat are something other than username or personhood status."}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#common-blockers", "page_title": "apps-architecture-identity", "index": 7, "depth": 2, "title": "Common blockers", "anchor": "common-blockers", "start_char": 6937, "end_char": 7459, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Common blockers\n\n- The device session is missing or expired: the app must complete device\n  attestation before identity actions can go ahead.\n- The username is taken: the backend allocates a suffixed name that is still\n  available.\n- Full personhood is not available in a build: treat `None` or `Lite` as the\n  safe default unless the current Devnet flow offers Full.\n- An app needs identity in a contract: read personhood through the precompile\n  or SDK-supported helpers, not by calling the backend from a contract."}
{"source": "polkadot-docs", "page_id": "apps-architecture-identity", "url": "https://developer.polkadot.com/apps/architecture/identity/#learn-more", "page_title": "apps-architecture-identity", "index": 8, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 7459, "end_char": 7869, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dedfc10804bfe3a6d620926405ea1c4213f4f80d9ca30e47b85bc75456e6299", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [identity-backend-community](https://github.com/paritytech/identity-backend-community): the BFF, its routes, and `CONCEPTS.md`\n- [individuality-community](https://github.com/paritytech/individuality-community): `people-lite`, `proof-of-ink`, and the `personhood` precompile\n- [attestation-protocol](https://github.com/paritytech/attestation-protocol): `SchemaRegistry` and `AttestationService`"}
{"source": "polkadot-docs", "page_id": "apps-architecture", "url": "https://developer.polkadot.com/apps/architecture/#the-pieces", "page_title": "apps-architecture", "index": 0, "depth": 2, "title": "The pieces", "anchor": "the-pieces", "start_char": 458, "end_char": 2169, "estimated_token_count": 417, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa470999aa18497e6e4d9112872a1c87a7027117c51cf479316d9a9cf7739104", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## The pieces\n\n- The network: a community-operated [Paseo](network.md) relay chain plus\n  system parachains. App developers target Asset Hub (para 1000), which runs\n  `pallet-revive` (PolkaVM/EVM contracts, chain id `420420417`), the\n  `pallet-assets` suite and the DotNS gateway pallet. Identity lives on the\n  People chain (para 1004). Web-app bundles live on the Bulletin chain\n  (para 1010).\n- The client tier: three native [Polkadot app](client.md) clients (Android,\n  iOS, Desktop/Web). They hold keys on the device and host dApps in a sandboxed\n  webview, talking to them over a shared protocol, TrUAPI.\n- Naming: [DotNS](naming.md), a set of PolkaVM contracts that turn a `.dot`\n  domain into an owner, a resolver and a content hash.\n- App delivery: the [`pad` CLI](app-delivery.md) uploads a static bundle to\n  Bulletin and binds its CID to a `.dot` domain. The\n  [dotli gateway](app-delivery.md) resolves and renders it.\n- Storage & data: one content-addressed [Bulletin store](storage.md) holds both\n  app bundles and app runtime data (through Cloud Storage). Writes need an\n  authorization, and reads are open.\n- Smart contracts: [contracts](contracts.md) are PolkaVM bytecode running on\n  `pallet-revive` on Asset Hub.\n- Identity & personhood: [proof-of-personhood](identity.md) tiers (Lite and\n  Full) and a precompile any contract can read.\n- Money: [CASH](money.md), a devnet \"digital dollar\" spent through the\n  privacy-preserving Coinage system on the People chain.\n- Discovery: [Browse](discovery.md), an on-chain publisher registry of\n  listable apps.\n- Messaging: [chat and calls](messaging.md) carried over the People-chain\n  statement store, with media on Bulletin and WebRTC for calls."}
{"source": "polkadot-docs", "page_id": "apps-architecture", "url": "https://developer.polkadot.com/apps/architecture/#system-diagram", "page_title": "apps-architecture", "index": 1, "depth": 2, "title": "System diagram", "anchor": "system-diagram", "start_char": 2169, "end_char": 3076, "estimated_token_count": 274, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa470999aa18497e6e4d9112872a1c87a7027117c51cf479316d9a9cf7739104", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## System diagram\n\n```mermaid\nflowchart TD\n  subgraph Clients[\"Entry points\"]\n    APP[\"Polkadot app<br/>(Android / iOS / Desktop)\"]\n    GW[\"Web gateway<br/>dev-dot.li\"]\n  end\n\n  subgraph Dev[\"Developer tooling (npm)\"]\n    SDK[\"@parity/product-sdk\"]\n    PAD[\"polkadot-app-deploy (pad)\"]\n    DOTNS[\"@polkadot-community-foundation/dotns-cli\"]\n  end\n\n  subgraph Net[\"Devnet\"]\n    AH[\"Asset Hub (1000)<br/>pallet-revive + assets<br/>DotNS contracts\"]\n    PEOPLE[\"People (1004)<br/>identity + personhood<br/>Coinage + statement store\"]\n    BULLETIN[\"Bulletin (1010)<br/>app bundles + chat media\"]\n  end\n\n  APP -->|TrUAPI| SDK\n  GW -->|smoldot light client| AH\n  SDK -->|host-routed RPC| AH\n  SDK --> PEOPLE\n  SDK --> BULLETIN\n\n  PAD -->|upload bundle| BULLETIN\n  PAD -->|register name + contenthash| AH\n  DOTNS -->|reserve .dot| AH\n\n  AH -.->|contenthash = CID| BULLETIN\n  PEOPLE -.->|ring roots via XCM| AH\n```"}
{"source": "polkadot-docs", "page_id": "apps-architecture", "url": "https://developer.polkadot.com/apps/architecture/#request-path-opening-a-dot-app", "page_title": "apps-architecture", "index": 2, "depth": 2, "title": "Request path: opening a `.dot` app", "anchor": "request-path-opening-a-dot-app", "start_char": 3076, "end_char": 5406, "estimated_token_count": 538, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa470999aa18497e6e4d9112872a1c87a7027117c51cf479316d9a9cf7739104", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Request path: opening a `.dot` app\n\nTake a user opening `calculator.dot`. The steps are much the same on the web\ngateway and in the app's browser. What differs is who you have to trust.\n\n1. Address to label. On the web, the user visits\n   `https://calculator.dev-dot.li`, and the dotli host takes the registrable\n   root and the label `calculator` from the subdomain. In the app, the user\n   types `calculator.dot` into the browser bar.\n2. Name to content hash. The client computes the ENS-style namehash of\n   `calculator.dot` (`keccak256(DOT_NODE, keccak256(\"calculator\"))`) and reads\n   `contenthash(node)` from the DotNS ContentResolver contract on Asset Hub.\n   The web gateway does this without trusting a server: it reads contract\n   storage directly through an in-browser smoldot light client, so there is no\n   RPC server in the path.\n3. Content hash to CID. The `contenthash` bytes (`0xe301` + CIDv1) decode to an\n   IPFS CID that points at the app bundle.\n4. Fetch the bundle. The content comes from the Bulletin chain (through smoldot\n   `bitswap_v1_get`, shown as verified) or from an IPFS gateway. A directory\n   arrives as a CAR archive, which is parsed into a file map and served by a\n   Service Worker virtual filesystem.\n5. Render in a sandbox. The bundle runs inside a sandboxed iframe (web) or a\n   platform webview (app). The host opens a TrUAPI channel to it. The gateway\n   runs the TrUAPI core (`@parity/truapi-host`) in a Web Worker and hands the\n   iframe a `MessagePort`, and the native apps run the same core. The\n   Product's TrUAPI client (`@parity/truapi`, used by the Product SDK) talks\n   over that channel.\n6. App talks to the host. Over TrUAPI the dApp asks for accounts, permissions,\n   signatures and chain connections. All chain RPC goes through the host\n   container (the Product SDK is built to run inside it), so the app never\n   manages its own node connections or keys. Keys on the device sign, and the\n   user approves each signature in a native modal.\n\nFrom here the running app draws on the rest of the platform: it calls\n[contracts](contracts.md) on Asset Hub, reads a caller's\n[personhood tier](identity.md) from the precompile at `0x…0a010000`, or moves\n[CASH](money.md). Messaging and calls run over the same\n[People-chain statement store](messaging.md) the app already uses."}
{"source": "polkadot-docs", "page_id": "apps-architecture", "url": "https://developer.polkadot.com/apps/architecture/#where-to-go-next", "page_title": "apps-architecture", "index": 3, "depth": 2, "title": "Where to go next", "anchor": "where-to-go-next", "start_char": 5406, "end_char": 5709, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa470999aa18497e6e4d9112872a1c87a7027117c51cf479316d9a9cf7739104", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Where to go next\n\n- New here? Start with [Get started as a developer](../get-started/developers.md).\n- Building an app? Read [App delivery](app-delivery.md), then\n  [Build & publish an app](../build/build-and-publish.md).\n- Looking for addresses and endpoints? See [Reference](../reference/index.md)."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#transport-the-statement-store", "page_title": "apps-architecture-messaging", "index": 0, "depth": 2, "title": "Transport: the statement store", "anchor": "transport-the-statement-store", "start_char": 434, "end_char": 919, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Transport: the statement store\n\nText messages are not stored on a server, and they are not sent directly\nbetween devices either. Each message is encrypted on the sending device and\npublished to the statement store on the People chain. Recipients subscribe to\nthat store and decrypt messages on their own device.\n\nThe same channel carries text, reactions, replies, contact events and call\nsetup signals. That shared transport is why chat and calls live in the same\npart of the app."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#encryption", "page_title": "apps-architecture-messaging", "index": 1, "depth": 3, "title": "Encryption", "anchor": "encryption", "start_char": 919, "end_char": 1090, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Encryption\n\nMessages are encrypted per peer, not with one global key. Only encrypted\nstatements are submitted to the store, so the People chain only sees\nciphertext."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#media-attachments-the-bulletin-hop", "page_title": "apps-architecture-messaging", "index": 2, "depth": 2, "title": "Media attachments: the Bulletin \"hop\"", "anchor": "media-attachments-the-bulletin-hop", "start_char": 1090, "end_char": 1417, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Media attachments: the Bulletin \"hop\"\n\nImages, video and files do not go through the statement store. Attachments are\nencrypted and uploaded through Bulletin-backed storage, and the chat message\ncarries a reference that lets the recipient fetch and decrypt the file.\n[The network](network.md) has more on Bulletin storage."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#voice-and-video-calls", "page_title": "apps-architecture-messaging", "index": 3, "depth": 2, "title": "Voice and video calls", "anchor": "voice-and-video-calls", "start_char": 1417, "end_char": 1724, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Voice and video calls\n\nCalls use WebRTC, with no dedicated signaling server. The offer, answer,\nconnection candidates and call-close signals are sent as encrypted chat\nmessages over the statement store. Once the peers connect, media flows directly\nwhen possible, or through TURN when a relay is needed."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#nat-traversal-stun-and-turn", "page_title": "apps-architecture-messaging", "index": 4, "depth": 3, "title": "NAT traversal (STUN and TURN)", "anchor": "nat-traversal-stun-and-turn", "start_char": 1724, "end_char": 2038, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### NAT traversal (STUN and TURN)\n\nWhen a direct WebRTC path is not available, clients can use temporary TURN\ncredentials. Platform infrastructure provides those credentials and they are\nshort-lived, so Product apps should treat calling as a service the host\nprovides and not embed TURN configuration themselves."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#data-paths-at-a-glance", "page_title": "apps-architecture-messaging", "index": 5, "depth": 2, "title": "Data paths at a glance", "anchor": "data-paths-at-a-glance", "start_char": 2038, "end_char": 2665, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Data paths at a glance\n\n```mermaid\nflowchart TD\n  subgraph ClientA[Client A]\n    A1[Chat UI / ChatEngine]\n    A2[WebRTC PeerConnection]\n  end\n  subgraph ClientB[Client B]\n    B1[Chat UI / ChatEngine]\n    B2[WebRTC PeerConnection]\n  end\n  SS[\"People chain statement store\"]\n  BC[\"Bulletin-backed attachment storage\"]\n  TURN[\"STUN / TURN\"]\n\n  A1 -- \"Encrypted statements<br/>(text + SDP/ICE call signals)\" --> SS\n  SS -- subscription --> B1\n  A1 -- \"chunked AES media\" --> BC\n  BC -- \"fetch by HopTicket\" --> B1\n  A2 -- \"ICE / media (audio+video)\" --> TURN\n  TURN -- relay --> B2\n  A2 -. \"direct P2P when possible\" .- B2\n```"}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#desktop-and-device-sync", "page_title": "apps-architecture-messaging", "index": 6, "depth": 2, "title": "Desktop and device sync", "anchor": "desktop-and-device-sync", "start_char": 2665, "end_char": 2967, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Desktop and device sync\n\nVoice and video calls are mobile-only today. The desktop build has no call UI\nand cannot start or answer calls. Desktop uses WebRTC only for device sync and\npeer-to-peer chat. It shares the same broad building blocks for chat and sync,\nbut calling stays on the mobile app."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#common-blockers", "page_title": "apps-architecture-messaging", "index": 7, "depth": 2, "title": "Common blockers", "anchor": "common-blockers", "start_char": 2967, "end_char": 3541, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Common blockers\n\n- A message appears delayed: the sender and recipient both depend on the\n  statement store subscription and on decrypting locally.\n- An attachment does not open: the encrypted attachment reference may arrive\n  before the content is available from Bulletin-backed storage.\n- A call only connects through a relay: that is expected on some networks.\n  TURN credentials come from the platform and can change.\n- You want to call from desktop: calling is mobile-only today, and the desktop\n  build has no call UI. Use the mobile app to start or answer calls."}
{"source": "polkadot-docs", "page_id": "apps-architecture-messaging", "url": "https://developer.polkadot.com/apps/architecture/messaging/#learn-more", "page_title": "apps-architecture-messaging", "index": 8, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 3541, "end_char": 3792, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1763437531380f19be0c3ba5c173a642e8fe81670f6f416cc6b99b07aa80834a", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Learn more\n\n- [Polkadot Android](https://github.com/Polkadot-Community-Foundation/polkadot-android-community): source for the chat engine and call stack\n- [Messaging & calls](../using-the-app/messaging-and-calls.md): how to chat and call in the app"}
{"source": "polkadot-docs", "page_id": "apps-architecture-money", "url": "https://developer.polkadot.com/apps/architecture/money/#two-balances", "page_title": "apps-architecture-money", "index": 0, "depth": 2, "title": "Two balances", "anchor": "two-balances", "start_char": 201, "end_char": 844, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:134e61d8d560fa69afd96ad365bbf5242bed2ae56384e3214ae94d9cf8298db9", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Two balances\n\nUsers see CASH in the Polkadot app. CASH is the app's name for a devnet\ndigital-dollar asset. It is the balance users top up, earn and send to other\npeople inside the app.\n\nThe chains also have a native token, PAS, used for fees and for account\nexistential deposits on Paseo-based chains. CASH and PAS are separate:\n\n- CASH is the spendable app balance.\n- PAS is the native network token used for fees.\n- Both are devnet-only and have no real value.\n\nKeep this in mind when something goes wrong. A user can have CASH for app\npayments and still need a small amount of PAS for network fees or to keep the\naccount in existence."}
{"source": "polkadot-docs", "page_id": "apps-architecture-money", "url": "https://developer.polkadot.com/apps/architecture/money/#where-cash-lives", "page_title": "apps-architecture-money", "index": 1, "depth": 2, "title": "Where CASH lives", "anchor": "where-cash-lives", "start_char": 844, "end_char": 1714, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:134e61d8d560fa69afd96ad365bbf5242bed2ae56384e3214ae94d9cf8298db9", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Where CASH lives\n\nCASH is built on the Polkadot asset stack, and the Polkadot app uses it through\nthe People chain. On People, the balance is a local pUSD asset (asset id `1`)\nthat Coinage denominates and shows as CASH. The same logical value is also\nrepresented on Asset Hub, with id `50000413`. That is a protected asset, and\ntransfers of it on Asset Hub are gated.\n\nDay to day, people don't need to move assets between chains by hand. The app\nshows CASH as a single balance and does the chain-specific work for them.\n\n```mermaid\nflowchart LR\n  App[\"Polkadot app<br/>shows CASH\"] --> Coinage[\"Coinage on People<br/>holds and sends CASH\"]\n  Asset[\"pUSD local asset<br/>People asset id 1\"] --> Coinage\n  PAS[\"PAS native token<br/>fees + account existence\"] -. separate .-> App\n  AH[\"Asset Hub id 50000413<br/>AH transfers gated\"] -. same logical value .-> Asset\n```"}
{"source": "polkadot-docs", "page_id": "apps-architecture-money", "url": "https://developer.polkadot.com/apps/architecture/money/#how-cash-is-held", "page_title": "apps-architecture-money", "index": 2, "depth": 2, "title": "How CASH is held", "anchor": "how-cash-is-held", "start_char": 1714, "end_char": 2200, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:134e61d8d560fa69afd96ad365bbf5242bed2ae56384e3214ae94d9cf8298db9", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## How CASH is held\n\nThe app does not treat CASH like a simple account balance. It holds and spends\nCASH through Coinage, a People-chain system that represents value as coins.\nWhen a user sends CASH, the app prepares and submits a Coinage transfer, not a\nplain token transfer.\n\nThis matters for developers: payment flows in your app should use the platform\nservices that the host and SDK provide. A Product should not try to rebuild the\nwallet, key handling or low-level payment flow."}
{"source": "polkadot-docs", "page_id": "apps-architecture-money", "url": "https://developer.polkadot.com/apps/architecture/money/#how-users-get-cash", "page_title": "apps-architecture-money", "index": 3, "depth": 2, "title": "How users get CASH", "anchor": "how-users-get-cash", "start_char": 2200, "end_char": 2604, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:134e61d8d560fa69afd96ad365bbf5242bed2ae56384e3214ae94d9cf8298db9", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## How users get CASH\n\nUsers get CASH inside the Polkadot app, in two ways:\n\n1. Top up in the app. Devnet builds can offer a top-up action that funds the\n   account and brings value into the CASH balance.\n2. Earn rewards. Some app and personhood flows can reward users with value that\n   then shows up as CASH.\n\nOnce onboarding completes, the balance in the user's Pocket updates and they\ncan spend it."}
{"source": "polkadot-docs", "page_id": "apps-architecture-money", "url": "https://developer.polkadot.com/apps/architecture/money/#sending-cash", "page_title": "apps-architecture-money", "index": 4, "depth": 2, "title": "Sending CASH", "anchor": "sending-cash", "start_char": 2604, "end_char": 2877, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:134e61d8d560fa69afd96ad365bbf5242bed2ae56384e3214ae94d9cf8298db9", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Sending CASH\n\nSending CASH goes through the wallet:\n\n1. The user chooses a recipient and amount in the Polkadot app.\n2. The app prepares the Coinage transfer.\n3. The user approves the action on the device.\n4. The app submits the transaction and waits for it to settle."}
{"source": "polkadot-docs", "page_id": "apps-architecture-money", "url": "https://developer.polkadot.com/apps/architecture/money/#what-developers-should-rely-on", "page_title": "apps-architecture-money", "index": 5, "depth": 2, "title": "What developers should rely on", "anchor": "what-developers-should-rely-on", "start_char": 2877, "end_char": 3371, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:134e61d8d560fa69afd96ad365bbf5242bed2ae56384e3214ae94d9cf8298db9", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## What developers should rely on\n\nTreat CASH as a platform service that the host and SDK provide:\n\n- Ask the host for the user's account and permissions.\n- Use the SDK and host-provided payment and chain APIs.\n- Let the Polkadot app handle signing and key custody.\n- Show amounts clearly as devnet value.\n\nDon't hardcode operator accounts, funding assumptions or private chain\nconfiguration into an app. The Devnet operators supply the network presets,\nlive endpoints and registry addresses."}
{"source": "polkadot-docs", "page_id": "apps-architecture-money", "url": "https://developer.polkadot.com/apps/architecture/money/#learn-more", "page_title": "apps-architecture-money", "index": 6, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 3371, "end_char": 3771, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:134e61d8d560fa69afd96ad365bbf5242bed2ae56384e3214ae94d9cf8298db9", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Learn more\n\n- [`pallet-coinage`](https://github.com/paritytech/individuality-community/blob/main/pallets/coinage/src/lib.rs): the source, showing how CASH is represented as coins, held and transferred\n- [paseo-network/runtimes](https://github.com/paseo-network/runtimes): the chain runtimes and asset definitions\n- [Get & use CASH](../using-the-app/get-and-use-cash.md): get and send CASH yourself"}
{"source": "polkadot-docs", "page_id": "apps-architecture-naming", "url": "https://developer.polkadot.com/apps/architecture/naming/#the-name-model", "page_title": "apps-architecture-naming", "index": 0, "depth": 2, "title": "The name model", "anchor": "the-name-model", "start_char": 729, "end_char": 1173, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:af8d78a2be89566edfd397033ad627d9eab1ce1f821c07f4c86d9f29164c0b55", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The name model\n\nEach `.dot` domain has two important pieces of state:\n\n- Owner: the account or contract that controls the name.\n- Resolver records: the data attached to the name, including the content hash\n  that points to an app bundle.\n\nInternally, DotNS hashes names into fixed-width identifiers so contracts can\nlook them up efficiently. You normally don't calculate those hashes yourself:\nthe CLI, SDK, gateway and host tooling do it."}
{"source": "polkadot-docs", "page_id": "apps-architecture-naming", "url": "https://developer.polkadot.com/apps/architecture/naming/#resolving-namedot-to-an-app-bundle", "page_title": "apps-architecture-naming", "index": 1, "depth": 2, "title": "Resolving `name.dot` to an app bundle", "anchor": "resolving-namedot-to-an-app-bundle", "start_char": 1173, "end_char": 2163, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:af8d78a2be89566edfd397033ad627d9eab1ce1f821c07f4c86d9f29164c0b55", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Resolving `name.dot` to an app bundle\n\nResolution only reads. A client never needs a naming server: it computes the\nnode locally and reads two contracts.\n\n1. Form `domain = <label>.dot` and compute `node = namehash(domain)`.\n2. Read `DotnsRegistry.recordExists(node)` and `DotnsRegistry.owner(node)`. If\n   the record does not exist or the owner is the zero address, resolution stops\n   with an empty result.\n3. Read `DotnsContentResolver.contenthash(node)`, which returns the ENS-style\n   contenthash bytes for the name.\n4. Decode those bytes to an IPFS CID.\n5. Fetch the application bundle from the gateway.\n\nThe web gateway at [dev-dot.li](https://dev-dot.li) follows the same path and\nrenders the resolved bundle in a sandboxed frame.\n[App delivery](./app-delivery.md) covers how the content is uploaded and how\nthe contenthash gets written.\n\nBecause resolution is a plain contract read, you can check any name yourself\nwith the DotNS CLI: `dotns content view <name> --env devnet`."}
{"source": "polkadot-docs", "page_id": "apps-architecture-naming", "url": "https://developer.polkadot.com/apps/architecture/naming/#contract-topology", "page_title": "apps-architecture-naming", "index": 2, "depth": 2, "title": "Contract topology", "anchor": "contract-topology", "start_char": 2163, "end_char": 2988, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:af8d78a2be89566edfd397033ad627d9eab1ce1f821c07f4c86d9f29164c0b55", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Contract topology\n\nDotNS splits ownership, records and control into separate contracts. That way\nparts of the protocol can be replaced without changing the basic model that\nclients depend on.\n\n```mermaid\nflowchart TD\n  Controller[\"Registration controllers\"] --> Registrar[\"Registrar<br/>name ownership\"]\n  Registrar --> Registry[\"Registry<br/>owner + resolver\"]\n  Registry --> Resolver[\"Resolvers<br/>contenthash + records\"]\n  Rules[\"Name rules<br/>length + personhood\"] --> Controller\n  Resolver --> Gateway[\"Gateway / app clients\"]\n```\n\n- Registrar: records who owns a `.dot` domain.\n- Registry: connects the name to its resolver.\n- Resolvers: hold the records that clients read, including the content hash\n  for an app bundle.\n- Name rules: decide which names are open, which are reserved and which need\n  personhood."}
{"source": "polkadot-docs", "page_id": "apps-architecture-naming", "url": "https://developer.polkadot.com/apps/architecture/naming/#registration", "page_title": "apps-architecture-naming", "index": 3, "depth": 2, "title": "Registration", "anchor": "registration", "start_char": 2988, "end_char": 3686, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:af8d78a2be89566edfd397033ad627d9eab1ce1f821c07f4c86d9f29164c0b55", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Registration\n\nThe public registration path is a two-phase commit-reveal, which stops anyone\nfrom front-running a name you chose. The CLI takes you through it:\n\n1. Validate and normalise the label (a single lowercase DNS label, at least 3\n   characters long; shorter labels revert with `LabelTooShort`).\n2. Classify and price the label through `PopRules`, and check whether it is\n   reserved.\n3. Commit to the name without revealing the full registration.\n4. Wait for the commitment window.\n5. Reveal the registration, mint the name and write its initial records.\n\nNames can also be transferred (the ERC-721 token moves), and the owner of a\nbase name can create subnames with `setSubnodeOwner`."}
{"source": "polkadot-docs", "page_id": "apps-architecture-naming", "url": "https://developer.polkadot.com/apps/architecture/naming/#reserved-and-short-name-gating", "page_title": "apps-architecture-naming", "index": 4, "depth": 2, "title": "Reserved and short-name gating", "anchor": "reserved-and-short-name-gating", "start_char": 3686, "end_char": 4707, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:af8d78a2be89566edfd397033ad627d9eab1ce1f821c07f4c86d9f29164c0b55", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Reserved and short-name gating\n\nNot every label is available on the public path. `PopRules` classifies each\nlabel by the length of its stem (the label with any trailing digits stripped)\nand gates it accordingly:\n\n| Tier | Condition | Effect |\n| --- | --- | --- |\n| Reserved | stem ≤ 5 characters | short names are gated |\n| PopLite | stem 6–8, exactly 2 trailing digits | lite personhood username |\n| PopFull | stem 6–8, no trailing digits | full personhood username |\n| NoStatus | stem ≥ 9 characters | open, deposit-backed |\n\nLabels with 1 or more than 2 trailing digits are rejected. Governance-reserved\nand name-reserved labels revert on the public controller. A separate\nowner-managed whitelist (`registerReserved`) can bypass PoP pricing for\nspecific addresses.\n\nPersonhood-gated names come through a controlled path tied to the personhood\nsystem, not the public commit-reveal path. Product developers normally deal\nwith this through the app, the CLI or DotNS services, not by calling those\ncontracts directly."}
{"source": "polkadot-docs", "page_id": "apps-architecture-naming", "url": "https://developer.polkadot.com/apps/architecture/naming/#learn-more", "page_title": "apps-architecture-naming", "index": 5, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 4707, "end_char": 4947, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:af8d78a2be89566edfd397033ad627d9eab1ce1f821c07f4c86d9f29164c0b55", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [dotns](https://github.com/paritytech/dotns): the contracts\n- [dotns-sdk](https://github.com/paritytech/dotns-sdk): the CLI and reference UI\n- [Register a .dot domain](../build/register-a-dot-name.md): register one yourself"}
{"source": "polkadot-docs", "page_id": "apps-architecture-network", "url": "https://developer.polkadot.com/apps/architecture/network/#topology", "page_title": "apps-architecture-network", "index": 0, "depth": 2, "title": "Topology", "anchor": "topology", "start_char": 493, "end_char": 1734, "estimated_token_count": 300, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd12eb4e6a6df928fe7f846e212e14e5cd3f4526af10e2338e27660dc65a6dbe", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Topology\n\nThe relay chain is the root of trust. Product flows mostly touch three system\nparachains: Asset Hub for contracts and assets, People for identity and money\nflows, and Bulletin for web-app bundle storage.\n\n```mermaid\ngraph TD\n  Relay[\"Paseo relay chain\"]\n  AH[\"Asset Hub (para 1000)<br/>contracts / assets / DotNS\"]\n  People[\"People (para 1004)<br/>identity + proof-of-personhood\"]\n  Bulletin[\"Bulletin (para 1010)<br/>transaction storage (web bundles)\"]\n  Relay --> AH\n  Relay --> People\n  Relay --> Bulletin\n  People -->|identity and CASH signals| AH\n  AH -.->|contenthash points to bundle CID| Bulletin\n\n  %% Per-chain colour — palette lives in diagrams.css (.relayNode etc.)\n  classDef relayNode stroke-width:1px;\n  classDef assethubNode stroke-width:1px;\n  classDef peopleNode stroke-width:1px;\n  classDef bulletinNode stroke-width:1px;\n  class Relay relayNode\n  class AH assethubNode\n  class People peopleNode\n  class Bulletin bulletinNode\n```\n\n| Chain | Para ID | Role |\n| --- | --- | --- |\n| Relay | — | Root of trust; anchors the system parachains |\n| Asset Hub | 1000 | Contracts (PolkaVM/EVM), assets, DotNS gateway |\n| People | 1004 | Identity and proof-of-personhood |\n| Bulletin | 1010 | Web-app content storage |"}
{"source": "polkadot-docs", "page_id": "apps-architecture-network", "url": "https://developer.polkadot.com/apps/architecture/network/#asset-hub-span-classdg-chip-style-chipvar-dg-assethubpara-1000span", "page_title": "apps-architecture-network", "index": 1, "depth": 2, "title": "Asset Hub <span class=\"dg-chip\" style=\"--chip:var(--dg-assethub)\">para 1000</span>", "anchor": "asset-hub-span-classdg-chip-style-chipvar-dg-assethubpara-1000span", "start_char": 1734, "end_char": 2709, "estimated_token_count": 274, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd12eb4e6a6df928fe7f846e212e14e5cd3f4526af10e2338e27660dc65a6dbe", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Asset Hub <span class=\"dg-chip\" style=\"--chip:var(--dg-assethub)\">para 1000</span>\n\nAsset Hub is the main chain for Product developers. It runs the contracts,\nassets and naming that deployed apps use.\n\n<div class=\"dg-cards\" markdown=\"1\">\n<div class=\"dg-card\" markdown=\"1\">\n**pallet-revive**\nThe PolkaVM smart-contract environment. DotNS and application contracts run here.\n</div>\n<div class=\"dg-card\" markdown=\"1\">\n**Assets + ERC-20 precompiles**\nOn-chain assets available to contracts through ERC-20-style precompiles, so contracts can read and transfer supported assets without dealing with Substrate storage.\n</div>\n<div class=\"dg-card\" markdown=\"1\">\n**DotNS gateway**\nConnects `.dot` domains to the contract environment. See [Naming](./naming.md) for how names resolve to app bundles.\n</div>\n<div class=\"dg-card\" markdown=\"1\">\n**Personhood precompile**\nContracts read a user's personhood tier through a precompile, without calling the identity backend.\n</div>\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-architecture-network", "url": "https://developer.polkadot.com/apps/architecture/network/#people-span-classdg-chip-style-chipvar-dg-peoplepara-1004span", "page_title": "apps-architecture-network", "index": 2, "depth": 2, "title": "People <span class=\"dg-chip\" style=\"--chip:var(--dg-people)\">para 1004</span>", "anchor": "people-span-classdg-chip-style-chipvar-dg-peoplepara-1004span", "start_char": 2709, "end_char": 2977, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd12eb4e6a6df928fe7f846e212e14e5cd3f4526af10e2338e27660dc65a6dbe", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## People <span class=\"dg-chip\" style=\"--chip:var(--dg-people)\">para 1004</span>\n\nThe People chain holds identity, proof-of-personhood and Coinage state.\nUsernames are attested here, personhood status is recorded here, and CASH is\nheld and sent here through Coinage."}
{"source": "polkadot-docs", "page_id": "apps-architecture-network", "url": "https://developer.polkadot.com/apps/architecture/network/#bulletin-span-classdg-chip-style-chipvar-dg-bulletinpara-1010span", "page_title": "apps-architecture-network", "index": 3, "depth": 2, "title": "Bulletin <span class=\"dg-chip\" style=\"--chip:var(--dg-bulletin)\">para 1010</span>", "anchor": "bulletin-span-classdg-chip-style-chipvar-dg-bulletinpara-1010span", "start_char": 2977, "end_char": 3396, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd12eb4e6a6df928fe7f846e212e14e5cd3f4526af10e2338e27660dc65a6dbe", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Bulletin <span class=\"dg-chip\" style=\"--chip:var(--dg-bulletin)\">para 1010</span>\n\nThe Bulletin chain stores published web-app bundles that the gateway serves.\n\nBulletin uploads work by authorization, not by fees. Instead of charging\ntokens per upload, an authorizer (Root, sibling parachains, or registered\nauthorizers) decides who can store data. That is why publishing an app bundle\ndoes not cost devnet tokens."}
{"source": "polkadot-docs", "page_id": "apps-architecture-network", "url": "https://developer.polkadot.com/apps/architecture/network/#the-deployments-register", "page_title": "apps-architecture-network", "index": 4, "depth": 2, "title": "The deployments register", "anchor": "the-deployments-register", "start_char": 3396, "end_char": 3819, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd12eb4e6a6df928fe7f846e212e14e5cd3f4526af10e2338e27660dc65a6dbe", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The deployments register\n\nAddresses, endpoints and CIDs are network-specific. They change when a network\nis redeployed, so nothing in the platform hard-codes them. Instead, each\ncommand-line tool selects a network preset (`--env devnet` for `pad` and\n`dotns`), and the preset carries the endpoints and address book for that\nnetwork.\n\nThe addresses themselves are in\n[Addresses & registries](../reference/addresses.md)."}
{"source": "polkadot-docs", "page_id": "apps-architecture-network", "url": "https://developer.polkadot.com/apps/architecture/network/#deploy-and-serve-flow", "page_title": "apps-architecture-network", "index": 5, "depth": 2, "title": "Deploy and serve flow", "anchor": "deploy-and-serve-flow", "start_char": 3819, "end_char": 5373, "estimated_token_count": 420, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd12eb4e6a6df928fe7f846e212e14e5cd3f4526af10e2338e27660dc65a6dbe", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Deploy and serve flow\n\nHere is how the three chains work together over an app's life:\n\n```mermaid\ngraph LR\n  Dev[\"App developer\"]\n  Revive[\"pallet-revive on Asset Hub<br/>(PolkaVM/EVM contract)\"]\n  DotNS[\"DotNS<br/>.dot domain + resolver\"]\n  Store[\"Bulletin transaction storage<br/>(auth-gated, CID)\"]\n  GW[\"Gateway dev-dot.li\"]\n  User[\"Polkadot app / web user\"]\n  Dev -->|deploy contract| Revive\n  Dev -->|reserve name| DotNS\n  Dev -->|upload web bundle| Store\n  DotNS -->|contenthash = CID| Store\n  GW -->|resolve .dot -> CID| DotNS\n  User -->|https://label.dev-dot.li| GW\n  User -->|contract calls| Revive\n\n  %% Per-chain colour — palette lives in diagrams.css (.relayNode etc.)\n  classDef developerNode stroke-width:1px;\n  classDef assethubNode stroke-width:1px;\n  classDef dotnsNode stroke-width:1px;\n  classDef bulletinNode stroke-width:1px;\n  classDef gatewayNode stroke-width:1px;\n  classDef userNode stroke-width:1px;\n  class Dev developerNode\n  class Revive assethubNode\n  class DotNS dotnsNode\n  class Store bulletinNode\n  class GW gatewayNode\n  class User userNode\n```\n\nA developer deploys contracts to Asset Hub through `pallet-revive`, reserves a\n`.dot` name through the DotNS gateway and uploads the web bundle to Bulletin.\nThe name's contenthash resolver is bound to the bundle's CID, and the gateway\nat [https://dev-dot.li](https://dev-dot.li) serves the app at\n`https://<label>.dev-dot.li`. The [contracts](./contracts.md) and\n[naming](./naming.md) pages, and the [developer guides](../using-the-app/index.md),\ngo into more detail."}
{"source": "polkadot-docs", "page_id": "apps-architecture-network", "url": "https://developer.polkadot.com/apps/architecture/network/#learn-more", "page_title": "apps-architecture-network", "index": 6, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 5373, "end_char": 5608, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd12eb4e6a6df928fe7f846e212e14e5cd3f4526af10e2338e27660dc65a6dbe", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [paseo-network/runtimes](https://github.com/paseo-network/runtimes): the chain runtimes\n- [pallet-revive](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive): the PolkaVM contract environment"}
{"source": "polkadot-docs", "page_id": "apps-architecture-storage", "url": "https://developer.polkadot.com/apps/architecture/storage/#cloud-storage-storing-app-data", "page_title": "apps-architecture-storage", "index": 0, "depth": 2, "title": "Cloud Storage: storing app data", "anchor": "cloud-storage-storing-app-data", "start_char": 1070, "end_char": 2642, "estimated_token_count": 388, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ec2063e70388a7965a1084a259c4a673d4e3b8ef362bb9619e90a646a4c9a4d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Cloud Storage: storing app data\n\nWhen an app needs to persist data, it uses Cloud Storage: content-addressed\nstorage backed by Bulletin, available through TrUAPI and the\n[Product SDK](../build/platform-services-sdk.md#store-and-retrieve-data-cloud-storage).\nThe API is small: upload bytes, get a CID, fetch by CID.\n\n```ts\nconst cloud = app.cloudStorage;          // null if the service is disabled\nconst uploaded = await cloud.upload(bytes);   // -> Result<CID>\nif (uploaded.ok) {\n  const back = await cloud.fetch(uploaded.value); // -> Result<Uint8Array>\n}\n```\n\nKnow these before you design around it:\n\n- It is content-addressed, not a key-value store. You get back a CID for\n  exactly the bytes you stored, and there is no \"path\" you can overwrite. To\n  model state that changes, store the new version and keep the CID that points\n  to it (for example in a `.dot` record, a contract, or another Cloud Storage\n  object).\n- Reads are open and writes are authorized. Anyone can fetch a CID. Uploading\n  needs a connected account with a storage authorization (see below).\n- Reads only work inside a container. The client fetches through the\n  host/light-client path, and there is no public IPFS-gateway fallback.\n- Pick the right network. `cloudStorage.environment` must be `devnet` for this\n  network. It defaults to `paseo`, a different chain that a Devnet host does not\n  serve, so `createApp()` fails if you leave it out.\n\nThe [Product SDK guide](../build/platform-services-sdk.md#store-and-retrieve-data-cloud-storage)\nhas the API details and the `Result` pattern."}
{"source": "polkadot-docs", "page_id": "apps-architecture-storage", "url": "https://developer.polkadot.com/apps/architecture/storage/#how-storage-authorization-works", "page_title": "apps-architecture-storage", "index": 1, "depth": 2, "title": "How storage authorization works", "anchor": "how-storage-authorization-works", "start_char": 2642, "end_char": 4410, "estimated_token_count": 381, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ec2063e70388a7965a1084a259c4a673d4e3b8ef362bb9619e90a646a4c9a4d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How storage authorization works\n\nBulletin storage works by authorization, not by fees. You don't pay a token fee\nper upload. Instead, the uploading account must hold a live authorization: an\non-chain quota of bytes and transactions granted by an authorizer. Reading\nnever needs one. Authorization limits storing, not retrieval.\n\n```mermaid\nflowchart TD\n  AUTH[Authorizer] -->|authorize_account: bytes + tx quota| ACCT[Your account]\n  ACCT -->|signs upload| BULLETIN[Bulletin store]\n  READER[Any reader] -->|no authorization needed| BULLETIN\n```\n\nThe account that signs an upload is the account that spends the quota, so that\nis the account to authorize. For publishing, it is the account that owns your\n`.dot` name. For Cloud Storage, it is the connected user account.\n\nWrites are gated because an unmetered public store invites spam. In production,\nthe write gate is typically tied to proof of personhood or to an operator-run\nauthorizer. This Devnet leaves it open on purpose: a public Storage Faucet and\na shared authorizer let any developer get an allowance without a personhood\ncheck. Grant one from the Faucet tab of the\n[Bulletin Chain Console](https://paritytech.github.io/polkadot-bulletin-chain/)\n(select the **Products Devnet** network). The steps for publishing are in\n[Get storage authorization](../build/build-and-publish.md#get-storage-authorization).\n\nAuthorizations are finite and expire. Each one is a limited quota with an\nexpiry date, and the Console lists current authorizations and when each one\nlapses. If a deploy or upload that used to work suddenly stops at the storage\nstep, the allowance has most likely run out or expired. Grant it again and\nretry. Content that is already stored is not affected: the limit only applies\nto new writes."}
{"source": "polkadot-docs", "page_id": "apps-architecture-storage", "url": "https://developer.polkadot.com/apps/architecture/storage/#learn-more", "page_title": "apps-architecture-storage", "index": 2, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 4410, "end_char": 4907, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ec2063e70388a7965a1084a259c4a673d4e3b8ef362bb9619e90a646a4c9a4d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [App delivery](app-delivery.md): publishing an app bundle to Bulletin and\n  binding it to a `.dot` name\n- [Store and retrieve data (Cloud Storage)](../build/platform-services-sdk.md#store-and-retrieve-data-cloud-storage): the SDK API, in code\n- [Get storage authorization](../build/build-and-publish.md#get-storage-authorization): grant an allowance and publish\n- [polkadot-bulletin-chain](https://github.com/paritytech/polkadot-bulletin-chain): the storage pallet and quota model"}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#prerequisites", "page_title": "apps-build-build-and-publish", "index": 0, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 748, "end_char": 2896, "estimated_token_count": 512, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\n`pad` requires Node.js 22 or newer. On Node 20 it fails at startup with an\nunrelated-looking error (a module `SyntaxError`, or `Missing WebSocket class`),\nso check with `node --version` before installing.\n\n```bash\nnpm i -g @polkadot-community-foundation/dotns-cli@latest            # dotns\nnpm i -g @polkadot-community-foundation/polkadot-app-deploy@latest  # pad, pad-bootstrap\n```\n\nInstall only what you need: `pad` publishes (and can register the name for\nyou), and `dotns` manages names in depth. Both are large. Expect a few minutes\nand roughly 1.5 GB across the global prefix and the npm cache, with no progress\noutput while npm works.\n\nAlways take the latest release. These CLIs carry the current contract addresses\nand network presets inside them, so an older copy can talk to a retired\ndeployment and report success while nothing changes. To upgrade one you already\nhave, re-run the same command.\n\nOn some ARM64 platforms (for example Termux on Android), a transitive\ndependency, `node-datachannel`, ships no prebuilt binary, and its native build\nfails during `npm i -g`. It is only used for optional peer-to-peer CID\nverification, so skip the build with `--ignore-scripts`:\n\n```bash\nnpm i -g --ignore-scripts @polkadot-community-foundation/dotns-cli@latest\n```\n\nIn this mode only the peer-to-peer verification path is unavailable. The CLI's\ngateway-based CID verification still works.\n\n\nEvery command below targets the Devnet with `--env devnet`. `pad` already\ndefaults to `devnet`, but pass the flag every time anyway, so a command never\nlands on another network by accident.\n\nYour signing account needs three things before the first on-chain step:\n\n1. Native tokens on Asset Hub for fees. See\n   [Faucet](../reference/networks.md#faucet).\n2. A mapped EVM address. `dotns` and `pad` both sign PolkaVM transactions on\n   Asset Hub, and an unmapped account fails on its first one.\n   Map it once with `dotns account map --env devnet`.\n3. A Bulletin storage authorization, so it can upload your bundle. See\n   [below](#get-storage-authorization).\n\nYou also need to own the `.dot` name you publish to. Step 3 covers that."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#get-storage-authorization", "page_title": "apps-build-build-and-publish", "index": 1, "depth": 2, "title": "Get storage authorization", "anchor": "get-storage-authorization", "start_char": 2896, "end_char": 4234, "estimated_token_count": 287, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Get storage authorization\n\nPublishing writes your app to the Bulletin Chain. Bulletin storage works by\nauthorization, not by fees: before `pad` can upload, the uploading account\nneeds a live authorization, which is an on-chain quota of bytes and\ntransactions. You don't pay devnet tokens per upload, and `pad` never\nauthorizes itself. Without an authorization it stops before uploading anything.\n\nThe account that signs is the account that uploads. When you pass\n`--mnemonic`, `pad` uploads from that same account, so that is the account to\nauthorize: the one that owns your `.dot` name.\n\nTo grant it, open the Faucet tab of the\n[Bulletin Chain Console](https://paritytech.github.io/polkadot-bulletin-chain/),\nselect the **Products Devnet** network and authorize the SS58 address you\ndeploy with. The same page lists current authorizations and when each expires.\n\nThis Storage Faucet is not the [token faucet](../reference/networks.md#faucet).\nThe token faucet gives you native devnet tokens for transaction fees. The\nStorage Faucet grants a Bulletin storage allowance. Publishing needs both:\ntokens to sign the on-chain transactions, and an allowance to upload the\nbundle.\n\nAuthorizations are finite and expire. If a deploy that used to work stops at\nthe upload step, the allowance has most likely lapsed. Grant it again and\nre-run."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#authorize-from-the-cli", "page_title": "apps-build-build-and-publish", "index": 2, "depth": 3, "title": "Authorize from the CLI", "anchor": "authorize-from-the-cli", "start_char": 4234, "end_char": 4756, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Authorize from the CLI\n\n`dotns` can also grant the authorization directly, signed by the shared devnet\nauthorizer:\n\n```bash\ndotns bulletin authorize <your-ss58-address> \\\n  --transactions 1000 --bytes 104857600 --env devnet\n```\n\nThis draws on a shared authorizer budget, so request only what you need. 1000\ntransactions and 100 MiB comfortably cover a typical app. Raising\n`--transactions` or `--bytes` past the shared budget fails with\n`InsufficientAuthorizerBudget`. Use the Storage Faucet above for larger grants."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#deploying-without-your-own-key", "page_title": "apps-build-build-and-publish", "index": 3, "depth": 3, "title": "Deploying without your own key", "anchor": "deploying-without-your-own-key", "start_char": 4756, "end_char": 5363, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Deploying without your own key\n\n`pad` can also upload from a shared pool of helper accounts, which it uses when\nyou deploy without `--mnemonic`. Those accounts are pre-authorized on the\nDevnet, and `pad-bootstrap` (same package, no extra install) tops them up:\n\n```bash\npad-bootstrap --env devnet --authorizer \"//Eve\"\n```\n\nPass `--authorizer` explicitly. Without it, `pad-bootstrap` falls back to\n`//Alice`, which cannot grant here. This path does not authorize your own\naccount, so it is only useful for CI and shared setups. A deploy that signs\nwith `--mnemonic` still needs the authorization above."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#1-scaffold-with-the-product-sdk", "page_title": "apps-build-build-and-publish", "index": 4, "depth": 2, "title": "1. Scaffold with the Product SDK", "anchor": "1-scaffold-with-the-product-sdk", "start_char": 5363, "end_char": 6181, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 1. Scaffold with the Product SDK\n\nStart from a template rather than an empty directory. The\n[playground-app-template](https://github.com/Polkadot-Community-Foundation/playground-app-template)\nis a minimal React + Vite + TypeScript app on Product SDK 0.39.0, so it speaks\nthe hosts' TrUAPI version. It shows the app-scoped product account (SS58 and\nH160 addresses) and signs a message via `@parity/product-sdk-signer`.\n\nYour app runs as a Product inside the Polkadot host (mobile, desktop or the web\ngateway). The host lends it a signer and routes all chain RPC. You reach the\nplatform through `@parity/product-sdk`: `createApp(config)` returns an app with\nwallet, chain and cloud-storage APIs, and the SDK also has contract and\nidentity modules. See\n[Use platform services from the SDK](platform-services-sdk.md)."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#2-build-the-frontend", "page_title": "apps-build-build-and-publish", "index": 5, "depth": 2, "title": "2. Build the frontend", "anchor": "2-build-the-frontend", "start_char": 6181, "end_char": 6362, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 2. Build the frontend\n\nProduce a static build directory. With a Vite template:\n\n```bash\nnpm install\nnpm run build   # emits dist/\n```\n\nThe output (`dist/`) is what you publish."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#3-register-a-dot-domain", "page_title": "apps-build-build-and-publish", "index": 6, "depth": 2, "title": "3. Register a .dot domain", "anchor": "3-register-a-dot-domain", "start_char": 6362, "end_char": 7156, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 3. Register a .dot domain\n\nNames are `.dot` domains managed by DotNS. Check that the name is free and\nregister it with the DotNS CLI:\n\n```bash\ndotns lookup name <name> --env devnet\ndotns register domain -n <name> --env devnet\n```\n\nPass the label without the `.dot` suffix: `my-cool-app`, not `my-cool-app.dot`.\n\nPick a label whose stem is nine characters or longer, so it registers without a\npersonhood check. Shorter labels are gated. Registration is a commit-reveal\nhandshake that takes a few minutes and costs a deposit.\n[Register a .dot domain](register-a-dot-name.md) has the rules and the\nverification step.\n\nYou can skip this step if you deploy with the account that will hold the name.\n`pad` registers the name for you during deploy if your signing account does not\nalready own it."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#4-publish-with-pad", "page_title": "apps-build-build-and-publish", "index": 7, "depth": 2, "title": "4. Publish with pad", "anchor": "4-publish-with-pad", "start_char": 7156, "end_char": 8179, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 4. Publish with pad\n\nPoint `pad` at your build directory and the target name. `pad` takes its signer\nexplicitly. It does not read the dotns keystore:\n\n```bash\npad ./dist <name>.dot --env devnet --mnemonic \"$MNEMONIC\"\n```\n\nKeep the phrase in an environment variable, and never commit or print it.\n\n`pad` can also sign in with your Polkadot app: run `pad login` and pair your\nphone. While you are signed in, `pad` registers and deploys with a local key,\nthen hands the name to your app account, so your phone signs nothing. These\nguides use `--mnemonic` throughout.\n\n`pad` uploads the bundle to Bulletin (skipping unchanged blocks on repeat\ndeploys), registers the name if needed and writes the content hash on Asset\nHub. A successful run ends with `Verified on-chain:` and the CID it published.\n\nCheck that the name points at that CID before you share it:\n\n```bash\ndotns content view <name> --env devnet\n```\n\nThe app is now live at `<name>.dot` in the Polkadot app and at\n`https://<name>.dev-dot.li` on the web gateway."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#add-card-metadata", "page_title": "apps-build-build-and-publish", "index": 8, "depth": 3, "title": "Add card metadata", "anchor": "add-card-metadata", "start_char": 8179, "end_char": 9277, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Add card metadata\n\nBrowse and the Polkadot app show your Product using a product config that `pad`\nreads at deploy time. Without one, the app still works, but it has no name,\ndescription or icon to show.\n\nSave this as `polkadot-app-deploy.config.ts` in your project. `pad` walks up\nfrom the build directory to find it:\n\n```ts\nexport default {\n  domain: \"my-cool-app.dot\",\n  displayName: \"My Cool App\",\n  description: \"What it does, in one line.\",\n  icon: { path: \"./icon.png\", format: \"png\" },\n  executables: [{ kind: \"app\", path: \"./dist\", appVersion: [1, 0, 0] }],\n};\n```\n\nPaths are relative to the config file, and the icon must exist. `pad` checks\nall of this before it uploads anything. It then uploads the icon and writes the\n`manifest` record on your name, plus an `executable` record on\n`app.<name>.dot`:\n\n```\nIcon CID: bafk2bzacecqdzkvdzflim3gspebc2iaqfjxtmqbuo6lpaqmvmlfhvkqxl2klw\nWriting root manifest text record on my-cool-app.dot (177 B)…\n✓ 2 text records written.\n```\n\n`executables` also accepts `widget` and `worker` entries, published to the\n`widget.` and `worker.` subnames."}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#reference-apps", "page_title": "apps-build-build-and-publish", "index": 9, "depth": 2, "title": "Reference apps", "anchor": "reference-apps", "start_char": 9277, "end_char": 10176, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Reference apps\n\nThese small apps are deployed on the Devnet. Their source is in the\n[browse repository](https://github.com/paritytech/browse/tree/main/apps/registry/tests/fixture-projects):\n\n| App | Open | `.dot` name | What it does |\n| --- | --- | --- | --- |\n| Calculator | <https://calculator.dev-dot.li> | `calculator.dot` | A basic calculator |\n| Stopwatch | <https://stopwatch.dev-dot.li> | `stopwatch.dot` | A stopwatch |\n| Countdown Timer | <https://countdown-timer.dev-dot.li> | `countdown-timer.dot` | Counts down from a time you set |\n| Alarm Clock | <https://alarm-clock.dev-dot.li> | `alarm-clock.dot` | Rings at the time you set |\n| Chess Clock | <https://chess-clock.dev-dot.li> | `chess-clock.dot` | Two clocks for a two-player game; tap to pass the turn |\n| Unit Converter | <https://unit-converter.dev-dot.li> | `unit-converter.dot` | Converts units, such as metres to feet |"}
{"source": "polkadot-docs", "page_id": "apps-build-build-and-publish", "url": "https://developer.polkadot.com/apps/build/build-and-publish/#learn-more", "page_title": "apps-build-build-and-publish", "index": 10, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 10176, "end_char": 10563, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:64231c82132752e9ac97b8ab89282e7106a3dfc39ccaa2f15e848025335cf37d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [Register a .dot domain](register-a-dot-name.md): everything you can do with names\n- [Use platform services from the SDK](platform-services-sdk.md): once your app is live\n- [App delivery](../architecture/app-delivery.md): how publishing works\n- [How Bulletin authorization works](https://github.com/paritytech/polkadot-bulletin-chain): the storage pallet and quota model"}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#introduction", "page_title": "Add a Smart Contract to Your Product", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 41, "end_char": 1656, "estimated_token_count": 395, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nSome Products need on-chain logic and shared state that no single user owns: a leaderboard, a registry, an escrow, a game whose rules must be enforced for everyone. That is what a smart contract gives you. This guide adds a [PolkaVM](/reference/glossary/#polkadot-virtual-machine-pvm) contract to a Product, deploys it to Asset Hub, and calls it from your frontend with the [`@parity/product-sdk-contracts`](https://paritytech.github.io/product-sdk/) package.\n\nContracts on Polkadot run as PolkaVM bytecode through the `pallet-revive` runtime on Asset Hub. You author them in Rust or Solidity, and the [Contract Dependency Manager](https://github.com/paritytech/contract-dependency-manager) (`cdm`) builds, deploys, and registers them, the same tool the `playground` CLI runs for you when it deploys a Product that has contracts. `cdm` fills the role npm fills for libraries, but for on-chain contracts: it publishes each contract under a global name (`@scope/name`) in an on-chain registry, so your frontend resolves it by name instead of hardcoding an address.\n\n!!! note \"Contracts are optional\"\n    Many Products never need a contract. If all you need is durable content or real-time state between users, [Store Data on Chain](/apps/build/store-data-on-chain/) and [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/) cover those without any contract at all. Reach for a contract when you need enforced, shared on-chain logic.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Smart contracts](/apps/architecture/contracts/)."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#prerequisites", "page_title": "Add a Smart Contract to Your Product", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1656, "end_char": 2295, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have:\n\n- A Polkadot Product project running locally. See [Set Up Your Project](/apps/build/#set-up-your-project).\n- PAS funds and a Bulletin Chain authorization for the account `cdm` will sign with. See [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/). Deploying a contract writes to Asset Hub (fees) and publishes metadata to the Bulletin Chain (authorization). The next two sections cover installing `cdm` and creating that account.\n- A workstation rather than a browser alone. Contracts compile to PolkaVM, so unlike the frontend capabilities this step needs a local toolchain."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#install-cdm", "page_title": "Add a Smart Contract to Your Product", "index": 2, "depth": 2, "title": "Install cdm", "anchor": "install-cdm", "start_char": 2295, "end_char": 2937, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install cdm\n\nInstall the `cdm` binary. The installer also pulls the Rust nightly toolchain with `rust-src` and the `cargo-pvm-contract` build tool:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/paritytech/contract-dependency-manager/main/install.sh | bash\n```\n\nUpdate an existing install with `cdm update`.\n\n!!! note \"`cdm` and `playground` are separate installs\"\n    Installing the [`playground` CLI](/apps/quick-start/) does not give you `cdm`, and vice versa. `playground deploy` shells out to its own bundled CDM pipeline for the contract step, but running `cdm` directly, as this guide does, needs the binary on your `PATH`."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#set-up-a-signing-account", "page_title": "Add a Smart Contract to Your Product", "index": 3, "depth": 2, "title": "Set Up a Signing Account", "anchor": "set-up-a-signing-account", "start_char": 2937, "end_char": 4375, "estimated_token_count": 348, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Set Up a Signing Account\n\n`cdm` signs from the CLI with its own keypair, separate from the account your phone holds. Generate one for the network, then map it for `pallet-revive`:\n\n```bash\ncdm init -n paseo\ncdm account map -n paseo\n```\n\nThe mapping step is required before your first deploy: `pallet-revive` needs each signing account bound to its H160 address, and without it the deploy fails. Two related subcommands are useful while you work:\n\n- **`cdm account bal -n paseo`**: Prints the account's balance and its Bulletin allowances, and links to a top-up when they run low.\n- **`cdm account set -n paseo --mnemonic \"…\"`**: Imports an existing account instead of generating one.\n\n!!! warning \"`cdm`'s `paseo` preset is Paseo Next, not the Paseo TestNet\"\n    `cdm -n paseo` targets the Paseo Asset Hub preview network (para 1500), the same network the `playground` CLI deploys to. `cdm -n devnet` targets Products Devnet, the Paseo TestNet Asset Hub (para 1000) with a registry operated by the Polkadot Community Foundation (PCF). Problems with Products Devnet go to PCF, not Parity; see [Choose the Right Channel](/get-support/#choose-the-right-channel). They are different chains with different registries, so a contract deployed under one preset is not resolvable under the other. Fund the account on the network you actually target — the [faucet](/apps/get-started/get-testnet-tokens/) needs `?parachain=1500` for Paseo Next."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#how-contracts-fit-together", "page_title": "Add a Smart Contract to Your Product", "index": 4, "depth": 2, "title": "How Contracts Fit Together", "anchor": "how-contracts-fit-together", "start_char": 4375, "end_char": 5608, "estimated_token_count": 288, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How Contracts Fit Together\n\nFour things happen when you publish a contract, and `cdm` handles all of them in one flow:\n\n- **Build**: Your Rust or Solidity contract compiles to PolkaVM bytecode targeting `pallet-revive` (Solidity via `resolc`).\n- **Deploy**: The bytecode is instantiated on Asset Hub at a deterministic address.\n- **Publish metadata**: The contract's ABI and docs are uploaded to the Bulletin Chain, addressed by CID.\n- **Register**: The contract's global name (`@scope/name`) is recorded in the on-chain `ContractRegistry`, mapping the name to its address and metadata CID.\n\nYour frontend then reads a project-local manifest, `cdm.json`, which holds the deployed address and ABI for each contract your Product depends on. The [`@parity/product-sdk-contracts`](https://paritytech.github.io/product-sdk/) package turns that manifest into typed contract objects.\n\n!!! warning \"The registry is append-only\"\n    Registration is permanent: the first account to publish a name owns it, versions only ever increment, and nothing can be overwritten or deleted. Do not publish a name you are only testing with as your real account, and never register anything you want to keep from a shared dev account such as `//Alice`."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#scaffold-a-contract", "page_title": "Add a Smart Contract to Your Product", "index": 5, "depth": 2, "title": "Scaffold a Contract", "anchor": "scaffold-a-contract", "start_char": 5608, "end_char": 8488, "estimated_token_count": 676, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Scaffold a Contract\n\n`cdm` ships example templates. Scaffold the `shared-counter` template, which defines a minimal counter contract you can adapt:\n\n```bash\ncdm template shared-counter\n```\n\nThat writes a Cargo workspace and a `cdm.json` manifest into `./shared-counter`. Pass a target directory to override the location, or `.` to scaffold into the current directory. The template ships three crates under `contracts/` that demonstrate a dependency graph: `counter` holds the shared count, `counter-writer` calls `counter.increment()` through a CDM reference, and `counter-reader` queries `counter.get_count()`.\n\n!!! tip \"A fuller example\"\n    `cdm template instagram` scaffolds a complete browser app rather than bare contracts, combining Product Account signing, Bulletin uploads, and `ContractManager` resolution from `cdm.json`. Reach for it when you want to read a working end-to-end Product instead of assembling one.\n\nEach crate declares its CDM package name in its own `Cargo.toml`:\n\n```toml title=\"contracts/counter/Cargo.toml\"\n[package.metadata.cdm]\npackage = \"@example/counter\"\n```\n\nThe contract itself is a module holding a storage struct and an `impl` block, annotated with the PolkaVM contract SDK macros:\n\n```rust title=\"contracts/counter/lib.rs\"\n#![cfg_attr(not(feature = \"abi-gen\"), no_main, no_std)]\n\n#[pvm_contract_sdk::contract(allocator = \"pico\", allocator_size = 1024)]\nmod counter {\n    use pvm_contract_sdk::Lazy;\n\n    pub struct Counter {\n        // Storage slots are auto-numbered in declaration order (`count` gets slot 0).\n        count: Lazy<u32>,\n    }\n\n    impl Counter {\n        #[pvm_contract_sdk::constructor]\n        pub fn new(&mut self) {\n            self.count.set(&0);\n        }\n\n        #[pvm_contract_sdk::method]\n        pub fn increment(&mut self) {\n            let current = self.count.get();\n            self.count.set(&(current + 1));\n        }\n\n        #[pvm_contract_sdk::method]\n        pub fn get_count(&self) -> u32 {\n            self.count.get()\n        }\n    }\n}\n```\n\nNote that the constructor takes `&mut self` and initializes storage in place; it does not return `Self`. Storage fields are wrapped in `Lazy<T>` so each is read and written on demand rather than loaded wholesale.\n\nBefore deploying, change _every_ `[package.metadata.cdm] package = \"@example/…\"` entry in the workspace to a scope you control, for example `@my-app/counter`. Package names are global per registry, the scaffolded `@example` scope is a placeholder, and registration is first-writer-owns, so you want your own scope on all three crates.\n\n!!! tip \"Prefer Solidity?\"\n    `cdm` also ships Solidity templates (`foundry-counter` and `hardhat-counter`) that compile to PolkaVM via `resolc`. Scaffold one the same way, for example `cdm template foundry-counter`. The deploy and frontend steps below are identical regardless of the contract language."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#verify-the-toolchain", "page_title": "Add a Smart Contract to Your Product", "index": 6, "depth": 2, "title": "Verify the Toolchain", "anchor": "verify-the-toolchain", "start_char": 8488, "end_char": 8846, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Verify the Toolchain\n\nThe `cdm` installer already set up the Rust nightly, `rust-src`, and `cargo-pvm-contract` that the contract compiler needs. Confirm they are in place before your first build:\n\n```bash\ncdm setup --check\n```\n\nIf anything is missing or was broken by an unrelated Rust change, `cdm setup` installs or repairs it:\n\n```bash\ncdm setup\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#build-and-deploy", "page_title": "Add a Smart Contract to Your Product", "index": 7, "depth": 2, "title": "Build and Deploy", "anchor": "build-and-deploy", "start_char": 8846, "end_char": 10192, "estimated_token_count": 326, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Build and Deploy\n\nDeploy with `cdm deploy`, selecting the target network with `-n`. This builds the bytecode, deploys it to Asset Hub, uploads the ABI to the Bulletin Chain, and registers the name, all in one flow:\n\n```bash\ncdm deploy -n paseo --suri \"INSERT_ACCOUNT_SECRET_URI\"\n```\n\n`cdm` signs from the CLI with the account you pass as `--suri`, or with the keypair `cdm init` generated for the network. It does not sign through the Polkadot App or a phone. The `-n` preset also selects the registry for the network, so you do not set a registry address by hand.\n\n!!! warning \"Always pass a signer you control\"\n    With no `--suri` and no `cdm init` account, `cdm` falls back to the shared `//Alice` development key. Because registration is first-writer-owns, deploying that way parks your contract name on a public key anyone can use. Pass `--suri` (or run `cdm init` first) so the name and contract belong to you.\n\n!!! note \"Deploying alongside your Product\"\n    When you deploy the whole Product with [`playground deploy`](/apps/deploy-your-app/), the CLI runs this contract step for you. At the `did you change your smart contracts?` prompt, choose `yes` and the CLI redeploys the contracts and rebuilds the site to match. Use `cdm deploy` directly when you want to iterate on the contract on its own, without redeploying the frontend."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#add-the-contract-to-your-manifest", "page_title": "Add a Smart Contract to Your Product", "index": 8, "depth": 2, "title": "Add the Contract to Your Manifest", "anchor": "add-the-contract-to-your-manifest", "start_char": 10192, "end_char": 11158, "estimated_token_count": 255, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Add the Contract to Your Manifest\n\nYour frontend resolves contracts from `cdm.json`, and `cdm deploy` does not write that file — `cdm install` does. After deploying, install your contract to write its address and ABI into the manifest. Installing works the same for a contract someone else published, so pass whichever `@scope/name` you need:\n\n```bash\ncdm install @my-app/counter -n paseo\n```\n\n`cdm install` resolves the name against the on-chain registry, fetches the ABI from the Bulletin Chain, and writes the entry into `cdm.json`:\n\n```json title=\"cdm.json\"\n{\n  \"dependencies\": {\n    \"@my-app/counter\": \"latest\"\n  },\n  \"contracts\": {\n    \"@my-app/counter\": {\n      \"version\": 1,\n      \"address\": \"0x…\",\n      \"abi\": [ /* … */ ],\n      \"metadataCid\": \"bafy…\"\n    }\n  }\n}\n```\n\nThe `shared-counter` template ships its `cdm.json` already populated for the example contracts, so you only run `cdm install` when you deploy your own contract or add someone else's."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#call-the-contract-from-your-frontend", "page_title": "Add a Smart Contract to Your Product", "index": 9, "depth": 2, "title": "Call the Contract From Your Frontend", "anchor": "call-the-contract-from-your-frontend", "start_char": 11158, "end_char": 14110, "estimated_token_count": 713, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Call the Contract From Your Frontend\n\nInstall the contracts package (or use the umbrella `@parity/product-sdk`):\n\n```bash\nnpm install @parity/product-sdk-contracts @parity/product-sdk-chain-client @parity/product-sdk-descriptors @parity/product-sdk-signer\n```\n\nBuild a `ContractManager` from the manifest and the host-routed chain client, map your signing account once (every contract write fails with `AccountNotMapped` until you do), then get a typed handle by name. Reads use `query` (a dry run — check `.success`), and writes use `tx` (which signs through the Host — check `.ok`):\n\n```typescript\nimport { SignerManager } from '@parity/product-sdk-signer';\nimport { createChainClient } from '@parity/product-sdk-chain-client';\nimport { paseo_asset_hub } from '@parity/product-sdk-descriptors/paseo-asset-hub';\nimport {\n  ContractManager,\n  ensureContractAccountMapped,\n} from '@parity/product-sdk-contracts';\nimport cdmJson from './cdm.json';\n\nasync function useCounter() {\n  // The same SignerManager setup as Sign and Submit Transactions.\n  const signerManager = new SignerManager({ ss58Prefix: 0, dappName: 'my-app.dot' });\n  const connected = await signerManager.connect();\n  if (!connected.ok) return;\n\n  const productAccount = await signerManager.getProductAccount('my-app.dot', 0);\n  if (!productAccount.ok) return;\n\n  const account = productAccount.value;\n  const signer = account.getSigner();\n\n  const client = await createChainClient({ chains: { assetHub: paseo_asset_hub } });\n\n  const manager = ContractManager.fromClient(\n    cdmJson,\n    client.raw.assetHub,\n    paseo_asset_hub,\n    { signerManager },\n  );\n\n  // pallet-revive requires each signing account to be mapped once.\n  await ensureContractAccountMapped(manager.getRuntime(), account.address, signer);\n\n  const counter = manager.getContract('@my-app/counter');\n\n  // Read: a dry run. Check .success before reading .value.\n  const count = await counter.getCount.query();\n  if (count.success) {\n    console.log(count.value);\n  }\n\n  // Write: signs through the Host. Returns a Result — check .ok.\n  const result = await counter.increment.tx({ signer });\n  if (!result.ok) {\n    console.error(result.error.message);\n  }\n}\n```\n\nPassing `signerManager` to `fromClient` lets the manager resolve the current account at call time, so an account switch is picked up without rebuilding it. See [Sign and Submit Transactions](/apps/build/sign-and-submit/) for the signing setup in depth. Contract writes are signed by your Product-scoped account, so they route to the user's phone for approval like any other transaction. For the full frontend surface, see [Contracts](/apps/product-sdk/contracts/).\n\n!!! note \"query returns a status, tx returns a Result\"\n    `query` is a dry run that does not throw on a revert; branch on `.success`, because on failure `.value` holds the dispatch-error payload, not your data. `tx` returns a `Result`; check `.ok` before assuming the write landed."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#redeploy-after-a-contract-change", "page_title": "Add a Smart Contract to Your Product", "index": 10, "depth": 2, "title": "Redeploy After a Contract Change", "anchor": "redeploy-after-a-contract-change", "start_char": 14110, "end_char": 15836, "estimated_token_count": 376, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Redeploy After a Contract Change\n\nContracts are immutable once deployed. Changing contract code means deploying a new version: run `cdm deploy -n paseo --suri ...` again (or choose `yes` at the contract prompt in `playground deploy`). The registry appends a new version under the same name; run `cdm install @my-app/counter -n paseo` afterward to refresh the address and ABI in `cdm.json` so your frontend picks up the new deployment.\n\nBecause a redeploy gives your contract a new on-chain address, existing users pointed at the old address keep using the old contract until they load the new bundle. Storage does not move with it: the new instance starts empty, and the old one keeps serving whoever has not reloaded.\n\nFor a contract with live users and stored state, that makes a redeploy a migration rather than an update. What it takes:\n\n- **Snapshot the old state before you redeploy.** Read it out through the old contract's `query` methods while its address is still the one in `cdm.json`, since afterward you need the previous address to reach it.\n- **Seed the new instance** from that snapshot, or give the contract a method that accepts it, before pointing users at the new address.\n- **Keep reading from the old address until the new one is populated**, so users who reload mid-migration do not see an empty contract.\n- **Expect a window where both are live.** Users on the old bundle keep writing to the old address until they reload, so either accept losing those writes or drain them after the fact.\n\nNone of that is automated. If your contract will hold state you cannot afford to lose, design for it up front — an explicit initializer that accepts prior state costs far less than reconstructing one later."}
{"source": "polkadot-docs", "page_id": "apps-build-deploy-a-smart-contract", "url": "https://developer.polkadot.com/apps/build/deploy-a-smart-contract/#where-to-go-next", "page_title": "Add a Smart Contract to Your Product", "index": 11, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 15836, "end_char": 16784, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:587949a5278e26dbd85364efaaa4975efe2ce8b9dfc7e693a2f9bdbfa13c7f2c", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Deploy Your App**\n\n    ---\n\n    Deploy the whole Product, contracts and frontend together, and register a `.dot` name with the `playground` CLI.\n\n    [:octicons-arrow-right-24: Deploy Your App](/apps/deploy-your-app/)\n\n-   <span class=\"badge external\">External</span> **Product SDK API Reference**\n\n    ---\n\n    The full `@parity/product-sdk-contracts` surface: `ContractManager`, contract handles, and the `query`, `tx`, and `prepare` methods.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/)\n\n-   <span class=\"badge external\">External</span> **Contract Dependency Manager**\n\n    ---\n\n    The `cdm` toolchain in depth: templates, the registry model, versioning, and installing published contracts.\n\n    [:octicons-arrow-right-24: Visit Repo](https://github.com/paritytech/contract-dependency-manager)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-build", "url": "https://developer.polkadot.com/apps/build/#set-up-your-project", "page_title": "Build", "index": 0, "depth": 2, "title": "Set Up Your Project", "anchor": "set-up-your-project", "start_char": 1064, "end_char": 2683, "estimated_token_count": 412, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c6fed6d5ca726bcd074813c8719e6e67fb0edc8002b1be6fc618a0ad38d5f07", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Set Up Your Project\n\nEvery guide assumes a Product project running locally in [Polkadot Desktop](/apps/get-started/). The steps below apply no matter how you bootstrapped your Product: a [Quick Start](/apps/quick-start/) deploy (RevX or CLI) or a project created from scratch.\n\n1. Scaffold a project. Any framework that serves on `localhost` works; this example uses Next.js:\n\n    ```bash\n    npx create-next-app@latest my-product\n    cd my-product\n    ```\n\n2. Install the [Product SDK](https://github.com/paritytech/product-sdk):\n\n    ```bash\n    npm install @parity/product-sdk\n    ```\n\n3. Start the dev server:\n\n    ```bash\n    npm run dev\n    ```\n\n4. Open Polkadot Desktop and click **Skip (Dev only)**.\n\n    ![Polkadot Desktop showing the \"Skip (Dev only)\" button](/images/apps/build/start-a-local-dev-loop/start-a-local-dev-loop-01.webp)\n\n5. Type `localhost:3000` (or your dev server's port) in the address bar and press **Enter**.\n\n    Desktop recognizes `localhost` as a whitelisted origin, skips `.dot` resolution, and loads your Product directly from the local server.\n\n    ![Polkadot Desktop showing a local Product loaded from localhost:3000](/images/apps/build/start-a-local-dev-loop/start-a-local-dev-loop-02.webp)\n\nYour Product is now running inside the Polkadot Desktop sandbox, served from your local machine. Live reload works through your dev server's hot module replacement: edit, save, and watch the change appear in Desktop. The sandbox and permission prompts apply exactly as they would for a published `.dot` Product, and no Proof of Personhood or funds are needed to load from `localhost`."}
{"source": "polkadot-docs", "page_id": "apps-build", "url": "https://developer.polkadot.com/apps/build/#capabilities", "page_title": "Build", "index": 1, "depth": 2, "title": "Capabilities", "anchor": "capabilities", "start_char": 2683, "end_char": 4961, "estimated_token_count": 591, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c6fed6d5ca726bcd074813c8719e6e67fb0edc8002b1be6fc618a0ad38d5f07", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Capabilities\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge beginner\">Beginner</span> **Read On-Chain Data**\n\n    ---\n\n    Your Product needs to show live balances, storage, and chain state. Reads are unsigned: no account, no tokens, no infrastructure to run.\n\n    [:octicons-arrow-right-24: Read On-Chain Data](/apps/build/read-chain-state/)\n\n-   <span class=\"badge beginner\">Beginner</span> **Sign and Submit Transactions**\n\n    ---\n\n    Your Product needs to act on chain on the user's behalf. Derive a per-user account and request signatures; every approval happens on the user's phone.\n\n    [:octicons-arrow-right-24: Sign and Submit Transactions](/apps/build/sign-and-submit/)\n\n-   <span class=\"badge intermediate\">Intermediate</span> **Store Data on Chain**\n\n    ---\n\n    Your Product needs content that outlives a session: profile photos, published posts, file uploads. Write to the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/) and fetch from anywhere by CID.\n\n    [:octicons-arrow-right-24: Store Data on Chain](/apps/build/store-data-on-chain/)\n\n-   <span class=\"badge intermediate\">Intermediate</span> **Publish and Subscribe to Off-Chain Data**\n\n    ---\n\n    Your Product needs real-time state between users: presence, typing indicators, multiplayer cursors. Signed pub/sub via the [Statement Store](/reference/apps/infrastructure/statement-store/), no fees per message.\n\n    [:octicons-arrow-right-24: Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/)\n\n-   <span class=\"badge beginner\">Beginner</span> **Persist Data Locally**\n\n    ---\n\n    Your Product needs to remember things on this device: preferences, drafts, cached values. Per-Product key-value storage backed by the Host, with no browser `localStorage` fallback.\n\n    [:octicons-arrow-right-24: Persist Data Locally](/apps/build/persist-data-locally/)\n\n-   <span class=\"badge advanced\">Advanced</span> **Add a Smart Contract to Your Product**\n\n    ---\n\n    Your Product needs enforced, shared on-chain logic: a leaderboard, a registry, an escrow. Deploy a PolkaVM contract to Asset Hub and call it by name from your frontend.\n\n    [:octicons-arrow-right-24: Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-build", "url": "https://developer.polkadot.com/apps/build/#the-product-sdk-packages", "page_title": "Build", "index": 2, "depth": 2, "title": "The `product-sdk` Packages", "anchor": "the-product-sdk-packages", "start_char": 4961, "end_char": 8972, "estimated_token_count": 1152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c6fed6d5ca726bcd074813c8719e6e67fb0edc8002b1be6fc618a0ad38d5f07", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The `product-sdk` Packages\n\nEach guide is built around one _primary_ package and weaves in _utility_ packages where they are needed. The full source is at [`paritytech/product-sdk`](https://github.com/paritytech/product-sdk). Here is what each package is for:\n\n|      Package      |                                                                                                                    What it does                                                                                                                     |                                     Guide                                      |\n|:-----------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------:|\n|  [`chain-client`](/apps/product-sdk/chain-client/)   |                                                A typed, host-routed client for reading on-chain storage, constants, and account state across one or more chains, with no RPC infrastructure to run.                                                 |              [Read On-Chain Data](/apps/build/read-chain-state/)               |\n|     [`signer`](/apps/product-sdk/signer/)      |                                             Derives product-scoped accounts and requests signatures, routing every approval to the user's [Polkadot App](/reference/apps/hosts/polkadot-app/). Your Product signs without ever handling keys.                                              |          [Sign and Submit Transactions](/apps/build/sign-and-submit/)          |\n|  [`cloud-storage`](/apps/product-sdk/cloud-storage/)  | A high-level client for the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/), Polkadot's content-addressed storage. Uploads and retrieves data by CID, with chunking, manifests, and authorization handled for you. |            [Store Data on Chain](/apps/build/store-data-on-chain/)             |\n| [`statement-store`](/apps/product-sdk/statement-store/) | A pub/sub client for the [Statement Store](/reference/apps/infrastructure/statement-store/): publish and subscribe to signed, short-lived statements gossiped peer-to-peer off-chain. Ideal for real-time signaling between users.  | [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/) |\n|  [`local-storage`](/apps/product-sdk/local-storage/)  |                                                       A per-Product, per-device key-value store backed by the Host, for preferences, drafts, and cached values that persist across sessions.                                                        |           [Persist Data Locally](/apps/build/persist-data-locally/)            |\n|    [`contracts`](/apps/product-sdk/contracts/)    |                             Typed calls to `pallet-revive` (PolkaVM) smart contracts on Asset Hub, resolved by name from a `cdm.json` manifest, for enforced shared on-chain logic and state.                              |    [Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/)    |\n\nThese packages anchor the current recipes because their surfaces are stable. Other packages in the SDK ([`keys`](/apps/product-sdk/keys/), `crypto`, [`host`](/apps/product-sdk/host/)) will get recipes of their own as their surfaces stabilize.\n\nThe guides also use these utility packages where relevant:\n\n- **[`tx`](/apps/product-sdk/tx/)**: Builds, signs, and tracks the lifecycle of transactions (used alongside [`signer`](/apps/product-sdk/signer/)).\n- **`address`**: Encodes, decodes, and validates SS58 addresses.\n- **`descriptors`**: Provides typed chain metadata for the [`chain-client`](/apps/product-sdk/chain-client/) Bring Your Own Descriptors path.\n- **`host`**: Provides low-level access to the Host API surfaces the higher-level packages build on."}
{"source": "polkadot-docs", "page_id": "apps-build", "url": "https://developer.polkadot.com/apps/build/#umbrella-or-individual-packages", "page_title": "Build", "index": 3, "depth": 2, "title": "Umbrella or Individual Packages", "anchor": "umbrella-or-individual-packages", "start_char": 8972, "end_char": 10192, "estimated_token_count": 289, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c6fed6d5ca726bcd074813c8719e6e67fb0edc8002b1be6fc618a0ad38d5f07", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Umbrella or Individual Packages\n\nMost guides work with either install style. Guides built on `createApp`, such as [Store Data on Chain](/apps/build/store-data-on-chain/) and [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/), need the umbrella package, because `createApp` has no standalone package. Choose based on your needs:\n\n- **Umbrella package**: `npm install @parity/product-sdk`. One dependency that re-exports everything. Convenient when your Product uses several capabilities and bundle size is not a concern.\n- **Individual packages**: `npm install @parity/product-sdk-cloud-storage` (and so on). Install only what you use to keep your bundle smaller and your dependencies explicit.\n\nThe import specifiers differ between the two — the umbrella exposes subpaths like `@parity/product-sdk/cloud-storage`, while the standalone package is `@parity/product-sdk-cloud-storage` — so switching styles means updating your imports. Start with the umbrella and switch to individual packages later as a bundle-size optimization.\n\nFor the full tour of the SDK — `createApp`, the package family, React bindings, and testing without a Host — see the [Product SDK overview](/apps/product-sdk/)."}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#introduction", "page_title": "Persist Data Locally", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 1267, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis guide covers the `@parity/product-sdk-local-storage` package, which provides a `LocalKvStore` for storing and retrieving key-value data between sessions. Use it for device-local data like saved preferences, unsubmitted drafts, or cached responses. Data is scoped to your Product and device; it does not sync across devices or leak between Products on the same Host.\n\n!!! info \"Storage options for your Product\"\n    Match the data to the layer built for it; see [Where to Store Data](/apps/concepts/data-placement/) for the full decision guide.\n\n    - **Local storage**: Per-Product, per-device key-value for preferences, drafts, and cached values. Not synced across devices. See [Persist Data Locally](/apps/build/persist-data-locally/).\n    - **Bulletin Chain**: Content-addressed, on-chain, retained ~2 weeks by default and renewable. Fetched later by CID: profile photos, published articles, app bundles. See [Store Data on Chain](/apps/build/store-data-on-chain/).\n    - **Statement Store**: Gossip-distributed, short-lived (default 30s TTL), allowance-gated. Real-time signaling between users: chat, presence, typing indicators. See [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/)."}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#prerequisites", "page_title": "Persist Data Locally", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1267, "end_char": 1524, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have:\n\n- A Polkadot Product project running locally (see [Set Up Your Project](/apps/build/#set-up-your-project))\n- Node.js 20 or later with ESM support (`@parity/product-sdk-local-storage` is ESM only)"}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#install-the-sdk", "page_title": "Persist Data Locally", "index": 2, "depth": 2, "title": "Install the SDK", "anchor": "install-the-sdk", "start_char": 1524, "end_char": 2958, "estimated_token_count": 332, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install the SDK\n\nThe SDK installs two ways. The umbrella package, `@parity/product-sdk`, is the recommended starting point: one dependency that re-exports most of the SDK. Individual packages install only what you use, which keeps your bundle smaller and your dependencies explicit, so switch to them later as a bundle-size optimization. The two use different import specifiers, so switching styles means updating your imports. See [Umbrella or Individual Packages](/apps/build/#umbrella-or-individual-packages) for the full comparison.\n\n\n- **Umbrella package**: The whole SDK in one dependency.\n\n    ```bash\n    npm install @parity/product-sdk\n    ```\n\n- **Individual package**: Only local storage.\n\n    ```bash\n    npm install @parity/product-sdk-local-storage\n    ```\n\nThe import specifiers differ between the two. The snippets in this guide use the standalone specifier `@parity/product-sdk-local-storage`; on the umbrella, the same exports come from the `@parity/product-sdk/local-storage` subpath. The React hooks shown later are umbrella-only, under `@parity/product-sdk/react`.\n\n!!! note \"Code examples\"\n    Each snippet in this guide is a standalone file you add to your Product's source tree. The filenames match the `title` shown in the code block header (for example, `initialize.ts`, `set-get-string.ts`). They are not meant to be concatenated; import and use each one independently wherever it fits in your Product."}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#initialize-the-store", "page_title": "Persist Data Locally", "index": 3, "depth": 2, "title": "Initialize the Store", "anchor": "initialize-the-store", "start_char": 2958, "end_char": 3751, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize the Store\n\n`createLocalKvStore()` is an async factory. You must `await` it before performing any read or write, because the function connects to the Host storage backend before the store is usable.\n\n```typescript title=\"initialize.ts\"\nimport { createLocalKvStore } from '@parity/product-sdk-local-storage';\nimport type { LocalKvStore } from '@parity/product-sdk-local-storage';\n\n// Connects to the Host storage backend. Must run inside a Polkadot Product;\n// outside a host container this throws \"Host storage unavailable\".\nconst store: LocalKvStore = await createLocalKvStore();\n\n```\n\n`createLocalKvStore()` accepts an optional `LocalKvStoreOptions` argument. The supported option is `prefix`, which is covered in [Namespace Keys with Prefixes](#namespace-keys-with-prefixes)."}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#store-string-values", "page_title": "Persist Data Locally", "index": 4, "depth": 2, "title": "Store String Values", "anchor": "store-string-values", "start_char": 3751, "end_char": 4160, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Store String Values\n\nUse `store.set(key, value)` to write a string value for a key. Use `store.get(key)` to read it back. If the key has not been set, `get` returns `null`.\n\n```typescript title=\"set-get-string.ts\"\nawait store.set('network', 'paseo');\n\nconst network = await store.get('network');\n\nif (network === null) {\n  console.log('Key not found');\n} else {\n  console.log('Network:', network);\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#store-json-values", "page_title": "Persist Data Locally", "index": 5, "depth": 2, "title": "Store JSON Values", "anchor": "store-json-values", "start_char": 4160, "end_char": 4923, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Store JSON Values\n\nUse `store.setJSON(key, value)` to write any JSON-serializable value. The store handles serialization for you. Use `store.getJSON<T>(key)` to read it back; the generic type parameter `T` enables type-safe retrieval. If the key does not exist, `getJSON` returns `null`.\n\n```typescript title=\"set-get-json.ts\"\ninterface UserPreferences {\n  theme: 'light' | 'dark';\n  language: string;\n}\n\nawait store.setJSON('preferences', {\n  theme: 'dark',\n  language: 'en',\n} satisfies UserPreferences);\n\nconst preferences = await store.getJSON<UserPreferences>('preferences');\n\nif (preferences === null) {\n  console.log('No preferences found');\n} else {\n  console.log('Theme:', preferences.theme);\n  console.log('Language:', preferences.language);\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#remove-stored-values", "page_title": "Persist Data Locally", "index": 6, "depth": 2, "title": "Remove Stored Values", "anchor": "remove-stored-values", "start_char": 4923, "end_char": 5191, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Remove Stored Values\n\nUse `store.remove(key)` to delete a key. The method does not throw if the key does not exist, so you can call it safely without first checking whether the value is present.\n\n```typescript title=\"remove.ts\"\nawait store.remove('network');\n\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#namespace-keys-with-prefixes", "page_title": "Persist Data Locally", "index": 7, "depth": 2, "title": "Namespace Keys with Prefixes", "anchor": "namespace-keys-with-prefixes", "start_char": 5191, "end_char": 6971, "estimated_token_count": 429, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Namespace Keys with Prefixes\n\nWithin a Product, multiple features may share the same `LocalKvStore`. Prefixes partition the namespace further to avoid key collisions between those features.\n\nPass a `prefix` option to `createLocalKvStore()` to prepend `prefix:` to every key operated on by that store instance. For example, `createLocalKvStore({ prefix: 'feature' })` stores the key `'setting'` internally as `'feature:setting'`.\n\n```typescript title=\"prefixed-store.ts\"\nimport { createLocalKvStore } from '@parity/product-sdk-local-storage';\n\nconst settingsStore = await createLocalKvStore({ prefix: 'settings' });\nconst cacheStore = await createLocalKvStore({ prefix: 'cache' });\n\n// Stored internally as \"settings:theme\"\nawait settingsStore.set('theme', 'dark');\n\n// Stored internally as \"cache:lastBlock\"\nawait cacheStore.set('lastBlock', '21540000');\n\n```\n\nThe Host-enforced Product-level namespace is separate from any developer-defined prefix. The Host's Product namespace is applied on top of your `prefix`, so a key `'setting'` in a `{ prefix: 'feature' }` store ends up stored as something like `'myproduct.dot:feature:setting'`, without you needing to construct that path yourself.\n\n!!! warning \"Prefixed stores do not share a key space\"\n    `app.localStorage` is itself a prefixed store: `createApp` builds it with a prefix taken from the Host's product ID, minus the final domain suffix (`my-product.dot` becomes `my-product`). Before v0.30.0, the prefix is the `name` you passed. A store you create with a different `prefix` writes under a different path, so a key written through `createLocalKvStore({ prefix: 'feature' })` and read back through `app.localStorage` resolves to `null` rather than raising an error. Read and write each key through the same store."}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#use-react-hooks", "page_title": "Persist Data Locally", "index": 8, "depth": 2, "title": "Use React Hooks", "anchor": "use-react-hooks", "start_char": 6971, "end_char": 9640, "estimated_token_count": 665, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use React Hooks\n\nIf your Product is a React application, `@parity/product-sdk` provides hooks that integrate local storage directly into the React component lifecycle. The hooks read the current value on mount and re-render the component whenever it changes.\n\nWrap your application in `ProductSDKProvider` once at the root, then call the hooks anywhere inside the tree:\n\n```tsx title=\"providers.tsx\"\n'use client';\n\nimport { ProductSDKProvider } from '@parity/product-sdk/react';\nimport type { ReactNode } from 'react';\n\nexport function Providers({ children }: { children: ReactNode }) {\n  return (\n    <ProductSDKProvider\n      fallback={<div>Initializing SDK…</div>}\n    >\n      {children}\n    </ProductSDKProvider>\n  );\n}\n\n```\n\n`useLocalStorageString` manages a plain string value. `useLocalStorage<T>` manages a JSON-serializable value typed by `T`. Both hooks return a tuple of `[currentValue, setValue, { loading, error }]`:\n\n```tsx title=\"local-storage-hooks.tsx\"\n'use client';\n\nimport {\n  useLocalStorage,\n  useLocalStorageString,\n} from '@parity/product-sdk/react';\n\ninterface UserPreferences {\n  theme: 'light' | 'dark';\n  language: string;\n}\n\nfunction StorageDemo() {\n  const [network, setNetwork, { loading: networkLoading }] =\n    useLocalStorageString('network');\n\n  const [\n    preferences,\n    setPreferences,\n    { loading: prefsLoading, error: prefsError },\n  ] = useLocalStorage<UserPreferences>('preferences');\n\n  return (\n    <div>\n      <p>Network: {networkLoading ? 'loading…' : (network ?? 'not set')}</p>\n      <button onClick={() => setNetwork('paseo')}>Set network</button>\n\n      <p>\n        Theme: {prefsLoading ? 'loading…' : (preferences?.theme ?? 'not set')}\n      </p>\n      <button onClick={() => setPreferences({ theme: 'dark', language: 'en' })}>\n        Set preferences\n      </button>\n\n      {prefsError && <p>Error: {prefsError.message}</p>}\n    </div>\n  );\n}\n\n```\n\nTo remove a key, access `app.localStorage` from `useProductSDK()` directly:\n\n```tsx title=\"remove-key.tsx\"\n'use client';\n\nimport { useProductSDK } from '@parity/product-sdk/react';\n\nfunction StorageActions() {\n  const app = useProductSDK();\n\n  async function handleRemove() {\n    await app.localStorage.remove('network');\n  }\n\n  return (\n    <div>\n      <button onClick={handleRemove}>Remove &quot;network&quot;</button>\n    </div>\n  );\n}\n\n```\n\n!!! note \"There is no clear-all\"\n    `LocalStorageApi` exposes `get`, `getJSON`, `set`, `setJSON`, and `remove`, and nothing else. The backing store has no way to enumerate keys, so removing everything your Product wrote means calling `remove()` on each key you know about. Track the keys yourself if you need that."}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#limitations", "page_title": "Persist Data Locally", "index": 9, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 9640, "end_char": 10493, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- Storage is not synced across devices. Values written on one Host instance are not visible on another.\n- `app.localStorage` and every `LocalKvStore` are scoped to your Product. You cannot read or modify another Product's keys.\n- React hooks (`useLocalStorage`, `useLocalStorageString`) are only available via the umbrella package `@parity/product-sdk`. The standalone `@parity/product-sdk-local-storage` package exposes no React hooks.\n- `createLocalKvStore()` requires a Host backend. Running outside a host container, it throws `Host storage unavailable`; there is no browser `localStorage` fallback. Run your Product inside [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) to use local storage. See [`Host storage unavailable`](/apps/troubleshooting/#uploads-are-rejected-or-host-storage-unavailable) in troubleshooting."}
{"source": "polkadot-docs", "page_id": "apps-build-persist-data-locally", "url": "https://developer.polkadot.com/apps/build/persist-data-locally/#where-to-go-next", "page_title": "Persist Data Locally", "index": 10, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 10493, "end_char": 11339, "estimated_token_count": 242, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0b4c71ce4a5005cecb96c2b665a12dc08dbec67142a88056585f2b8c1c33da10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    When data must outlive the device and be fetchable by anyone, move it to the Bulletin Chain.\n\n    [:octicons-arrow-right-24: Store Data on Chain](/apps/build/store-data-on-chain/)\n\n-   <span class=\"badge guide\">Guide</span> **Deploy Your Product**\n\n    ---\n\n    You've covered the capabilities; ship your Product to a live `.dot` name with the Quick Start deploy routes.\n\n    [:octicons-arrow-right-24: Quick Start](/apps/quick-start/)\n\n-   <span class=\"badge external\">External</span> **Product SDK API Reference**\n\n    ---\n\n    The full `product-sdk` surface beyond this recipe: every package, class, and method.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#before-you-start", "page_title": "apps-build-platform-services-sdk", "index": 0, "depth": 2, "title": "Before you start", "anchor": "before-you-start", "start_char": 528, "end_char": 1090, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Before you start\n\nThe SDK is a TypeScript umbrella package. You import from its subpath entry\npoints directly: `./chain`, `./cloud-storage`, `./contracts`, `./identity`,\n`./individuality`, `./nfts`, `./host`, `./wallet`, `./local-storage`,\n`./crypto`, `./address`, `./renderer`, `./core`, `./react`, and `./testing`.\n\n`./react` (`ProductSDKProvider`, `useChain`, `useWallet`, `useLocalStorage`,\n`useProductSDK`) declares `react` `^18 || ^19` as a peer dependency. In a\nproject without React installed, only that subpath fails, with a\nmodule-not-found error."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#your-app-has-to-run-inside-a-host", "page_title": "apps-build-platform-services-sdk", "index": 1, "depth": 3, "title": "Your app has to run inside a host", "anchor": "your-app-has-to-run-inside-a-host", "start_char": 1090, "end_char": 1620, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Your app has to run inside a host\n\nEvery chain call and every storage call goes through the host container: the\nPolkadot app (mobile or desktop) or the web gateway at\n[dev-dot.li](https://dev-dot.li). Outside a container, `createApp()` itself\nthrows before you reach any service:\n\n```\nHostUnavailableError: createApp requires a host product context\n```\n\nA chain call made outside a container throws\n`Host provider unavailable for chain <genesisHash>`. To run your app in CI,\nuse the [test host](#test-without-the-real-host)."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#check-results-instead-of-catching-errors", "page_title": "apps-build-platform-services-sdk", "index": 2, "depth": 3, "title": "Check results instead of catching errors", "anchor": "check-results-instead-of-catching-errors", "start_char": 1620, "end_char": 2015, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Check results instead of catching errors\n\nMost operations that can fail return a `Result` instead of throwing.\n`Result<T, E>` is `{ ok: true; value: T } | { ok: false; error: E }`, so check\n`res.ok` before you read `res.value`. `ok`, `err` and `isErrorOf` are exported\nfrom the package root. `createApp`, `getChainAPI` and the `app.wallet` helpers\ndo throw, so wrap those in `try`/`catch`."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#connect-to-the-chains", "page_title": "apps-build-platform-services-sdk", "index": 3, "depth": 2, "title": "Connect to the chains", "anchor": "connect-to-the-chains", "start_char": 2015, "end_char": 4267, "estimated_token_count": 524, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Connect to the chains\n\nThe chain client gives you typed PAPI access to the three platform chains:\nAsset Hub, the Bulletin chain, and the Individuality (People) chain. You can\nconnect in two ways.\n\nThe simplest is the preset. Call `getChainAPI(env)` and the SDK loads the right\ndescriptors for you:\n\n```ts\nimport { getChainAPI } from \"@parity/product-sdk/chain\";\n\nconst client = await getChainAPI(\"devnet\");\n\nconst account = await client.assetHub.query.System.Account.getValue(address);\nconst fee = await client.bulletin.query.TransactionStorage.ByteFee.getValue();\nclient.individuality; // People-chain access\nclient.raw; // lower-level PAPI handles, keyed by chain name\nclient.destroy(); // tear the connections down when you are finished\n```\n\n`Environment` has five values: `polkadot`, `kusama`, `paseo`, `previewnet` and\n`devnet`. `polkadot` and `kusama` throw before connecting, because their\nBulletin and Individuality chains are not live yet. Connections are cached by\neach chain's genesis-hash fingerprint.\n\nFor a specific or pre-release chain, pass descriptors yourself. They live in\n`@parity/product-sdk-descriptors`. To import from it, add it as a direct\ndependency, as shown in\n[Current Devnet chain metadata](../reference/packages.md#current-devnet-chain-metadata):\n\n```ts\nimport { createChainClient } from \"@parity/product-sdk/chain\";\nimport { devnet_asset_hub } from \"@parity/product-sdk-descriptors/devnet-asset-hub\";\nimport { devnet_bulletin } from \"@parity/product-sdk-descriptors/devnet-bulletin\";\n\nconst client = await createChainClient({\n  chains: { assetHub: devnet_asset_hub, bulletin: devnet_bulletin },\n});\n```\n\n`createChainClient` is async. If you leave out the `await`, the failure only\nshows up on the next line you write, as a\n`Property 'assetHub' does not exist on type 'Promise<ChainClient<…>>'` error.\n\n!!! warning \"The descriptor chooses the chain\"\n    The descriptor you pass to `createChainClient` is your network selection.\n    Passing `paseo_asset_hub` here connects your app to Paseo Next, not this\n    Devnet, whatever `--env` you deployed with. Nothing fails at build time:\n    the app builds and loads, then throws `ChainNotSupportedError` at runtime.\n    Match the descriptor prefix to your target network."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#sign-transactions", "page_title": "apps-build-platform-services-sdk", "index": 4, "depth": 2, "title": "Sign transactions", "anchor": "sign-transactions", "start_char": 4267, "end_char": 5119, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Sign transactions\n\nSigning goes through the host wallet, so you never manage keys yourself.\nConnecting returns a `Result` with the available accounts. `getSigner()`\nreturns the selected account's PAPI 3 transaction signer, but only once an\naccount is selected:\n\n```ts\nimport { SignerManager } from \"@parity/product-sdk/wallet\";\n\nconst manager = new SignerManager();\nconst connected = await manager.connect(); // or connect(\"dev\") for Alice/Bob\nif (!connected.ok) throw connected.error;\n\nconst [account] = connected.value;\nif (!account) throw new Error(\"Host wallet returned no accounts\");\n\nmanager.selectAccount(account.address);\nconst signer = manager.getSigner(); // CommonSignerTxCreator | null\n```\n\n`connect()` reports failure in its result and does not throw. If you skip the\ncheck, you end up with a `null` signer and no error to explain it."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#store-and-retrieve-data-cloud-storage", "page_title": "apps-build-platform-services-sdk", "index": 5, "depth": 2, "title": "Store and retrieve data (Cloud Storage)", "anchor": "store-and-retrieve-data-cloud-storage", "start_char": 5119, "end_char": 6648, "estimated_token_count": 374, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Store and retrieve data (Cloud Storage)\n\nCloud Storage is content-addressed storage backed by the Polkadot Bulletin\nchain, and it is how an app is meant to persist data. You store bytes, get back\na root CID, and read the bytes back by CID. Uploads need a connected wallet\nwith a selected account, and a storage authorization on that account.\n[Storage & data](../architecture/storage.md) explains the model behind it.\n\n```ts\nimport { createApp } from \"@parity/product-sdk\";\n\nconst app = await createApp({\n  cloudStorage: { environment: \"devnet\" },\n});\n\nconst cloud = app.cloudStorage;\nif (!cloud) throw new Error(\"Cloud Storage is disabled\");\n\nconst uploaded = await cloud.upload(bytes);\nif (!uploaded.ok) throw uploaded.error;\n\nconst fetched = await cloud.fetch(uploaded.value);\nif (fetched.ok) {\n  render(fetched.value); // Uint8Array\n}\n```\n\n!!! warning \"`cloudStorage.environment` defaults to `paseo`\"\n    Omit the option and the SDK targets Bulletin on Paseo, which a Devnet host\n    does not serve, so `createApp()` fails. Pass `environment: \"devnet\"`. The\n    values are `paseo`, `previewnet` and `devnet`. Passing\n    `cloudStorage: false` turns the service off, which is why\n    `app.cloudStorage` can be null.\n\n`cloud.computeCid(data)` computes the CID of raw bytes without uploading them\n(`calculateCid` from the package root does the same without an `App`). This is\nnot the CID that `upload()` returns, which is the CID of the stored manifest.\nReads only work inside a container. There is no IPFS-gateway fallback."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#call-smart-contracts", "page_title": "apps-build-platform-services-sdk", "index": 6, "depth": 2, "title": "Call smart contracts", "anchor": "call-smart-contracts", "start_char": 6648, "end_char": 7650, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Call smart contracts\n\nContracts on the devnet are PolkaVM bytecode running on Asset Hub through\n`pallet-revive`, with Solidity-style ABIs. Build a runtime from a raw PAPI\nclient, then a typed contract handle:\n\n```ts\nimport {\n  createContract,\n  createContractRuntimeFromClient,\n} from \"@parity/product-sdk/contracts\";\n\n// client and manager as above; address and abi are your contract's.\nconst runtime = createContractRuntimeFromClient(client.raw.assetHub, devnet_asset_hub);\nconst contract = createContract(runtime, address, abi, { signerManager: manager });\n```\n\nThe argument order is `(runtime, address, abi)`, with the address first. The\noptional fourth argument supplies the signer: pass `{ signerManager }` for\n`.tx()` calls, which look up the selected account when you call them.\nRead-only `.query()` calls need no account and fall back to the keyless\n`QUERY_FALLBACK_ORIGIN`. `ensureContractAccountMapped(runtime, address, signer)`\nmaps an account for `pallet-revive` when a call needs it."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#read-identity-and-personhood", "page_title": "apps-build-platform-services-sdk", "index": 7, "depth": 2, "title": "Read identity and personhood", "anchor": "read-identity-and-personhood", "start_char": 7650, "end_char": 9681, "estimated_token_count": 486, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Read identity and personhood\n\nTo prove a user controls a `.dot` identity, sign with the account that owns it.\nThe wallet looks up the username's owner on the People chain and signs with\nthat account:\n\n```ts\nimport { devnet_individuality } from \"@parity/product-sdk-descriptors/devnet-individuality\";\n\nconst proof = await app.wallet.signMessageWithDotNsIdentity({\n  peopleChain: devnet_individuality,\n  username: \"alice\", // omit to use the user's primary .dot name\n  message: \"Sign in to my-app\",\n});\n\nproof.username; // username used for the lookup\nproof.accountId; // owning AccountId32, 0x-prefixed\nproof.signature; // Uint8Array\n```\n\nUsernames are matched byte for byte against the chain's records, and the\n`.dot` suffix is not handled for you, so pass the exact registered value. If\nyou omit `username`, the host shows an identity-permission prompt. If your app\nalready connects the People chain with `app.chain.connect({ … })`, the lookup\nreuses that connection.\n\nFor an app-scoped account, or a per-context alias that cannot be linked back to\nthe user's account, use `SignerManager.getProductAccount()` and\n`SignerManager.getProductAccountAlias()`. Both go through the host.\n`isValidDotNsName(name, suffix)` and `normalizeDotNsName(name, suffix)`\nvalidate and canonicalise a name. Pass the TLD suffix, which is `\".dot\"` on\nthis Devnet.\n\nFor the raw host session (login state, product accounts, ring proofs), call\n`getAccountsProvider()` from `@parity/product-sdk/host`. It is async and\nresolves to `null` outside a host container. Its methods return neverthrow\n`ResultAsync` values (`.isOk()`), not the SDK's own `Result`.\n\nTo read a user's personhood tier on-chain, call the `personhood`\n`pallet-revive` precompile at the fixed address\n`0x000000000000000000000000000000000A010000` with a contract handle. Its\n`personhoodStatus(account, bytes32 context)` returns a status\n(`0 = None`, `1 = Lite`, `2 = Full`) and a per-application `contextAlias`.\n[Identity & personhood](../architecture/identity.md) has the full model."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#test-without-the-real-host", "page_title": "apps-build-platform-services-sdk", "index": 8, "depth": 2, "title": "Test without the real host", "anchor": "test-without-the-real-host", "start_char": 9681, "end_char": 11491, "estimated_token_count": 459, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Test without the real host\n\n`@parity/truapi-host` ships a Playwright test host that runs the real host core\nwith auto-signing dev accounts, so you can drive your app end to end in CI:\n\n```bash\nnpm i -D @parity/truapi-host@0.25.0 @playwright/test esbuild\n```\n\n```ts\nimport { test as base, expect } from \"@playwright/test\";\nimport {\n  createTestHostFixture,\n  type TestHost,\n} from \"@parity/truapi-host/testing/playwright\";\n\nconst test = base.extend<{ testHost: TestHost }>(\n  createTestHostFixture({\n    productUrl: \"http://localhost:5173\",\n    productId: \"my-app.dot\", // the .dot name your app signs as\n    accounts: [\"alice\"],\n    networks: [\n      {\n        id: \"devnet-asset-hub\",\n        name: \"Devnet Asset Hub\",\n        genesisHash: \"0xd6eec26135305a8ad257a20d003357284c8aa03d0bdb2b357ab0a22371e11ef2\",\n        rpcUrl: \"wss://asset-hub-paseo-rpc.n.dwellir.com\",\n        tokenSymbol: \"PAS\",\n        tokenDecimals: 10,\n      },\n    ],\n  }),\n);\n\ntest(\"signs a transfer\", async ({ testHost }) => {\n  await testHost.waitForConnection();\n  await testHost.productFrame().getByRole(\"button\", { name: \"Send\" }).click();\n\n  const signed = await testHost.getSigningLog();\n  expect(signed.length).toBeGreaterThan(0);\n});\n```\n\nThe fixture embeds your product in an iframe, signs in the dev accounts,\nauto-signs signing requests, and proxies chain RPC to the chains you list.\n`switchAccount`, `getSigningLog` and the permission, notification and chat logs\nlet tests check what the host did.\n\nEach `networks` entry's `id` suffix sets its role (`-asset-hub`, `-people`,\n`-bulletin`). If your app uses People or Bulletin, add entries for them from\n[Networks & endpoints](../reference/networks.md). `productId` must be the name\nyour app signs as, because the host refuses a signing request scoped to\nanother product."}
{"source": "polkadot-docs", "page_id": "apps-build-platform-services-sdk", "url": "https://developer.polkadot.com/apps/build/platform-services-sdk/#learn-more", "page_title": "apps-build-platform-services-sdk", "index": 9, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 11491, "end_char": 11941, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58e6b6d22093e9fbf90da653fb1090edc6335ab5d9ad56c27089cd7a2fb9d3aa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [product-sdk](https://github.com/paritytech/product-sdk): SDK source\n- [Claude Code plugin](https://github.com/paritytech/product-sdk#claude-code-plugin): agent skills for every SDK area. See the [developer quickstart](../get-started/developers.md#build-with-claude-code)\n- [Smart contracts](../architecture/contracts.md): contracts on Asset Hub\n- [Identity & personhood](../architecture/identity.md): the model behind the precompile"}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#introduction", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 44, "end_char": 1970, "estimated_token_count": 445, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis guide covers the [Statement Store](/reference/apps/infrastructure/statement-store/), a pub/sub primitive on Polkadot's People Chain for real-time signaling between users of your Product. Statements are small, signed payloads that propagate peer-to-peer via the node's gossip layer without entering chain storage, making them the right tool for chat messages, presence indicators, multiplayer cursors, and typing indicators. Submissions are allowance-gated (no fees); reading is permissionless. The guide covers four steps: setting up the client, subscribing to incoming statements, publishing a typed statement, and using a channel for last-write-wins state.\n\n!!! info \"Storage options for your Product\"\n    Match the data to the layer built for it; see [Where to Store Data](/apps/concepts/data-placement/) for the full decision guide.\n\n    - **Local storage**: Per-Product, per-device key-value for preferences, drafts, and cached values. Not synced across devices. See [Persist Data Locally](/apps/build/persist-data-locally/).\n    - **Bulletin Chain**: Content-addressed, on-chain, retained ~2 weeks by default and renewable. Fetched later by CID: profile photos, published articles, app bundles. See [Store Data on Chain](/apps/build/store-data-on-chain/).\n    - **Statement Store**: Gossip-distributed, short-lived (default 30s TTL), allowance-gated. Real-time signaling between users: chat, presence, typing indicators. See [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/).\n\n\nThe Statement Store and Bulletin Chain compose well: [Polkadot App](/reference/apps/hosts/polkadot-app/)'s Chat uses the Statement Store for signaling (who's online, session handshakes) and the Bulletin Chain for the encrypted message content. Many Products follow the same split: Statement Store for ephemeral state, Bulletin Chain for content that needs to survive longer than a session."}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#prerequisites", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1970, "end_char": 2971, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have:\n\n- Completed [Install Desktop and Pair](/apps/get-started/) so you have a paired [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) and a signer for product-scoped accounts\n- A Statement Store allowance for your account; the People Chain's `pallet-statement-store` gates submissions on a per-account allowance (`max_count` live statements and `max_size` total bytes)\n- A Polkadot Product project running locally (see [Set Up Your Project](/apps/build/#set-up-your-project) if you don't have one yet)\n\n!!! warning \"Provisional: obtaining an allowance\"\n    The process for obtaining a Statement Store allowance on TestNet is not yet documented. Ask in the developer community for the current access paths.\n\n!!! note\n    PAS funds are not required for the Statement Store itself; submissions don't pay transaction fees. The allowance is the gating mechanism; PAS is only relevant if your Product later interacts with chains that charge fees."}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#install-the-sdk", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 2, "depth": 2, "title": "Install the SDK", "anchor": "install-the-sdk", "start_char": 2971, "end_char": 3881, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install the SDK\n\nThis guide builds on `createApp`, which only the umbrella package provides, and on `statement-store`, which has no umbrella subpath, so install both:\n\n```bash\nnpm install @parity/product-sdk @parity/product-sdk-statement-store\n```\n\n!!! note \"Versions the snippets target\"\n    The snippets target `@parity/product-sdk` v0.30.0 and `@parity/product-sdk-statement-store` v0.6.11; every SDK surface they use is present on that line. If you pin an earlier release, pass `createApp` a `name` (required before v0.30.0) and check the return types first: v0.18.0 moved `StatementStoreClient.publish` and `ChannelStore.write` from `Promise<boolean>` to a typed `Result`. A `Result` object is always truthy, so code written for the older shape keeps compiling and stops working.\n\nSee [Umbrella or Individual Packages](/apps/build/#umbrella-or-individual-packages) for how the install styles compare."}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#set-up-your-statement-store-client", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 3, "depth": 2, "title": "Set Up Your Statement Store Client", "anchor": "set-up-your-statement-store-client", "start_char": 3881, "end_char": 7429, "estimated_token_count": 816, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up Your Statement Store Client\n\nEvery snippet in this guide is Product code: modules placed inside the Product running at `localhost:3000` (per [Set Up Your Project](/apps/build/#set-up-your-project)), loaded by Polkadot Desktop. Signing requests route through the Host (Polkadot Desktop) to the user's paired Polkadot App on their phone, which holds the signing keys; your Product never derives, sees, or holds keys.\n\n`StatementStoreClient` is the high-level client. It wraps the People Chain node's `statement_submit` and `statement_subscribeStatement` JSON-RPC methods, handles JSON encoding of your payload, requests authentication proofs from the Host, and deduplicates incoming statements. Connect it once at the top of your Product:\n\nStart with the shared app setup, which creates the SDK app and connects the wallet. It is the same file [Store Data on Chain](/apps/build/store-data-on-chain/) uses:\n\n```typescript title=\"setup-app.ts\"\nimport { createApp } from '@parity/product-sdk';\n\n// The Host supplies your Product's identity: `createApp` reads the product ID\n// the Host loaded you under and derives the user's product account from it.\n// If the Host declines to derive an account, `connect()` resolves with an empty\n// list instead of failing, so check the list before you rely on it.\nexport const app = await createApp();\n\nexport const { accounts } = await app.wallet.connect();\nif (accounts.length === 0) {\n  throw new Error(\n    'The Host returned no account for this Product. Check that you are signed in to Polkadot Desktop.',\n  );\n}\n\n```\n\nThen create the Statement Store client for the first connected account:\n\n```typescript title=\"setup-statement-store.ts\"\n// Place this in your Product, after the setup from `setup-app.ts`.\nimport { StatementStoreClient } from '@parity/product-sdk-statement-store';\nimport { accounts } from './setup-app';\n\n// `appName` is the gossip topic this client subscribes to, not a dotNS name.\nexport const client = new StatementStoreClient({ appName: 'my-product' });\nawait client.connect({\n  mode: 'host',\n  accountId: [accounts[0].address, 42], // 42 = generic SS58 prefix\n});\n\nconsole.log('Statement Store connected as', accounts[0].address);\n\n```\n\n`new StatementStoreClient({ appName })` creates the client. The `appName` is hashed with Blake2b-256 and used as the statement's primary topic; every submission your Product makes carries that topic, and `client.subscribe()` filters on it at the node boundary, so other instances of _your_ Product see your statements while traffic from other Products on the network is dropped before it reaches your subscriber. `client.connect({ mode: 'host', accountId })` wires the client to the Host API transport and delegates proof creation to the Host; Polkadot Desktop routes the proof request to the user's paired Polkadot App, which signs and returns the proof. The `accountId` is a tuple of `[ss58Address, chainPrefix]`; `42` is the generic Substrate SS58 prefix.\n\n!!! note \"Delivery is best-effort\"\n    The Statement Store does not retry, acknowledge, or guarantee ordering; those are network-layer guarantees the gossip protocol doesn't provide. If your Product needs to know a statement reached a peer, the peer publishes an ack statement; reliability is composed at the application layer. If the content needs to outlive the TTL, store it on the Bulletin Chain and publish a CID as the statement payload.\n\n    Polkadot App's Chat is exactly this composition: Statement Store for signaling, Bulletin Chain for the encrypted message content."}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#subscribe-to-incoming-statements", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 4, "depth": 2, "title": "Subscribe to Incoming Statements", "anchor": "subscribe-to-incoming-statements", "start_char": 7429, "end_char": 9744, "estimated_token_count": 523, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Subscribe to Incoming Statements\n\n`client.subscribe<T>(callback, options?)` registers a topic filter with the connected node. Internally, the SDK calls `statement_subscribeStatement` with a filter scoped to your Product's `appName` topic; the node returns the current statement pool matching that filter and streams any further submissions that match. The SDK decodes the JSON payload into your typed `T` and dedupes by channel and content hash before invoking your callback:\n\n```typescript title=\"subscribe-statements.ts\"\n// Place this in your Product, after the setup from `setup-statement-store.ts`.\n\nimport type { ReceivedStatement } from '@parity/product-sdk-statement-store';\nimport { client } from './setup-statement-store';\n\n// JSON-serialized when published; decoded back to this type on receive.\ninterface ChatMessage {\n  text: string;\n  from: string;\n  ts: number;\n}\n\nconst subscription = client.subscribe<ChatMessage>(\n  (statement: ReceivedStatement<ChatMessage>) => {\n    console.log(\n      `[${statement.signerHex?.slice(0, 10)}…] ${statement.data.from}: ${statement.data.text}`,\n    );\n  },\n  { topic2: 'room-42' },\n);\n\n// subscription.unsubscribe() when you no longer want updates.\n\n```\n\nThe optional `topic2` is hashed with Blake2b-256 and added to the filter; scope to a room id, a document id, or any other secondary key within your Product. The returned `Unsubscribable` exposes `unsubscribe()` to tear down the JSON-RPC subscription when you no longer need it.\n\n!!! warning \"A subscription receives every statement on its topic, regardless of payload shape\"\n    The filter matches on topics, not on your TypeScript type. A subscriber on a given `topic2` receives _all_ statements published to that topic, including channel writes (the next section) and any other payload type your Product publishes there. The SDK decodes each one as your declared `T`, so a statement with a different shape arrives with `undefined` fields rather than an error.\n\n    If your Product publishes more than one kind of payload (for example, chat messages _and_ presence updates), either give each kind its own `topic2` (`room-42-chat` vs `room-42-presence`) or include a discriminator field in the payload and branch on it inside the callback. Reusing one `topic2` for distinct shapes will cross-deliver them."}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#publish-a-typed-statement", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 5, "depth": 2, "title": "Publish a Typed Statement", "anchor": "publish-a-typed-statement", "start_char": 9744, "end_char": 12187, "estimated_token_count": 591, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Publish a Typed Statement\n\n`client.publish<T>(data, options?)` builds a `Statement`, JSON-encodes the payload, requests a proof through the Host (Polkadot Desktop forwards the request to the user's paired Polkadot App, which signs), and submits via the node's `statement_submit` JSON-RPC. Every instance of your Product subscribed to the matching topic will receive it as the gossip propagates:\n\n```typescript title=\"publish-statement.ts\"\n// Place this in your Product, after the setup from `setup-statement-store.ts`.\n\nimport { client } from './setup-statement-store';\n\ninterface ChatMessage {\n  text: string;\n  from: string;\n  ts: number;\n}\n\n// `publish` resolves with a `Result`. A `Result` is always truthy, so check\n// `.ok` rather than the returned object itself.\nconst accepted = await client.publish<ChatMessage>(\n  {\n    text: 'Hello, room!',\n    from: 'alice',\n    ts: Date.now(),\n  },\n  {\n    topic2: 'room-42', // scope to a specific room, doc, or context\n    ttlSeconds: 60, // override the default 30s TTL\n  },\n);\n\nif (accepted.ok) {\n  console.log('Statement accepted into the gossip layer');\n} else {\n  console.warn(`Statement rejected: ${accepted.error.message}`);\n}\n\n```\n\n`publish` returns a `Result`. Check `.ok` rather than the returned object: a `Result` is always truthy, so `if (accepted)` passes for a rejected publish as readily as an accepted one. On failure, `.error` carries the reason — a `StatementSubmitError` when `pallet-statement-store`'s validity check rejects it (typically allowance or proof failure), a `StatementDataTooLargeError` when the JSON-encoded payload exceeds the per-statement size limit of 512 bytes, and a `StatementConnectionError` when the client is not connected.\n\nTwo limits worth designing around:\n\n- **512-byte payload limit**: Measured after JSON encoding. For larger content, store it on the Bulletin Chain and publish the CID as a small statement.\n- **30-second default TTL**: The pallet enforces a maximum retention window. The SDK defaults to 30 seconds, and you can shorten or lengthen per-statement via `ttlSeconds` up to that cap. After expiry, the node evicts the statement from its pool.\n\n`PublishOptions` covers the common cases: `topic2` (secondary Blake2b-256 topic for room/doc scoping), `channel` (last-write-wins; see the next section), `ttlSeconds` (override the default), and `decryptionKey` (an opaque hint subscribers can match on to discover encrypted content)."}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#use-a-channel-for-last-write-wins-state", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 6, "depth": 2, "title": "Use a Channel for Last-Write-Wins State", "anchor": "use-a-channel-for-last-write-wins-state", "start_char": 12187, "end_char": 14951, "estimated_token_count": 715, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use a Channel for Last-Write-Wins State\n\n`pallet-statement-store` supports an optional `channel` field on every statement: when a new submission carries the same `channel` as an existing live statement from the same account, the pallet replaces the older one in the node's pool. The gossip layer then propagates the replacement, and every subscribed peer drops the old statement in favor of the new one. The SDK abstracts this with `ChannelStore<T>`; each channel name maps to a single live value:\n\n```typescript title=\"channel-presence.ts\"\n// Place this in your Product, after the setup from `setup-statement-store.ts`.\n\nimport { ChannelStore } from '@parity/product-sdk-statement-store';\nimport { client } from './setup-statement-store';\n\ninterface Presence {\n  status: 'online' | 'away' | 'offline';\n  timestamp: number;\n}\n\nconst channels = new ChannelStore<Presence>(client, { topic2: 'room-42' });\n\n// `write` forwards to `publish`, so it resolves with a `Result` too.\nconst written = await channels.write('presence/alice', {\n  status: 'online',\n  timestamp: Date.now(),\n});\nif (!written.ok) {\n  console.warn(`Channel write rejected: ${written.error.message}`);\n}\n\n// A second write on the same channel replaces the first.\nawait channels.write('presence/alice', {\n  status: 'away',\n  timestamp: Date.now(),\n});\n\n// `onChange` and `readAll` key channels by their hex hash, not by the readable\n// name you wrote. Use `channels.read(name)` to look a channel up by name.\nchannels.onChange((channelHash, value, previous) => {\n  console.log(\n    `${channelHash}: ${previous?.status ?? '<none>'} → ${value.status}`,\n  );\n});\n\nfor (const [channelHash, value] of channels.readAll()) {\n  console.log(`${channelHash}: ${value.status}`);\n}\n\nconsole.log(`alice is ${channels.read('presence/alice')?.status ?? 'unknown'}`);\n\n```\n\n`channels.write(name, value)` hashes the channel name with Blake2b-256 and publishes, forwarding `publish`'s `Result` to you; `channels.read(name)` returns the latest value seen on that channel; `channels.readAll()` returns the full map, keyed by channel hash rather than by the readable name; `channels.onChange(callback)` fires on every transition, and passes that same hash to the callback. `ChannelStore` stamps `timestamp` for you if the value omits it. Channel scope is per-account; the pallet's replacement rule only matches statements from the same signer, so one user cannot overwrite another user's channel.\n\n`ChannelStore` is the right primitive for soft state where only the latest version matters: presence indicators, multiplayer cursors, \"now playing\" status. For append-only events such as chat messages, action logs, social-feed posts, keep using `client.publish` directly so each event lives independently until its TTL."}
{"source": "polkadot-docs", "page_id": "apps-build-pub-sub-off-chain-data", "url": "https://developer.polkadot.com/apps/build/pub-sub-off-chain-data/#where-to-go-next", "page_title": "Publish and Subscribe to Off-Chain Data", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 14951, "end_char": 15882, "estimated_token_count": 255, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e197ea1960c09dcc23c4dfce53ba2e7e0af7552ae8e367d0575ae44764fef99e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Persist Data Locally**\n\n    ---\n\n    Your Product can sync state between users; next, keep device-local data (preferences, drafts, caches) across sessions.\n\n    [:octicons-arrow-right-24: Persist Data Locally](/apps/build/persist-data-locally/)\n\n-   <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    For durable, content-addressed payloads, route through the Bulletin Chain. Pair with the Statement Store by publishing the CID as a Statement.\n\n    [:octicons-arrow-right-24: Store Data on Chain](/apps/build/store-data-on-chain/)\n\n-   <span class=\"badge external\">External</span> **Product SDK API Reference**\n\n    ---\n\n    The full `product-sdk` surface beyond this recipe: every package, class, and method.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#introduction", "page_title": "Read On-Chain Data", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 670, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nThis guide covers the `@parity/product-sdk-chain-client` package, which gives your Product a typed, host-aware client for reading on-chain state (account balances, storage items, and runtime constants) from inside a Polkadot host container. The SDK ships two connection paths: a zero-config Preset path (`getChainAPI`) and a Bring Your Own Descriptors (BYOD) path (`createChainClient`) for explicit descriptor control. Both produce the same client shape.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Connect to the chains](/apps/build/platform-services-sdk/#connect-to-the-chains)."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#prerequisites", "page_title": "Read On-Chain Data", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 670, "end_char": 1235, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have:\n\n- A Polkadot Product project running locally (see [Set Up Your Project](/apps/build/#set-up-your-project)) with a TypeScript toolchain\n- Node.js 20 or later with ESM support (`@parity/product-sdk-chain-client` is ESM only)\n- [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) to run your Product inside a host container (see [Install Desktop and Pair](/apps/get-started/))\n\n!!! note\n    You do not need funded accounts to read chain state. Reads are unsigned and require only a running host container."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#install-the-sdk", "page_title": "Read On-Chain Data", "index": 2, "depth": 2, "title": "Install the SDK", "anchor": "install-the-sdk", "start_char": 1235, "end_char": 2738, "estimated_token_count": 335, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install the SDK\n\nThe SDK installs two ways. The umbrella package, `@parity/product-sdk`, is the recommended starting point: one dependency that re-exports most of the SDK. Individual packages install only what you use, which keeps your bundle smaller and your dependencies explicit, so switch to them later as a bundle-size optimization. The two use different import specifiers, so switching styles means updating your imports. See [Umbrella or Individual Packages](/apps/build/#umbrella-or-individual-packages) for the full comparison.\n\n\n- **Umbrella package**: The whole SDK in one dependency.\n\n    ```bash\n    npm install @parity/product-sdk\n    ```\n\n- **Individual package**: Only the chain client.\n\n    ```bash\n    npm install @parity/product-sdk-chain-client\n    ```\n\nThe import specifiers differ between the two. The snippets in this guide use the standalone specifier `@parity/product-sdk-chain-client`; on the umbrella, the same exports come from the `@parity/product-sdk/chain` subpath, which keeps the older name. `createChainClient` is also re-exported from the umbrella root, but `getChainAPI` and `destroyAll` are not.\n\nIf you plan to use the BYOD path, also install the descriptors package regardless of which option above you chose:\n\n```bash\nnpm install @parity/product-sdk-descriptors\n```\n\nThe descriptors package exposes typed `ChainDefinition` objects through subpath imports (for example, `@parity/product-sdk-descriptors/paseo-bulletin`). Each subpath corresponds to one chain."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#connect-to-a-chain", "page_title": "Read On-Chain Data", "index": 3, "depth": 2, "title": "Connect to a Chain", "anchor": "connect-to-a-chain", "start_char": 2738, "end_char": 3178, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Connect to a Chain\n\nThe SDK provides two connection paths. The Preset path (`getChainAPI`) is the fastest way to get a working client — it comes preconfigured with the descriptors for supported environments. Use the BYOD path (`createChainClient`) when you need explicit control over which chains and descriptors your Product uses. Neither path takes RPC endpoints: the Host resolves the connection from each descriptor's genesis hash."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#connect-using-a-preset", "page_title": "Read On-Chain Data", "index": 4, "depth": 3, "title": "Connect Using a Preset", "anchor": "connect-using-a-preset", "start_char": 3178, "end_char": 4924, "estimated_token_count": 407, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Connect Using a Preset\n\n`getChainAPI()` returns a client preconfigured with the descriptors for the environment the Host is on. Host discovery runs first on every call: the SDK reads the Host's chains and matches the asset hub's genesis hash against its bundled descriptors, so the no-argument call is the one that lets the Host select the network.\n\n```typescript\nimport { getChainAPI } from '@parity/product-sdk-chain-client';\n\n// No argument: the Host selects the network, matched by genesis hash.\n// Pass one — getChainAPI('paseo') — to fail loudly if the Host is elsewhere.\nconst client = await getChainAPI();\n\nconst fee = await client.bulletin.query.TransactionStorage.ByteFee.getValue();\nconst blockNumber = await client.assetHub.query.System.Number.getValue();\n\nclient.destroy();\n```\n\nThe argument is optional, and it acts as an assertion rather than a request. When the Host reports an environment that disagrees with the one you named, the call throws `EnvironmentMismatchError` instead of connecting to the environment you asked for. Pass one to pin your Product to a single environment, or when the Host reports no usable network and discovery has nothing to match against.\n\nThe returned client exposes one property per chain in the preset (`assetHub`, `bulletin`, `individuality`), each typed by the underlying [polkadot-api](https://papi.how) (PAPI) descriptor.\n\n!!! warning \"Not every environment is live\"\n    The `Environment` union is `polkadot`, `kusama`, `paseo`, `previewnet`, and `devnet`. Anything else is a compile error. Of those five, `paseo`, `previewnet`, and `devnet` have all three chains live; `polkadot` and `kusama` are reserved, and `getChainAPI` throws `Chain API for \"<env>\" is not yet available` for both."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#connect-using-custom-descriptors-byod", "page_title": "Read On-Chain Data", "index": 5, "depth": 3, "title": "Connect Using Custom Descriptors (BYOD)", "anchor": "connect-using-custom-descriptors-byod", "start_char": 4924, "end_char": 6167, "estimated_token_count": 284, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Connect Using Custom Descriptors (BYOD)\n\nUse `createChainClient` to supply your own descriptors, importing the chain descriptor objects you need directly instead of relying on a preset. `ChainClientConfig` accepts a single field, `chains`.\n\n```typescript\nimport { createChainClient } from '@parity/product-sdk-chain-client';\nimport {\n  paseo_asset_hub,\n} from '@parity/product-sdk-descriptors/paseo-asset-hub';\nimport {\n  paseo_bulletin,\n} from '@parity/product-sdk-descriptors/paseo-bulletin';\n\nconst client = await createChainClient({\n  chains: {\n    assetHub: paseo_asset_hub,\n    bulletin: paseo_bulletin,\n  },\n});\n\nclient.destroy();\n```\n\nThe keys you choose in `chains` (`assetHub`, `bulletin`) become the property names on the returned client. Pick names that read naturally in your call sites; the rest of the SDK is fully typed against them. Connections are routed through the Host at runtime, so there is no endpoint field to set.\n\n!!! tip \"Using a different chain\"\n    To connect to a chain other than `paseo_bulletin`, find its descriptor in `@parity/product-sdk-descriptors`, then add it under a new key in `chains`. The client surface (`client.<yourKey>.query.*`) is automatically typed to match the descriptor you supplied."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#read-storage-and-constants", "page_title": "Read On-Chain Data", "index": 6, "depth": 2, "title": "Read Storage and Constants", "anchor": "read-storage-and-constants", "start_char": 6167, "end_char": 7451, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Read Storage and Constants\n\nOnce you have a client, every chain you connected exposes a typed PAPI surface under `.query`, `.constants`, and the rest of the PAPI shape. The pattern is:\n\n```text\nclient.<chainName>.query.<Pallet>.<Item>.getValue(...args)\n```\n\nThe following examples show common read operations. Each one maps directly to a pallet storage item and requires no transaction or signature.\n\n??? code \"Byte Fee\"\n    `TransactionStorage.ByteFee` returns the current cost per byte for on-chain storage on the Bulletin chain.\n\n    ```typescript\n    const fee = await client.bulletin.query.TransactionStorage.ByteFee.getValue();\n    console.log(`${fee} planck/byte`);\n    ```\n\n??? code \"Block Number\"\n    `System.Number` returns the current best block number for the chain.\n\n    ```typescript\n    const blockNumber = await client.assetHub.query.System.Number.getValue();\n    ```\n\n??? code \"Account State\"\n    `System.Account` returns the full account record for an address, including nonce and balance buckets.\n\n    ```typescript\n    const address = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY';\n\n    const account = await client.assetHub.query.System.Account.getValue(address);\n    const {\n      nonce,\n      data: { free, reserved, frozen },\n    } = account;\n    ```"}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#read-multiple-chains-in-parallel", "page_title": "Read On-Chain Data", "index": 7, "depth": 2, "title": "Read Multiple Chains in Parallel", "anchor": "read-multiple-chains-in-parallel", "start_char": 7451, "end_char": 7934, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Read Multiple Chains in Parallel\n\nBecause each chain has its own connection internally, reads across chains are independent and can be issued in parallel with `Promise.all`.\n\n```typescript\nconst [fee, blockNumber] = await Promise.all([\n  client.bulletin.query.TransactionStorage.ByteFee.getValue(),\n  client.assetHub.query.System.Number.getValue(),\n]);\n```\n\nThis is the recommended pattern whenever your Product needs to assemble a view from more than one storage item or chain."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#access-the-raw-papi-client", "page_title": "Read On-Chain Data", "index": 8, "depth": 2, "title": "Access the Raw PAPI Client", "anchor": "access-the-raw-papi-client", "start_char": 7934, "end_char": 8645, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Access the Raw PAPI Client\n\nFor advanced flows that the typed surface does not cover, such as raw storage subscriptions, low-level block tracking, or building a `ContractRuntime` for pallet-revive, every chain on the client exposes the underlying `PolkadotClient` under `.raw`.\n\n```typescript\n// Subscribe to every new finalized block on the Bulletin chain\nconst subscription = client.raw.bulletin.finalizedBlock$.subscribe((block) => {\n  console.log(`Finalized block #${block.number}: ${block.hash}`);\n});\n\n// Unsubscribe when done\nsubscription.unsubscribe();\n```\n\nUse the raw client only when you need to step outside the typed query/constants shape. Most reads should go through the typed surface above."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#detect-whether-you-are-inside-a-host", "page_title": "Read On-Chain Data", "index": 9, "depth": 2, "title": "Detect Whether You Are Inside a Host", "anchor": "detect-whether-you-are-inside-a-host", "start_char": 8645, "end_char": 9384, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Detect Whether You Are Inside a Host\n\nThe SDK re-exports two helpers from `@parity/product-sdk-host` for detecting whether your Product is running inside a host container. Use these when behavior should branch, for example, showing a connection status indicator.\n\n```typescript\nimport {\n  isInsideContainer,\n  isInsideContainerSync,\n} from '@parity/product-sdk-chain-client';\n\nconst inContainer = await isInsideContainer(); // async, canonical\nconst inContainerSync = isInsideContainerSync(); // sync, for top-level guards\n```\n\n!!! note\n    You generally do not need to branch on this. The client routes calls correctly when inside a host container; detection is for cases where your Product itself wants to adapt its UI or telemetry."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#clean-up-connections", "page_title": "Read On-Chain Data", "index": 10, "depth": 2, "title": "Clean Up Connections", "anchor": "clean-up-connections", "start_char": 9384, "end_char": 9883, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Clean Up Connections\n\nEach client owns one or more connections. Tear them down when your Product no longer needs them, typically on view unmount or process shutdown.\n\n```typescript\nimport { destroyAll } from '@parity/product-sdk-chain-client';\n\n// Close only the connections owned by this client\nclient.destroy();\n\n// Global escape hatch: closes every connection the SDK has open\ndestroyAll();\n```\n\nUse `client.destroy()` for normal cleanup and reserve `destroyAll()` for full-process teardown."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#limitations", "page_title": "Read On-Chain Data", "index": 11, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 9883, "end_char": 10719, "estimated_token_count": 196, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Limitations\n\n- The `paseo`, `previewnet`, and `devnet` environments are the presets with all three chains live. `polkadot` and `kusama` are reserved and throw at runtime.\n- The package is ESM only; your Product's build pipeline must support ESM imports.\n- Descriptors are imported by subpath (`@parity/product-sdk-descriptors/paseo-bulletin`), not from the package root. Bundlers that do not honor `exports` subpaths will fail to resolve them.\n- Host-routed reads require a host container; there is no direct-WebSocket fallback, so outside a Host the client [throws](/apps/troubleshooting/#connecting-to-a-chain-throws-outside-a-host). For out-of-Host development, use the SDK's testing fakes.\n- Reactive subscriptions (watching a storage item over time) are not covered on this page. A dedicated page on subscriptions will follow."}
{"source": "polkadot-docs", "page_id": "apps-build-read-chain-state", "url": "https://developer.polkadot.com/apps/build/read-chain-state/#where-to-go-next", "page_title": "Read On-Chain Data", "index": 12, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 10719, "end_char": 11582, "estimated_token_count": 246, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:66827e33944e87e4e32e0b674894eb1d22ec727817fd1e839a98fa0706d8c9ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Sign and Submit Transactions**\n\n    ---\n\n    Your Product can read the chain; next, let it act on the user's behalf, with every approval on their phone.\n\n    [:octicons-arrow-right-24: Sign and Submit Transactions](/apps/build/sign-and-submit/)\n\n-   <span class=\"badge external\">External</span> **polkadot-api Docs**\n\n    ---\n\n    Reference for the typed PAPI surface that `@parity/product-sdk-chain-client` exposes per chain.\n\n    [:octicons-arrow-right-24: Visit Site](https://papi.how)\n\n-   <span class=\"badge external\">External</span> **Product SDK API Reference**\n\n    ---\n\n    The full `product-sdk` surface beyond this recipe: every package, class, and method.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#install-the-cli", "page_title": "apps-build-register-a-dot-name", "index": 0, "depth": 2, "title": "Install the CLI", "anchor": "install-the-cli", "start_char": 933, "end_char": 1188, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install the CLI\n\nThe `dotns` command ships in `@polkadot-community-foundation/dotns-cli`.\n[Packages & tools](../reference/packages.md) has the install line.\n\nEvery command takes a network with `--env devnet` (or the `DOTNS_ENV`\nenvironment variable)."}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#set-up-an-account", "page_title": "apps-build-register-a-dot-name", "index": 1, "depth": 2, "title": "Set up an account", "anchor": "set-up-an-account", "start_char": 1188, "end_char": 1331, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Set up an account\n\nThe CLI signs with its own key, separate from any account in the Polkadot app.\nSet one up before you register anything."}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#fastest-a-throwaway-account", "page_title": "apps-build-register-a-dot-name", "index": 2, "depth": 3, "title": "Fastest: a throwaway account", "anchor": "fastest-a-throwaway-account", "start_char": 1331, "end_char": 2761, "estimated_token_count": 351, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Fastest: a throwaway account\n\nFor a hackathon, you don't need to import a seed phrase or set a keystore\npassword. Create a fresh account and pass its mnemonic to the CLIs through the\nenvironment:\n\n```bash\n# One fresh BIP-39 mnemonic, generated with the crypto that ships inside the CLIs\nexport MNEMONIC=\"$(NODE_PATH=\"$(npm root -g)/@polkadot-community-foundation/dotns-cli/node_modules\" \\\n  node -e 'const c=require(\"@polkadot/util-crypto\");c.cryptoWaitReady().then(()=>console.log(c.mnemonicGenerate()))')\"\n\nexport DOTNS_MNEMONIC=\"$MNEMONIC\"   # dotns signs with this — no `dotns auth set`, no password\ndotns account address               # the throwaway's address — fund THIS at the faucet\n```\n\n`pad` takes the same `$MNEMONIC` when it publishes (`--mnemonic \"$MNEMONIC\"`),\nso one account both owns the name and deploys to it. The phrase only lives in\nthis shell session. Save it if you want to keep the name. If you discard it,\nthe account really is throwaway.\n\n!!! danger \"Set a key, or you sign as a shared account\"\n    With neither `DOTNS_MNEMONIC`/`DOTNS_KEY_URI` set nor `dotns auth set` run,\n    `dotns` falls back to a shared public dev account that anyone can control.\n    A name registered to it is not yours, and anyone can transfer it away.\n    `dotns` prints a warning on every command when this happens.\n\n\nThen check which account is active:\n\n```bash\ndotns account address\ndotns account info --env devnet\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#keep-it-the-encrypted-keystore", "page_title": "apps-build-register-a-dot-name", "index": 3, "depth": 3, "title": "Keep it: the encrypted keystore", "anchor": "keep-it-the-encrypted-keystore", "start_char": 2761, "end_char": 3423, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Keep it: the encrypted keystore\n\nTo reuse an account across sessions, store a mnemonic or key-uri in the\npassword-protected `dotns` keystore instead of the environment:\n\n```bash\ndotns auth set\n```\n\nThe prompt first asks which kind of secret you are storing. Answer `mnemonic` or\n`key-uri`, then paste the value. Finally it asks you to set a keystore\npassword. Every later `dotns` command needs that password: pass it with\n`--password`, or export `DOTNS_KEYSTORE_PASSWORD` so scripts don't stall on a\nhidden prompt.\n\nTo do it in one non-interactive step instead:\n\n```bash\nexport DOTNS_KEYSTORE_PASSWORD=\"…\"\ndotns auth set --mnemonic \"…\" --account my-app\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#fund-and-map-the-account", "page_title": "apps-build-register-a-dot-name", "index": 4, "depth": 3, "title": "Fund and map the account", "anchor": "fund-and-map-the-account", "start_char": 3423, "end_char": 4104, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Fund and map the account\n\nRegistration signs a PolkaVM transaction, so your account also needs a balance\nfor fees and a mapped EVM address. Fund it from the\n[faucet](../reference/networks.md#faucet), then:\n\n```bash\n# Map your Substrate account to its EVM address (once per account)\ndotns account map --env devnet\n\n# Check whether an address is already mapped\ndotns account is-mapped <address> --env devnet\n```\n\n`dotns account is-mapped` checks the address you pass in. Its connection banner\nstill shows the CLI's default signer, so it may show the shared dev account\neven when your keystore is set up. Trust the `mapped:` line for the address you\nasked about, not the banner."}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#reserved-and-short-name-gating", "page_title": "apps-build-register-a-dot-name", "index": 5, "depth": 2, "title": "Reserved and short-name gating", "anchor": "reserved-and-short-name-gating", "start_char": 4104, "end_char": 5299, "estimated_token_count": 252, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Reserved and short-name gating\n\nNot every label is open to everyone. The public commit-reveal path requires a\nlabel of at least three characters, and sorts labels by their stem (the label\nwith any trailing digits stripped):\n\n- Reserved: stems of five characters or fewer are gated and cannot be claimed\n  through the open path.\n- Personhood-gated: stems of six to eight characters need proof of personhood\n  (the lite tier for a stem plus exactly two digits, the full tier for no\n  digits).\n- Open: stems of nine characters or more register without a personhood check.\n\nThe controller rejects governance-reserved and explicitly reserved names.\nPersonhood-tier usernames are issued through the gateway path when you prove\npersonhood in the Polkadot app, not through the CLI commands below.\n\nSo if you just want a name for an app, use a label whose stem is nine\ncharacters or longer, for example `my-cool-app`. It is the only band that\nregisters without proof of personhood, which today comes from the Polkadot app\nand not from the CLI. Shorter names such as `my-app` (a six-character stem)\nwill be refused.\n\nYou can't check a label's tier before committing to it, so count the stem\nyourself."}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#register-a-name", "page_title": "apps-build-register-a-dot-name", "index": 6, "depth": 2, "title": "Register a name", "anchor": "register-a-name", "start_char": 5299, "end_char": 6482, "estimated_token_count": 295, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Register a name\n\nRegistration is a commit-reveal handshake: you commit a hashed intent, wait a\nminimum commitment age, then reveal and pay. The CLI runs all three steps:\n\n```bash\ndotns register domain -n my-cool-app --env devnet\n```\n\nIt takes several minutes, because the commitment has to finalize, then\nmature, then be revealed. Before the final step the CLI prints the tier and the\nprice it is about to pay:\n\n```\n  name tier:  NoStatus\n  your tier:  NoStatus\n  message:    Available to all\n  price:      10 PAS\n```\n\nUseful options:\n\n- `-r, --reverse`: also set this name as your account's reverse (primary)\n  record.\n- `--json`: print machine-readable output.\n\nWhatever the CLI printed, check the result on chain before you do anything\nelse:\n\n```bash\ndotns lookup owner-of my-cool-app --env devnet\ndotns lookup name my-cool-app --env devnet    # full record view\n```\n\nYou can also look the name up in the [DotNS UI](https://dotns.dev-dot.li).\n\nIf the owner is your address, the name is yours and you are done. Only if it is\nnot, resume the handshake:\n\n```bash\ndotns register list --env devnet     # inspect cached commitments\ndotns register retry my-cool-app --env devnet\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#bind-a-name-to-a-bundle", "page_title": "apps-build-register-a-dot-name", "index": 7, "depth": 2, "title": "Bind a name to a bundle", "anchor": "bind-a-name-to-a-bundle", "start_char": 6482, "end_char": 7077, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Bind a name to a bundle\n\nOnce you have deployed your app (see\n[Build & publish an app](build-and-publish.md)), you have an IPFS CID for the\nbundle. Write it into the content resolver to make the name resolve to your\napp:\n\n```bash\n# Set the content hash (IPFS CID) for a name you own\ndotns content set my-cool-app <cid> --env devnet\n\n# Read it back\ndotns content view my-cool-app --env devnet\n```\n\nAfter this, opening `my-cool-app.dot` in the Polkadot app or at\n[dev-dot.li](https://dev-dot.li) resolves the name, decodes the content hash to\nthe CID and fetches your bundle from the gateway."}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#manage-a-name", "page_title": "apps-build-register-a-dot-name", "index": 8, "depth": 2, "title": "Manage a name", "anchor": "manage-a-name", "start_char": 7077, "end_char": 7463, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Manage a name\n\n```bash\n# Set one of your names as the primary (reverse) name for your account\ndotns primary set my-cool-app --env devnet\ndotns primary status --env devnet\n\n# Transfer ownership to another address or label\ndotns lookup transfer my-cool-app --destination <address-or-label> --env devnet\n\n# Create a subname under a name you own\ndotns register subname --env devnet\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-register-a-dot-name", "url": "https://developer.polkadot.com/apps/build/register-a-dot-name/#learn-more", "page_title": "apps-build-register-a-dot-name", "index": 9, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 7463, "end_char": 7717, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2507ceeb95c7fed22d6551d6b1ffffdaf9b17924f82831a9915d394eb4fe3226", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [Naming (DotNS)](../architecture/naming.md): resolution, the contracts and the naming rules\n- [DotNS UI](https://dotns.dev-dot.li): the same lookups in a browser\n- [Build & publish an app](build-and-publish.md): bind the name to a bundle"}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#introduction", "page_title": "Sign and Submit Transactions", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 33, "end_char": 679, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nThis guide covers the `@parity/product-sdk-signer` package, which gives your Product a typed, host-aware signing interface for deriving accounts and signing payloads (raw bytes or full transactions) from inside a Polkadot host container. The SDK exposes a single orchestrator, `SignerManager`, that wraps both the production host path ([Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/)) and a deterministic dev path behind the same `Result`-typed API.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Sign transactions](/apps/build/platform-services-sdk/#sign-transactions)."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#prerequisites", "page_title": "Sign and Submit Transactions", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 679, "end_char": 1560, "estimated_token_count": 216, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have:\n\n- A Polkadot Product project running locally (see [Set Up Your Project](/apps/build/#set-up-your-project)) with a TypeScript toolchain\n- Node.js 20 or later with ESM support (`@parity/product-sdk-signer` is ESM only)\n- Polkadot Desktop to run your Product inside a host container (see [Install Desktop and Pair](/apps/get-started/))\n\n!!! note\n    To test signing without a host container, use `manager.connect('dev')`. This loads the standard Substrate dev accounts (Alice, Bob, and others) locally and does not require Polkadot Desktop. See [Test Without a Host](#test-without-a-host).\n\n!!! note \"Code examples\"\n    The snippets in this guide are standalone; each one illustrates one concept and can be pasted into your Product independently. They are confirmed working with Polkadot Desktop and `@parity/product-sdk` v0.9.0."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#install-the-sdk", "page_title": "Sign and Submit Transactions", "index": 2, "depth": 2, "title": "Install the SDK", "anchor": "install-the-sdk", "start_char": 1560, "end_char": 2632, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install the SDK\n\nThe SDK installs two ways. The umbrella package, `@parity/product-sdk`, is the recommended starting point: one dependency that re-exports most of the SDK. Individual packages install only what you use, which keeps your bundle smaller and your dependencies explicit, so switch to them later as a bundle-size optimization. The two use different import specifiers, so switching styles means updating your imports. See [Umbrella or Individual Packages](/apps/build/#umbrella-or-individual-packages) for the full comparison.\n\n\n- **Umbrella package**: The whole SDK in one dependency.\n\n    ```bash\n    npm install @parity/product-sdk\n    ```\n\n- **Individual package**: Only the signer.\n\n    ```bash\n    npm install @parity/product-sdk-signer\n    ```\n\nThe import specifiers differ between the two. The snippets in this guide use the standalone specifier `@parity/product-sdk-signer`; on the umbrella, the same exports come from the `@parity/product-sdk/wallet` subpath, which keeps the older name. `SignerManager` is also re-exported from the umbrella root."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#how-product-accounts-work", "page_title": "Sign and Submit Transactions", "index": 3, "depth": 2, "title": "How Product Accounts Work", "anchor": "how-product-accounts-work", "start_char": 2632, "end_char": 3521, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How Product Accounts Work\n\nEvery product-scoped account is identified by a `ProductAccountId` tuple:\n\n- **`dotNsIdentifier`**: The dotNS identifier of the Product requesting the account, for example the `.dot` name your Product is loaded under.\n- **`derivationIndex`**: A non-negative integer chosen by the Product. Index `0` is the conventional default; higher indices give you additional sub-accounts within the same Product.\n\nThe same `(dotNsIdentifier, derivationIndex)` pair always yields the same public key, so your Product can reproduce the same address across sessions without persisting it.\n\n!!! note \"Per-Product isolation is a privacy feature\"\n    `app-a.dot` and `app-b.dot` produce different addresses for the same user. This prevents passive on-chain correlation across Products. Sharing an account across Products requires explicit permission; it is never the default."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#set-up-signer-manager", "page_title": "Sign and Submit Transactions", "index": 4, "depth": 2, "title": "Set Up Signer Manager", "anchor": "set-up-signer-manager", "start_char": 3521, "end_char": 5565, "estimated_token_count": 473, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Set Up Signer Manager\n\nConstruct `SignerManager` once and hold it for the lifetime of your Product. Always set `ss58Prefix` and `dappName` explicitly. Use the `onConnect` callback to request any resources your Product needs immediately after connection; the callback fires exactly once per connect and re-fires automatically after any auto-reconnect.\n\n```typescript\nimport { SignerManager } from '@parity/product-sdk-signer';\n\nconst manager = new SignerManager({\n  ss58Prefix: 0,\n  dappName: 'my-product',\n  onConnect: async (_account, { requestResourceAllocation, signal }) => {\n    try {\n      const outcomes = await requestResourceAllocation([\n        { tag: 'BulletinAllowance', value: undefined },\n      ]);\n      if (signal.aborted) return;\n      if (outcomes.some((outcome) => outcome !== 'Allocated')) {\n        // Degrade gracefully: the capability is unavailable, not fatal.\n      }\n    } catch (cause) {\n      // Typed host error; the connection itself is unaffected.\n    }\n  },\n});\n```\n\n- **`ss58Prefix`**: The SS58 address-format prefix for the target network. Use `0` for the Polkadot relay chain.\n- **`dappName`**: A human-readable name for your Product, shown in Desktop UI.\n- **`onConnect`**: Fires once per connection transition. Request the resources your Product needs here, before any signing call is made.\n- **`ctx.requestResourceAllocation`**: The one call in this package that **throws** instead of returning a `Result`, so wrap it in `try`/`catch`. Each outcome is `'Allocated'`, `'Rejected'`, or `'NotAvailable'`; treat anything other than allocated as the capability being unavailable.\n- **`ctx.signal`**: Aborts if the user disconnects while the request is in flight. Check it before acting on the outcomes.\n\n!!! note \"`AutoSigning` is not grantable yet\"\n    It is the resource most worth requesting and the one you cannot depend on: both the Android and iOS wallets return `NotAvailable` for it today. Keep per-transaction signing as the real path. See [Allowances and Permissions](/apps/concepts/allowances/)."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#connect-to-the-host", "page_title": "Sign and Submit Transactions", "index": 5, "depth": 2, "title": "Connect to the Host", "anchor": "connect-to-the-host", "start_char": 5565, "end_char": 7307, "estimated_token_count": 416, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Connect to the Host\n\nCall `connect()` to establish a session with the host and discover available accounts. `connect()`, `selectAccount()`, `getProductAccount()`, and `signRaw()` all return a `Result`; always check `.ok` before accessing `.value`. (`getSigner()` returns a nullable directly, not a `Result`.)\n\nEach step below is a self-contained function over the `manager` you built above, so you can paste them one at a time.\n\n```typescript\nasync function connectAndSelect() {\n  const connectResult = await manager.connect();\n  if (!connectResult.ok) {\n    // HostUnavailableError when running outside Desktop\n    console.error(connectResult.error.message);\n    return null;\n  }\n\n  const accounts = connectResult.value;\n  if (accounts.length === 0) {\n    // Connected, but the host derived no accounts for this Product.\n    return null;\n  }\n\n  // Auto-select the first account if none is already selected\n  if (!manager.getState().selectedAccount) {\n    const selectResult = manager.selectAccount(accounts[0].address);\n    if (!selectResult.ok) {\n      console.error(selectResult.error.message);\n      return null;\n    }\n  }\n\n  return manager.getState().selectedAccount;\n}\n```\n\n!!! warning \"A successful connect can still yield zero accounts\"\n    `connect()` resolves with `ok([])` — not an error — when `dappName` is unset or the host rejects the derivation, typically because the `.dot` identifier is not registered for that user. Check the length before indexing, or `accounts[0].address` throws on a path the SDK treats as normal.\n\n`connect()` defaults to the host provider. Outside a host container it returns `HostUnavailableError`; use `connect('dev')` for local testing instead. See [Test Without a Host](#test-without-a-host)."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#get-a-product-account", "page_title": "Sign and Submit Transactions", "index": 6, "depth": 2, "title": "Get a Product Account", "anchor": "get-a-product-account", "start_char": 7307, "end_char": 8017, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Get a Product Account\n\n`getProductAccount` requests the product-scoped account for a given `dotNsIdentifier` from the host. This is a host-only API; it returns `HostUnavailableError` when the active provider is `'dev'`.\n\n```typescript\nasync function loadProductAccount() {\n  const accountResult = await manager.getProductAccount('my-product.dot', 0);\n  if (!accountResult.ok) {\n    console.error(accountResult.error.message);\n    return null;\n  }\n\n  return accountResult.value; // SignerAccount\n}\n```\n\nThe returned `SignerAccount` exposes:\n\n- **`address`**: The SS58-encoded address for the current network.\n- **`publicKey`**: The raw 32-byte public key.\n- **`name`**: An optional display name, or `null`."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#show-a-display-name", "page_title": "Sign and Submit Transactions", "index": 7, "depth": 2, "title": "Show a Display Name", "anchor": "show-a-display-name", "start_char": 8017, "end_char": 9572, "estimated_token_count": 364, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Show a Display Name\n\nThere is no built-in primitive for an in-app username, so most Products need to choose a display identity themselves. [Usernames in Your Product](/apps/concepts/identity/#usernames-in-your-product) covers the pattern to follow; this section covers the call it depends on.\n\nWhen the user holds a personhood tier, the platform already associates an earned name with their account. Read it with `getUserId`:\n\n```typescript\nasync function loadDisplayName() {\n  const idResult = await manager.getUserId();\n  if (!idResult.ok) {\n    return null; // No host, no permission, or no personhood tier\n  }\n\n  return idResult.value.primaryUsername; // e.g. 'joseph.42'\n}\n```\n\nWhen there is no earned name to read, fall back to a per-Product display name the user sets, stored in [local storage](/apps/product-sdk/local-storage/) (device-local) or [cloud storage](/apps/product-sdk/cloud-storage/) (shared) and keyed to their per-app account. Either way, treat the result as a label rather than as identity: authorization and uniqueness come from the per-app account and Proof of Personhood.\n\n!!! warning \"`getUserId` is host-only and prompts the user\"\n    `getUserId` returns `HostUnavailableError` when the active provider is `'dev'`, so a Product that renders a display name works in a Host and fails under the dev provider. It also triggers a host identity-permission prompt on first use. If your Product has its own display-name chain and does not need the platform name, skip the call rather than requesting a permission you will not use."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#sign-arbitrary-bytes", "page_title": "Sign and Submit Transactions", "index": 8, "depth": 2, "title": "Sign Arbitrary Bytes", "anchor": "sign-arbitrary-bytes", "start_char": 9572, "end_char": 10460, "estimated_token_count": 203, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Sign Arbitrary Bytes\n\nUse `signRaw` to sign an arbitrary byte payload with the currently selected account. This is useful for off-chain authentication, message proofs, and any use case that does not require a full transaction.\n\n`signRaw` returns a `Result<Uint8Array, SignerError>`; it never throws. Always check `.ok` before accessing `.value`.\n\n```typescript\nasync function signMessage() {\n  const account = await loadProductAccount();\n  if (!account) return null;\n\n  const selectResult = manager.selectAccount(account.address);\n  if (!selectResult.ok) {\n    console.error(selectResult.error.message);\n    return null;\n  }\n\n  const payload = new TextEncoder().encode('hello polkadot');\n  const result = await manager.signRaw(payload);\n\n  if (!result.ok) {\n    console.error(result.error.message);\n    return null;\n  }\n\n  return result.value; // Uint8Array - the raw signature\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#sign-and-submit-a-transaction", "page_title": "Sign and Submit Transactions", "index": 9, "depth": 2, "title": "Sign and Submit a Transaction", "anchor": "sign-and-submit-a-transaction", "start_char": 10460, "end_char": 11909, "estimated_token_count": 341, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Sign and Submit a Transaction\n\nTo sign a transaction, get a `PolkadotSigner` from `SignerManager` and pass it to the `signAndSubmit` method from `polkadot-api` (PAPI). The SDK handles routing the signing request to Desktop, which renders a signing modal and forwards to the [Polkadot App](/reference/apps/hosts/polkadot-app/).\n\n`@parity/product-sdk-signer` provides only the signer interface; chain connectivity uses `polkadot-api` directly. Set up your PAPI client separately:\n\n```typescript\nimport { createClient } from 'polkadot-api';\nimport { getWsProvider } from 'polkadot-api/ws-provider/web';\nimport { dot } from '@polkadot-api/descriptors';\n\nconst client = createClient(getWsProvider('wss://rpc.polkadot.io'));\nconst api = client.getTypedApi(dot);\n```\n\nThe `dot` descriptor is the typed API surface for the Polkadot relay chain. Run `npx papi add dot` in your project to pull or regenerate it.\n\n```typescript\nasync function transfer() {\n  const recipient = 'INSERT_RECIPIENT_ADDRESS';\n\n  const account = await loadProductAccount();\n  if (!account) return null;\n\n  const selectResult = manager.selectAccount(account.address);\n  if (!selectResult.ok) return null;\n\n  // getSigner() returns null if no account is selected\n  const signer = manager.getSigner();\n  if (!signer) return null;\n\n  const tx = api.tx.Balances.transfer_keep_alive({\n    dest: recipient,\n    value: 1_000_000_000_000n,\n  });\n\n  return tx.signAndSubmit(signer);\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#handle-signing-errors", "page_title": "Sign and Submit Transactions", "index": 10, "depth": 2, "title": "Handle Signing Errors", "anchor": "handle-signing-errors", "start_char": 11909, "end_char": 13355, "estimated_token_count": 305, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Handle Signing Errors\n\nTwo outcomes are worth handling explicitly: the user rejects the request, or the signing session times out.\n\n```typescript\nimport {\n  HostRejectedError,\n  TimeoutError,\n} from '@parity/product-sdk-signer';\nimport type { PolkadotSigner } from 'polkadot-api';\n\nasync function submitOrReport(\n  tx: { signAndSubmit(signer: PolkadotSigner): Promise<unknown> },\n  signer: PolkadotSigner,\n) {\n  try {\n    return await tx.signAndSubmit(signer);\n  } catch (error) {\n    if (error instanceof HostRejectedError) {\n      // The user dismissed the signing prompt on the Polkadot App\n      return null;\n    }\n    if (error instanceof TimeoutError) {\n      // The signing session expired before the user responded\n      return null;\n    }\n    throw error;\n  }\n}\n```\n\n- **`HostRejectedError`**: The user explicitly denied the request. Return the user to a stable state and let them retry.\n- **`TimeoutError`**: The signing session expired. Treat this the same as a rejection.\n\n!!! tip \"Design for async latency\"\n    Signing is asynchronous because the Polkadot App runs on a separate device. Show a non-blocking pending state rather than freezing the interface, and make sure your retry path is idempotent in case the user attempts the same action twice. There is no push notification when the phone is waiting, so a stalled-looking action is often an [unanswered prompt](/apps/troubleshooting/#the-app-seems-frozen-after-an-action)."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#test-without-a-host", "page_title": "Sign and Submit Transactions", "index": 11, "depth": 2, "title": "Test Without a Host", "anchor": "test-without-a-host", "start_char": 13355, "end_char": 14462, "estimated_token_count": 270, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Test Without a Host\n\nDuring development, use `connect('dev')` to load the standard Substrate dev accounts (Alice, Bob, Charlie, Dave, Eve, and Ferdie) without needing Polkadot Desktop. The signing API is identical — only the provider changes.\n\n```typescript\nasync function devSignRaw() {\n  const result = await manager.connect('dev');\n  if (!result.ok) return null;\n\n  const [alice] = result.value;\n  if (!alice) return null;\n\n  const selectResult = manager.selectAccount(alice.address);\n  if (!selectResult.ok) return null;\n\n  const signResult = await manager.signRaw(new TextEncoder().encode('test'));\n  if (!signResult.ok) return null;\n\n  return signResult.value; // Uint8Array - the raw signature\n}\n```\n\n!!! warning \"Four methods are host-only\"\n    `getProductAccount`, `getProductAccountAlias`, `createRingVRFProof`, and `getUserId` return `HostUnavailableError` when the active provider is `'dev'`. `getUserId` is easy to miss: [Show a Display Name](#show-a-display-name) uses it to read the user's earned name, so a Product that does that renders fine in a Host and fails under the dev provider."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#limitations", "page_title": "Sign and Submit Transactions", "index": 12, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 14462, "end_char": 14858, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Limitations\n\n- The package is ESM only; your Product's build pipeline must support ESM imports.\n- `SignerManager.destroy()` is terminal. After calling it, all subsequent method calls return `DestroyedError`. Use `disconnect()` for a reversible reset.\n- Account persistence across page reloads requires the host to expose `localStorage`. Outside a host container, persistence silently no-ops."}
{"source": "polkadot-docs", "page_id": "apps-build-sign-and-submit", "url": "https://developer.polkadot.com/apps/build/sign-and-submit/#where-to-go-next", "page_title": "Sign and Submit Transactions", "index": 13, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 14858, "end_char": 15703, "estimated_token_count": 242, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:281a577ed9d75d947e94211955fe35d414605922627fd9842e3e901fafcce4c3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    Your Product can sign; next, use that signer to store content on the Bulletin Chain and fetch it from anywhere by CID.\n\n    [:octicons-arrow-right-24: Store Data on Chain](/apps/build/store-data-on-chain/)\n\n-   <span class=\"badge external\">External</span> **PAPI Docs**\n\n    ---\n\n    Reference for the typed PAPI signer interface that `@parity/product-sdk-signer` exposes.\n\n    [:octicons-arrow-right-24: Visit Site](https://papi.how)\n\n-   <span class=\"badge external\">External</span> **Product SDK API Reference**\n\n    ---\n\n    The full `product-sdk` surface beyond this recipe: every package, class, and method.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#introduction", "page_title": "Store Data on Chain", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 24, "end_char": 1917, "estimated_token_count": 451, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nThis guide covers the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/), Polkadot's content-addressed storage layer for Products. You write data, the chain returns a Content Identifier (CID), and anyone with that CID can fetch the data back from the network. Data is retained for about two weeks by default and can be renewed. Access is gated by a per-account storage authorization, not a token balance. The guide walks through four flows in order of complexity: a Hello World store and retrieve, a larger file upload, long-lived data with renewal, and Preimage submission.\n\n!!! info \"Storage options for your Product\"\n    Match the data to the layer built for it; see [Where to Store Data](/apps/concepts/data-placement/) for the full decision guide.\n\n    - **Local storage**: Per-Product, per-device key-value for preferences, drafts, and cached values. Not synced across devices. See [Persist Data Locally](/apps/build/persist-data-locally/).\n    - **Bulletin Chain**: Content-addressed, on-chain, retained ~2 weeks by default and renewable. Fetched later by CID: profile photos, published articles, app bundles. See [Store Data on Chain](/apps/build/store-data-on-chain/).\n    - **Statement Store**: Gossip-distributed, short-lived (default 30s TTL), allowance-gated. Real-time signaling between users: chat, presence, typing indicators. See [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/).\n\n\n!!! note \"Network\"\n    The flows on this page target Paseo Next, the default environment in [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) development builds. If you switched environments during setup, select the matching network from the environment selector in Polkadot Desktop.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Storage & data](/apps/architecture/storage/)."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#prerequisites", "page_title": "Store Data on Chain", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1917, "end_char": 2465, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have:\n\n- Completed the [Install Desktop and Pair](/apps/get-started/) and [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/) guides; your account needs PAS funds and a Bulletin Chain authorization. If you have not obtained a Bulletin Chain authorization yet, request one from the [Bulletin Chain authorization page](https://paritytech.github.io/polkadot-bulletin-chain/authorizations)\n- A Polkadot Product project running locally (see [Set Up Your Project](/apps/build/#set-up-your-project))"}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#install-the-sdk", "page_title": "Store Data on Chain", "index": 2, "depth": 2, "title": "Install the SDK", "anchor": "install-the-sdk", "start_char": 2465, "end_char": 3136, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install the SDK\n\nThis guide builds on `createApp`, which only the umbrella package provides, so install the umbrella:\n\n```bash\nnpm install @parity/product-sdk\n```\n\nEvery snippet imports from `@parity/product-sdk`, including `SignerManager` and `CloudStorageClient`, which the umbrella re-exports from its root, and `parseCid` and `CidCodec`, which it re-exports from its `@parity/product-sdk/cloud-storage` subpath, so no other package is needed. The renewal example is the exception: it also uses `@ipld/dag-pb` to read chunked-upload manifests. See [Umbrella or Individual Packages](/apps/build/#umbrella-or-individual-packages) for how the install styles compare."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#set-up-your-storage-client", "page_title": "Store Data on Chain", "index": 3, "depth": 2, "title": "Set Up Your Storage Client", "anchor": "set-up-your-storage-client", "start_char": 3136, "end_char": 5334, "estimated_token_count": 548, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Set Up Your Storage Client\n\nEvery snippet in this guide is Product code: modules you place inside the Product running at `localhost:3000` (per [Set Up Your Project](/apps/build/#set-up-your-project)), loaded by Polkadot Desktop. Run nothing from a terminal; the snippets execute in the browser context Polkadot Desktop's localhost bypass loads them into. The signer for every Bulletin transaction comes from the Host (your paired account in Polkadot Desktop); your Product never derives keys.\n\nCreate the SDK app and connect the wallet:\n\n```typescript title=\"setup-app.ts\"\nimport { createApp } from '@parity/product-sdk';\n\n// The Host supplies your Product's identity: `createApp` reads the product ID\n// the Host loaded you under and derives the user's product account from it.\n// If the Host declines to derive an account, `connect()` resolves with an empty\n// list instead of failing, so check the list before you rely on it.\nexport const app = await createApp();\n\nexport const { accounts } = await app.wallet.connect();\nif (accounts.length === 0) {\n  throw new Error(\n    'The Host returned no account for this Product. Check that you are signed in to Polkadot Desktop.',\n  );\n}\n\n```\n\n`createApp()` returns an `App` with `app.wallet`, `app.localStorage`, `app.chain`, and `app.cloudStorage`, the high-level Bulletin Chain API exposing `upload()`, `fetch()`, and `computeCid()`. The exported `app` and `accounts` are reused across the simple sections that follow, and the same setup file is shared with [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/).\n\n!!! warning \"The Host supplies your Product's identity\"\n    Since `@parity/product-sdk` v0.30.0, `createApp` takes no `name`: it derives the user's account from the product ID the Host loaded your Product under. Releases before v0.30.0 require `name` and derive the account from it instead. If the Host declines to derive an account, `wallet.connect()` resolves with _zero accounts_ rather than failing, so the only symptom is an empty list. Every upload on this page needs a selected account, so guard the list before going further. See [Product SDK](/apps/product-sdk/) for the full `createApp` contract."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#store-a-hello-world", "page_title": "Store Data on Chain", "index": 4, "depth": 2, "title": "Store a Hello World", "anchor": "store-a-hello-world", "start_char": 5334, "end_char": 6283, "estimated_token_count": 246, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Store a Hello World\n\nThe simplest write: a short string, one line.\n\n```typescript title=\"hello-bulletin.ts\"\n// Place this in your Product, after the setup from `setup-app.ts`.\n\nimport { app } from './setup-app';\n\nconst stored = await app.cloudStorage!.upload('Hello, Bulletin!');\nif (!stored.ok) throw new Error(`Upload failed: ${stored.error.message}`);\n\nconsole.log(`CID: ${stored.value}`);\n\n```\n\n`app.cloudStorage.upload(data)` accepts a string or `Uint8Array`, signs the underlying transaction with your paired account, and resolves with a `Result` whose `value` is the CID, a Blake2b-256 content hash encoded as a CIDv1 string. Internally the SDK uses the chunking pipeline with a DAG-PB manifest, so the same call shape works for any payload size; see [Store a Larger File](#store-a-larger-file) for the chunk-level controls.\n\nYou should see something like:\n\n```text\nCID: bafk2bzacea6wlxyalo6gbajlwuubv7w5dvss3vmfqmavlqy63e4vypth2ov6u\n```"}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#retrieve-your-data", "page_title": "Store Data on Chain", "index": 5, "depth": 2, "title": "Retrieve Your Data", "anchor": "retrieve-your-data", "start_char": 6283, "end_char": 7776, "estimated_token_count": 366, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Retrieve Your Data\n\nThe Bulletin Chain follows a \"write-to-chain, read-from-network\" model: the chain holds the storage commitment, and the data itself lives at collator nodes addressable by CID. Reading is permissionless. No authorization, fees, or signature are required. `app.cloudStorage.fetch(cid)` routes through the Host's preimage subscription with caching:\n\n```typescript title=\"retrieve-data.ts\"\n// Place this in your Product, after the setup from `setup-app.ts`.\n\nimport { app } from './setup-app';\n\nconst CID_STRING = 'INSERT_CID';\n\nconst fetched = await app.cloudStorage!.fetch(CID_STRING);\nif (!fetched.ok) throw new Error(`Fetch failed: ${fetched.error.message}`);\n\nconst bytes = fetched.value;\nconsole.log(`Retrieved ${bytes.length} bytes`);\nconsole.log(new TextDecoder().decode(bytes));\n\n// Verify the fetched bytes match the CID you asked for.\nconst recomputed = await app.cloudStorage!.computeCid(bytes);\nconsole.log(`CID verified: ${recomputed === CID_STRING}`);\n\n```\n\nThe snippet verifies the bytes by recomputing their CID with `app.cloudStorage.computeCid(bytes)` and comparing to the CID you asked for. If the host returned the wrong bytes, the recomputed CID does not match; that is the integrity property content addressing gives you.\n\nFor libp2p / Helia / Smoldot retrieval paths (when you want to fetch outside a Polkadot Desktop container), see [Retrieve Your Data](/chain-interactions/store-data/bulletin-chain/#retrieve-your-data) in the canonical tutorial."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#store-a-larger-file", "page_title": "Store Data on Chain", "index": 6, "depth": 2, "title": "Store a Larger File", "anchor": "store-a-larger-file", "start_char": 7776, "end_char": 12156, "estimated_token_count": 1080, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Store a Larger File\n\n`app.cloudStorage.upload()` chunks transparently above a 2 MiB threshold and stores a DAG-PB manifest that references each chunk's CID, returning the manifest CID. For most Products, that is all you need. Pass any `Uint8Array` to `upload()` and the SDK handles chunking, manifest generation, and the underlying transactions for you.\n\nFor finer control, such as custom chunk size, per-chunk progress callbacks, or access to the individual chunk CIDs, drop one level lower to `CloudStorageClient`, which the umbrella re-exports from `@parity/product-sdk-cloud-storage`. This is also the path you use for the next two sections (authorization checks, renewal). `CloudStorageClient` needs a signer, and `App` does not expose the one `createApp` holds, so this setup builds its own with `SignerManager`. Set its `dappName` to the product ID the Host loads your Product under, so it derives the same account as `app.wallet`:\n\n```typescript title=\"setup-client.ts\"\nimport { CloudStorageClient, SignerManager } from '@parity/product-sdk';\n\n// `App` does not expose its signer, so the advanced sections build their own.\n// Unlike `createApp`, `SignerManager` does not read your Product's identity from\n// the Host: set `dappName` to the product ID the Host loads you under (your\n// `.dot` name) so it derives the same account that `app.wallet` does.\nconst signerManager = new SignerManager({ dappName: 'my-product.dot' });\n\nconst connected = await signerManager.connect();\nif (!connected.ok) throw new Error(connected.error.message);\n\nconst accounts = connected.value;\nif (accounts.length === 0) {\n  throw new Error(\n    'The Host returned no account for this Product. Check that you are signed in to Polkadot Desktop.',\n  );\n}\n\n// A real Product would render an account picker; here we pick the first one.\nconst selected = signerManager.selectAccount(accounts[0].address);\nif (!selected.ok) throw new Error(selected.error.message);\n\nconst signer = signerManager.getSigner();\nif (!signer) throw new Error('Could not build a signer from the selected account.');\n\nexport const client = await CloudStorageClient.create({\n  environment: 'paseo',\n  signer,\n});\n\nexport const account = selected.value;\n\n```\n\n`CloudStorageClient.create({ environment: 'paseo', signer })` resolves with `client.store / client.renew / client.checkAuthorization / client.fetchBytes / client.estimateAuthorization` for the high-level operations, plus `client.api` for the typed Bulletin Chain API when you need to drop one level lower still. The exported `client` and `account` are reused by the advanced sections that follow.\n\nThe `client.store(...)` builder takes the same chunking pipeline `app.cloudStorage.upload` uses internally, with the controls exposed:\n\n```typescript title=\"store-large-file.ts\"\n// Place this in your Product, after the setup from `setup-client.ts`.\n\nimport { client } from './setup-client';\n\n// e.g., a File the user dropped, an asset bundled with your Product.\ndeclare const largeFile: Uint8Array;\n\nconst estimate = client.estimateAuthorization(largeFile.length);\nconsole.log(\n  `Need ${estimate.transactions} txs / ${estimate.bytes} bytes of authorization`,\n);\n\nconst result = await client\n  .store(largeFile)\n  .withChunkSize(1024 * 1024)\n  .withManifest(true)\n  .withCallback((event) => {\n    console.log(`Progress: ${JSON.stringify(event)}`);\n  })\n  .send();\n\nconsole.log(`Root CID (manifest): ${result.cid?.toString()}`);\nif (result.chunks) {\n  console.log(`Chunks: ${result.chunks.numChunks}`);\n  for (const [i, cid] of result.chunks.chunkCids.entries()) {\n    console.log(`  [${i}] ${cid.toString()}`);\n  }\n}\n\n```\n\nThe returned `StoreResult.cid` is the manifest CID; `StoreResult.chunks.chunkCids` lists each chunk's individual CID. `withCallback()` receives per-chunk progress events as the upload streams. The Bulletin Chain limits each transaction to 2 MiB; see [Size Limits](/reference/polkadot-hub/data-storage/#size-limits). Chunks cannot exceed that.\n\nChunked uploads are not atomic. Each chunk is a separate transaction, and the manifest is one more on top. If chunk N fails after chunks 0..N-1 have already landed, the earlier chunks remain on chain and consume your authorization. There is no rollback. Inspect the `chunkCids` on the thrown error and either resume from the failed chunk or, if the use case demands it, abandon the partial upload."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#get-authorization", "page_title": "Store Data on Chain", "index": 7, "depth": 2, "title": "Get Authorization", "anchor": "get-authorization", "start_char": 12156, "end_char": 15112, "estimated_token_count": 716, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Get Authorization\n\nThe Bulletin Chain has no token balance for storage; every account needs an explicit authorization. You should already have one from [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/); if not, request your storage quota directly from the [Bulletin Chain authorization page](https://paritytech.github.io/polkadot-bulletin-chain/authorizations). If a store is rejected, confirm the authorization is on the account that signs: see [uploads are rejected](/apps/troubleshooting/#uploads-are-rejected-or-host-storage-unavailable) in troubleshooting.\n\n!!! note\n    The `authorize_account` extrinsic requires the authorizer origin: Root, or an account or parachain allowed to grant authorizations. You cannot self-authorize programmatically; on Polkadot TestNet, use the [Bulletin Chain authorization page](https://paritytech.github.io/polkadot-bulletin-chain/authorizations) before submitting any `store` extrinsic from your Product.\n\n`CloudStorageClient` (introduced in [Store a Larger File](#store-a-larger-file)) exposes `client.checkAuthorization(address)` as a pre-flight check before submitting a store:\n\n```typescript title=\"check-authorization.ts\"\n// Place this in your Product, after the setup from `setup-client.ts`.\n\nimport { client, account } from './setup-client';\n\n// `checkAuthorization` resolves with a `Result`, so unwrap it before reading\n// the status. The fields live on `auth.value`, never on `auth` itself.\nconst auth = await client.checkAuthorization(account.address);\n\nif (!auth.ok) {\n  console.error(`Could not read the authorization: ${auth.error.message}`);\n} else if (!auth.value.authorized) {\n  console.log(`No authorization found for ${account.address}`);\n} else {\n  console.log(`Remaining transactions: ${auth.value.remainingTransactions}`);\n  console.log(`Remaining bytes:        ${auth.value.remainingBytes}`);\n  console.log(`Expires at block:       ${auth.value.expiration}`);\n}\n\n// Estimate authorization needed for a hypothetical 2 MiB payload.\nconst estimate = client.estimateAuthorization(2 * 1024 * 1024);\nconsole.log(`To store 2 MiB you need ~${estimate.transactions} txs, ${estimate.bytes} bytes`);\n\n```\n\n`checkAuthorization` resolves with a `Result`, not with the status directly. Check `auth.ok` first; the status is on `auth.value`, and reading the fields off the wrapper yields `undefined` and silently takes the failure branch. On success, `auth.value` carries an `AuthorizationStatus`:\n\n- **`authorized`**: `true` when an authorization record exists for the account.\n- **`remainingTransactions`**: Number of `store` calls remaining in the quota.\n- **`remainingBytes`**: Bytes remaining across those calls (`bigint`).\n- **`expiration`**: The block at which any unused quota expires.\n\n`client.estimateAuthorization(dataSize)` returns the `{ transactions, bytes }` you would need to authorize a hypothetical payload of `dataSize` bytes, which is useful before requesting a quota top-up."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#renew-long-lived-data", "page_title": "Store Data on Chain", "index": 8, "depth": 2, "title": "Renew Long-Lived Data", "anchor": "renew-long-lived-data", "start_char": 15112, "end_char": 20710, "estimated_token_count": 1292, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Renew Long-Lived Data\n\nStored data is retained for roughly two weeks. If your Product needs the data to outlive that window, renew it before it expires.\n\nRenewal identifies the data by its content hash, which is the multihash digest of its CID. What you renew depends on the kind of CID:\n\n- **Single-transaction CID**: The CID codec is raw (`CidCodec.Raw`, and the string starts with `bafk`). Renew that one content hash.\n- **Manifest CID**: The CID codec is DAG-PB (`CidCodec.DagPb`, and the string starts with `bafy`). A chunked upload stores each chunk and the manifest as separate transactions, each with its own retention period, so renew the manifest and every chunk. The manifest lists the chunk CIDs as its links.\n\nThe following example takes the CID that an upload returned, collects the content hashes of the manifest and its chunks when the CID is a manifest, and registers a renewal for each one. It reads the manifest with `fetchBytes(cid, { noReassemble: true })` and decodes it with `@ipld/dag-pb`, so install that package too:\n\n```bash\nnpm install @ipld/dag-pb\n```\n\n```typescript title=\"renew-data.ts\"\n// Place this in your Product, after the setup from `setup-client.ts`.\n\nimport { decode } from '@ipld/dag-pb';\nimport { CidCodec, parseCid } from '@parity/product-sdk/cloud-storage';\nimport { client } from './setup-client';\n\n// The CID that the upload returned: a single-transaction CID, or the manifest\n// CID of a chunked upload.\ndeclare const cid: string;\n\n// A CID's multihash digest is the content hash the Bulletin Chain tracks.\n// The map is keyed by CID, so identical chunks are renewed once.\nconst root = parseCid(cid);\nconst contentHashes = new Map<string, Uint8Array>([\n  [root.toString(), root.multihash.digest],\n]);\n\n// A DAG-PB CID is a manifest. Its links are the chunk CIDs, and each chunk is\n// a separately stored transaction that needs its own renewal.\nif (root.code === CidCodec.DagPb) {\n  const manifest = await client.fetchBytes(cid, { noReassemble: true });\n  if (!manifest.ok) throw new Error(manifest.error.message);\n  for (const link of decode(manifest.value).Links) {\n    contentHashes.set(link.Hash.toString(), link.Hash.multihash.digest);\n  }\n}\n\n// Register a one-time renewal for each stored record.\nfor (const contentHash of contentHashes.values()) {\n  const receipt = await client.inner.renew(contentHash).send();\n  console.log(`Renewal registered in block ${receipt.blockNumber}`);\n}\n\n```\n\nIf you uploaded with `CloudStorageClient.store(...).send()`, `StoreResult.chunks.chunkCids` already holds the chunk CIDs as `CID` objects, so you can read each content hash from `chunkCid.multihash.digest` without fetching the manifest.\n\n`client.inner.renew(contentHash)` registers a one-time renewal. When the current retention period ends, the chain stores the data again, and it stays available for another full period. The renewal is paid from your authorization when you register it. `client.inner` is the underlying Bulletin SDK client, which `CloudStorageClient` exposes for operations beyond its own surface, and `send()` resolves with a `TransactionReceipt` that includes `blockHash`, `txHash`, and `blockNumber`.\n\nRenewals have their own byte budget. The chain counts renewed bytes separately from stored bytes, and it rejects a renewal when the bytes already renewed under your authorization, plus the size of this data, would exceed the authorization's byte allowance. The `remainingBytes` that `checkAuthorization` reports covers stored bytes only, so it does not predict whether a renewal succeeds.\n\nThe underlying client also provides the following alternatives:\n\n- **`client.inner.enableAutoRenew(contentHash)`**: Renews the data at the end of every retention period, until your authorization can no longer cover a renewal.\n- **`client.inner.forceRenew(contentHash)`**: Stores a new copy of the data immediately, with a retention period that starts from the current block.\n- **`client.renew(block, index)`**: Renews by position, using the `blockNumber` and `extrinsicIndex` from a single-transaction `StoreResult`. Despite its name, `extrinsicIndex` holds the index from the `Stored` event, which is the value renewal expects. A position identifies one stored copy and stays valid only until that copy's retention period ends. After `forceRenew`, the original copy keeps its position until then, so renewing that position stores and pays for yet another copy. Prefer the content hash, which always resolves to the latest copy.\n\nThe cloud storage client's typed API does not expose `RetentionPeriod`, the `Utility` pallet, or the renewal pre-flight. For those, create a `polkadot-api` client with the `paseo_bulletin` descriptor from `@parity/product-sdk-descriptors/paseo-bulletin`. It provides `query.TransactionStorage.RetentionPeriod`, the `BulletinTransactionStorageApi.can_renew(account, entry)` runtime API, which reports whether a renewal would be accepted, and the `DataRenewal` calls. To register many renewals in one transaction, pass those calls to `batchSubmitAndWatch` from `@parity/product-sdk-tx`, which wraps them in `Utility.batch_all`; see [Transactions](/apps/product-sdk/tx/).\n\n!!! warning\n    Each content hash can have only one registered renewal at a time, across all accounts. Registering a renewal again before the current one takes effect fails with `RenewalAlreadyEnabled`, so register once per retention period. The Bulletin Chain does not notify your Product before data expires: either enable auto-renewal or run your own scheduler (a cron job, queue, or background worker) that registers renewals in time."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#storage-paths-at-a-glance", "page_title": "Store Data on Chain", "index": 9, "depth": 2, "title": "Storage Paths at a Glance", "anchor": "storage-paths-at-a-glance", "start_char": 20710, "end_char": 21870, "estimated_token_count": 345, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Storage Paths at a Glance\n\nThe flows in this guide target the same chain but differ in authorization, atomicity, and consumer access. Use this table to pick the right path before writing.\n\n|              Path               |                    Authorization                     |          Atomicity           |      Retention       |                            Use When                             |\n|:-------------------------------:|:----------------------------------------------------:|:----------------------------:|:--------------------:|:---------------------------------------------------------------:|\n| Bulletin store (small)          | Bulletin authorization                               | Single tx                    | ~2 weeks (renewable) | Most Product writes                                             |\n| Bulletin store (chunked)        | Bulletin authorization                               | Multi-tx + DAG-PB manifest   | ~2 weeks (renewable) | Files larger than 2 MiB                                         |\n\nFor deeper comparison and the full pallet reference, see [Data Storage Reference](/reference/polkadot-hub/data-storage/)."}
{"source": "polkadot-docs", "page_id": "apps-build-store-data-on-chain", "url": "https://developer.polkadot.com/apps/build/store-data-on-chain/#where-to-go-next", "page_title": "Store Data on Chain", "index": 10, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 21870, "end_char": 22751, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74cf7f479cdc612dcf870e8f3e87ef298068a25d9cc9dea3c7e4d6489f4bb487", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Publish and Subscribe to Off-Chain Data**\n\n    ---\n\n    Your Product can store durable content; next, add real-time state between users via the Statement Store.\n\n    [:octicons-arrow-right-24: Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/)\n\n-   <span class=\"badge guide\">Guide</span> **Read On-Chain Data**\n\n    ---\n\n    Pair Bulletin writes with chain reads via the Host API's PAPI provider.\n\n    [:octicons-arrow-right-24: Read On-Chain Data](/apps/build/read-chain-state/)\n\n-   <span class=\"badge external\">External</span> **Product SDK API Reference**\n\n    ---\n\n    The full `product-sdk` surface beyond this recipe: every package, class, and method.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-concepts-accounts", "url": "https://developer.polkadot.com/apps/concepts/accounts/#introduction", "page_title": "Accounts and Signing", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 588, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50a97fc998c8769bda00c1706df8b60f79185822b01008c9fd15a883a90f10a9", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nMore than one account is in play when you build and deploy a Polkadot Product, and they are not always the same account. Getting them confused is the most common way to hit a `no allowance set for account` error: you fund or authorize one account, then sign with a different one. This page explains which component holds which key, which account actually signs, and how to keep them aligned.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [The Polkadot app (client tier)](/apps/architecture/client/)."}
{"source": "polkadot-docs", "page_id": "apps-concepts-accounts", "url": "https://developer.polkadot.com/apps/concepts/accounts/#who-holds-what", "page_title": "Accounts and Signing", "index": 1, "depth": 2, "title": "Who Holds What", "anchor": "who-holds-what", "start_char": 588, "end_char": 1016, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50a97fc998c8769bda00c1706df8b60f79185822b01008c9fd15a883a90f10a9", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Who Holds What\n\n- **The phone (Polkadot App)**: Holds the user's root private key and the secret for every per-Product account derived from it. All signing happens here. The key never leaves the device.\n- **The Host (Polkadot Desktop or Web)**: Holds no keys. It relays signing requests to the paired phone and shows the result.\n- **The `playground` CLI**: What it holds depends on the signer mode you choose, covered next."}
{"source": "polkadot-docs", "page_id": "apps-concepts-accounts", "url": "https://developer.polkadot.com/apps/concepts/accounts/#the-account-that-signs-a-deploy", "page_title": "Accounts and Signing", "index": 2, "depth": 2, "title": "The Account That Signs a Deploy", "anchor": "the-account-that-signs-a-deploy", "start_char": 1016, "end_char": 2136, "estimated_token_count": 284, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50a97fc998c8769bda00c1706df8b60f79185822b01008c9fd15a883a90f10a9", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Account That Signs a Deploy\n\n`playground deploy` signs with a different account depending on the signer mode:\n\n- **`--signer phone`** (the choice to make for a deploy you intend to keep; omit the flag and `pg deploy` prompts you): The deploy is signed by a **product account derived from the phone's root key**, scoped to your Product. The CLI holds only a paired session; the secret stays on the phone, which approves each step. The CLI does not create its own account in this mode.\n- **`--signer dev --suri <uri>`**: The CLI signs with a **local development key** derived from the URI you pass (for example, `//Alice` or a mnemonic). This account is unrelated to the phone. No phone approvals happen.\n- **`--signer dev` with no `--suri`**: Falls back to a **shared, publicly known development mnemonic**. Anyone can control this account; never use it for a deploy you want to keep.\n\n!!! warning \"Dev-signer deploys are owned by the dev account\"\n    A Product deployed with `--signer dev` is owned by that development key, not by you. Use the phone signer for anything you intend to keep or hand to real users."}
{"source": "polkadot-docs", "page_id": "apps-concepts-accounts", "url": "https://developer.polkadot.com/apps/concepts/accounts/#product-accounts-are-per-product", "page_title": "Accounts and Signing", "index": 3, "depth": 2, "title": "Product Accounts Are Per Product", "anchor": "product-accounts-are-per-product", "start_char": 2136, "end_char": 3088, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50a97fc998c8769bda00c1706df8b60f79185822b01008c9fd15a883a90f10a9", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Product Accounts Are Per Product\n\nA product account is derived deterministically from `[\"product\", productId, derivationIndex]`, so the account you get depends on the `productId` and index in play:\n\n- Inside a Host, your frontend derives its `productId` from where it is loaded: `localhost` maps to `playground.dot`, a `<name>.dot.li` gateway URL maps to `<name>.dot`, and otherwise it falls back to `playground.dot`. The derivation index is `0`.\n- The CLI session derives its own product account from the identifier it was paired under.\n\nThe consequence: the account your running frontend signs with, and the account the CLI deployed under, are the **same only if their `productId` and index match**. A Product loaded from `localhost` (deriving under `playground.dot`) uses a different account than the same Product loaded from `my-app.dot.li` (deriving under `my-app.dot`). See [Identity](/apps/concepts/identity/) for the full derivation model."}
{"source": "polkadot-docs", "page_id": "apps-concepts-accounts", "url": "https://developer.polkadot.com/apps/concepts/accounts/#why-this-causes-no-allowance-set-for-account", "page_title": "Accounts and Signing", "index": 4, "depth": 2, "title": "Why This Causes `no allowance set for account`", "anchor": "why-this-causes-no-allowance-set-for-account", "start_char": 3088, "end_char": 3997, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50a97fc998c8769bda00c1706df8b60f79185822b01008c9fd15a883a90f10a9", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Why This Causes `no allowance set for account`\n\nStorage and messaging [allowances](/apps/concepts/allowances/) are granted **per account**. A missing allowance is rejected independently of your token balance: even with enough PAS to cover fees, the service rejects the request if the signing account has no allowance.\n\nSo the failure is almost always an account mismatch: you granted the allowance (or storage authorization) to one account, but the account that actually signed was a different one — a dev key instead of the phone account, or a product account derived under a different `productId` than you expected. The fix is to grant the allowance to the account that actually signs, and to keep the `productId` consistent between where you request the allowance and where you sign. See the [troubleshooting entry](/apps/troubleshooting/#no-allowance-set-for-account) for the step-by-step resolution."}
{"source": "polkadot-docs", "page_id": "apps-concepts-accounts", "url": "https://developer.polkadot.com/apps/concepts/accounts/#see-the-signing-address", "page_title": "Accounts and Signing", "index": 5, "depth": 2, "title": "See the Signing Address", "anchor": "see-the-signing-address", "start_char": 3997, "end_char": 5460, "estimated_token_count": 331, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50a97fc998c8769bda00c1706df8b60f79185822b01008c9fd15a883a90f10a9", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## See the Signing Address\n\nBefore granting an allowance, confirm which account will sign:\n\n- **From the CLI**: Run `pg status`. It prints the product account paired with your phone in both encodings — the SS58 address and its H160 (EVM) form — along with its PAS and PGAS balances and the state of its Bulletin allowance. It is read-only: it signs nothing and submits no transactions, so it is safe to run at any point. `pg login` prints the same two addresses when a session is established.\n- **In a Host**: A Product running inside Polkadot Desktop or Web can read its product account through the [`signer`](/apps/product-sdk/signer/) package (`getProductAccount`), which returns the account's SS58 address and its H160 (EVM) form. Surfacing that address in your Product's own UI during development is the most reliable way to know what your frontend is signing with.\n\n!!! note \"The two addresses are one key\"\n    `pg status` reports the SS58 and the H160 as separate rows, but they are two encodings of the same product account, not two accounts. Fund and authorize the SS58 form; `pallet-revive` contracts see the H160 form as `caller()`.\n\n!!! warning \"The CLI account is not always your frontend's account\"\n    `pg status` reports the account derived under `playground.dot/0`. A Product loaded from a deployed name derives under that name instead, so its account differs from the one the CLI shows. Check both when an allowance lands somewhere unexpected."}
{"source": "polkadot-docs", "page_id": "apps-concepts-accounts", "url": "https://developer.polkadot.com/apps/concepts/accounts/#where-to-go-next", "page_title": "Accounts and Signing", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5460, "end_char": 6235, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50a97fc998c8769bda00c1706df8b60f79185822b01008c9fd15a883a90f10a9", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Allowances and Permissions**\n\n    ---\n\n    What an allowance authorizes, and how to grant it to the right account.\n\n    [:octicons-arrow-right-24: Allowances and Permissions](/apps/concepts/allowances/)\n\n-   <span class=\"badge learn\">Learn</span> **Identity**\n\n    ---\n\n    The per-Product account derivation model and why accounts differ across Products.\n\n    [:octicons-arrow-right-24: Identity](/apps/concepts/identity/)\n\n-   <span class=\"badge guide\">Guide</span> **Get TestNet Tokens**\n\n    ---\n\n    Fund the signing account and grant it the service allowances it needs.\n\n    [:octicons-arrow-right-24: Get TestNet Tokens](/apps/get-started/get-testnet-tokens/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-concepts-allowances", "url": "https://developer.polkadot.com/apps/concepts/allowances/#introduction", "page_title": "Allowances and Permissions", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 31, "end_char": 872, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9a4bcad745e8cdfb0be50521ceb132551a63141656834cf73425c3e74455321e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nSome capabilities let your Product act on chain on the user's behalf, so the user has to grant them first. Your Product requests these grants — _allowances_, or resource allocations — from the Host, and the user approves them. A prompt such as \"sign and submit on-chain transactions on your behalf\" is one of these grants.\n\nAllowances are granted **per account**. This is why they are closely tied to [Accounts and Signing](/apps/concepts/accounts/): granting an allowance to one account does nothing for a different one, and a misdirected grant surfaces as [`no allowance set for account`](/apps/troubleshooting/#no-allowance-set-for-account).\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Get storage authorization](/apps/build/build-and-publish/#get-storage-authorization)."}
{"source": "polkadot-docs", "page_id": "apps-concepts-allowances", "url": "https://developer.polkadot.com/apps/concepts/allowances/#what-your-product-can-request", "page_title": "Allowances and Permissions", "index": 1, "depth": 2, "title": "What Your Product Can Request", "anchor": "what-your-product-can-request", "start_char": 872, "end_char": 2072, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9a4bcad745e8cdfb0be50521ceb132551a63141656834cf73425c3e74455321e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What Your Product Can Request\n\nYour Product requests allowances through the SDK, typically once on connect. The resource types are:\n\n| Resource                  | What it authorizes                                                                 |\n|---------------------------|------------------------------------------------------------------------------------|\n| `StatementStoreAllowance` | Publishing to the [Statement Store](/apps/product-sdk/statement-store/).           |\n| `BulletinAllowance`       | Storing data on the [Bulletin Chain](/apps/product-sdk/cloud-storage/).            |\n| `SmartContractAllowance`  | Sponsoring transactions for a product account, keyed by its derivation index, for [contract](/apps/product-sdk/contracts/) calls. |\n| `AutoSigning`             | Signing and submitting transactions on the user's behalf without a per-action prompt. |\n\n!!! note \"Tag spelling differs by toolchain\"\n    The Host and frontend codec spells the storage tag `BulletinAllowance`. The CLI and terminal codec spells it `BulletInAllowance` (capital `I`). They are two different codecs; use the spelling that matches the surface you are calling, and do not \"correct\" one to the other."}
{"source": "polkadot-docs", "page_id": "apps-concepts-allowances", "url": "https://developer.polkadot.com/apps/concepts/allowances/#requesting-an-allowance", "page_title": "Allowances and Permissions", "index": 2, "depth": 2, "title": "Requesting an Allowance", "anchor": "requesting-an-allowance", "start_char": 2072, "end_char": 2949, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9a4bcad745e8cdfb0be50521ceb132551a63141656834cf73425c3e74455321e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Requesting an Allowance\n\nThe [`signer`](/apps/product-sdk/signer/) package requests allocations through its `onConnect` hook, which fires once per connection. Each request resolves to an outcome:\n\n- **`Allocated`**: The user granted it.\n- **`Rejected`**: The user declined it.\n- **`NotAvailable`**: The Host or wallet cannot provide it right now.\n\nRequest the allowances your Product needs up front, then treat a non-`Allocated` outcome as a feature being unavailable rather than a fatal error, so a declined grant degrades gracefully.\n\n!!! warning \"AutoSigning is not available on mobile today\"\n    `AutoSigning` returns `NotAvailable` on both the Android and iOS wallets today. A Product can request it, but the wallet will not grant it yet, so do not build a flow that depends on it. Fall back to per-transaction signing, where each submission prompts the user's phone."}
{"source": "polkadot-docs", "page_id": "apps-concepts-allowances", "url": "https://developer.polkadot.com/apps/concepts/allowances/#scope-and-lifetime", "page_title": "Allowances and Permissions", "index": 3, "depth": 2, "title": "Scope and Lifetime", "anchor": "scope-and-lifetime", "start_char": 2949, "end_char": 3475, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9a4bcad745e8cdfb0be50521ceb132551a63141656834cf73425c3e74455321e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Scope and Lifetime\n\n- **Scope**: An allowance authorizes one capability for one account. `AutoSigning` is the broadest — it hands your Product a signing subtree so it can sign without prompting for each action — which is why it is gated behind an explicit approval.\n- **Lifetime**: The exact lifetime and expiry policy of an allowance is not documented. In practice, an expired allowance surfaces as an error telling you to re-pair the wallet. Treat allowances as revocable and potentially expiring rather than permanent."}
{"source": "polkadot-docs", "page_id": "apps-concepts-allowances", "url": "https://developer.polkadot.com/apps/concepts/allowances/#re-approval-is-expected", "page_title": "Allowances and Permissions", "index": 4, "depth": 2, "title": "Re-Approval Is Expected", "anchor": "re-approval-is-expected", "start_char": 3475, "end_char": 4087, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9a4bcad745e8cdfb0be50521ceb132551a63141656834cf73425c3e74455321e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Re-Approval Is Expected\n\nUsers are prompted once, and operations covered by a granted allowance do not prompt again. Two cases where you will see a prompt again are by design, not bugs:\n\n- **Redeploys**: The CLI caches granted allowances on disk, so subsequent deploys skip most prompts. A fresh environment prompts again.\n- **Page reload**: A Product re-requests its allocations each time it connects. If the Host still holds the grant, this is silent; otherwise the user is prompted again.\n\nDesign for re-approval: make requesting allowances idempotent, and do not treat a repeat prompt as an error state."}
{"source": "polkadot-docs", "page_id": "apps-concepts-allowances", "url": "https://developer.polkadot.com/apps/concepts/allowances/#inspect-and-revoke", "page_title": "Allowances and Permissions", "index": 5, "depth": 2, "title": "Inspect and Revoke", "anchor": "inspect-and-revoke", "start_char": 4087, "end_char": 4876, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9a4bcad745e8cdfb0be50521ceb132551a63141656834cf73425c3e74455321e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Inspect and Revoke\n\n- **Inspect**: There are cached checks for whether a storage or Statement Store allowance is present (they read local state and do not prompt the wallet). There is no documented way to inspect an `AutoSigning` grant specifically, and these checks read cached state rather than querying on-chain records.\n- **Revoke**: There is no documented per-allowance revoke. The coarse lever is tearing down the session — signing out clears the granted state. Revoking a single allowance while keeping others is not supported.\n\n!!! info \"Dismissing the approval modal\"\n    Declining or dismissing an approval resolves that request as `Rejected` or `NotAvailable` rather than crashing your Product. The exact outcome a dismissed modal returns is not documented, so handle both."}
{"source": "polkadot-docs", "page_id": "apps-concepts-allowances", "url": "https://developer.polkadot.com/apps/concepts/allowances/#where-to-go-next", "page_title": "Allowances and Permissions", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4876, "end_char": 5670, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9a4bcad745e8cdfb0be50521ceb132551a63141656834cf73425c3e74455321e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Accounts and Signing**\n\n    ---\n\n    Allowances are per account; make sure you grant them to the account that signs.\n\n    [:octicons-arrow-right-24: Accounts and Signing](/apps/concepts/accounts/)\n\n-   <span class=\"badge guide\">Guide</span> **Get TestNet Tokens**\n\n    ---\n\n    Grant your account the Bulletin storage authorization and other service allowances.\n\n    [:octicons-arrow-right-24: Get TestNet Tokens](/apps/get-started/get-testnet-tokens/)\n\n-   <span class=\"badge learn\">Learn</span> **Permissions Reference**\n\n    ---\n\n    The Host-to-Product permission model at the protocol level.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/permissions/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#introduction", "page_title": "Where to Store Data", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 24, "end_char": 471, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nA Polkadot Product has four places to keep data, and choosing the wrong one is a common early mistake — most often, putting bulk data in a contract. Each option trades off cost, persistence, size, and who can read it. This page is a decision guide: match the data to the layer built for it.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Storage & data](/apps/architecture/storage/)."}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#the-options-at-a-glance", "page_title": "Where to Store Data", "index": 1, "depth": 2, "title": "The Options at a Glance", "anchor": "the-options-at-a-glance", "start_char": 471, "end_char": 1331, "estimated_token_count": 246, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Options at a Glance\n\n|          Layer          |         Best for          |       Persistence        |       Size       |            Readable by            |\n|-------------------------|---------------------------|--------------------------|------------------|-----------------------------------|\n| Contract storage        | Enforced shared state and logic | Permanent           | Small, structured | Anyone, through contract methods  |\n| Cloud storage (Bulletin) | Files and content blobs   | ~2 weeks, renewable      | Large            | Anyone with the CID               |\n| Statement store         | Real-time signaling       | Seconds (ephemeral)      | Up to 512 bytes  | Subscribers to your Product       |\n| Local storage           | Per-device state          | Until cleared            | Small            | Only this device                  |"}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#contract-storage", "page_title": "Where to Store Data", "index": 2, "depth": 2, "title": "Contract Storage", "anchor": "contract-storage", "start_char": 1331, "end_char": 1997, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Contract Storage\n\nUse a [smart contract](/apps/product-sdk/contracts/) when data is _logic that must be enforced for everyone_: ownership records, a leaderboard's rules, an escrow's state, a registry. Contract storage is permanent and its rules are trustless, but on-chain storage is expensive per byte and every write is a transaction.\n\nDo not put bulk data in a contract — file contents, images, long text, or anything that grows. Store the bytes in cloud storage and keep only the CID (a short content hash) in the contract if the contract needs to reference them. This keeps the contract small and cheap while the heavy data lives in the layer built for it."}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#cloud-storage-bulletin-chain", "page_title": "Where to Store Data", "index": 3, "depth": 2, "title": "Cloud Storage (Bulletin Chain)", "anchor": "cloud-storage-bulletin-chain", "start_char": 1997, "end_char": 2764, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Cloud Storage (Bulletin Chain)\n\nUse [cloud storage](/apps/product-sdk/cloud-storage/) for content that outlives a session: profile photos, uploads, published posts, snapshots of app state. You upload bytes and get back a CID; anyone with the CID can fetch and verify the bytes.\n\nThe key tradeoff is **retention**. Stored data is kept for about two weeks by default and must be renewed to persist beyond that. Renewal works from a CID. A chunked upload is renewed chunk by chunk, and its manifest CID lists the chunk CIDs. Plan for renewal from the start; see [Store Data on Chain](/apps/build/store-data-on-chain/#renew-long-lived-data) for how to renew, and [Deploy Your App](/apps/deploy-your-app/#keep-your-app-available) for keeping a deployed app available."}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#statement-store", "page_title": "Where to Store Data", "index": 4, "depth": 2, "title": "Statement Store", "anchor": "statement-store", "start_char": 2764, "end_char": 3130, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Statement Store\n\nUse the [statement store](/apps/product-sdk/statement-store/) for real-time state between users: presence, typing indicators, cursors, and announcing where a fresh snapshot lives. Statements are signed, capped at 512 bytes, and expire in seconds. They are signaling, not storage — pair them with cloud storage when the content needs to survive."}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#local-storage", "page_title": "Where to Store Data", "index": 5, "depth": 2, "title": "Local Storage", "anchor": "local-storage", "start_char": 3130, "end_char": 3407, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Local Storage\n\nUse [local storage](/apps/product-sdk/local-storage/) for state that belongs to one device: preferences, drafts, and cached values. It is private to the device and instant to read, but it is not shared, not durable across devices, and not a source of truth."}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#a-common-pattern", "page_title": "Where to Store Data", "index": 6, "depth": 2, "title": "A Common Pattern", "anchor": "a-common-pattern", "start_char": 3407, "end_char": 3918, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## A Common Pattern\n\nMany Products combine layers rather than choosing one:\n\n- The **statement store** announces that something changed (a small, live signal).\n- **Cloud storage** holds the full content, addressed by CID.\n- A **contract** or the announcement carries the CID so others know where to look.\n- **Local storage** renders instantly from the device's last known state while the rest loads.\n\nThe [Shared Todo App tutorial](/apps/tutorials/shared-todo-app/) builds exactly this composition end to end."}
{"source": "polkadot-docs", "page_id": "apps-concepts-data-placement", "url": "https://developer.polkadot.com/apps/concepts/data-placement/#where-to-go-next", "page_title": "Where to Store Data", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3918, "end_char": 4742, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:314c67850fc137175f285eff38cf7daa5b1cdf81af18e344e7dac0650845cbe0", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    Upload to the Bulletin Chain and fetch by CID, with authorization and renewal.\n\n    [:octicons-arrow-right-24: Store Data on Chain](/apps/build/store-data-on-chain/)\n\n-   <span class=\"badge guide\">Guide</span> **Add a Smart Contract to Your Product**\n\n    ---\n\n    Put enforced shared state in a contract, and keep bulk data out of it.\n\n    [:octicons-arrow-right-24: Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/)\n\n-   <span class=\"badge guide\">Guide</span> **Build a Shared Todo App**\n\n    ---\n\n    A tutorial that composes all four layers into one Product.\n\n    [:octicons-arrow-right-24: Build a Shared Todo App](/apps/tutorials/shared-todo-app/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#introduction", "page_title": "Identity", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 1086, "estimated_token_count": 243, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nA user interacting with your Product carries two identities, and they are deliberately separate:\n\n- **A per-app account**: A per-Product account derived for each user. This is the identity your Product signs and transacts with.\n- **Proof of Personhood**: A tier, a per-app alias, and sometimes an earned name, which together attest that the user is a unique human without revealing who they are.\n\nKeeping them apart is what lets the platform give your Product a stable account, and optional proof that the user is a real person, without turning every Product into a tracking surface.\n\nA related name that is not a user identity comes up constantly: your Product's own `.dot` address, the name users type to reach it. It shares a namespace with the names the personhood gateway issues, which makes the two easy to confuse, so it is covered in [Your Product's `.dot` Address](#your-products-dot-address) below.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Identity & personhood](/apps/architecture/identity/)."}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#the-per-app-account", "page_title": "Identity", "index": 1, "depth": 2, "title": "The Per-App Account", "anchor": "the-per-app-account", "start_char": 1086, "end_char": 2793, "estimated_token_count": 385, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Per-App Account\n\nWhen a user opens your Product, the Host derives a **product account** for that user, scoped to your Product. The same user opening `app-a.dot` and `app-b.dot` gets a _different_ account in each, derived deterministically from the user's identity and the Product's `.dot` identifier.\n\nThe account has two address forms, both derived from the same public key:\n\n- **SS58**: The Substrate address, used across Polkadot chains.\n- **H160**: The EVM-style address, used for `pallet-revive` contracts on Polkadot Hub.\n\nDerivation follows a junction path of `[\"product\", productId, derivationIndex]` applied with sr25519 soft derivation, where `productId` is normally your `.dot` name. Because soft derivation is composable on public keys, the CLI, a web Host, or any external client can compute the same address the mobile wallet derives privately, without ever seeing the secret key.\n\nYour Product obtains this account through the [`signer`](/apps/product-sdk/signer/) package (`getProductAccount`) and signs with it; every approval routes to the user's phone. See [Sign and Submit Transactions](/apps/build/sign-and-submit/) for the working flow.\n\n!!! info \"Why per-app derivation\"\n    If every Product saw the same account for a user, any two Products could compare accounts and correlate the user across them. Per-Product derivation makes that impossible by default: different Products see different, unlinkable addresses for the same person. Sharing an account across your own Products is possible, but it requires an explicit permission grant; it is never the default. The same reasoning governs the sandbox model in the [TrUAPI reference](/reference/apps/protocol/truapi/sandbox/)."}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#proof-of-personhood", "page_title": "Identity", "index": 2, "depth": 2, "title": "Proof of Personhood", "anchor": "proof-of-personhood", "start_char": 2793, "end_char": 3858, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Proof of Personhood\n\n[Proof of Personhood](/reference/apps/infrastructure/pop/) is a separate signal that a user is a unique human. It always has a tier and a per-app alias, and it sometimes has an earned name:\n\n- **A tier**: The strength of the proof, from none, through an attested proof of a unique device, to full personhood, proven in the Polkadot App. The [Proof of Personhood reference](/reference/apps/infrastructure/pop/) names the tiers.\n- **A per-app alias**: A Ring-VRF-derived identifier that is deterministic for a given user and Product, and unlinkable across Products.\n- **An earned name**: The human-readable name the personhood gateway issues to a user who has proved a tier, such as `joseph.42`.\n\nAn alias is never an account address, and — like the per-app account — it is scoped per Product so it cannot be used to correlate a user across Products. Cross-Product alias linking requires an explicit consent step. Use personhood to gate features on verified-human status (for example, one action per person) without learning who the user is."}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#the-earned-name", "page_title": "Identity", "index": 3, "depth": 3, "title": "The Earned Name", "anchor": "the-earned-name", "start_char": 3858, "end_char": 5210, "estimated_token_count": 312, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### The Earned Name\n\nAn earned name is the one part of a user's identity that is human-readable and stable across Products. The personhood gateway issues it rather than the public registration path, which gives it properties a name bought with a deposit does not have: it is soulbound, so it never transfers, and it is not free-form, because the gateway decides the shape it issues.\n\nRead it with `getUserId` from the [`signer`](/apps/product-sdk/signer/) package, which returns it as `primaryUsername`. A user with no personhood tier has no earned name, so treat it as optional and always have a fallback. For the call and its caveats, see [Show a Display Name](/apps/build/sign-and-submit/#show-a-display-name).\n\n!!! info \"One name, several labels\"\n    These docs call this the **earned name**, the term the dotNS reference uses for a name the gateway grants. A name that identifies a person is a _personhood name_ and one that identifies a proved device is a _device name_; the SDK returns either as `primaryUsername`.\n\n!!! warning \"An earned name and a Product address can be coupled\"\n    A user's identities and your Product's address are separate by design, but not always independent in practice: the gateway issues an earned name into dotNS naming, so the name is also a dotNS name of the same text. Do not assume the two can never be linked."}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#usernames-in-your-product", "page_title": "Identity", "index": 4, "depth": 2, "title": "Usernames in Your Product", "anchor": "usernames-in-your-product", "start_char": 5210, "end_char": 6594, "estimated_token_count": 327, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Usernames in Your Product\n\nThere is no built-in primitive for an in-app username, so most Products need to choose a display identity themselves. Until a primitive exists, the recommended pattern keeps you aligned with the platform's identity model rather than inventing a parallel one:\n\n- **Prefer the earned name where you have it.** When the user holds any personhood tier, read the username the platform already associates with them (through the [`signer`](/apps/product-sdk/signer/) package's `getUserId`) and use it as the display name. This reuses an identity the user already has instead of minting a new one. See [Show a Display Name](/apps/build/sign-and-submit/#show-a-display-name) for the call and its caveats.\n- **Otherwise, let the user set a per-Product display name** and store it in [local storage](/apps/product-sdk/local-storage/) (device-local) or [cloud storage](/apps/product-sdk/cloud-storage/) (shared), keyed to their per-app account. Keep it scoped to your Product so it does not become a cross-Product identifier.\n- **Do not treat a display name as identity.** Authorization and uniqueness come from the per-app account and Proof of Personhood; a display name is a label on top of them.\n\nFollowing this pattern means Products converge on the same approach instead of each reinventing usernames, which eases any future migration to a platform primitive."}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#your-products-dot-address", "page_title": "Identity", "index": 5, "depth": 2, "title": "Your Product's `.dot` Address", "anchor": "your-products-dot-address", "start_char": 6594, "end_char": 7903, "estimated_token_count": 287, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Your Product's `.dot` Address\n\nA [`.dot` name](/apps/register-dot-domain/) is registered with [dotNS](/reference/apps/infrastructure/dotns/) and resolves to a content record: the CID of a published Product bundle. Ownership of a name is held by a Polkadot Hub account, but the name is not an account and cannot sign.\n\nTransferability depends on how the name was acquired. A name anyone registered by paying the deposit can be transferred. A name earned through the personhood gateway, the route that grants device and personhood names, cannot move: it identifies the person or device that earned it, and it stays with them. Most names point at _content_ rather than at a user, but a gateway name identifies an identity (a personhood name names a person, and a device name names a unique device its holder proved), so a client that needs to tell the kinds apart should read `isPopIssued(label)` on the PoP controller rather than inspect the string. See [PopRules and Pricing](/reference/apps/infrastructure/dotns/poprules-pricing/).\n\nA name is how users reach your Product; it is not how your Product identifies a user. The confusion is that both live in the same namespace: a name registered by paying the deposit points at content, while a name earned through the gateway points at a person or a device."}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#how-they-fit-together", "page_title": "Identity", "index": 6, "depth": 2, "title": "How They Fit Together", "anchor": "how-they-fit-together", "start_char": 7903, "end_char": 8645, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How They Fit Together\n\n- Users **find** your Product by its `.dot` address, which identifies your Product rather than them.\n- Your Product **acts** as the user through the per-app account, signing on the user's phone.\n- Your Product optionally **gates** features on Proof of Personhood, reading a tier and a per-app alias rather than a real-world identity, and **displays** the user's earned name when there is one.\n\nNone of these reveals the user's root key. The per-app account and the personhood alias stay scoped to your Product unless the user explicitly grants cross-Product linking. The earned name is the exception: it is stable across Products by design, which is why reading it goes through `getUserId` and a permission prompt."}
{"source": "polkadot-docs", "page_id": "apps-concepts-identity", "url": "https://developer.polkadot.com/apps/concepts/identity/#where-to-go-next", "page_title": "Identity", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 8645, "end_char": 9407, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:22608684ee0568ecbe9482a2422427cac987a7e9a64a23b1382194bc397543fa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Sign and Submit Transactions**\n\n    ---\n\n    Derive and sign with the per-app account in your Product.\n\n    [:octicons-arrow-right-24: Sign and Submit Transactions](/apps/build/sign-and-submit/)\n\n-   <span class=\"badge learn\">Learn</span> **Proof of Personhood**\n\n    ---\n\n    The Ring-VRF mechanism, tiers, and per-app aliases in depth.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/)\n\n-   <span class=\"badge learn\">Learn</span> **The Sandbox Model**\n\n    ---\n\n    How the Host isolates each Product and derives its per-domain account.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/sandbox/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-concepts-networks", "url": "https://developer.polkadot.com/apps/concepts/networks/#introduction", "page_title": "Networks", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 2776, "estimated_token_count": 630, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:955ac383b8b88a02185e52798546e9b2d0d731432016aa605fcee007f1ec4b9a", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nTwo TestNet environments are available while you build Polkadot Products, and they are separate networks, not two names for one. The [Product SDK](/apps/product-sdk/) exposes both as presets:\n\n- **`paseo` (Paseo Next v2)**: The environment Polkadot Desktop development builds default to. It is a preview network and the successor to Paseo Next v1.\n- **`devnet` (Products Devnet)**: A public Paseo TestNet operated by the [Polkadot Community Foundation](../polkadot-app.md) (PCF) using open-source technology developed by Parity. Parity does not operate it. Its chains, endpoints and faucet are listed in [Networks & endpoints](/apps/reference/networks/).\n\nBoth expose the same core chains a Product uses — Asset Hub, the Bulletin Chain, and Individuality (the chain that carries identity, personhood, and the Statement Store, which the reference docs also call the People Chain) — so most Product code runs on either without changes. The production `polkadot` and `kusama` presets are not live yet; requesting them throws.\n\n!!! note \"Who operates each environment\"\n    Polkadot Products can target environments run by two different operators. Each operator deploys, maintains, and supports its own environment, so report a problem to the operator of the environment where it occurs. See [Choose the Right Channel](/get-support/#choose-the-right-channel) for where to ask.\n\n    - **Parity**: Runs Paseo Next v2 (the `paseo` preset, parachain 1500) and the services on it, including dotNS and the Playground directory, and maintains the `playground` CLI these docs use. Parity publishes development builds of Polkadot Desktop on the [`polkadot-desktop-community` releases page](https://github.com/paritytech/polkadot-desktop-community/releases) and nightly Android builds of the Polkadot App on the [`trinity-user-agents` releases page](https://github.com/paritytech/trinity-user-agents/releases/tag/nightly-android). Ask about Paseo Next v2 or Parity's tools through [Polkadot Developer Support](/get-support/#support-channels), or report bugs in the tool's own GitHub repository.\n    - **Polkadot Community Foundation (PCF)**: Operates Products Devnet (the `devnet` preset) and everything on it, including its chains, registries, and deployments, using open-source technology developed by Parity. PCF also publishes its own builds of the Polkadot App, including the Google Play app, and of Polkadot Desktop, and the `pad` tooling that publishes to Browse. Parity does not operate these services; report issues with them in PCF's [`products-devnet-issues` repository](https://github.com/Polkadot-Community-Foundation/products-devnet-issues) or ask in `#devnet-discussion` on the [Polkadot Discord server](https://discord.com/invite/eD4jMYbC5U)."}
{"source": "polkadot-docs", "page_id": "apps-concepts-networks", "url": "https://developer.polkadot.com/apps/concepts/networks/#what-differs", "page_title": "Networks", "index": 1, "depth": 2, "title": "What Differs", "anchor": "what-differs", "start_char": 2776, "end_char": 3690, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:955ac383b8b88a02185e52798546e9b2d0d731432016aa605fcee007f1ec4b9a", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What Differs\n\nThe one behavioral difference documented today that can affect your app is transaction signing on Paseo Next v2:\n\n- **`AsPgas` signed extension (Paseo Next v2)**: Paseo Next v2 ships an `AsPgas` signed extension that legacy Polkadot.js-style signing does not understand, so that path fails with an error about the unsupported signed extension. Sign through the product account instead — get a signer from [`getProductAccount(...).getSigner()`](/apps/product-sdk/signer/), which routes through the Host's transaction path and preserves the extension. This is the path the SDK guides already use, so following them keeps you compatible.\n\nBeyond signing, the two networks are separate deployments with separate operators, so do not assume they offer the same capabilities. Endpoints and preset details are re-homed as the networks evolve, so resolve them from the SDK preset rather than hardcoding."}
{"source": "polkadot-docs", "page_id": "apps-concepts-networks", "url": "https://developer.polkadot.com/apps/concepts/networks/#proof-of-personhood-availability", "page_title": "Networks", "index": 2, "depth": 2, "title": "Proof of Personhood Availability", "anchor": "proof-of-personhood-availability", "start_char": 3690, "end_char": 4444, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:955ac383b8b88a02185e52798546e9b2d0d731432016aa605fcee007f1ec4b9a", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Proof of Personhood Availability\n\nWhether the [Proof of Personhood](/apps/concepts/identity/) Full tier is active on a given network depends on operator-side configuration, so it can differ between environments and over time. Treat a `None` or `Lite` result as the safe default in your Product, and gate features so they still work when a higher tier is unavailable.\n\n!!! warning \"Confirm current per-network capabilities\"\n    Which personhood tiers, discovery directories, and services are live on each network is evolving and is not fully captured in these docs. Before depending on a specific capability being present on Products Devnet or Paseo Next v2, confirm its current status with that network's operator rather than assuming the two match."}
{"source": "polkadot-docs", "page_id": "apps-concepts-networks", "url": "https://developer.polkadot.com/apps/concepts/networks/#where-to-go-next", "page_title": "Networks", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4444, "end_char": 4993, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:955ac383b8b88a02185e52798546e9b2d0d731432016aa605fcee007f1ec4b9a", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Chain Client**\n\n    ---\n\n    How a Product connects to these networks through the Host, and how presets map to chains.\n\n    [:octicons-arrow-right-24: Chain Client](/apps/product-sdk/chain-client/)\n\n-   <span class=\"badge guide\">Guide</span> **Get TestNet Tokens**\n\n    ---\n\n    Fund your account and grant service allowances on your target network.\n\n    [:octicons-arrow-right-24: Get TestNet Tokens](/apps/get-started/get-testnet-tokens/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#introduction", "page_title": "Deploy Your App", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 1836, "estimated_token_count": 458, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nThis page covers how to take a finished Polkadot Product live with the `playground` CLI. By the end, your app bundle will be uploaded to the Bulletin Chain, registered under a dotNS name, and, if you choose, discoverable in the Polkadot Playground.\n\n!!! warning \"TestNet names end in `.paseo`, not `.dot`\"\n    dotNS top-level domains are per network. On Paseo Next v2, the TestNet the Apps tooling targets by default, names are minted under `.paseo`: publish `myproject57` and you get `myproject57.paseo`, served at `https://myproject57.paseo.li`. Whether you supply the bare label or the full name depends on the tool; see [Choose a Name](/apps/register-dot-domain/#choose-a-name).\n\n\nA deploy is really four stages, and `playground deploy` walks you through all of them in one flow:\n\n- **Build**: Compile your Product into a static bundle of files (HTML, JS, CSS, assets) with `playground build`.\n- **Register**: Reserve a dotNS name for your Product through the on-chain name service. This is the address people use to reach it. See [Register a `.dot` Domain](/apps/register-dot-domain/).\n- **Publish**: Optionally list your Product in the public Playground directory so others can discover it. Deploying without publishing keeps it reachable at its dotNS address but unlisted. See [List Your App](/apps/list-your-app/).\n- **Deploy**: Upload the bundle to the Bulletin Chain and bind it to your name, so any Host can fetch and verify it directly.\n\nIf your Product includes a [smart contract](/apps/build/deploy-a-smart-contract/), the deploy flow can redeploy that too, covered in the contract prompt below.\n\n!!! note \"Products Devnet\"\n    This page uses Paseo Next v2 (`paseo` preset). For the PCF Products Devnet (`devnet` preset), see [Build & publish an app](/apps/build/build-and-publish/)."}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#prerequisites", "page_title": "Deploy Your App", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1836, "end_char": 2372, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore deploying, ensure you have:\n\n- Complete [Install Desktop and Pair](/apps/get-started/) and [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/); your account needs PAS funds and a Bulletin Chain authorization. If you have not obtained a Bulletin Chain authorization yet, request one from the [Bulletin Chain authorization page](https://paritytech.github.io/polkadot-bulletin-chain/authorizations)\n- A Polkadot Product project running locally. See [Set Up Your Project](/apps/build/#set-up-your-project)"}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#build-your-app-bundle", "page_title": "Deploy Your App", "index": 2, "depth": 2, "title": "Build Your App Bundle", "anchor": "build-your-app-bundle", "start_char": 2372, "end_char": 2906, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Build Your App Bundle\n\nRun `playground build` to compile your project into a deployable bundle.\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>playground build</span>\n</div>\n\nThe CLI auto-detects your project type and runs the appropriate build. The output is a set of static files (HTML, JS, CSS, assets) that will be uploaded in the next step.\n\n!!! tip\n    If you have already built the project, you can skip this step. `playground deploy` will prompt you to reuse the existing build."}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#deploy-your-app", "page_title": "Deploy Your App", "index": 3, "depth": 2, "title": "Deploy Your App", "anchor": "deploy-your-app", "start_char": 2906, "end_char": 9559, "estimated_token_count": 1756, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Deploy Your App\n\nRun `playground deploy` to start the interactive deploy flow. The CLI walks you through a series of prompts, then shows a confirmation summary before uploading.\n\n<div class=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>playground deploy</span>\n</div>\n\nThe CLI presents the following prompts in order:\n\n1. **Review app detail page**: A reminder that your `README.md` becomes your app's detail page on the playground. Make sure it's up to date, then press ++enter++ to continue (or ++esc++ to exit and edit it first).\n\n2. **Redeploy contracts if changed**: Smart contracts hold your app's on-chain logic and data, and deploy separately from your website. Choose **no** if you only changed the website. Choose **yes** if you changed contract code in this project. The CLI then redeploys and reinstalls the contracts and rebuilds the site to match. See [Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/) for the contract workflow in depth.\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  did you change your smart contracts?\n      › no  ·  I only changed the website\n        yes  ·  I changed contract code too</pre></span>\n    </div>\n\n3. **Choose to rebuild before deployment**: Compiles your latest code into the files that get uploaded. Choose **yes** to rebuild now, or **no** to redeploy the build that's already in your build folder.\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  build before deploy?\n      › yes  ·  rebuild with my latest code\n        no  ·  redeploy the existing build</pre></span>\n    </div>\n\n4. **Choose who signs the upload**: Publishing writes to the blockchain, which needs a signature. The **dev signer** uses a shared test account: instant, no phone needed. The **phone signer** signs with your own logged-in account, with a few taps on your phone.\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  who signs the upload?\n      › dev signer  ·  fast, no phone needed\n        your phone signer  ·  signs with your own account</pre></span>\n    </div>\n\n    !!! note \"Your phone will prompt — check it\"\n        With the phone signer, each step waits for you to approve it in the Polkadot App, and there is no push notification announcing that a prompt is waiting. If the deploy appears to stall — including a deliberate pause while your name is registered — open the app and look for a pending approval. See the troubleshooting entries for [an unanswered phone prompt](/apps/troubleshooting/#the-app-seems-frozen-after-an-action) and [the registration pause](/apps/troubleshooting/#the-deploy-pauses-for-about-a-minute), and [Accounts and Signing](/apps/concepts/accounts/) for which account the phone signer uses.\n\n5. **Choose a default build directory**:  The folder holding your built site (the files that get uploaded). The default `dist` fits most projects. This example uses `.next` for a Next.js app.\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  build directory  default: dist\n      › .next█</pre></span>\n    </div>\n\n6. **Choose a domain name**: Pick the address people will use to reach your app. Enter the bare label, such as `myproject57`; the CLI appends the environment's TLD, so on Paseo Next v2 that becomes `myproject57.paseo`. Which names you may register depends on the label's length, counted as written. Digits count like any other character:\n\n    | Length                 | Requirement                                              |\n    |------------------------|----------------------------------------------------------|\n    | 9 characters or longer | Open to everyone, with no personhood check               |\n    | 6 to 8 characters      | Not sold on this path; earned in the Polkadot App        |\n    | 5 characters or fewer  | Reserved for governance, not sold on this path           |\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  domain\n      › myproject57█</pre></span>\n    </div>\n\n    The label also has to be 3 to 63 lowercase characters (`a-z`, `0-9`, `-`), with no leading or trailing dash. Digits are allowed anywhere and in any quantity. If registration is rejected, the name may already be [taken](/apps/troubleshooting/#the-name-is-already-registered) or [too short to buy](/apps/troubleshooting/#short-names-are-not-for-sale). See [Register a `.dot` Domain](/apps/register-dot-domain/#choose-a-name) for the full name rules.\n\n7. **Publish to the playground**: Choose **yes** to list your app in the public Polkadot Playground so others can find and open it. Choose **no** to still deploy it to your dotNS address, but keep it unlisted.\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  publish to the playground?\n      › yes  ·  list it in the public playground\n        no  ·  deploy to my .paseo address only</pre></span>\n    </div>\n\n8. **Review confirmation summary**: The CLI shows a summary of your choices before uploading. Review it, then press ++enter++ to deploy (or ++esc++ to cancel). With the dev signer, no phone taps are needed and `phone approvals` reads `none`.\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  playground deploy  ·  myproject57.paseo  ·  paseo next v2        v0.47.0\n      ────────────────────────────────────────────────────────────────────────<br>\n      deploying myproject57.paseo<br>\n      signer        Dev signer (no phone taps for upload)\n      build         skip (use existing)\n      build dir     .next\n      contracts     skip\n      publish       dotNS only<br>\n      phone approvals none<br>\n      enter to deploy  ·  esc to cancel</pre></span>\n    </div>\n\n    Press ++enter++ to confirm. The CLI then runs the upload and on-chain registration steps. If you chose the **phone signer**, each step triggers an approval prompt in the Polkadot mobile app — open the app and approve when prompted. With the **dev signer** selected here, the upload and dotNS registration run automatically with no phone prompts, and the deploy finalizes:\n\n    <div class=\"termynal\" data-termynal>\n    <span data-ty><pre>  playground deploy  ·  myproject57.paseo  ·  paseo next v2        v0.47.0\n      ────────────────────────────────────────────────────────────────────────<br>\n      frontend<br>\n      · build         skipped\n      ✓ upload + dotns<br>\n      ✓ deploy complete<br>\n      url           https://myproject57.paseo.li\n      domain        myproject57.paseo\n      app cid       bafybeihvru3e6ojhopxj7xxwtafrpyvsha6kylzklryon5k67u4clr26re\n      ipfs cid      bafybeigr2liqwftbmily4sdxvo7mq4atgboqsrpdadypmsbpkn7c25cwja</pre></span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#open-your-app", "page_title": "Deploy Your App", "index": 4, "depth": 2, "title": "Open Your App", "anchor": "open-your-app", "start_char": 9559, "end_char": 11126, "estimated_token_count": 370, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Open Your App\n\nOnce the deploy completes, the CLI prints the URLs for your app. Regardless of whether you published it to the playground, your app is live at its dotNS address and reachable through the web gateway, which appends `.li` to the full name:\n\n```text\nhttps://myproject57.paseo.li\n```\n\nYou can also navigate directly by entering your name in the [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) browser address bar:\n\n```text\nmyproject57.paseo\n```\n\n![Successfully deployed app reachable at its dotNS URL](/images/apps/deploy-your-app/deploy-your-app-01.webp)\n\nEither way, the app loads directly from the Bulletin Chain — no central server involved.\n\nIf you chose **yes** at the `publish to the playground?` prompt, your app is also listed in the public playground directory. Open `playground.dot` in Polkadot Desktop browser and your app appears under your name, so others can find and open it. If you chose **no** (`dotNS only`, as in this example), the app is still fully deployed and reachable at the URLs above, only unlisted in the directory.\n\n!!! tip\n    If your app does not appear immediately, wait a few seconds and refresh. On-chain state propagation can take a short time after the deploy transaction finalizes, and the web gateway resolves your name through an in-browser light client. A `curl` or script against the gateway URL returns a generic gateway shell rather than your app — open it in a real browser. If it still does not resolve, see [Troubleshooting](/apps/troubleshooting/#the-app-does-not-appear-right-after-deploy)."}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#keep-your-app-available", "page_title": "Deploy Your App", "index": 5, "depth": 2, "title": "Keep Your App Available", "anchor": "keep-your-app-available", "start_char": 11126, "end_char": 12370, "estimated_token_count": 264, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Keep Your App Available\n\nData published to the Bulletin Chain, including your app bundle, is retained for about two weeks by default and must be renewed to persist beyond that. The exact retention window is still being finalized, so treat \"about two weeks\" as provisional. Renewal is a separate transaction that keeps the data available for another retention window without changing its CID.\n\nRenewal identifies each stored record by its content hash, which you can derive from the record's CID. Your app bundle is stored as several chunks, each in its own transaction, plus a manifest that lists them, so keeping the bundle available means renewing the manifest and every chunk.\n\n!!! warning \"The CLI deploy does not renew your bundle\"\n    `playground deploy` does not renew the data it uploads. The `app cid` it prints is the bundle's manifest, and its links are the chunk CIDs, so you can renew the whole bundle from that one CID without uploading it again. The [renewal example in Store Data on Chain](/apps/build/store-data-on-chain/#renew-long-lived-data) reads the manifest and renews the manifest and every chunk. See the [Bulletin Chain renewal reference](/reference/apps/infrastructure/bulletin-chain/renewal/) for the mechanics."}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#if-a-deploy-fails", "page_title": "Deploy Your App", "index": 6, "depth": 2, "title": "If a Deploy Fails", "anchor": "if-a-deploy-fails", "start_char": 12370, "end_char": 13279, "estimated_token_count": 244, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## If a Deploy Fails\n\nDeploy-time issues have named fixes in [Troubleshooting](/apps/troubleshooting/):\n\n- [The deploy pauses for about a minute](/apps/troubleshooting/#the-deploy-pauses-for-about-a-minute): the tooling waiting out the dotNS commit-reveal handshake, not a hang.\n- [The name is already registered](/apps/troubleshooting/#the-name-is-already-registered) or is [too short to buy](/apps/troubleshooting/#short-names-are-not-for-sale): choose a different or longer name.\n- [`no allowance set for account`](/apps/troubleshooting/#no-allowance-set-for-account) or [uploads are rejected](/apps/troubleshooting/#uploads-are-rejected-or-host-storage-unavailable): the signing account is missing PAS or a storage authorization.\n- [The app does not appear right after deploy](/apps/troubleshooting/#the-app-does-not-appear-right-after-deploy): on-chain propagation and gateway resolution take a moment."}
{"source": "polkadot-docs", "page_id": "apps-deploy-your-app", "url": "https://developer.polkadot.com/apps/deploy-your-app/#where-to-go-next", "page_title": "Deploy Your App", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 13279, "end_char": 14060, "estimated_token_count": 228, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bbe4375981f7339513eaf7b41eb457bb76e17043d3558a572590b9c2106e03", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Register a `.dot` Domain**\n\n    ---\n\n    The naming step in depth: availability rules, the commit-reveal flow, and managing your name.\n\n    [:octicons-arrow-right-24: Register a `.dot` Domain](/apps/register-dot-domain/)\n\n-   <span class=\"badge guide\">Guide</span> **List Your App**\n\n    ---\n\n    Make your Product discoverable in the Playground and Browse directories.\n\n    [:octicons-arrow-right-24: List Your App](/apps/list-your-app/)\n\n-   <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The store receipt, chunking, authorization, and renewal in full.\n\n    [:octicons-arrow-right-24: Store Data on Chain](/apps/build/store-data-on-chain/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#what-you-are-building", "page_title": "apps-get-started-developers", "index": 0, "depth": 2, "title": "What you are building", "anchor": "what-you-are-building", "start_char": 496, "end_char": 1235, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What you are building\n\nThese docs call a published app a Product. It is a static web app: HTML, CSS\nand JavaScript. There is no app store, no backend for you to run and no server\nbetween your users and your app.\n\nA Product runs inside a host: the Polkadot app (mobile or desktop) or the web\ngateway at [dev-dot.li](https://dev-dot.li). The host provides the wallet, the\nsigning prompts, storage and chain access. Your app talks to the host over a\nprotocol called TrUAPI, so the same code runs on mobile, desktop and the web,\nand your users never have to handle raw keys or RPC endpoints.\n\nTo publish, you upload the bundle to the Devnet and point a `.dot` domain at\nit. The name then resolves to your bundle wherever someone opens it."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#how-the-pieces-fit", "page_title": "apps-get-started-developers", "index": 1, "depth": 2, "title": "How the pieces fit", "anchor": "how-the-pieces-fit", "start_char": 1235, "end_char": 2675, "estimated_token_count": 364, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How the pieces fit\n\n```mermaid\nflowchart TD\n  subgraph U[Entry points]\n    APP[Polkadot app<br/>mobile + desktop]\n    GW[Web gateway<br/>dev-dot.li]\n  end\n  subgraph D[Your Product]\n    BUNDLE[Static web bundle<br/>.dot domain -> content]\n  end\n  subgraph S[Developer tooling]\n    SDK[Product SDK<br/>@parity/product-sdk]\n    HOST[Host protocol: TrUAPI<br/>@parity/truapi]\n    CLIS[CLIs: pad / dotns]\n  end\n  subgraph P[Platform services on Paseo]\n    NAME[DotNS naming<br/>Asset Hub contracts]\n    STORE[Bulletin content storage]\n    ID[Identity + personhood<br/>People chain]\n    MONEY[CASH + assets<br/>People chain / Asset Hub]\n    CONTRACTS[PolkaVM contracts<br/>pallet-revive]\n    BROWSE[Browse directory<br/>Publisher registry]\n  end\n  APP --> BUNDLE\n  GW --> BUNDLE\n  BUNDLE --> HOST\n  BUNDLE --> SDK\n  SDK --> HOST\n  CLIS --> NAME\n  CLIS --> STORE\n  HOST --> ID\n  HOST --> MONEY\n  HOST --> CONTRACTS\n  NAME --> STORE\n  BROWSE --> NAME\n```\n\nThe Polkadot app keeps keys on the device, runs each Product in a sandbox and\nspeaks TrUAPI to it. You use the SDK in your app code, and the CLIs to name\nand publish your app. The services on the chains handle naming, storage,\nidentity, money, contracts and discovery.\n\nWhen you get stuck, first work out which of these layers the problem is in. The\n[architecture overview](../architecture/index.md) explains each one, and\nfollows a request from a `.dot` name to chain storage and back."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#before-you-start", "page_title": "apps-get-started-developers", "index": 2, "depth": 2, "title": "Before you start", "anchor": "before-you-start", "start_char": 2675, "end_char": 3641, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Before you start\n\nYou run every command below through the CLIs from\n[step 1](#1-install-the-tooling), and you sign with one account. If you don't\nhave a key yet, [step 4](#4-set-up-an-account-and-register-a-dot-domain) shows\nhow to create a throwaway one (no seed to import, no password).\n\nBefore a command can touch the chain, that account must be:\n\n1. Funded with native tokens on Asset Hub, to pay fees. Use the\n   [faucet](../reference/networks.md#faucet).\n2. Mapped to its EVM address. Do this once with\n   `dotns account map --env devnet`. Every CLI here signs PolkaVM transactions\n   on Asset Hub, and an unmapped account fails on the first one.\n3. Authorized to write to Bulletin, so step 5 can upload your bundle. See\n   [Get storage authorization](../build/build-and-publish.md#get-storage-authorization).\n\nThe CLIs don't share a keystore. `dotns` keeps its own (step 4) and `pad` takes\n`--mnemonic` on the command line. Both can use the same account."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#1-install-the-tooling", "page_title": "apps-get-started-developers", "index": 3, "depth": 2, "title": "1. Install the tooling", "anchor": "1-install-the-tooling", "start_char": 3641, "end_char": 5269, "estimated_token_count": 407, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 1. Install the tooling\n\n`pad` requires Node.js 22 or newer. On Node 20 it fails at startup with an\nunrelated-looking error (a module `SyntaxError`, or `Missing WebSocket class`),\nso check with `node --version` before installing.\n\n```bash\nnpm i -g @polkadot-community-foundation/dotns-cli@latest            # dotns\nnpm i -g @polkadot-community-foundation/polkadot-app-deploy@latest  # pad, pad-bootstrap\n```\n\nInstall only what you need: `pad` publishes (and can register the name for\nyou), and `dotns` manages names in depth. Both are large. Expect a few minutes\nand roughly 1.5 GB across the global prefix and the npm cache, with no progress\noutput while npm works.\n\nAlways take the latest release. These CLIs carry the current contract addresses\nand network presets inside them, so an older copy can talk to a retired\ndeployment and report success while nothing changes. To upgrade one you already\nhave, re-run the same command.\n\nOn some ARM64 platforms (for example Termux on Android), a transitive\ndependency, `node-datachannel`, ships no prebuilt binary, and its native build\nfails during `npm i -g`. It is only used for optional peer-to-peer CID\nverification, so skip the build with `--ignore-scripts`:\n\n```bash\nnpm i -g --ignore-scripts @polkadot-community-foundation/dotns-cli@latest\n```\n\nIn this mode only the peer-to-peer verification path is unavailable. The CLI's\ngateway-based CID verification still works.\n\n\nYour app code also needs the SDK, at the version the hosts speak (see\n[Packages & tools](../reference/packages.md#install-the-sdk-version-the-hosts-speak)):\n\n```bash\nnpm i @parity/product-sdk@0.39.0\n```"}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#2-choose-a-network-preset", "page_title": "apps-get-started-developers", "index": 4, "depth": 2, "title": "2. Choose a network preset", "anchor": "2-choose-a-network-preset", "start_char": 5269, "end_char": 5558, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 2. Choose a network preset\n\nBoth CLIs take the network as a flag, and for this Devnet it is `--env devnet`.\n`pad` and `dotns` already default to `devnet`, but they also ship presets for\nother networks. Pass `--env devnet` anyway, so a command never lands on another\nchain by accident."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#3-build-a-web-app-with-the-product-sdk", "page_title": "apps-get-started-developers", "index": 5, "depth": 2, "title": "3. Build a web app with the Product SDK", "anchor": "3-build-a-web-app-with-the-product-sdk", "start_char": 5558, "end_char": 6611, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 3. Build a web app with the Product SDK\n\nThe Product SDK (`@parity/product-sdk`) gives your app typed access to the\nhost: wallet, storage, chain calls, contracts and identity.\n\n```ts\nimport { createApp } from \"@parity/product-sdk\";\n\nconst app = await createApp({\n  cloudStorage: { environment: \"devnet\" }, // defaults to paseo\n});\n\nconst result = await app.cloudStorage!.upload(\"hello world\");\nif (result.ok) console.log(result.value); // the CID\n```\n\nThis code only works inside a host. Outside the Polkadot app or the web\ngateway, `createApp()` itself throws\n`createApp requires a host product context`. Start from the\n[playground-app-template](https://github.com/Polkadot-Community-Foundation/playground-app-template),\nwhich is already on the SDK version the hosts speak. For automated tests, use\nthe test host in `@parity/truapi-host`, described in\n[Use platform services from the SDK](../build/platform-services-sdk.md#test-without-the-real-host).\n\nBuild your app to a static directory. The template uses `vite build`, which\nwrites to `dist/`."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#build-with-claude-code", "page_title": "apps-get-started-developers", "index": 6, "depth": 3, "title": "Build with Claude Code", "anchor": "build-with-claude-code", "start_char": 6611, "end_char": 7539, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Build with Claude Code\n\nThe product-sdk repo is also a\n[Claude Code plugin marketplace](https://github.com/paritytech/product-sdk#claude-code-plugin).\nIts skills teach Claude Code the whole SDK: app scaffolding, chain connections,\ntransactions, contracts, cloud storage, statement store, individuality,\nutilities, and migrating an existing codebase. Install it, then ask \"build me a\nPolkadot app\":\n\n```\n/plugin marketplace add paritytech/product-sdk\n/plugin install product-sdk@paritytech\n/reload-plugins\n```\n\nEach skill is a plain Markdown file under\n[`product-sdk/skills/`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills),\nso other agents and editors can read them as reference too.\n\nThe skills follow the SDK's `main` branch, which is already past 0.39.0. Tell\nthe agent to keep `@parity/product-sdk@0.39.0`, and check an API against that\nversion when a skill and the installed package disagree."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#4-set-up-an-account-and-register-a-dot-domain", "page_title": "apps-get-started-developers", "index": 7, "depth": 2, "title": "4. Set up an account and register a `.dot` domain", "anchor": "4-set-up-an-account-and-register-a-dot-domain", "start_char": 7539, "end_char": 10128, "estimated_token_count": 644, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 4. Set up an account and register a `.dot` domain\n\nYour deploy account must own the `.dot` domain before you can publish to it.\nThis is a CLI signing key, separate from any account in the Polkadot app.\n\nFor a hackathon, you don't need to import a seed phrase or set a keystore\npassword. Create a fresh account and pass its mnemonic to the CLIs through the\nenvironment:\n\n```bash\n# One fresh BIP-39 mnemonic, generated with the crypto that ships inside the CLIs\nexport MNEMONIC=\"$(NODE_PATH=\"$(npm root -g)/@polkadot-community-foundation/dotns-cli/node_modules\" \\\n  node -e 'const c=require(\"@polkadot/util-crypto\");c.cryptoWaitReady().then(()=>console.log(c.mnemonicGenerate()))')\"\n\nexport DOTNS_MNEMONIC=\"$MNEMONIC\"   # dotns signs with this — no `dotns auth set`, no password\ndotns account address               # the throwaway's address — fund THIS at the faucet\n```\n\n`pad` takes the same `$MNEMONIC` when it publishes (`--mnemonic \"$MNEMONIC\"`),\nso one account both owns the name and deploys to it. The phrase only lives in\nthis shell session. Save it if you want to keep the name. If you discard it,\nthe account really is throwaway.\n\n!!! danger \"Set a key, or you sign as a shared account\"\n    With neither `DOTNS_MNEMONIC`/`DOTNS_KEY_URI` set nor `dotns auth set` run,\n    `dotns` falls back to a shared public dev account that anyone can control.\n    A name registered to it is not yours, and anyone can transfer it away.\n    `dotns` prints a warning on every command when this happens.\n\n\nTo reuse an account across sessions, store a mnemonic or key-uri in the\nencrypted `dotns` keystore instead of the environment:\n\n```bash\ndotns auth set          # choose `mnemonic`, paste it, then set a password\ndotns account address   # confirm the active account\n```\n\nEvery later command then needs the keystore password. Export\n`DOTNS_KEYSTORE_PASSWORD` to avoid an interactive prompt. See\n[Register a `.dot` domain](../build/register-a-dot-name.md#set-up-an-account)\nfor details.\n\nFund, map and authorize the account as listed in\n[Before you start](#before-you-start). Then, with `$MNEMONIC` exported,\nregister your name:\n\n```bash\ndotns register domain --name my-cool-app --env devnet\n```\n\nPick a label whose stem (the label without any trailing digits) is nine\ncharacters or longer. Shorter ones need proof of personhood or are reserved. Registration is a\ncommit-reveal flow that takes a few minutes, so check that it landed before you\nmove on:\n\n```bash\ndotns lookup owner-of my-cool-app --env devnet\n```\n\n[Register a `.dot` domain](../build/register-a-dot-name.md) has the full rules."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#5-publish-the-bundle-with-pad", "page_title": "apps-get-started-developers", "index": 8, "depth": 2, "title": "5. Publish the bundle with `pad`", "anchor": "5-publish-the-bundle-with-pad", "start_char": 10128, "end_char": 10808, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## 5. Publish the bundle with `pad`\n\n`pad` uploads your static build and points the `.dot` domain at it. It does not\nread the dotns keystore, so give it the signer that owns the name:\n\n```bash\npad ./dist my-cool-app.dot --env devnet --mnemonic \"$MNEMONIC\"\n```\n\nThat account must own the name and hold a Bulletin storage authorization. A\nsuccessful run ends with `Verified on-chain:` and the published CID.\n\nYour app is now live as `my-cool-app.dot` in the Polkadot app and at\n`https://my-cool-app.dev-dot.li` on the gateway. To give it a name, description\nand icon in the directory, add a product config. See\n[Add card metadata](../build/build-and-publish.md#add-card-metadata)."}
{"source": "polkadot-docs", "page_id": "apps-get-started-developers", "url": "https://developer.polkadot.com/apps/get-started/developers/#next-steps", "page_title": "apps-get-started-developers", "index": 9, "depth": 2, "title": "Next steps", "anchor": "next-steps", "start_char": 10808, "end_char": 11686, "estimated_token_count": 265, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13b6ea75350b2acae47b0aca8d460ec71bc98d98830e152f44a74d30a70e8833", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Next steps\n\nEach step above has a full guide under the **Guides** tab:\n\n<div class=\"grid cards\" markdown>\n\n-   **[Build & publish an app](../build/build-and-publish.md)**\n\n    ---\n\n    Bundle, name, deploy and card metadata.\n\n-   **[Register a `.dot` domain](../build/register-a-dot-name.md)**\n\n    ---\n\n    Account setup, name rules and the commit-reveal flow.\n\n-   **[Use platform services from the SDK](../build/platform-services-sdk.md)**\n\n    ---\n\n    Chains, storage, contracts and identity from your app.\n\n</div>\n\nTo see finished Products, open [Calculator](https://calculator.dev-dot.li) or\n[Stopwatch](https://stopwatch.dev-dot.li). The full list of reference apps is\nin [More resources](../reference/resources.md).\n\nTo try your own app as a user, install the Polkadot app and fund an account.\nSee [Create an account & get funds](../using-the-app/create-account.md)."}
{"source": "polkadot-docs", "page_id": "apps-get-started-get-testnet-tokens", "url": "https://developer.polkadot.com/apps/get-started/get-testnet-tokens/#prerequisites", "page_title": "Get TestNet Tokens", "index": 0, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 430, "end_char": 659, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f0cbca3d3ee2dd4b8eb78f647704f77711e86485a0351feb58f9f9d393be354", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have:\n\n- Completed the [Install Polkadot Desktop and Pair](/apps/get-started/) guide so [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) is paired with your signer"}
{"source": "polkadot-docs", "page_id": "apps-get-started-get-testnet-tokens", "url": "https://developer.polkadot.com/apps/get-started/get-testnet-tokens/#get-tokens", "page_title": "Get TestNet Tokens", "index": 1, "depth": 2, "title": "Get Tokens", "anchor": "get-tokens", "start_char": 659, "end_char": 2303, "estimated_token_count": 383, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f0cbca3d3ee2dd4b8eb78f647704f77711e86485a0351feb58f9f9d393be354", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Get Tokens\n\nThe Polkadot Faucet distributes free PAS tokens to developers.\n\n1. Open the [Polkadot Faucet for parachain 1500](https://faucet.polkadot.io/?parachain=1500). Paseo Next v2's Polkadot Hub is parachain 1500, so use this link rather than picking a network by hand.\n\n    ![Polkadot TestNet Faucet showing the Network and Chain dropdowns, the Paseo Address input, the reCAPTCHA check, and the Get some PASs button.](/images/apps/get-started/get-testnet-tokens/get-testnet-tokens-01.webp)\n\n2. Paste the address of the account paired with Polkadot Desktop into the address field.\n3. Click **Get Some PASs** to request tokens. They arrive in your account shortly after the request is processed.\n\n!!! warning \"Pick parachain 1500, not the public Paseo Polkadot Hub\"\n    The faucet's default selection drips to the public Paseo Polkadot Hub (parachain 1000), which is a different chain from the one Polkadot Desktop and the `playground` CLI target. Funding that chain leaves your Paseo Next v2 balance at zero, with no error to tell you why. The `?parachain=1500` link above is the same one the `playground` CLI uses. Parachain 1000 is the right choice only for the PCF Products Devnet (`devnet` preset); see its [Faucet](/apps/reference/networks/#faucet) instructions.\n\n!!! tip \"Or top up from the CLI\"\n    If you have paired the [`playground` CLI](/apps/quick-start/), `pg drip` funds your product account directly, no browser or captcha involved. It sends 1 PAS per run up to a 10 PAS cap, drawn from a shared dev funder rather than the public faucet. Run `pg status` afterward to confirm the balance landed on the account you expect."}
{"source": "polkadot-docs", "page_id": "apps-get-started-get-testnet-tokens", "url": "https://developer.polkadot.com/apps/get-started/get-testnet-tokens/#service-allowances", "page_title": "Get TestNet Tokens", "index": 2, "depth": 2, "title": "Service Allowances", "anchor": "service-allowances", "start_char": 2303, "end_char": 5070, "estimated_token_count": 566, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f0cbca3d3ee2dd4b8eb78f647704f77711e86485a0351feb58f9f9d393be354", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Service Allowances\n\nSome Polkadot infrastructure services use a separate allowance-based access model. These allowances are independent of your token balance; even with enough PAS to cover fees, a missing allowance will cause the service to reject your request. Allowances are granted per account, so a missing or misdirected one surfaces as [`no allowance set for account`](/apps/troubleshooting/#no-allowance-set-for-account) or [rejected uploads](/apps/troubleshooting/#uploads-are-rejected-or-host-storage-unavailable); see [Accounts and Signing](/apps/concepts/accounts/) for granting them to the account that actually signs.\n\n??? note \"Service Allowances: Bulletin Chain Storage\"\n\n    The [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/) has no token balance for storage. Every account needs an explicit authorization that grants a quota of transactions and bytes before it can store data on-chain. Without authorization, storage extrinsics are rejected.\n\n    On TestNet, request your storage authorization directly from the [Bulletin Chain authorization page](https://paritytech.github.io/polkadot-bulletin-chain/authorizations). This is required before submitting any `store` extrinsic from your Product.\n\n    After your authorization request is confirmed, you can verify the allocation on-chain by querying the `Authorizations` storage map of the `transaction-storage` pallet for your account.\n\n??? note \"Service Allowances: Statement Store\"\n\n    The [Statement Store](/reference/apps/infrastructure/statement-store/) lets accounts publish off-chain statements that are gossiped and persisted by the network. Access is controlled by an on-chain `StatementAllowance` record that specifies two limits per account: `max_count` (the maximum number of statements the account can publish) and `max_size` (the maximum total bytes across those statements).\n\n    !!! warning \"Provisional\"\n        The process for obtaining a Statement Store allowance on TestNet is not yet documented. Check back for updates, or ask in the developer community for available access paths.\n\n??? note \"Service Allowances: dotNS Names\"\n\n    [dotNS](/reference/apps/infrastructure/dotns/) name registration charges the same refundable deposit for every name it admits on the public path, whatever its length. The deposit is paid in the network's native token, so on Paseo it is PAS, and names carry the environment's TLD rather than `.dot`. The public path sells only names of nine characters or more. Device and personhood names of six to eight characters are earned through the personhood gateway instead, and carry no deposit.\n\n    See the [dotNS PopRules and Pricing reference](/reference/apps/infrastructure/dotns/poprules-pricing/) for the bands and the deposit."}
{"source": "polkadot-docs", "page_id": "apps-get-started-get-testnet-tokens", "url": "https://developer.polkadot.com/apps/get-started/get-testnet-tokens/#where-to-go-next", "page_title": "Get TestNet Tokens", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5070, "end_char": 5417, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f0cbca3d3ee2dd4b8eb78f647704f77711e86485a0351feb58f9f9d393be354", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Build Your Product**\n\n    ---\n\n    Set up a local project, load it in Polkadot Desktop via the `localhost` bypass, and add capabilities guide by guide.\n\n    [:octicons-arrow-right-24: Set Up Your Project](/apps/build/#set-up-your-project)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-get-started", "url": "https://developer.polkadot.com/apps/get-started/#introduction", "page_title": "Install Polkadot Desktop and Pair", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 38, "end_char": 1390, "estimated_token_count": 312, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa71a8b92d656f085618f747f20986c6a853f2a5c0cdfa3d3d6db3c89b96c204", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nYou should already have the [Polkadot App](/reference/apps/hosts/polkadot-app/) on your phone from the [Apps overview](/apps/); it holds your key and approves signing. This page covers installing [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/), where your Product runs, and pairing the two with a QR scan, then forwards you to TestNet funding. About 10 minutes.\n\nTwo pieces of the Polkadot Triangle need to be talking to each other: Polkadot Desktop, where your Product runs, and the Polkadot App on your phone, where signing happens.\n\n![Diagram: Polkadot Desktop displays a QR code that the Polkadot App scans; the App returns a session public key, and from then on every signing request routes from Desktop to the App for signature.](/images/apps/get-started/install-and-pair/pairing-flow.svg)\n\nPolkadot Desktop never holds your private key. Your identity lives on the Polkadot [People Chain](/reference/glossary/#people-chain), your private key lives in the Polkadot App, and Polkadot Desktop only ever holds a derived session public key — enough to identify you and construct per-Product accounts, but not enough to sign anything on its own.\n\n!!! note \"Products Devnet\"\n    This page uses Paseo Next v2 (`paseo` preset). For the PCF Products Devnet (`devnet` preset), see [More resources](/apps/reference/resources/)."}
{"source": "polkadot-docs", "page_id": "apps-get-started", "url": "https://developer.polkadot.com/apps/get-started/#prerequisites", "page_title": "Install Polkadot Desktop and Pair", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1390, "end_char": 3671, "estimated_token_count": 523, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa71a8b92d656f085618f747f20986c6a853f2a5c0cdfa3d3d6db3c89b96c204", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have:\n\n- The [Polkadot App](/apps/#get-the-polkadot-app) installed on your phone with an account created (your developer identity and signing device for Polkadot Products)\n- A workstation running macOS, Windows, or Linux\n- A device (iOS or Android) with a working camera\n- Network connectivity on both devices\n\nOn Android, the Polkadot App is installed from Parity's APK rather than Google Play, which requires allowing installs from unknown apps. See [Get the Polkadot App](/apps/#get-the-polkadot-app).\n\n!!! note \"Who operates each environment\"\n    Polkadot Products can target environments run by two different operators. Each operator deploys, maintains, and supports its own environment, so report a problem to the operator of the environment where it occurs. See [Choose the Right Channel](/get-support/#choose-the-right-channel) for where to ask.\n\n    - **Parity**: Runs Paseo Next v2 (the `paseo` preset, parachain 1500) and the services on it, including dotNS and the Playground directory, and maintains the `playground` CLI these docs use. Parity publishes development builds of Polkadot Desktop on the [`polkadot-desktop-community` releases page](https://github.com/paritytech/polkadot-desktop-community/releases) and nightly Android builds of the Polkadot App on the [`trinity-user-agents` releases page](https://github.com/paritytech/trinity-user-agents/releases/tag/nightly-android). Ask about Paseo Next v2 or Parity's tools through [Polkadot Developer Support](/get-support/#support-channels), or report bugs in the tool's own GitHub repository.\n    - **Polkadot Community Foundation (PCF)**: Operates Products Devnet (the `devnet` preset) and everything on it, including its chains, registries, and deployments, using open-source technology developed by Parity. PCF also publishes its own builds of the Polkadot App, including the Google Play app, and of Polkadot Desktop, and the `pad` tooling that publishes to Browse. Parity does not operate these services; report issues with them in PCF's [`products-devnet-issues` repository](https://github.com/Polkadot-Community-Foundation/products-devnet-issues) or ask in `#devnet-discussion` on the [Polkadot Discord server](https://discord.com/invite/eD4jMYbC5U)."}
{"source": "polkadot-docs", "page_id": "apps-get-started", "url": "https://developer.polkadot.com/apps/get-started/#install-polkadot-desktop", "page_title": "Install Polkadot Desktop and Pair", "index": 2, "depth": 2, "title": "Install Polkadot Desktop", "anchor": "install-polkadot-desktop", "start_char": 3671, "end_char": 4603, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa71a8b92d656f085618f747f20986c6a853f2a5c0cdfa3d3d6db3c89b96c204", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install Polkadot Desktop\n\n1. Download the latest development build of Polkadot Desktop for your platform from the [`polkadot-desktop-community` releases page](https://github.com/paritytech/polkadot-desktop-community/releases).\n\n2. Install the application using your platform's standard installer.\n\n3. Launch Polkadot Desktop. On first launch, Desktop opens into the pairing flow with a QR code.\n\n    ![Polkadot Desktop login screen showing the pairing QR code and the network selector at the top right with Paseo Next V2 selected.](/images/apps/get-started/install-and-pair/install-and-pair-02.webp)\n\n    !!! note \"Skip for development\"\n        The login screen also exposes a **Skip (Dev only)** button. Skipping the pairing drops you straight into Desktop without a paired signer, useful for inspecting Desktop or testing a local Product that does not require signing, but most development flows assume a paired Polkadot App."}
{"source": "polkadot-docs", "page_id": "apps-get-started", "url": "https://developer.polkadot.com/apps/get-started/#pair-polkadot-desktop-with-the-polkadot-app", "page_title": "Install Polkadot Desktop and Pair", "index": 3, "depth": 2, "title": "Pair Polkadot Desktop with the Polkadot App", "anchor": "pair-polkadot-desktop-with-the-polkadot-app", "start_char": 4603, "end_char": 6398, "estimated_token_count": 428, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa71a8b92d656f085618f747f20986c6a853f2a5c0cdfa3d3d6db3c89b96c204", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Pair Polkadot Desktop with the Polkadot App\n\nPairing is a one-time cryptographic handshake. Desktop displays the QR code, the App scans it, and the App returns a session public key that Desktop stores. From that point forward, Desktop knows who you are and can construct per-Product sub-accounts, but every signing prompt still routes back to the App for approval.\n\n1. Leave the QR code visible on the Polkadot Desktop login screen.\n\n2. In the Polkadot App, open the camera-scanning view and scan the QR code shown on Desktop. A **Link a new device?** prompt appears with the Desktop version details.\n\n    ![Polkadot App showing the \"Link a new device?\" prompt listing Polkadot Desktop with Cancel and Link buttons.](/images/apps/get-started/install-and-pair/install-and-pair-03.webp)\n\n3. Tap **Link** to confirm. The App briefly shows a **Connecting device...** state while the handshake completes.\n\n    ![Polkadot App showing the \"Connecting device...\" state with a loading spinner.](/images/apps/get-started/install-and-pair/install-and-pair-04.webp)\n\n4. Desktop transitions from the QR code to a **Completing pairing...** state.\n\n    ![Polkadot Desktop showing the \"Completing pairing...\" state with a loading spinner where the QR code was.](/images/apps/get-started/install-and-pair/install-and-pair-05.webp)\n\n5. Once the handshake completes, Desktop opens the main dashboard.\n\n    ![Polkadot Desktop showing the paired dashboard with the address bar and Browse section listing available Products.](/images/apps/get-started/install-and-pair/install-and-pair-06.webp)\n\nAfter pairing, your identity on the People Chain is bound to the Polkadot App for this Desktop session. Every subsequent signing request will route to the App, and you approve or reject each one on the signing device."}
{"source": "polkadot-docs", "page_id": "apps-get-started", "url": "https://developer.polkadot.com/apps/get-started/#where-to-go-next", "page_title": "Install Polkadot Desktop and Pair", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6398, "end_char": 6703, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa71a8b92d656f085618f747f20986c6a853f2a5c0cdfa3d3d6db3c89b96c204", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Get TestNet Tokens**\n\n    ---\n\n    Claim TestNet tokens from the Polkadot Faucet and unlock per-service allowances.\n\n    [:octicons-arrow-right-24: Continue](/apps/get-started/get-testnet-tokens/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-get-started-set-up-your-ai-agent", "url": "https://developer.polkadot.com/apps/get-started/set-up-your-ai-agent/#introduction", "page_title": "Set Up Your AI Agent", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 755, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:561ab4942305935ceabb29a9e520767b19c3b717db496a5d0517cac6fc3eeab8", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nMany developers build Polkadot Products with an AI coding agent. Out of the box, an agent does not know that Products run inside a Host, that chain access routes through the SDK rather than a direct RPC, or where the skills and repos live — so it falls back on generic patterns that do not work here. A few minutes of setup points the agent at the right context and tilts it toward correct, idiomatic code.\n\nThis page gives you a paste-ready setup prompt, then the resources to wire in: the skills, the repos, and the machine-readable docs.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Build with Claude Code](/apps/get-started/developers/#build-with-claude-code)."}
{"source": "polkadot-docs", "page_id": "apps-get-started-set-up-your-ai-agent", "url": "https://developer.polkadot.com/apps/get-started/set-up-your-ai-agent/#the-setup-prompt", "page_title": "Set Up Your AI Agent", "index": 1, "depth": 2, "title": "The Setup Prompt", "anchor": "the-setup-prompt", "start_char": 755, "end_char": 3848, "estimated_token_count": 765, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:561ab4942305935ceabb29a9e520767b19c3b717db496a5d0517cac6fc3eeab8", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Setup Prompt\n\nPaste this at the start of a session to orient your agent. It states the toolchain, the repos, the docs, and the rules that most often trip agents up:\n\n```text\nYou are helping me build a Polkadot Product: a sandboxed web app (HTML/JS/CSS)\nthat runs inside a Polkadot Host (Polkadot Desktop, the Polkadot App, or Polkadot\nWeb) and is addressed by a .dot name.\n\nToolchain:\n- Build app code with @parity/product-sdk (TypeScript). Install its skills first.\n- Deploy with the playground CLI (`pg` / `playground`).\n- For smart contracts, use the Contract Dependency Manager (`cdm`); contracts compile\n  to PolkaVM on pallet-revive (Asset Hub). Author them in Rust or Solidity (Solidity\n  via resolc, Foundry, or Hardhat). Do not target mainnet-EVM/Ethereum tooling or\n  legacy ink!/Wasm.\n\nDocs (read before answering; append `.md` to any page URL for raw markdown):\n- Guides: https://developer.polkadot.com/apps/\n- Full corpus: https://developer.polkadot.com/ai/llms-full.jsonl\n- Index: https://developer.polkadot.com/llms.txt\n- SDK API reference: https://paritytech.github.io/product-sdk/\n\nRepos:\n- https://github.com/paritytech/product-sdk (SDK packages + skills)\n- https://github.com/paritytech/playground-cli (the deploy CLI)\n- https://github.com/paritytech/contract-dependency-manager (contracts)\n\nRules to follow:\n- All chain reads, signing, and storage route through the Host via @parity/product-sdk.\n  Never open a direct WebSocket/RPC connection or dial a public IPFS gateway.\n- Sign with a product account: getProductAccount(...).getSigner(). Approvals happen\n  on the user's phone. On Paseo Next v2, do not use Polkadot.js-style signing (the\n  AsPgas signed extension breaks it) — use the product-account signer.\n- Most fallible SDK calls return a Result; check `.ok` before reading `.value`. Two\n  exceptions: a contract read, `contract.method.query()`, returns `{ success, value }`,\n  so check `.success`; and the `createApp` facade is not Result-typed except for\n  `app.cloudStorage` — `app.wallet` and `app.chain` throw, and `app.localStorage`\n  returns plain values. Prefer the individual packages (`signer`, `chain-client`,\n  `local-storage`), which are Result-typed throughout.\n- From `@parity/product-sdk` v0.30.0, call `createApp()` with no `name`: the Host's\n  product ID supplies the identity, and a `name` is ignored with a warning. If the Host\n  declines to derive an account, `wallet.connect()` resolves with zero accounts rather\n  than erroring, so always check `accounts.length`.\n- Storage: put files/blobs on the Bulletin Chain (content-addressed by CID, retained\n  ~2 weeks, renewable). Keep bulk data OUT of contracts; store only small enforced\n  state on-chain. Service allowances are granted per account.\n- Prefer the SDK packages and the installed skills over generic JavaScript. If you are\n  unsure how a surface works, read the docs page or the package README rather than guessing.\n```\n\nTrim the sections your project does not need. If you scaffolded from a template, much of this is already encoded in the project's agent files (see below)."}
{"source": "polkadot-docs", "page_id": "apps-get-started-set-up-your-ai-agent", "url": "https://developer.polkadot.com/apps/get-started/set-up-your-ai-agent/#install-the-skills", "page_title": "Set Up Your AI Agent", "index": 2, "depth": 2, "title": "Install the Skills", "anchor": "install-the-skills", "start_char": 3848, "end_char": 4800, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:561ab4942305935ceabb29a9e520767b19c3b717db496a5d0517cac6fc3eeab8", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install the Skills\n\nThe [Product SDK skills](/reference/apps/skills/) are modular instruction sets that teach an agent how to work across the Products stack (chain connections, storage, contracts, and more). They tilt the agent toward idiomatic answers instead of generic boilerplate.\n\nIn Claude Code, add the Parity marketplace and install the plugin:\n\n```text\n/plugin marketplace add paritytech/product-sdk\n/plugin install product-sdk@paritytech\n```\n\nFor other agents (Cursor, Codex, Cline, Windsurf, or a custom harness), clone `paritytech/product-sdk` and register the skills under `product-sdk/skills/` with your agent's context mechanism. The [Skills reference](/reference/apps/skills/) covers the full list, how to register them, and how to keep them current.\n\n!!! tip \"Keep skills current\"\n    Product surfaces are in active development. A stale skill teaches stale API patterns, which is worse than no skill. Refresh after major releases."}
{"source": "polkadot-docs", "page_id": "apps-get-started-set-up-your-ai-agent", "url": "https://developer.polkadot.com/apps/get-started/set-up-your-ai-agent/#start-from-a-template", "page_title": "Set Up Your AI Agent", "index": 3, "depth": 2, "title": "Start From a Template", "anchor": "start-from-a-template", "start_char": 4800, "end_char": 5424, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:561ab4942305935ceabb29a9e520767b19c3b717db496a5d0517cac6fc3eeab8", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Start From a Template\n\nThe official Playground starter template ships agent-instruction files, so an agent picks up the conventions automatically:\n\n- `CLAUDE.md` for Claude Code, `AGENTS.md` for Codex and other `AGENTS.md`-aware tools.\n- `.clinerules`, `.windsurfrules`, and `.github/copilot-instructions.md` for Cline, Windsurf, and GitHub Copilot.\n\nCoverage varies by app: a moddable app you clone with `pg mod` may ship all of these, only `CLAUDE.md`, or none, so check the project. If it includes a `setup.sh`, `pg mod` runs it for you to install dependencies and fetch the latest skills; many apps do not ship one."}
{"source": "polkadot-docs", "page_id": "apps-get-started-set-up-your-ai-agent", "url": "https://developer.polkadot.com/apps/get-started/set-up-your-ai-agent/#give-your-agent-the-docs", "page_title": "Set Up Your AI Agent", "index": 4, "depth": 2, "title": "Give Your Agent the Docs", "anchor": "give-your-agent-the-docs", "start_char": 5424, "end_char": 6003, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:561ab4942305935ceabb29a9e520767b19c3b717db496a5d0517cac6fc3eeab8", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Give Your Agent the Docs\n\nThis documentation publishes machine-readable versions for AI tools:\n\n- **`/llms.txt`**: An index of the documentation, following the [llms.txt convention](https://llmstxt.org/).\n- **`/ai/llms-full.jsonl`**: Every page, pre-chunked by section, one JSON object per line.\n- **Per-page markdown**: Append `.md` to any page path (for example, `/apps/quick-start.md`) to get its raw markdown, or use the **Markdown for LLMs** button on any page to copy it or hand the URL to your agent.\n\nThe [AI Resources](/ai-resources/) page collects these downloads."}
{"source": "polkadot-docs", "page_id": "apps-get-started-set-up-your-ai-agent", "url": "https://developer.polkadot.com/apps/get-started/set-up-your-ai-agent/#where-to-go-next", "page_title": "Set Up Your AI Agent", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6003, "end_char": 6715, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:561ab4942305935ceabb29a9e520767b19c3b717db496a5d0517cac6fc3eeab8", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Quick Start**\n\n    ---\n\n    With your agent set up, deploy your first Product from the terminal or the browser.\n\n    [:octicons-arrow-right-24: Quick Start](/apps/quick-start/)\n\n-   <span class=\"badge guide\">Guide</span> **Build Guides**\n\n    ---\n\n    The capability recipes your agent will lean on, one per SDK package.\n\n    [:octicons-arrow-right-24: Open Build Guides](/apps/build/)\n\n-   <span class=\"badge learn\">Learn</span> **Skills Reference**\n\n    ---\n\n    The full skills list, how to register them, and how to keep them current.\n\n    [:octicons-arrow-right-24: Skills](/reference/apps/skills/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps", "url": "https://developer.polkadot.com/apps/#get-the-polkadot-app", "page_title": "Apps", "index": 0, "depth": 2, "title": "Get the Polkadot App", "anchor": "get-the-polkadot-app", "start_char": 29, "end_char": 1081, "estimated_token_count": 259, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e2c68dd24ea8ec23b9c9e104b90dd51e337aafa5fddaaf92eb78672a4b49daa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Get the Polkadot App\n\nThe Polkadot App is your wallet, identity, and signer: the center of everything you build. Install it first; every path below connects through it.\n\n<div class=\"button-wrapper\" markdown>\n[:material-apple: App Store — Coming soon]()   [:material-android: Android (APK)](https://github.com/paritytech/trinity-user-agents/releases/tag/nightly-android)\n</div>\n\nThe Android build is a nightly APK published by Parity, so you install it from the release page rather than from Google Play. The release offers two APKs:\n\n- **`app-gp-nightly.apk`**: For devices with Google Play services.\n- **`app-vanilla-nightly.apk`**: For devices without Google Play services.\n\nAndroid blocks APKs from outside an app store by default. When prompted, allow the app you downloaded the APK with, such as your browser or file manager, to install unknown apps, then open the APK to install it.\n\n!!! note \"Products Devnet\"\n    PCF publishes separate app builds for the Products Devnet (`devnet` preset): see [More resources](/apps/reference/resources/)."}
{"source": "polkadot-docs", "page_id": "apps", "url": "https://developer.polkadot.com/apps/#then-pick-your-path", "page_title": "Apps", "index": 1, "depth": 2, "title": "Then Pick Your Path", "anchor": "then-pick-your-path", "start_char": 1081, "end_char": 1757, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e2c68dd24ea8ec23b9c9e104b90dd51e337aafa5fddaaf92eb78672a4b49daa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Then Pick Your Path\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Deploy Your First Product**\n\n    ---\n\n    Go from nothing to a live `.dot` Product: generate one in the browser with RevX, or deploy from the terminal with the CLI. No local host setup to reach a live deployment.\n\n    [:octicons-arrow-right-24: Quick Start](/apps/quick-start/)\n\n-   <span class=\"badge guide\">Guide</span> **Develop Locally (the Full Route)**\n\n    ---\n\n    Install Polkadot Desktop, pair it with your phone, and get TestNet tokens, then build your Product capability by capability.\n\n    [:octicons-arrow-right-24: Get Started](/apps/get-started/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps", "url": "https://developer.polkadot.com/apps/#what-is-a-polkadot-product", "page_title": "Apps", "index": 2, "depth": 2, "title": "What Is a Polkadot Product?", "anchor": "what-is-a-polkadot-product", "start_char": 1757, "end_char": 3313, "estimated_token_count": 364, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e2c68dd24ea8ec23b9c9e104b90dd51e337aafa5fddaaf92eb78672a4b49daa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What Is a Polkadot Product?\n\n_Polkadot Products_ are what _you_ build: third-party applications that run _inside_ one of the Polkadot Apps. Products are sandboxed single-page apps (HTML / JS / CSS), addressed by `.dot` names (e.g., `awesome.dot`), registered on-chain through a decentralized name service, and they never see the user's private key. The bundle itself is published to a decentralized cloud storage provider and fetched by the Host on demand.\n\n_Polkadot Apps_ are the three applications that can host Polkadot Products, collectively known as the _Polkadot Triangle_:\n\n- **[Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/)**: The workstation host. Loads Polkadot Products by their `.dot` name and runs them in a sandbox.\n- **[Polkadot App](/reference/apps/hosts/polkadot-app/)**: The mobile wallet and signer. Holds the user's private key and approves every signing request.\n- **[Polkadot Web](/reference/apps/hosts/polkadot-web/)**: The browser host at `dot.li`. Resolves `.dot` names client-side via a light client and renders the Product in a sandboxed iframe.\n\nYou build Polkadot Products. They run inside one of the Polkadot Apps. This section teaches you how.\n\n![The Polkadot Triangle: Polkadot Desktop at the top, Polkadot App at the bottom-left, Polkadot Web at the bottom-right, with Polkadot Product running inside](/images/apps/index/polkadot-triangle.svg)\n\nFor the architectural breakdown covering how the Product, SDK, Host, and Polkadot infrastructure relate, see the [App Development Reference](/reference/apps/)."}
{"source": "polkadot-docs", "page_id": "apps", "url": "https://developer.polkadot.com/apps/#why-build-a-polkadot-product", "page_title": "Apps", "index": 3, "depth": 2, "title": "Why Build a Polkadot Product?", "anchor": "why-build-a-polkadot-product", "start_char": 3313, "end_char": 6178, "estimated_token_count": 662, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e2c68dd24ea8ec23b9c9e104b90dd51e337aafa5fddaaf92eb78672a4b49daa", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Why Build a Polkadot Product?\n\nPolkadot Apps is a complete environment for building Web3 decentralized applications:\n\n**Wallet built-in**: The Polkadot App on the user's phone is the wallet for every Polkadot Product they use. No wallet integration code, no \"Connect Wallet\" button to design, no signing plumbing to maintain. Your Product receives a derived per-user account and asks for signatures; approvals happen on the user's phone.\n\n**Identity built-in**: Per-Product accounts are derived from the user's `.dot` identity, so there is no signup flow. With [Proof of Personhood](/reference/apps/infrastructure/pop/), you can gate features on verified-human status without seeing who the user is, a privacy-preserving humans-only access model built into the platform. Need to recognize the same user across two of your Products? Same alias system, scoped to your Product set.\n\n**Decentralized hosting**: Your bundle lives on a decentralized cloud storage provider. Your `.dot` name lives in a decentralized name service. There is no centralized hosting provider, no DNS service, no platform in the middle. Users fetch your Product directly and verify it themselves.\n\n**Product SDK**: The [Product SDK](/apps/product-sdk/) covers what you would otherwise integrate yourself:\n\n- **Chain access**: Query state and submit transactions through the Host. No RPC servers to operate; signing prompts open on the user's phone.\n- **Decentralized storage**: Upload files, get a permanent content-addressed URL.\n- **Real-time signed messaging**: Pub/sub between users of your Product via the [Statement Store](/reference/apps/infrastructure/statement-store/), every message verifiable.\n- **Smart contracts**: Call `pallet-revive` contracts on Asset Hub, resolved by name and typed from a manifest (deployed with the Contract Dependency Manager).\n- **Privacy-preserving payments**: Request, top up, track status. Built on [Coinage](/reference/apps/infrastructure/pop/pallet-coinage/).\n- **Chat**: Rooms, bots, interactive action buttons.\n- **Identity**: Derived per-Product accounts, plus optional [Proof of Personhood](/reference/apps/infrastructure/pop/) gating.\n- **Local storage**: Per-Product key/value, persisted on the user's device.\n\nPermissions (microphone access, outbound network requests, on-chain transaction submission, and more) are declared in your Product's [manifest](/reference/apps/hosts/polkadot-desktop/permissions/) and prompted at runtime. Users see exactly what your Product can access before they grant it. The Host enforces the boundary inside its [sandbox](/reference/apps/protocol/truapi/sandbox/), not your code.\n\n**Three Hosts, one Product**: The same `.dot` bundle runs in the mobile Polkadot App, on the workstation in Polkadot Desktop, and in any browser via Polkadot Web. You do not write three apps; the Triangle abstracts the platform."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#introduction", "page_title": "List Your App", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 1594, "estimated_token_count": 376, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nDeploying makes your Product reachable at its dotNS address. Listing makes it _discoverable_: it puts your Product in a directory that users browse inside their Host, so people who have never heard your `.dot` name can still find and open it.\n\nThere are two discovery surfaces:\n\n- **The Playground directory** (`playground.dot`): The directory the [`playground` CLI](/apps/quick-start/) publishes to on the TestNet it targets. This is the path you use when you deploy with `playground deploy`.\n- **[Browse](/reference/glossary/#browse)**: Polkadot's native discovery catalogue, surfaced in the App and Desktop dashboards. It is the broader destination for a Product that is ready for end users.\n\nBoth are catalogues of published Products surfaced inside the Hosts, and both store a minimal on-chain record while pulling display details from your name's [dotNS](/reference/apps/infrastructure/dotns/) metadata. They differ in the tooling that publishes to them, covered below.\n\n!!! warning \"TestNet names end in `.paseo`, not `.dot`\"\n    dotNS top-level domains are per network. On Paseo Next v2, the TestNet the Apps tooling targets by default, names are minted under `.paseo`: publish `myproject57` and you get `myproject57.paseo`, served at `https://myproject57.paseo.li`. Whether you supply the bare label or the full name depends on the tool; see [Choose a Name](/apps/register-dot-domain/#choose-a-name).\n\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [App discovery: Browse](/apps/architecture/discovery/)."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#the-playground-directory", "page_title": "List Your App", "index": 1, "depth": 2, "title": "The Playground Directory", "anchor": "the-playground-directory", "start_char": 1594, "end_char": 2119, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Playground Directory\n\nThe Playground directory lives at `playground.dot`, which you open in the Polkadot Desktop browser. It is scoped to the TestNet the `playground` CLI targets, so treat a listing there as a way to share work in progress rather than as a launch surface; [Browse](#browse) is where a Product goes when it is ready for end users. Listed Products appear under their dotNS name, and your Product's `README.md` becomes its detail page in the directory, so make sure it is up to date before you publish."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#list-during-deploy", "page_title": "List Your App", "index": 2, "depth": 3, "title": "List During Deploy", "anchor": "list-during-deploy", "start_char": 2119, "end_char": 2790, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### List During Deploy\n\nListing is a choice you make during `playground deploy`. At the `publish to the playground?` prompt, choose **yes**:\n\n<div class=\"termynal\" data-termynal>\n<span data-ty><pre>  publish to the playground?\n    › yes  ·  list it in the public playground\n      no  ·  deploy to my .paseo address only</pre></span>\n</div>\n\nChoosing **no** still deploys your Product to its dotNS address; it stays unlisted. To skip the prompt, pass the `--playground` flag:\n\n```bash\nplayground deploy --domain my-product --playground\n```\n\nWith the phone signer, publishing adds one more approval in the Polkadot App, for writing the listing to the Playground registry."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#categorize-the-listing", "page_title": "List Your App", "index": 3, "depth": 3, "title": "Categorize the Listing", "anchor": "categorize-the-listing", "start_char": 2790, "end_char": 3340, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Categorize the Listing\n\nPass `--tag` to file your Product under a category, which drives the tag filter in the playground app. Omit the flag and the CLI prompts you:\n\n```bash\nplayground deploy --domain my-product --playground --tag gaming\n```\n\nAn app carries at most one tag, and the accepted values are a fixed list: `site`, `social`, `chat`, `utility`, `gaming`, `marketplace`, and `irl`. There is no free-form tag, because a value outside this list still renders on your app's card but has no filter pill, making it effectively unfilterable."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#keep-a-listing-private", "page_title": "List Your App", "index": 4, "depth": 3, "title": "Keep a Listing Private", "anchor": "keep-a-listing-private", "start_char": 3340, "end_char": 3739, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Keep a Listing Private\n\nPass `--private` (alongside `--playground`) to publish with owner-only visibility. The listing exists but only you see it, which is useful for staging a Product in the directory before you announce it. Unlike the other listing choices, this one is never prompted for — you have to pass the flag:\n\n```bash\nplayground deploy --domain my-product --playground --private\n```"}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#let-others-fork-your-product", "page_title": "List Your App", "index": 5, "depth": 3, "title": "Let Others Fork Your Product", "anchor": "let-others-fork-your-product", "start_char": 3739, "end_char": 4847, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Let Others Fork Your Product\n\nPass `--moddable` (alongside `--playground`) to mark your Product as one others can clone, customize, and redeploy as their own. A moddable listing records your public repository as its source:\n\n```bash\nplayground deploy --domain my-product --playground --moddable\n```\n\nThe CLI reads your existing `origin` remote and records its URL in the Bulletin metadata. It never creates a repo or pushes for you, so set that up first. The deploy fails with an actionable message if `origin` is unset, points at a private repo, or points anywhere other than GitHub, because `pg mod` fetches source only from `codeload.github.com`:\n\n```bash\ngit remote add origin https://github.com/<user>/<repo>\ngit push -u origin main\n```\n\nAnyone can then clone a moddable Product with `pg mod`:\n\n```bash\npg mod my-product\n```\n\n`pg mod` copies a moddable Product from the Playground registry into a local project you can edit and redeploy under your own name. Omit the domain to open a picker showing every moddable Product. See the [Quick Start](/apps/quick-start/) for the full `pg mod` reference."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#change-or-remove-a-listing", "page_title": "List Your App", "index": 6, "depth": 3, "title": "Change or Remove a Listing", "anchor": "change-or-remove-a-listing", "start_char": 4847, "end_char": 5170, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Change or Remove a Listing\n\nThe listing choice is made at deploy time through the `publish to the playground?` prompt (or `--playground`). Redeploying re-runs that choice, so deploy again with your preferred option to update the listing state. The `playground` CLI does not currently expose a separate unlist command."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#browse", "page_title": "List Your App", "index": 7, "depth": 2, "title": "Browse", "anchor": "browse", "start_char": 5170, "end_char": 5465, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Browse\n\n[Browse](/reference/glossary/#browse) is Polkadot's native discovery catalogue: a curated directory surfaced inside the Host dashboards, and the destination for a Product once it is ready for end users. You saw its **Browse** section on the Polkadot Desktop dashboard after pairing."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#how-a-browse-listing-works", "page_title": "List Your App", "index": 8, "depth": 3, "title": "How a Browse Listing Works", "anchor": "how-a-browse-listing-works", "start_char": 5465, "end_char": 6338, "estimated_token_count": 196, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### How a Browse Listing Works\n\nBrowse enforces who can list, on chain, so the directory stays tied to real ownership and real people:\n\n- **Ownership**: You must own the dotNS name you are listing.\n- **Proof of Personhood**: The listing account needs [Proof of Personhood](/reference/apps/infrastructure/pop/), Lite or Full. Personhood is obtained in the Polkadot App on your device.\n- **Rate limits**: Listings are rate-limited per personhood tier over a rolling 24 hours — Lite accounts can publish one per day, Full accounts five per day.\n\nA listing itself stores only a minimal on-chain record: a hash of the label, the publisher's address, and a timestamp. The display name, description, and icon are not stored in the listing; they are read from your name's dotNS manifest when the directory renders, so keeping your manifest current keeps your Browse card current."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#publishing-to-browse", "page_title": "List Your App", "index": 9, "depth": 3, "title": "Publishing to Browse", "anchor": "publishing-to-browse", "start_char": 6338, "end_char": 7333, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Publishing to Browse\n\nPublishing into the on-chain Browse catalogue is separate from the `playground` CLI, which publishes to the Playground directory described above, not to Browse. Browse is run by the Polkadot Community Foundation (PCF), so report problems with it to PCF; see [Choose the Right Channel](/get-support/#choose-the-right-channel). PCF's `pad` deploy CLI no longer lists apps in Browse: its `--publish` and `--unpublish` flags were removed in October 2026. For the publish permission model, the personhood requirements, and the Browse contract details, see [App discovery: Browse](/apps/architecture/discovery/).\n\n!!! note \"Two toolchains, two directories\"\n    These docs standardize on the `playground` CLI, whose listing path is the Playground directory. Browse is the Community Foundation's directory, with its own on-chain registry. The two are separate publish mechanisms that share the same idea: a discovery directory of published Products surfaced inside the Hosts."}
{"source": "polkadot-docs", "page_id": "apps-list-your-app", "url": "https://developer.polkadot.com/apps/list-your-app/#where-to-go-next", "page_title": "List Your App", "index": 10, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 7333, "end_char": 8103, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a3da134bef8d2c935f2d526a060bbd7bad0f4df34de5dc8279357c05fec3e0a7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Deploy Your App**\n\n    ---\n\n    The full deploy flow, where the `publish to the playground?` choice is made.\n\n    [:octicons-arrow-right-24: Deploy Your App](/apps/deploy-your-app/)\n\n-   <span class=\"badge guide\">Guide</span> **Register a `.dot` Domain**\n\n    ---\n\n    A listing points at your `.dot` name, so register one first.\n\n    [:octicons-arrow-right-24: Register a `.dot` Domain](/apps/register-dot-domain/)\n\n-   <span class=\"badge learn\">Learn</span> **Proof of Personhood**\n\n    ---\n\n    The personhood tiers a Browse listing checks, and how they gate names and features.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-polkadot-app", "url": "https://developer.polkadot.com/apps/polkadot-app/#choose-your-path", "page_title": "The Polkadot App", "index": 0, "depth": 2, "title": "Choose your path", "anchor": "choose-your-path", "start_char": 526, "end_char": 1929, "estimated_token_count": 507, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e41191a34cf29991c430569ae28a1ccbc0ee05d42f192955a7de6800674f0d1", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Choose your path\n\n<div class=\"intro-cta\">\n<a class=\"intro-cta__card\" href=\"../using-the-app/users/\">\n  <div class=\"intro-cta__top\">\n    <span class=\"intro-cta__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polygon points=\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\"/></svg></span>\n    <span class=\"intro-cta__tag\">For users</span>\n  </div>\n  <div class=\"intro-cta__title\">Use the app</div>\n  <div class=\"intro-cta__desc\">Install the Polkadot app, set up a devnet account and open your first app.</div>\n  <div class=\"intro-cta__go\">Get started as a user <span>&rarr;</span></div>\n</a>\n<a class=\"intro-cta__card intro-cta__card--dev\" href=\"../get-started/developers/\">\n  <div class=\"intro-cta__top\">\n    <span class=\"intro-cta__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg></span>\n    <span class=\"intro-cta__tag\">For developers</span>\n  </div>\n  <div class=\"intro-cta__title\">Build a Product</div>\n  <div class=\"intro-cta__desc\">Build a web app, give it a <code>.dot</code> domain and publish it on the Devnet.</div>\n  <div class=\"intro-cta__go\">Get started as a developer <span>&rarr;</span></div>\n</a>\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-polkadot-app", "url": "https://developer.polkadot.com/apps/polkadot-app/#explore-the-platform", "page_title": "The Polkadot App", "index": 1, "depth": 2, "title": "Explore the platform", "anchor": "explore-the-platform", "start_char": 1929, "end_char": 4821, "estimated_token_count": 1159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e41191a34cf29991c430569ae28a1ccbc0ee05d42f192955a7de6800674f0d1", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Explore the platform\n\n<div class=\"home-rail\">\n<a class=\"rail-tile\" href=\"../architecture/\">\n  <span class=\"rail-tile__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 2 7 12 12 22 7 12 2\"/><polyline points=\"2 17 12 22 22 17\"/><polyline points=\"2 12 12 17 22 12\"/></svg></span>\n  <b>Architecture</b>\n  <span class=\"rail-tile__desc\">How the app, DotNS, Bulletin, Asset Hub, People, CASH and messaging fit together.</span>\n  <span class=\"rail-tile__arrow\">&rarr;</span>\n</a>\n<a class=\"rail-tile\" href=\"../using-the-app/\">\n  <span class=\"rail-tile__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"/><path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\"/></svg></span>\n  <b>Guides</b>\n  <span class=\"rail-tile__desc\">Step by step: create an account, get CASH, register a <code>.dot</code> domain, publish an app.</span>\n  <span class=\"rail-tile__arrow\">&rarr;</span>\n</a>\n<a class=\"rail-tile\" href=\"../reference/\">\n  <span class=\"rail-tile__icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"/><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"/><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"/><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"/></svg></span>\n  <b>Reference</b>\n  <span class=\"rail-tile__desc\">Packages, network IDs, registries, addresses, source links and terms.</span>\n  <span class=\"rail-tile__arrow\">&rarr;</span>\n</a>\n</div>\n\n<div class=\"home-outro\">\n<div class=\"home-outro__col\">\n<div class=\"home-outro__label\">Popular guides</div>\n<div class=\"dg-links\">\n<a href=\"../using-the-app/create-account/\">Create an account &amp; get funds</a>\n<a href=\"../using-the-app/get-and-use-cash/\">Get &amp; use CASH</a>\n<a href=\"../using-the-app/discover-and-open-apps/\">Discover &amp; open apps</a>\n<a href=\"../build/build-and-publish/\">Build &amp; publish an app</a>\n<a href=\"../build/register-a-dot-name/\">Register a <code>.dot</code> domain</a>\n<a href=\"../build/platform-services-sdk/\">Use platform services from the SDK</a>\n</div>\n</div>\n<div class=\"home-outro__col\">\n<div class=\"home-outro__label\">Devnet entry points</div>\n<div class=\"home-entry\">\n<a class=\"entry-chip\" href=\"https://dev-dot.li\" target=\"_blank\" rel=\"noopener\"><span class=\"lbl\">Web gateway</span><span class=\"val\">dev-dot.li</span></a>\n<a class=\"entry-chip\" href=\"https://browse.dev-dot.li\" target=\"_blank\" rel=\"noopener\"><span class=\"lbl\">Browse directory</span><span class=\"val\">browse.dev-dot.li</span></a>\n<a class=\"entry-chip\" href=\"https://faucet.polkadot.io\" target=\"_blank\" rel=\"noopener\"><span class=\"lbl\">Faucet</span><span class=\"val\">faucet.polkadot.io</span></a>\n</div>\n</div>\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#introduction", "page_title": "Auth", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 9, "end_char": 985, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-auth`](https://paritytech.github.io/product-sdk/api/auth/) is the sign-in flow for a Polkadot product CLI, with no interface attached. It wraps QR pairing, session discovery, session signing, resource allocation, and sign-out behind one object, `AuthClient`, and leaves every rendering decision to you.\n\nIt sits one level above [Terminal](/apps/product-sdk/terminal/): where that package gives you an adapter and the primitives, this one composes them into the login, logout, and allowance steps a CLI actually performs, parameterized by an `AuthConfig` so the same code serves any product. Terminal-rendering helpers live behind a separate `./ui` entry point, so a headless consumer never pulls them in.\n\n!!! note \"Not for Products\"\n    Like [Terminal](/apps/product-sdk/terminal/), this is CLI infrastructure. A Product runs inside a Host that already owns pairing and signing, so it uses [Signer](/apps/product-sdk/signer/) instead."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#when-to-use-it", "page_title": "Auth", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 985, "end_char": 1611, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use It\n\n- To build the login and logout flows of a command-line tool that signs as the user's Polkadot App account.\n- To resolve a signer from mixed sources — a paired phone session, a dev `--suri`, or a named dev account — behind one call (`resolveSigner`).\n- To request the resource allowances a fresh session needs before it can sign anything (`requestResourceAllocation`).\n- When you want the flow without the terminal rendering: import from the package root and supply your own interface.\n- Not inside a Product, and not when [Terminal](/apps/product-sdk/terminal/)'s lower-level primitives are all you need."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#core-concepts", "page_title": "Auth", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1611, "end_char": 3310, "estimated_token_count": 405, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Concepts\n\n- **`createAuthClient(config)`**: Builds a client bound to one product's `AuthConfig`. Every adapter, derivation, and storage path reads from that config, which is what makes the package product-agnostic.\n- **`AuthConfig`**: Four fields. `dappId` scopes the on-disk session namespace (`~/.polkadot-apps/{dappId}_*`) and the pairing, so each product gets an independently revocable session; `productId` and `derivationIndex` derive the product account; `peopleEndpoints` are the RPC endpoints the adapter connects to.\n- **`connect()` returns one of two shapes**: `{ kind: 'existing' }` when a session is already on disk, or `{ kind: 'qr', qrCode, login }` when the user has to scan. Print the QR _before_ mounting any interface, then await `waitForLogin(handle, onStatus)`.\n- **Three addresses, one key**: `SessionAddresses` carries `rootAddress` (the wallet root, the right input for `lookupUsername` in [Individuality](/apps/product-sdk/individuality/)), `productAddress` (the product account that actually signs), and `productH160` (the same product key as an EVM address). The last two are the same public key in two encodings.\n- **`SessionHandle.destroy()` is mandatory**: The signer depends on a long-lived adapter whose WebSocket keeps the Node event loop alive. Not calling `destroy()` means your CLI hangs on exit.\n- **Allocation before signing**: A freshly paired session cannot sign until the user grants resource allowances. `requestAllocation` requests `DEFAULT_RESOURCES` through the client's own `productId`, and `summarizeOutcomes` sorts the results into `granted`, `rejected`, and `unavailable` buckets by pairing each outcome with the resource at the same index."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#log-in-and-sign", "page_title": "Auth", "index": 3, "depth": 2, "title": "Log In and Sign", "anchor": "log-in-and-sign", "start_char": 3310, "end_char": 4242, "estimated_token_count": 252, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Log In and Sign\n\nBuild the client, branch on whether a session already exists, then get a signer:\n\n```typescript\nimport { createAuthClient } from '@parity/product-sdk-auth';\n\nconst auth = createAuthClient({\n  dappId: 'my-cli',\n  productId: 'my-cli.dot',\n  derivationIndex: 0,\n  peopleEndpoints: ['wss://paseo-people-next-system-rpc.polkadot.io'],\n});\n\nconst connection = await auth.connect();\n\nif (connection.kind === 'qr') {\n  console.log(connection.qrCode); // print before any interface mounts\n  await auth.waitForLogin(connection.login, (status) => {\n    if (status.step === 'pending') console.log(status.stage);\n  });\n}\n\nconst session = await auth.getSessionSigner();\nif (session) {\n  try {\n    console.log('signing as', session.addresses.productAddress);\n    // Use session.signer with submitAndWatch, a contract .tx(), or any PAPI call.\n  } finally {\n    session.destroy(); // required — releases the WebSocket\n  }\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#request-allowances", "page_title": "Auth", "index": 4, "depth": 2, "title": "Request Allowances", "anchor": "request-allowances", "start_char": 4242, "end_char": 6063, "estimated_token_count": 405, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Request Allowances\n\nA fresh session needs allowances before its first signature. Request them once and report what the user actually granted:\n\n```typescript\nimport { summarizeOutcomes, DEFAULT_RESOURCES } from '@parity/product-sdk-auth';\n\n// The client binds `productId` from your AuthConfig, so it is not passed here.\nconst outcomes = await auth.requestAllocation(session.userSession, DEFAULT_RESOURCES);\n\nconst { granted, rejected, unavailable } = summarizeOutcomes(outcomes, DEFAULT_RESOURCES);\nif (rejected.length || unavailable.length) {\n  console.warn(\n    'not granted:',\n    [...rejected, ...unavailable].map((resource) => resource.tag).join(', '),\n  );\n}\n```\n\n`DEFAULT_RESOURCES` covers what a CLI product account normally needs: `BulletInAllowance`, `StatementStoreAllowance`, and `SmartContractAllowance` for derivation index `0`. `summarizeOutcomes` buckets the results into `granted`, `rejected`, and `unavailable` — it is order-sensitive, so pass the same resource array you requested. Treat anything other than granted as a capability being unavailable rather than a fatal error, so a declined grant degrades gracefully. See [Allowances and Permissions](/apps/concepts/allowances/) for what each resource authorizes.\n\n!!! warning \"These outcomes are tagged objects, not strings\"\n    An allocation outcome here is `{ tag: 'Allocated' | 'Rejected' | 'NotAvailable', ... }`, so compare `outcome.tag`, not `outcome`. The same concept in [`host`](/apps/product-sdk/host/) is a bare string union, and a comparison written for one silently never matches on the other.\n\nThe standalone `requestResourceAllocation(session, productId, resources?, onExisting?)` is there when you are not holding an `AuthClient`. It throws on transport failures; per-resource refusals come back as outcomes rather than exceptions."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#resolve-a-signer-from-mixed-sources", "page_title": "Auth", "index": 5, "depth": 2, "title": "Resolve a Signer From Mixed Sources", "anchor": "resolve-a-signer-from-mixed-sources", "start_char": 6063, "end_char": 7345, "estimated_token_count": 328, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resolve a Signer From Mixed Sources\n\nA CLI usually accepts several ways to sign: the paired phone in normal use, a dev key in CI. `resolveSigner` collapses that into one call:\n\n```typescript\nimport { resolveSigner, SignerNotAvailableError } from '@parity/product-sdk-auth';\n\nlet resolved;\ntry {\n  // A `--suri` wins; otherwise the paired session is used.\n  resolved = await resolveSigner(auth, { suri: process.env.DEPLOY_SURI });\n} catch (error) {\n  if (error instanceof SignerNotAvailableError) {\n    console.error('No signer: pass --suri or log in first.');\n  }\n  throw error;\n}\n\ntry {\n  console.log(`signing as ${resolved.address} (${resolved.source})`);\n  // Pass resolved.signer to submitAndWatch, a contract .tx(), or any PAPI call.\n} finally {\n  resolved.destroy(); // tears down the session adapter; a no-op for dev signers\n}\n```\n\n`resolveSigner` takes the client first, then the options, and returns a `ResolvedSigner`: the `signer` itself plus `address`, `source` (`'dev'` or `'session'`), and a `destroy()` to call in a `finally` block. For a mobile session it also carries `userSession` and the `addresses` triple; both are absent for a dev signer. `parseDevAccountName` turns a name such as `//Alice` into the corresponding well-known dev account, for the CI path."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#limitations", "page_title": "Auth", "index": 6, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 7345, "end_char": 7992, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- Node only, like [Terminal](/apps/product-sdk/terminal/), and subject to the same Node 21 requirement through it.\n- Failures are thrown, not returned on a `Result` channel. `resolveSigner` raises `SignerNotAvailableError`; other steps surface their own errors.\n- `SessionHandle.destroy()` must be called or the process will not exit.\n- `AuthConfig` has no defaults — `dappId`, `productId`, `derivationIndex`, and `peopleEndpoints` are all required, because the values are per product and per network.\n- Sessions are keyed by `dappId` on disk, so two products never share a session and signing out of one leaves the other paired."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-auth", "url": "https://developer.polkadot.com/apps/product-sdk/auth/#where-to-go-next", "page_title": "Auth", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 7992, "end_char": 8819, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:772705de4def6206d33c17249241ba9f8e8a737daf57d7d044cc9b0853600392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Terminal**\n\n    ---\n\n    The layer below: the adapter, QR rendering, and allowance signers this package composes.\n\n    [:octicons-arrow-right-24: Terminal](/apps/product-sdk/terminal/)\n\n-   <span class=\"badge learn\">Learn</span> **Allowances and Permissions**\n\n    ---\n\n    What each resource allowance authorizes, its scope and lifetime, and how re-approval works.\n\n    [:octicons-arrow-right-24: Allowances](/apps/concepts/allowances/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `auth` surface: `AuthClient`, session signers, allocation helpers, and the `/ui` subpath.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/auth/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-chain-client", "url": "https://developer.polkadot.com/apps/product-sdk/chain-client/#introduction", "page_title": "Chain Client", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 842, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ebd2d4b9d05d95ba37f3b502c80356788b37006ee94cb6a668b98a65cc5b16d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-chain-client`](https://paritytech.github.io/product-sdk/api/chain-client/) is the connection layer of the Product SDK. It gives your Product a typed [PAPI](https://papi.how) client for reading state and building extrinsics across the Polkadot ecosystem chains a Product uses (Asset Hub, the Bulletin Chain, and Individuality), and it routes every connection through the Host rather than opening a WebSocket itself.\n\nBecause the Host owns the connection, your Product never picks an RPC endpoint or manages reconnection. You ask for a chain by name or by descriptor, and the client hands back a fully typed API.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Connect to the chains](/apps/build/platform-services-sdk/#connect-to-the-chains)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-chain-client", "url": "https://developer.polkadot.com/apps/product-sdk/chain-client/#when-to-use-it", "page_title": "Chain Client", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 842, "end_char": 1462, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ebd2d4b9d05d95ba37f3b502c80356788b37006ee94cb6a668b98a65cc5b16d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## When to Use It\n\n- Whenever your Product needs to read on-chain storage, constants, or account state, or to build a transaction to submit later.\n- Use `getChainAPI` for the zero-config path: pass an environment name and get the preset chains back with no descriptor imports.\n- Use `createChainClient` when you want to bring your own descriptors: a custom chain, a pre-release runtime, or only a subset of chains.\n- Do not reach for it to submit or sign; pair it with [Signer](/apps/product-sdk/signer/) and [Transactions](/apps/product-sdk/tx/) for that. There is no direct-WebSocket fallback, so it requires a Host."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-chain-client", "url": "https://developer.polkadot.com/apps/product-sdk/chain-client/#core-concepts", "page_title": "Chain Client", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1462, "end_char": 2549, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ebd2d4b9d05d95ba37f3b502c80356788b37006ee94cb6a668b98a65cc5b16d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Core Concepts\n\n- **`getChainAPI(env)`**: The zero-config factory. Pass `'paseo'` (or `'devnet'` for Products Devnet, operated by the Polkadot Community Foundation) and it lazy-loads the descriptors and returns a client with fixed `assetHub`, `bulletin`, and `individuality` keys.\n- **`createChainClient(config)`**: The bring-your-own-descriptors factory. You pass a `chains` map of names to descriptors, and each becomes a typed API on the returned client.\n- **`ChainClient`**: The returned object. Each configured key is a typed PAPI `TypedApi`; `.raw` exposes the underlying `PolkadotClient` per chain for advanced use; and `.destroy()` tears down the connections.\n- **Connection caching**: Clients are cached by a genesis-hash fingerprint of their chain set. Two calls with the same descriptors share one instance, so you do not accumulate duplicate connections.\n- **Graceful degradation**: A chain the Host cannot serve does not break the whole client. The supported chains stay usable, and any access to the unsupported one throws a `ChainNotSupportedError` instead of hanging."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-chain-client", "url": "https://developer.polkadot.com/apps/product-sdk/chain-client/#read-chain-state-with-a-preset", "page_title": "Chain Client", "index": 3, "depth": 2, "title": "Read Chain State With a Preset", "anchor": "read-chain-state-with-a-preset", "start_char": 2549, "end_char": 3010, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ebd2d4b9d05d95ba37f3b502c80356788b37006ee94cb6a668b98a65cc5b16d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Read Chain State With a Preset\n\nThe fastest path is `getChainAPI`. Connect to Paseo and read an account and a constant, then release the connection:\n\n```typescript\nimport { getChainAPI } from '@parity/product-sdk-chain-client';\n\nconst client = await getChainAPI('paseo');\n\nconst account = await client.assetHub.query.System.Account.getValue(address);\nconst byteFee = await client.bulletin.query.TransactionStorage.ByteFee.getValue();\n\nclient.destroy();\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-chain-client", "url": "https://developer.polkadot.com/apps/product-sdk/chain-client/#bring-your-own-descriptor", "page_title": "Chain Client", "index": 4, "depth": 2, "title": "Bring Your Own Descriptor", "anchor": "bring-your-own-descriptor", "start_char": 3010, "end_char": 3595, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ebd2d4b9d05d95ba37f3b502c80356788b37006ee94cb6a668b98a65cc5b16d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Bring Your Own Descriptor\n\nWhen you need a specific chain or a smaller client, pass descriptors directly. `isConnected` is a synchronous, side-effect-free check:\n\n```typescript\nimport {\n  createChainClient,\n  isConnected,\n} from '@parity/product-sdk-chain-client';\nimport { paseo_asset_hub } from '@parity/product-sdk-descriptors/paseo-asset-hub';\n\nconst client = await createChainClient({ chains: { assetHub: paseo_asset_hub } });\n\nconst blockNumber = await client.assetHub.query.System.Number.getValue();\nconsole.log(isConnected(paseo_asset_hub)); // true\n\nclient.destroy();\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-chain-client", "url": "https://developer.polkadot.com/apps/product-sdk/chain-client/#limitations", "page_title": "Chain Client", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 3595, "end_char": 4076, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ebd2d4b9d05d95ba37f3b502c80356788b37006ee94cb6a668b98a65cc5b16d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Limitations\n\n- The client is Host-only; it throws if no Host provider is available and there is no standalone fallback.\n- The `polkadot` and `kusama` environments are not live yet and throw when requested; use `paseo` or `devnet`.\n- Descriptors are per-environment. A `paseo` descriptor and a `devnet` descriptor have different genesis hashes and are not interchangeable.\n- Call `.destroy()` (or `destroyAll()`) to release cached connections when a client is no longer needed."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-chain-client", "url": "https://developer.polkadot.com/apps/product-sdk/chain-client/#where-to-go-next", "page_title": "Chain Client", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4076, "end_char": 4892, "estimated_token_count": 242, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ebd2d4b9d05d95ba37f3b502c80356788b37006ee94cb6a668b98a65cc5b16d", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Read On-Chain Data**\n\n    ---\n\n    The task-focused recipe: set up the client and read balances and storage step by step.\n\n    [:octicons-arrow-right-24: Read On-Chain Data](/apps/build/read-chain-state/)\n\n-   <span class=\"badge learn\">Learn</span> **Signer**\n\n    ---\n\n    Get an account and a signer to pair with the client when you need to submit, not just read.\n\n    [:octicons-arrow-right-24: Signer](/apps/product-sdk/signer/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `chain-client` surface: `getChainAPI`, `createChainClient`, and every type.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/chain-client/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-cloud-storage", "url": "https://developer.polkadot.com/apps/product-sdk/cloud-storage/#introduction", "page_title": "Cloud Storage", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 810, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8afbe41e24dabf51a52c27ff14b5665738146cc4901b0c1ab5ac941090f4d122", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-cloud-storage`](https://paritytech.github.io/product-sdk/api/cloud-storage/) stores content-addressed data on the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/). You upload bytes and get back a CID; you fetch by CID from anywhere inside a Host. It handles chunking, DAG-PB manifests, and CID calculation for you, and adds network presets, container-only read helpers, and an authorization pre-flight.\n\nReach for it when your Product needs content that outlives a session and is addressable by anyone who has the CID: profile photos, published posts, file uploads, or full snapshots of app state.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Storage & data](/apps/architecture/storage/)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-cloud-storage", "url": "https://developer.polkadot.com/apps/product-sdk/cloud-storage/#when-to-use-it", "page_title": "Cloud Storage", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 810, "end_char": 1353, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8afbe41e24dabf51a52c27ff14b5665738146cc4901b0c1ab5ac941090f4d122", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## When to Use It\n\n- To store bytes or files on chain and receive a CID plus a block receipt (`store(data).send()`).\n- To fetch content by CID inside a Host, with automatic reassembly of chunked uploads (`fetchBytes`, `fetchJson`).\n- To check an account's storage quota before uploading, so a missing allowance becomes an actionable error rather than a bare on-chain rejection (`checkAuthorization`).\n- Reads are Host-only; there is no public gateway fallback. To confirm a CID landed on chain without fetching the bytes, use `verifyStored`."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-cloud-storage", "url": "https://developer.polkadot.com/apps/product-sdk/cloud-storage/#core-concepts", "page_title": "Cloud Storage", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1353, "end_char": 2531, "estimated_token_count": 293, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8afbe41e24dabf51a52c27ff14b5665738146cc4901b0c1ab5ac941090f4d122", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Core Concepts\n\n- **`CloudStorageClient`**: The main class. Create it with `CloudStorageClient.create({ environment, signer })`, then call `store`, `fetchBytes`, and `fetchJson`.\n- **Content addressing**: Uploads are identified by a CID (CIDv1) derived from their content, not by a path or key. The same bytes always produce the same CID.\n- **`store(data)` builder**: A fluent builder ending in `.send()`, which resolves with a `StoreResult`. Only `size` is always present; `cid`, `blockNumber`, and `extrinsicIndex` are optional. Large payloads are chunked automatically.\n- **Read helpers return a `Result`**: `fetchBytes` and `fetchJson` return a `Result` (check `.ok`); DAG-PB chunked content is reassembled for you unless you opt out.\n- **Authorization pre-flight**: `checkAuthorization` returns a `Result` wrapping an `AuthorizationStatus` with the remaining transactions, bytes, and expiration, and never throws. Uploading requires an [authorization](/apps/get-started/get-testnet-tokens/) on the account.\n- **`createLazySigner(getSigner)`**: A signer wrapper that resolves the underlying signer on each call, so you can build the client before an account is selected."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-cloud-storage", "url": "https://developer.polkadot.com/apps/product-sdk/cloud-storage/#store-and-fetch-by-cid", "page_title": "Cloud Storage", "index": 3, "depth": 2, "title": "Store and Fetch by CID", "anchor": "store-and-fetch-by-cid", "start_char": 2531, "end_char": 3207, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8afbe41e24dabf51a52c27ff14b5665738146cc4901b0c1ab5ac941090f4d122", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Store and Fetch by CID\n\nCreate a client with a lazy signer, upload bytes, and fetch them back by CID:\n\n```typescript\nimport {\n  CloudStorageClient,\n  createLazySigner,\n} from '@parity/product-sdk-cloud-storage';\n\nconst client = await CloudStorageClient.create({\n  environment: 'paseo',\n  signer: createLazySigner(() => manager.getSigner()),\n});\n\nconst stored = await client.store(bytes).send();\nif (!stored.cid) throw new Error('The store returned no CID.');\nconst cid = stored.cid.toString();\nconsole.log(cid, stored.blockNumber, stored.size);\n\nconst fetched = await client.fetchBytes(cid);\nif (fetched.ok) {\n  console.log(new TextDecoder().decode(fetched.value));\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-cloud-storage", "url": "https://developer.polkadot.com/apps/product-sdk/cloud-storage/#check-the-quota-before-uploading", "page_title": "Cloud Storage", "index": 4, "depth": 2, "title": "Check the Quota Before Uploading", "anchor": "check-the-quota-before-uploading", "start_char": 3207, "end_char": 3727, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8afbe41e24dabf51a52c27ff14b5665738146cc4901b0c1ab5ac941090f4d122", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Check the Quota Before Uploading\n\nConfirm the account is authorized and has room before you submit an upload:\n\n```typescript\nimport { checkAuthorization } from '@parity/product-sdk-cloud-storage';\n\nconst status = await checkAuthorization(api, address);\nif (!status.ok) {\n  console.error(status.error.message);\n} else if (!status.value.authorized) {\n  // The account has no storage authorization yet.\n} else if (status.value.remainingBytes < BigInt(bytes.length)) {\n  // The upload exceeds the remaining quota.\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-cloud-storage", "url": "https://developer.polkadot.com/apps/product-sdk/cloud-storage/#limitations", "page_title": "Cloud Storage", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 3727, "end_char": 4480, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8afbe41e24dabf51a52c27ff14b5665738146cc4901b0c1ab5ac941090f4d122", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Limitations\n\n- Reads run inside a Host only; outside a container, `fetchBytes` returns a `CloudStorageHostUnavailableError`.\n- Uploading requires a signer and an on-chain storage authorization for the account.\n- `authorizeAccount` is additive and is deliberately not retried; verify the result with `checkAuthorization` before retrying yourself.\n- `verifyStored` needs a known block; it does not scan the whole chain.\n- A chunked upload (large files) returns no `blockNumber` or `extrinsicIndex`, so it cannot be renewed by position. [Renew it by content hash](/apps/build/store-data-on-chain/#renew-long-lived-data) instead: the manifest CID and every chunk CID, which you can read from `StoreResult.chunks.chunkCids` or from the manifest's links."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-cloud-storage", "url": "https://developer.polkadot.com/apps/product-sdk/cloud-storage/#where-to-go-next", "page_title": "Cloud Storage", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4480, "end_char": 5356, "estimated_token_count": 245, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8afbe41e24dabf51a52c27ff14b5665738146cc4901b0c1ab5ac941090f4d122", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The task-focused recipe: upload to the Bulletin Chain and fetch by CID, with chunking and authorization.\n\n    [:octicons-arrow-right-24: Store Data on Chain](/apps/build/store-data-on-chain/)\n\n-   <span class=\"badge learn\">Learn</span> **Statement Store**\n\n    ---\n\n    Pair durable storage with real-time signaling: announce a fresh CID to other users as it changes.\n\n    [:octicons-arrow-right-24: Statement Store](/apps/product-sdk/statement-store/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `cloud-storage` surface: `CloudStorageClient`, CID helpers, and authorization.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/cloud-storage/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-contracts", "url": "https://developer.polkadot.com/apps/product-sdk/contracts/#introduction", "page_title": "Contracts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 813, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90dcb58187ffb195f82bfd6af01df5afc87a213e1d4697768b294fa96b510898", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-contracts`](https://paritytech.github.io/product-sdk/api/contracts/) gives your Product typed access to smart contracts deployed on Asset Hub. It calls `pallet-revive` (PolkaVM) contracts through the typed chain API, resolves each contract's address and ABI from a `cdm.json` manifest, and exposes reads, signed writes, and atomic batches on a typed handle.\n\nIt is the frontend counterpart to deploying a contract: once a contract is deployed and registered, this package turns its manifest entry into a typed object you call by name.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Smart contracts](/apps/architecture/contracts/) or [Call smart contracts](/apps/build/platform-services-sdk/#call-smart-contracts)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-contracts", "url": "https://developer.polkadot.com/apps/product-sdk/contracts/#when-to-use-it", "page_title": "Contracts", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 813, "end_char": 1323, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90dcb58187ffb195f82bfd6af01df5afc87a213e1d4697768b294fa96b510898", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## When to Use It\n\n- To call a contract deployed on Asset Hub: reads with `query`, signed writes with `tx`, or atomic multi-call batches with `prepare`.\n- When you have a `cdm.json` manifest (address and ABI per installed contract), which is the primary path via `ContractManager.fromClient`.\n- Not for deploying contracts; deployment is handled by the `cdm` toolchain, covered in [Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/). The target chain must expose the `Revive` pallet."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-contracts", "url": "https://developer.polkadot.com/apps/product-sdk/contracts/#core-concepts", "page_title": "Contracts", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1323, "end_char": 2433, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90dcb58187ffb195f82bfd6af01df5afc87a213e1d4697768b294fa96b510898", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Core Concepts\n\n- **`ContractManager`**: Resolves contracts from a `cdm.json` manifest. `fromClient(...)` is synchronous and uses the addresses snapshotted in the manifest; `getContract(name)` returns a typed handle and throws `ContractNotFoundError` if the name is not in the manifest.\n- **Contract handle**: Each ABI method exposes `query`, `tx`, and `prepare`.\n- **`query` returns a discriminated result**: A read is a dry run that returns `{ success, value, gasRequired }`. It does not throw on a revert, so branch on `.success` rather than using `try`/`catch`.\n- **`tx` returns a `Result`**: A signed write returns a `Result` (check `.ok`). Before signing, it dry-runs the call to size gas and fail fast on a revert.\n- **Account mapping**: `pallet-revive` requires each signing account to be mapped to its H160 address once. Call `ensureContractAccountMapped` at startup, or every `tx` on a fresh account fails with `AccountNotMapped`.\n- **Product-account signing**: Writes are signed by your Product-scoped account, so contract calls route to the user's phone for approval like any other transaction."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-contracts", "url": "https://developer.polkadot.com/apps/product-sdk/contracts/#call-a-contract", "page_title": "Contracts", "index": 3, "depth": 2, "title": "Call a Contract", "anchor": "call-a-contract", "start_char": 2433, "end_char": 3340, "estimated_token_count": 230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90dcb58187ffb195f82bfd6af01df5afc87a213e1d4697768b294fa96b510898", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Call a Contract\n\nBuild a manager from the manifest and the chain client, map the account once, then read and write:\n\n```typescript\nimport {\n  ContractManager,\n  ensureContractAccountMapped,\n} from '@parity/product-sdk-contracts';\nimport { paseo_asset_hub } from '@parity/product-sdk-descriptors/paseo-asset-hub';\nimport cdmJson from './cdm.json';\n\nconst manager = ContractManager.fromClient(\n  cdmJson,\n  chain.raw.assetHub,\n  paseo_asset_hub,\n  { signerManager },\n);\n\nawait ensureContractAccountMapped(manager.getRuntime(), account.address, signer);\n\nconst counter = manager.getContract('@my-app/counter');\n\n// Read: a dry run. Check .success, not .ok.\nconst count = await counter.getCount.query();\nif (count.success) console.log(count.value);\n\n// Write: signs through the Host. Check .ok.\nconst result = await counter.increment.tx({ signer });\nif (!result.ok) console.error(result.error.message);\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-contracts", "url": "https://developer.polkadot.com/apps/product-sdk/contracts/#limitations", "page_title": "Contracts", "index": 4, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 3340, "end_char": 3858, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90dcb58187ffb195f82bfd6af01df5afc87a213e1d4697768b294fa96b510898", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Limitations\n\n- `query` never throws on a chain-side failure; it returns `{ success: false, value: <error> }`, so branch on `.success`.\n- A fresh signing account fails every `tx` with `AccountNotMapped` until `ensureContractAccountMapped` runs once.\n- Passing both `gasLimit` and `storageDepositLimit` skips the dry-run, including the revert pre-check, so a reverting transaction is still submitted and its gas paid.\n- The `/codegen` and `/pvm` subpaths pull in Node-only modules; keep them out of browser bundles."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-contracts", "url": "https://developer.polkadot.com/apps/product-sdk/contracts/#where-to-go-next", "page_title": "Contracts", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3858, "end_char": 4728, "estimated_token_count": 242, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90dcb58187ffb195f82bfd6af01df5afc87a213e1d4697768b294fa96b510898", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Add a Smart Contract to Your Product**\n\n    ---\n\n    The task-focused recipe: scaffold, deploy, and register a contract, then wire it into your frontend.\n\n    [:octicons-arrow-right-24: Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/)\n\n-   <span class=\"badge learn\">Learn</span> **Transactions**\n\n    ---\n\n    The submission layer this package builds on for its signed writes and batches.\n\n    [:octicons-arrow-right-24: Transactions](/apps/product-sdk/tx/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `contracts` surface: `ContractManager`, contract handles, and the `pvm` subpath.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/contracts/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-host", "url": "https://developer.polkadot.com/apps/product-sdk/host/#introduction", "page_title": "Host", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 9, "end_char": 718, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e3284b0b28655c1398cf952dba462381759277a98694e84d343296e4167d8cd1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-host`](https://paritytech.github.io/product-sdk/api/host/) detects the Polkadot Host container and exposes its full surface directly: accounts and signing, storage, permissions, payments, chat, notifications, navigation, entropy, the statement store, and chain providers. It is the foundation the other SDK packages build on, wrapping the Host protocol so higher-level packages can offer focused APIs.\n\nMost Products reach these capabilities through the higher-level packages rather than calling the Host directly. Use this package when you need a surface those packages do not wrap yet, or when you need to detect whether your Product is running inside a Host at all."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-host", "url": "https://developer.polkadot.com/apps/product-sdk/host/#when-to-use-it", "page_title": "Host", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 718, "end_char": 1495, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e3284b0b28655c1398cf952dba462381759277a98694e84d343296e4167d8cd1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use It\n\n- To detect whether your Product is running inside a Host container (`isInsideContainer`, `isInsideContainerSync`) and branch behavior accordingly.\n- To reach a Host capability directly: accounts and signers, payments, chat, push notifications, deep-link navigation, or feature and chain probes.\n- To get a PAPI-compatible provider that routes chain traffic through the Host (`getHostProvider`), or the native statement store transport (`getStatementStore`).\n- Prefer the higher-level packages where they exist: [Signer](/apps/product-sdk/signer/) for signing, [Local Storage](/apps/product-sdk/local-storage/) for key-value storage, and [Chain Client](/apps/product-sdk/chain-client/) for connections. Outside a container, every getter resolves to `null`."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-host", "url": "https://developer.polkadot.com/apps/product-sdk/host/#core-concepts", "page_title": "Host", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1495, "end_char": 2538, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e3284b0b28655c1398cf952dba462381759277a98694e84d343296e4167d8cd1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Concepts\n\n- **Container detection**: `isInsideContainer()` is the async check; `isInsideContainerSync()` is a fast heuristic. Every Host getter returns `null` when not inside a container.\n- **Feature-detection getters**: `getAccountsProvider`, `getHostLocalStorage`, `getPaymentManager`, `getChatManager`, `getNotificationManager`, and more each return an adapter, or `null` if the Host is absent.\n- **Two error conventions**: Flat operations such as `requestPermission` and `navigateTo` return a `Result` (check `.ok`). Adapter methods keep throwing, because they implement external interfaces such as PAPI's provider that cannot carry a `Result`.\n- **Accounts surface**: `getAccountsProvider()` exposes product accounts (app-scoped keypairs the Host derives per Product) and legacy accounts (the user's existing wallet keys), plus signer factories for each.\n- **Chain support probes**: `getHostProvider(genesisHash)` throws a `ChainNotSupportedError` when the Host cannot serve a chain, rather than returning a provider that hangs."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-host", "url": "https://developer.polkadot.com/apps/product-sdk/host/#detect-the-container-and-read-host-storage", "page_title": "Host", "index": 3, "depth": 2, "title": "Detect the Container and Read Host Storage", "anchor": "detect-the-container-and-read-host-storage", "start_char": 2538, "end_char": 2972, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e3284b0b28655c1398cf952dba462381759277a98694e84d343296e4167d8cd1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Detect the Container and Read Host Storage\n\nCheck for a Host, then use its storage surface directly:\n\n```typescript\nimport {\n  isInsideContainer,\n  getHostLocalStorage,\n} from '@parity/product-sdk-host';\n\nif (await isInsideContainer()) {\n  const storage = await getHostLocalStorage();\n  if (storage) {\n    await storage.writeString('theme', 'dark');\n    const theme = await storage.readString('theme'); // \"\" if missing\n  }\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-host", "url": "https://developer.polkadot.com/apps/product-sdk/host/#get-a-product-account-and-signer", "page_title": "Host", "index": 4, "depth": 2, "title": "Get a Product Account and Signer", "anchor": "get-a-product-account-and-signer", "start_char": 2972, "end_char": 3416, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e3284b0b28655c1398cf952dba462381759277a98694e84d343296e4167d8cd1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get a Product Account and Signer\n\nReach an app-scoped product account and build a signer for it:\n\n```typescript\nimport { getAccountsProvider } from '@parity/product-sdk-host';\n\nconst accounts = await getAccountsProvider();\nif (accounts) {\n  const account = await accounts\n    .getProductAccount('my-product.dot', 0)\n    .match((a) => a, () => null);\n\n  if (account) {\n    const signer = accounts.getProductAccountSigner(account);\n  }\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-host", "url": "https://developer.polkadot.com/apps/product-sdk/host/#limitations", "page_title": "Host", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 3416, "end_char": 3943, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e3284b0b28655c1398cf952dba462381759277a98694e84d343296e4167d8cd1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- Every getter returns `null` outside a Host container; this package has no standalone fallback.\n- The package mixes two error conventions: flat operations return a `Result`, while adapter methods throw. Handle both.\n- `getHostProvider` throws `ChainNotSupportedError` when the Host cannot serve a chain, rather than returning a working provider.\n- Host storage returns an empty string for a missing key; normalize it yourself, or use the [Local Storage](/apps/product-sdk/local-storage/) package, which does."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-host", "url": "https://developer.polkadot.com/apps/product-sdk/host/#where-to-go-next", "page_title": "Host", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3943, "end_char": 4700, "estimated_token_count": 211, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e3284b0b28655c1398cf952dba462381759277a98694e84d343296e4167d8cd1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **App Development Reference**\n\n    ---\n\n    How the Host mediates between your Product and Polkadot's infrastructure.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/)\n\n-   <span class=\"badge learn\">Learn</span> **Signer**\n\n    ---\n\n    The higher-level way to discover accounts and sign, built on this package.\n\n    [:octicons-arrow-right-24: Signer](/apps/product-sdk/signer/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `host` surface: container detection and every Host capability getter.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/host/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#introduction", "page_title": "Product SDK", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 16, "end_char": 1219, "estimated_token_count": 266, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nThe [Product SDK](https://github.com/paritytech/product-sdk) is the TypeScript SDK for building Polkadot Products. It gives your Product typed access to everything the platform provides: chain reads, transaction signing, decentralized storage, off-chain messaging, smart contracts, and identity, all routed through the Host your Product runs inside.\n\nThe SDK never dials an RPC endpoint itself. Every sensitive operation (signing, chain access, storage) goes through the Host, which selects the network, holds the user's keys, and prompts for approval on the user's phone. Your Product calls a typed method; the Host mediates the rest.\n\nFallible operations in the individual packages return a typed `Result` instead of throwing, so you check `.ok` before reading `.value`. That pattern runs through every capability package and is what each [Build guide](/apps/build/) teaches. The `createApp` facade below is thinner and does not follow it uniformly — see [What `createApp` Returns](#what-createapp-returns).\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? Its hosts need a pinned SDK version: see [Packages & tools](/apps/reference/packages/)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#two-ways-to-use-the-sdk", "page_title": "Product SDK", "index": 1, "depth": 2, "title": "Two Ways to Use the SDK", "anchor": "two-ways-to-use-the-sdk", "start_char": 1219, "end_char": 3115, "estimated_token_count": 471, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Two Ways to Use the SDK\n\nThe SDK ships as one umbrella package that re-exports most capabilities, plus individual per-capability packages you can install on their own:\n\n- **Umbrella package**: `npm install @parity/product-sdk`. One dependency that provides the `createApp` entry point and re-exports most capabilities through subpaths such as `@parity/product-sdk/cloud-storage`. Convenient when your Product uses several capabilities and bundle size is not a concern. A few packages, notably `statement-store`, are not re-exported and are always installed on their own.\n- **Individual packages**: `npm install @parity/product-sdk-chain-client @parity/product-sdk-signer` (and so on). Install only what you use to keep your bundle smaller and your dependencies explicit.\n\nThe import specifiers differ between the two: the umbrella exposes subpaths like `@parity/product-sdk/cloud-storage`, while the standalone package is `@parity/product-sdk-cloud-storage`. Switching styles means updating your imports.\n\nThe umbrella's subpaths are a fixed set: `address`, `chain`, `cloud-storage`, `contracts`, `core`, `crypto`, `host`, `identity`, `individuality`, `local-storage`, `react`, `renderer`, `testing`, and `wallet`. Two of those names do not match their leaf package — `@parity/product-sdk/chain` re-exports `chain-client`, and `@parity/product-sdk/wallet` re-exports `signer`, kept under the older name for compatibility.\n\nNote what is _not_ there: `tx`, `keys`, `statement-store`, `terminal`, and `auth` have no umbrella subpath and are not re-exported from the root, so install those from their own packages even when you are otherwise on the umbrella. The root entry point does re-export the most common handful directly — `createApp`, `SignerManager`, `createChainClient`, `createLocalKvStore`, `CloudStorageClient`, `isInsideContainer`, and the `Result` trio (`ok`, `err`, `isErrorOf`)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#a-minimal-product", "page_title": "Product SDK", "index": 2, "depth": 2, "title": "A Minimal Product", "anchor": "a-minimal-product", "start_char": 3115, "end_char": 5075, "estimated_token_count": 481, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## A Minimal Product\n\n`createApp` is the fastest way in. It wires the signer, local storage, chain client, and cloud storage behind one object — the signer is exposed as `app.wallet`, the facade's older name for it:\n\n```typescript\nimport { createApp } from '@parity/product-sdk';\n\nasync function start() {\n  // Throws outside a host container; the Host supplies the Product's identity.\n  const app = await createApp({ logLevel: 'info' });\n\n  // wallet.connect() throws rather than returning a Result.\n  try {\n    const { accounts } = await app.wallet.connect();\n    if (accounts.length === 0) {\n      // Connected, but the Host did not derive an account for this Product.\n    } else {\n      console.log('Connected accounts:', accounts);\n    }\n  } catch (cause) {\n    // The Host refused the connection.\n  }\n\n  // Per-Product storage, namespaced by the Host's product ID. No Result: a miss reads as null.\n  await app.localStorage.set('lastVisit', new Date().toISOString());\n  const lastVisit = await app.localStorage.get('lastVisit'); // string | null\n  console.log('Last visit:', lastVisit);\n\n  return app;\n}\n```\n\n!!! warning \"The Host supplies your Product's identity\"\n    Since `@parity/product-sdk` v0.30.0, `createApp` takes no `name`. It reads the product ID the Host loaded your Product under, derives the user's account from that ID, and namespaces local storage under the ID minus its final domain suffix: `my-product.dot` becomes `my-product`, and local development IDs such as `localhost:3000` stay unchanged. A `name` you still pass is ignored and logged as a warning. Releases before v0.30.0 require `name` and use it for both the account and the storage namespace.\n\n    `createApp` throws `HostUnavailableError` outside a host container. Inside one, if the Host declines to derive an account (for example, because the user is signed out), `wallet.connect()` resolves with _zero accounts_ instead of failing, so the only symptom is an empty list."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#what-createapp-returns", "page_title": "Product SDK", "index": 3, "depth": 3, "title": "What `createApp` Returns", "anchor": "what-createapp-returns", "start_char": 5075, "end_char": 6941, "estimated_token_count": 571, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### What `createApp` Returns\n\nAn `App` exposing `wallet`, `localStorage`, `chain`, and `cloudStorage`, plus `getAppInfo`. The four do not share one error convention, so check which one you are calling before writing the guard:\n\n|      Member      |                                  Convention                                   |\n|------------------|-------------------------------------------------------------------------------|\n| `wallet`         | **Throws.** `connect()` rethrows the signer's error as a plain `Error`, so the typed variant is lost — you cannot tell `HostUnavailableError` from a rejection. |\n| `localStorage`   | **Neither.** `get` resolves to `string \\| null`, `set` to `void`; a failed read is indistinguishable from a missing key. |\n| `chain`          | **Throws.** `getClient` and `getRawClient` throw if the chain is not connected. |\n| `cloudStorage`   | **Returns a `Result`.** `upload` and `fetch` resolve to `ok`/`err`, matching the rest of the SDK. Also `null` entirely when cloud storage is disabled via `cloudStorage: false`. |\n\nIf you want the `Result` convention throughout, use the individual packages instead: [`signer`](/apps/product-sdk/signer/) in place of `app.wallet`, [`chain-client`](/apps/product-sdk/chain-client/) in place of `app.chain`, and [`local-storage`](/apps/product-sdk/local-storage/) in place of `app.localStorage`. That is the path every [Build guide](/apps/build/) takes.\n\n!!! warning \"createApp requires a Host\"\n    `createApp` must run inside a compatible Host ([Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/), the [Polkadot App](/reference/apps/hosts/polkadot-app/), or [Polkadot Web](/reference/apps/hosts/polkadot-web/)). Called outside one, it throws `HostUnavailableError`. For local development and tests, use the SDK's fake Host; see [Testing Without a Host](#testing-without-a-host)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#the-package-family", "page_title": "Product SDK", "index": 4, "depth": 2, "title": "The Package Family", "anchor": "the-package-family", "start_char": 6941, "end_char": 10217, "estimated_token_count": 941, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Package Family\n\nEach capability is its own package. The umbrella re-exports most of them; a few (such as `statement-store`) are always installed on their own. Each capability package below has its own overview page in this section covering what it is, when to use it, its core concepts, and typical journeys. The API reference links point to the generated reference for the complete surface.\n\n|                Package                 |                                            What it does                                            |                     API reference                     |\n|:--------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------------:|\n|   [Chain Client](/apps/product-sdk/chain-client/) (`chain-client`)     | Typed, host-routed client for reading on-chain storage, constants, and account state across chains |    [API](https://paritytech.github.io/product-sdk/api/chain-client/)    |\n|        [Signer](/apps/product-sdk/signer/) (`signer`)         |    Derives product-scoped accounts and requests signatures, routing every approval to the phone    |      [API](https://paritytech.github.io/product-sdk/api/signer/)      |\n|     [Transactions](/apps/product-sdk/tx/) (`tx`)          |                     Builds, submits, and follows transactions through to finality                  |       [API](https://paritytech.github.io/product-sdk/api/tx/)       |\n|  [Cloud Storage](/apps/product-sdk/cloud-storage/) (`cloud-storage`)   |     Uploads and retrieves content-addressed data by CID, backed by the Bulletin Chain              |   [API](https://paritytech.github.io/product-sdk/api/cloud-storage/)    |\n| [Statement Store](/apps/product-sdk/statement-store/) (`statement-store`) |        Publish/subscribe client for signed, short-lived statements gossiped off-chain             |  [API](https://paritytech.github.io/product-sdk/api/statement-store/)   |\n|   [Local Storage](/apps/product-sdk/local-storage/) (`local-storage`)   |             Per-Product, per-device key-value store backed by the Host                            |   [API](https://paritytech.github.io/product-sdk/api/local-storage/)    |\n|      [Contracts](/apps/product-sdk/contracts/) (`contracts`)      |   Typed calls to `pallet-revive` (PolkaVM) contracts on Asset Hub, resolved from a `cdm.json`      |    [API](https://paritytech.github.io/product-sdk/api/contracts/)     |\n|          [Keys](/apps/product-sdk/keys/) (`keys`)         |                Derives application and session keys from the user's accounts                        |       [API](https://paritytech.github.io/product-sdk/api/keys/)       |\n|  [Individuality](/apps/product-sdk/individuality/) (`individuality`) |     Reads personhood standing and usernames on the Individuality chain, and dispatches under a person origin    | [Source](https://github.com/paritytech/product-sdk/tree/main/product-sdk/packages/individuality) |\n|          [Host](/apps/product-sdk/host/) (`host`)         |         Detects the Host container and exposes its lower-level API surface directly                 |       [API](https://paritytech.github.io/product-sdk/api/host/)       |"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#command-line-packages", "page_title": "Product SDK", "index": 5, "depth": 3, "title": "Command-Line Packages", "anchor": "command-line-packages", "start_char": 10217, "end_char": 11263, "estimated_token_count": 378, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Command-Line Packages\n\nTwo packages are for tools you run _next to_ a Product — a deploy script, a migration job, a CI step — rather than inside one. A Product runs in a Host that already owns pairing and signing, so it uses [Signer](/apps/product-sdk/signer/) instead. Both require Node 21 or later.\n\n|                Package                 |                                What it does                                |                  API reference                   |\n|:--------------------------------------:|:--------------------------------------------------------------------------:|:------------------------------------------------:|\n|  [Terminal](/apps/product-sdk/terminal/) (`terminal`)  | QR-code pairing, session signing, and allowance signers for a Node CLI     | [API](https://paritytech.github.io/product-sdk/api/terminal/) |\n|      [Auth](/apps/product-sdk/auth/) (`auth`)      | The runtime-agnostic login, logout, and allocation flow built on `terminal` |   [API](https://paritytech.github.io/product-sdk/api/auth/)   |"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#supporting-packages", "page_title": "Product SDK", "index": 6, "depth": 3, "title": "Supporting Packages", "anchor": "supporting-packages", "start_char": 11263, "end_char": 12830, "estimated_token_count": 459, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Supporting Packages\n\nLower-level primitives the capability packages build on. Each has its own generated API reference:\n\n- **[`address`](https://paritytech.github.io/product-sdk/api/address/)**: Encodes, decodes, and converts SS58 and H160 addresses.\n- **[`crypto`](https://paritytech.github.io/product-sdk/api/crypto/)**: Encryption, hashing, and encoding primitives.\n- **[`utils`](https://paritytech.github.io/product-sdk/api/utils/)**: Byte encoding, 32-byte hashes (`blake2b256`, `sha256`, `keccak256`), planck token formatting, and typed balance queries.\n- **[`logger`](https://paritytech.github.io/product-sdk/api/logger/)**: Structured, namespace-filtered logging.\n- **[`errors`](https://paritytech.github.io/product-sdk/api/errors/)** and **[`result`](https://paritytech.github.io/product-sdk/api/result/)**: The shared `SdkError` marker and the generic `Result` type the whole SDK returns.\n- **`descriptors`**: Typed chain metadata consumed by the chain client. Imported per chain (for example, `@parity/product-sdk-descriptors/paseo-asset-hub`).\n\n!!! note \"`result` breaks the package-name pattern\"\n    Every other package installs as `@parity/product-sdk-<name>`, but the result type ships as `@parity/result`, with no `product-sdk-` prefix. Most Products never install it directly, since the capability packages re-export `Result`, `ok`, and `err`; if you do need it standalone, use the unprefixed name.\n\nThe full surface, every package, class, and method, is documented in the [Product SDK API reference](https://paritytech.github.io/product-sdk/)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#capabilities-that-live-on-the-host", "page_title": "Product SDK", "index": 7, "depth": 2, "title": "Capabilities That Live on the Host", "anchor": "capabilities-that-live-on-the-host", "start_char": 12830, "end_char": 13663, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Capabilities That Live on the Host\n\nA few things the platform offers are reached through the [`host`](/apps/product-sdk/host/) package rather than a dedicated capability package, so there is no focused API to learn yet:\n\n- **Payments**: `getPaymentManager()` — request a payment, top up, and track status.\n- **Chat**: `getChatManager()` — rooms, bots, and interactive action buttons.\n- **Notifications**: `getNotificationManager()` — push notifications to the user's phone.\n- **Navigation**: `navigateTo()` — deep links between Products.\n\nThese are Host getters that return `null` outside a container, and their surfaces are still settling. Treat them as lower-level than the rest of the SDK, and check the [`host` API reference](https://paritytech.github.io/product-sdk/api/host/) for the current shape before building on them."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#react-bindings", "page_title": "Product SDK", "index": 8, "depth": 2, "title": "React Bindings", "anchor": "react-bindings", "start_char": 13663, "end_char": 14186, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## React Bindings\n\nThe umbrella exposes a React entry point at `@parity/product-sdk/react`. Wrap your app in `ProductSDKProvider`, then reach the SDK from any component through hooks:\n\n- **`useProductSDK`**: The `App` instance and connection state.\n- **`useWallet`**: The connected account and signing helpers.\n- **`useLocalStorage`**: Reactive per-Product key-value storage.\n- **`useChain`**: The host-routed chain client.\n\nThe [Shared Todo App tutorial](/apps/tutorials/shared-todo-app/) uses these bindings end to end."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#testing-without-a-host", "page_title": "Product SDK", "index": 9, "depth": 2, "title": "Testing Without a Host", "anchor": "testing-without-a-host", "start_char": 14186, "end_char": 16739, "estimated_token_count": 627, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Testing Without a Host\n\nBecause `createApp` and the host-only methods require a Host, the SDK ships fakes so _automated tests_ can exercise Product logic in plain Node or a browser test runner. These are a test tool, not a development environment: to _develop_ against a real Host, run your Product from `localhost` inside Polkadot Desktop, per [Set Up Your Project](/apps/build/#set-up-your-project).\n\n`@parity/product-sdk/testing` exports `createFakeApp`, which returns a fake `App` you can use directly in a logic test or hand to `ProductSDKContext.Provider` for a React component test:\n\n```typescript\nimport { createFakeApp } from '@parity/product-sdk/testing';\n\n// Synchronous, unlike the real createApp, which returns a Promise.\nconst app = createFakeApp({ wallet: { accounts: [alice, bob], selected: alice } });\n\nawait app.wallet.connect();\n```\n\nIt fakes `wallet`, `localStorage`, and `cloudStorage`. Each is overridable through the options, along with `name`.\n\n!!! warning \"There is no chain fake, and `app.chain` throws\"\n    `createFakeApp` leaves `chain` unconfigured, so `getClient` and `getRawClient` throw — deliberately, because the Host owns RPC selection and a fake would not exercise the real wiring. The SDK's own guidance is to put chain-reading logic behind an interface you control, unit-test against that, and cover the wiring in end-to-end tests. Pass a `chain` override to `createFakeApp` if you would rather supply your own double.\n\n    This matters most for [Read On-Chain Data](/apps/build/read-chain-state/), the first Build recipe, which is entirely chain reads.\n\nThe subpath also re-exports the per-package fakes for [`signer`](/apps/product-sdk/signer/), [`local-storage`](/apps/product-sdk/local-storage/), [`contracts`](/apps/product-sdk/contracts/), and [`host`](/apps/product-sdk/host/) — `createFakeSignerProvider`, `createFakeHostLocalStorage`, and the rest — so one import covers them.\n\n!!! note \"Statement store fakes are imported separately\"\n    They are deliberately not re-exported here, for the same reason `statement-store` has no umbrella subpath: adding it would pull in a dependency the umbrella does not otherwise have, and could pin a different version than the one your Product installs. Import them from `@parity/product-sdk-statement-store/testing` instead.\n\nIndividual packages also expose a dev path where it makes sense; for example, `SignerManager.connect('dev')` loads the standard Substrate dev accounts. See [Sign and Submit Transactions](/apps/build/sign-and-submit/#test-without-a-host)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#requirements", "page_title": "Product SDK", "index": 10, "depth": 2, "title": "Requirements", "anchor": "requirements", "start_char": 16739, "end_char": 17388, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Requirements\n\n- **Node.js**: version 20 or later — **except [`terminal`](/apps/product-sdk/terminal/) and [`auth`](/apps/product-sdk/auth/), which need 21 or later.** Those two open a WebSocket through the global `WebSocket` that Node 21 was the first to expose; on Node 18 or 20 they fail at connect time with `WebSocket is not defined`, not at install time.\n- **Module format**: ESM only. The SDK does not ship CommonJS builds.\n- **TypeScript**: version 5.0 or later, if you consume the types.\n- **Runtime Host**: The umbrella package and host-only methods require a compatible Host at runtime. Use the SDK's testing fakes in automated tests."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk", "url": "https://developer.polkadot.com/apps/product-sdk/#where-to-go-next", "page_title": "Product SDK", "index": 11, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 17388, "end_char": 18207, "estimated_token_count": 224, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5a0fca17576cd22381baac0d1d13eef15d4c95790d6504e30770947aa8d69762", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Build Guides**\n\n    ---\n\n    Task-focused recipes, one per capability, that take you from an empty project to working Product code.\n\n    [:octicons-arrow-right-24: Open Build Guides](/apps/build/)\n\n-   <span class=\"badge external\">External</span> **Product SDK API Reference**\n\n    ---\n\n    The complete SDK surface: installation, quickstart, testing, and per-package API docs for every class and method.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/)\n\n-   <span class=\"badge learn\">Learn</span> **App Development Reference**\n\n    ---\n\n    How the Product, SDK, Host, and on-chain infrastructure fit together.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#introduction", "page_title": "Individuality", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 1425, "estimated_token_count": 332, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-individuality`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/packages/individuality) reads a person's standing on the Individuality chain and lets your Product act as that person on it. It is the typed way to answer \"is this a verified human, and how far along are they?\" without learning who they are.\n\nThe package has two halves. The _read_ half works in both directions: given a `.dot` username or an account, what is that person's [Proof of Personhood](/reference/apps/infrastructure/pop/) state; and given an account, which usernames does it hold. The _write_ half is a single function, `withAsPerson`, which wraps a signer so a transaction dispatches under a _person_ origin instead of an account origin.\n\nReads return a typed `Result`, so you check `.ok` before reading `.value`. A username nobody owns is not a failure: it arrives on the success channel as a `UsernameUnowned` result.\n\n!!! danger \"Not an authorization oracle\"\n    This is a client-side read in a client-side library. A backend that trusts \"the SDK said `Member`\" is trivially spoofed. Use it to shape your interface — show progress, gate a button, pick a label — but anything that gates real value must verify on chain itself.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Identity & personhood](/apps/architecture/identity/)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#when-to-use-it", "page_title": "Individuality", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 1425, "end_char": 2038, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## When to Use It\n\n- To read a person's personhood state and progress metrics for display, from either a username or an account (`readPersonhoodState`).\n- To resolve which usernames an account holds, and which one to show (`lookupUsername`, `displayUsername`).\n- To dispatch a call under a person origin rather than an account origin (`withAsPerson`), for extrinsics the Individuality chain gates on personhood.\n- To read the periodic game and its prize draws, and to build the sign-up and claim calls around them.\n- Not to authorize anything server-side, and not to gate access to funds. See the warning above."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#core-concepts", "page_title": "Individuality", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 2038, "end_char": 3722, "estimated_token_count": 397, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Core Concepts\n\n- **Everything is pinned to one block**: A read batches several storage lookups and reports the `FinalizedSnapshot` (`blockHash`, `blockNumber`) they all came from. The personhood threshold and the absence-grace ratio update on a session cadence, so an unpinned read could mix eras and derive a state that never existed.\n- **`PersonhoodResult` versus `PersonhoodState`**: The outer result is `UsernameUnowned` or `Resolved`. Only `Resolved` carries an account, an optional contextual `alias`, the `state`, and `metrics`.\n- **Seven states, discriminated by `tag`**: `NotEnrolled`, `Lite`, `Candidate` (accruing score, carries `score` and `personhoodThreshold`), `MembershipReady`, `Member` (carries `activeWeeks`), `Caution` (the next absence would breach the grace policy), and `Suspended`.\n- **`metrics` is always present on a resolved read**: The same numbers the state was derived from, in every state, so a progress interface renders without branching on the tag first.\n- **`Caution.misses` is a projection**: It is what the absence window _would_ hold after one more absence, not a count of past absences. A `window` of `0` means no grace at all and lands in `Caution` regardless.\n- **Lite and full usernames**: An account always has a lite username (`example.07`); a full one appears only once the person claims a bare name. `displayUsername` picks the right one, `usernameBase` extracts the letters a claim would offer, and `canClaimFullUsername` is the chain's own precondition, not an approximation.\n- **The derivation is exported separately**: `derivePersonhoodState` is pure. Feed it a snapshot you already hold and it needs no chain client and no Host."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#read-a-persons-standing", "page_title": "Individuality", "index": 3, "depth": 2, "title": "Read a Person's Standing", "anchor": "read-a-persons-standing", "start_char": 3722, "end_char": 4632, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Read a Person's Standing\n\nPass either a `username` or an `account`. Branch on `.ok`, then on the result `tag`:\n\n```typescript\nimport { getChainAPI } from '@parity/product-sdk-chain-client';\nimport { readPersonhoodState } from '@parity/product-sdk-individuality';\n\nconst chain = await getChainAPI('paseo');\n\nconst result = await readPersonhoodState(chain, { username: 'alice.dot' });\nif (!result.ok) {\n  console.error(result.error.message); // ProductIndividualityError\n} else if (result.value.tag === 'UsernameUnowned') {\n  // Nobody owns this name — a success value, not an error.\n} else {\n  const { state, metrics, at } = result.value;\n  console.log(state.tag, 'as of block', at.blockNumber);\n\n  if (state.tag === 'Candidate') {\n    console.log(`${state.score} of ${state.personhoodThreshold}`);\n  } else if (state.tag === 'Member') {\n    console.log(`${state.activeWeeks} consecutive games`);\n  }\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#resolve-an-accounts-username", "page_title": "Individuality", "index": 4, "depth": 2, "title": "Resolve an Account's Username", "anchor": "resolve-an-accounts-username", "start_char": 4632, "end_char": 5433, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Resolve an Account's Username\n\nThe other direction, from an account to the names it holds:\n\n```typescript\nimport { getChainAPI } from '@parity/product-sdk-chain-client';\nimport {\n  canClaimFullUsername,\n  displayUsername,\n  lookupUsername,\n  usernameBase,\n} from '@parity/product-sdk-individuality';\n\nconst chain = await getChainAPI('paseo');\n\nconst usernames = await lookupUsername(chain, { account: rootAddress });\nif (usernames.ok && usernames.value !== null) {\n  const record = usernames.value;\n  console.log(displayUsername(record)); // full name if claimed, else the lite one\n\n  if (canClaimFullUsername(record)) {\n    console.log('could claim:', usernameBase(record.liteUsername));\n  }\n}\n```\n\nA `null` value means the account has no record at all, which is an answer rather than a failure."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#act-under-a-person-origin", "page_title": "Individuality", "index": 5, "depth": 2, "title": "Act Under a Person Origin", "anchor": "act-under-a-person-origin", "start_char": 5433, "end_char": 6616, "estimated_token_count": 267, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Act Under a Person Origin\n\n`withAsPerson` wraps a `PolkadotSigner` so the call dispatches as a person. It returns a signer, so submission stays with [Transactions](/apps/product-sdk/tx/):\n\n```typescript\nimport { submitAndWatch } from '@parity/product-sdk-tx';\nimport { withAsPerson } from '@parity/product-sdk-individuality';\n\nconst personSigner = withAsPerson(accounts.getProductAccountSigner(account), {\n  tag: 'AliasWithAccount',\n});\n\nconst result = await submitAndWatch(someGatedCall, personSigner);\n```\n\nThe `AsPersonInfo` variants are `AliasWithAccount` (the signing account is already bound to the alias, no proof needed), `AliasWithProof` (authorized by a ring-VRF proof alone), and `AliasWithAccountRevised` (signs and moves the stored alias to the current ring revision, which is the fix when the chain answers `BadSigner`).\n\n!!! warning \"AsPerson errors are thrown, not returned\"\n    Unlike the rest of the package, `withAsPerson` raises `AsPersonError` rather than returning a `Result`. It has to: the failure happens inside `PolkadotSigner.signTx`, where there is no error channel to return on. Wrap the submission in `try`/`catch` as well as checking the `Result`."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#the-game-and-prize-draws", "page_title": "Individuality", "index": 6, "depth": 2, "title": "The Game and Prize Draws", "anchor": "the-game-and-prize-draws", "start_char": 6616, "end_char": 7760, "estimated_token_count": 243, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Game and Prize Draws\n\nThe Individuality chain runs a periodic game, and the package covers it end to end: `readCurrentGame` for the current game and its phase, `readGameAirdropEventIds` and `readAirdropDraw` for its prize draws, `readPrizeStatus` for one identity's outcome across every draw at a single pinned block, `signUpWithAccountTx` to enter, and `readClaimEligibility` plus `claimPrizeTx` and `confirmClaim` to collect a prize.\n\nTwo details shape how you use it: `claim_airdrop` has six gates and only two concern personhood, so eligibility is exported as a predicate (`deriveClaimEligibility`) separately from the read that feeds it; and `confirmClaim` re-reads whether a claim landed, which is how a claim flow survives a page reload, since a successful claim removes the `Winners` row.\n\n!!! note \"Only the account sign-up path is buildable today\"\n    Of the two sign-up variants, only `Account` can be constructed. The `Alias` variant needs a ring-VRF proof at a context the chain chooses, and every context a Host will sign under is derived from the product id. The package's `signup-types.ts` records the current blockers."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#limitations", "page_title": "Individuality", "index": 7, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 7760, "end_char": 8487, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Limitations\n\n- Client-side only, and not a source of authorization. Verify on chain for anything that gates value.\n- Reads return a `Result` carrying `ProductIndividualityError`; `withAsPerson` throws `AsPersonError` instead.\n- `readPersonhoodState` pins one finalized block. Treat the state as a snapshot with an `at`, not a live value, and re-read rather than caching across sessions.\n- The `AliasWithProof` variant is rejected on the Individuality runtime Paseo runs today, however correct the bytes are. It becomes reachable after the network upgrades, with no change needed here.\n- A personhood tier is obtained in the [Polkadot App](/reference/apps/hosts/polkadot-app/); nothing in this package grants or raises one."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-individuality", "url": "https://developer.polkadot.com/apps/product-sdk/individuality/#where-to-go-next", "page_title": "Individuality", "index": 8, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 8487, "end_char": 9331, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d06ccd702f26da054b346643a47f7d70f255be565795d1a2863c228c049d39f3", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Identity**\n\n    ---\n\n    How a user's per-app account and Proof of Personhood stay separate, and why.\n\n    [:octicons-arrow-right-24: Identity](/apps/concepts/identity/)\n\n-   <span class=\"badge learn\">Learn</span> **Proof of Personhood**\n\n    ---\n\n    The Ring-VRF mechanism, the tiers this package reads, and per-app aliases in depth.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/)\n\n-   <span class=\"badge external\">External</span> **Package Source**\n\n    ---\n\n    The complete `individuality` surface: the state machine, the game and airdrop reads, and `withAsPerson`.\n\n    [:octicons-arrow-right-24: Visit Repo](https://github.com/paritytech/product-sdk/tree/main/product-sdk/packages/individuality)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-keys", "url": "https://developer.polkadot.com/apps/product-sdk/keys/#introduction", "page_title": "Keys", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 9, "end_char": 642, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d4e809cc76cb547d028721f2bc0c320236ea319fb29a31bf317f42b22c10fce6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-keys`](https://paritytech.github.io/product-sdk/api/keys/) derives application-scoped keys and accounts without ever touching the user's seed phrase. From a one-time user signature it can derive symmetric keys and keypairs your Product owns; it can generate and persist a session signer; and it can compute the address of a Host-derived product account from a public key alone.\n\nReach for it when your Product needs its own keys — for encrypting local data, deriving an app-scoped account, or maintaining a burner signer that survives reloads — rather than the user's primary wallet accounts."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-keys", "url": "https://developer.polkadot.com/apps/product-sdk/keys/#when-to-use-it", "page_title": "Keys", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 642, "end_char": 1308, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d4e809cc76cb547d028721f2bc0c320236ea319fb29a31bf317f42b22c10fce6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use It\n\n- To derive app-private encryption or signing keys deterministically from a one-time user signature (`KeyManager.fromSignature`), so the app scopes its own keys without asking for a mnemonic.\n- To keep a persistent session or burner signer that survives reloads by storing its mnemonic in a local store (`SessionKeyManager`).\n- To compute the public address of a Host-derived product account off-device, from a parent public key (`deriveProductAccountPublicKey`).\n- Not for signing real transactions with the user's wallet accounts; use the [Signer](/apps/product-sdk/signer/) package for that. This package manages app-derived and session keys."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-keys", "url": "https://developer.polkadot.com/apps/product-sdk/keys/#core-concepts", "page_title": "Keys", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1308, "end_char": 2419, "estimated_token_count": 252, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d4e809cc76cb547d028721f2bc0c320236ea319fb29a31bf317f42b22c10fce6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Concepts\n\n- **`KeyManager`**: Holds a master key in memory and derives child keys with HKDF. Create it with `KeyManager.fromSignature(signature, signerAddress)` or `KeyManager.fromRawKey(masterKey)`. It persists nothing; persistence is the consumer's responsibility.\n- **Derivation methods**: `deriveSymmetricKey(context)` returns a 32-byte key; `deriveAccount(context)` returns an sr25519 account; `deriveKeypairs()` returns encryption and signing keypairs. The same context always yields the same key, and different contexts are uncorrelated.\n- **`SessionKeyManager`**: Storage-backed. It generates a mnemonic, persists it in a `LocalKvStore`, and derives an account. `create`, `get`, `getOrCreate`, and `clear` manage its lifecycle.\n- **`DerivedAccount`**: The account shape returned throughout: `publicKey`, `ss58Address`, `h160Address`, and a ready-to-use `signer`.\n- **`deriveProductAccountPublicKey`**: Computes a product account's public key from a parent public key and a Product identifier, matching the derivation the Host performs privately, so an external client derives the same address."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-keys", "url": "https://developer.polkadot.com/apps/product-sdk/keys/#keep-a-persistent-session-key", "page_title": "Keys", "index": 3, "depth": 2, "title": "Keep a Persistent Session Key", "anchor": "keep-a-persistent-session-key", "start_char": 2419, "end_char": 2863, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d4e809cc76cb547d028721f2bc0c320236ea319fb29a31bf317f42b22c10fce6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Keep a Persistent Session Key\n\nBack a session signer with the local store so it survives reloads:\n\n```typescript\nimport { SessionKeyManager } from '@parity/product-sdk-keys';\nimport { createLocalKvStore } from '@parity/product-sdk-local-storage';\n\nconst store = await createLocalKvStore();\nconst sessionKeys = new SessionKeyManager({ store });\n\nconst session = await sessionKeys.getOrCreate();\nconsole.log(session.account.ss58Address);\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-keys", "url": "https://developer.polkadot.com/apps/product-sdk/keys/#derive-app-scoped-keys-from-a-signature", "page_title": "Keys", "index": 4, "depth": 2, "title": "Derive App-Scoped Keys From a Signature", "anchor": "derive-app-scoped-keys-from-a-signature", "start_char": 2863, "end_char": 3336, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d4e809cc76cb547d028721f2bc0c320236ea319fb29a31bf317f42b22c10fce6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Derive App-Scoped Keys From a Signature\n\nTurn a one-time user signature into keys the app owns, scoped by context:\n\n```typescript\nimport { KeyManager } from '@parity/product-sdk-keys';\n\nconst keys = KeyManager.fromSignature(signatureBytes, signerAddress);\n\nconst docKey = keys.deriveSymmetricKey('doc:123'); // 32-byte symmetric key\nconst docAccount = keys.deriveAccount('doc-account:123'); // sr25519 account\nconst { encryption, signing } = keys.deriveKeypairs();\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-keys", "url": "https://developer.polkadot.com/apps/product-sdk/keys/#limitations", "page_title": "Keys", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 3336, "end_char": 3785, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d4e809cc76cb547d028721f2bc0c320236ea319fb29a31bf317f42b22c10fce6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- `KeyManager` holds the master key in memory and persists nothing; use `exportKey` and `fromRawKey` to manage persistence yourself.\n- `fromSignature` requires at least 32 bytes of signature material, and `fromRawKey` requires exactly 32 bytes; both throw otherwise.\n- A session key's mnemonic is stored in plaintext in the key-value store; it is the only thing persisted.\n- Invalid mnemonics throw; validate input before deriving."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-keys", "url": "https://developer.polkadot.com/apps/product-sdk/keys/#where-to-go-next", "page_title": "Keys", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3785, "end_char": 4546, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d4e809cc76cb547d028721f2bc0c320236ea319fb29a31bf317f42b22c10fce6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Signer**\n\n    ---\n\n    For signing with the user's wallet accounts and deriving Host product accounts.\n\n    [:octicons-arrow-right-24: Signer](/apps/product-sdk/signer/)\n\n-   <span class=\"badge learn\">Learn</span> **Local Storage**\n\n    ---\n\n    The store the session-key manager persists its mnemonic to.\n\n    [:octicons-arrow-right-24: Local Storage](/apps/product-sdk/local-storage/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `keys` surface: `KeyManager`, `SessionKeyManager`, and derivation helpers.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/keys/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-local-storage", "url": "https://developer.polkadot.com/apps/product-sdk/local-storage/#introduction", "page_title": "Local Storage", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 578, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8861003ebf5f331d5302d3676d415be5fbcb31978bd0e275a2e738c7051ace77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-local-storage`](https://paritytech.github.io/product-sdk/api/local-storage/) is an async key-value store backed by the Host container's storage. It gives your Product a small, per-device place to keep state — settings, drafts, cached identifiers — with optional key namespacing and typed JSON helpers, without touching raw browser `localStorage`.\n\nThe store is scoped per Product, so keys never collide with other Products, and reads are error-tolerant: a missing or failed read resolves to `null` rather than throwing."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-local-storage", "url": "https://developer.polkadot.com/apps/product-sdk/local-storage/#when-to-use-it", "page_title": "Local Storage", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 578, "end_char": 1191, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8861003ebf5f331d5302d3676d415be5fbcb31978bd0e275a2e738c7051ace77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use It\n\n- To persist small app state inside a Host: preferences, drafts, cached values, or a session identifier.\n- To namespace keys per Product with a `prefix`, so `theme` becomes `my-product:theme` and stays isolated.\n- To hand a store to higher-level SDK pieces; for example, the session-key manager in [Keys](/apps/product-sdk/keys/) takes a store to persist its mnemonic.\n- Not a general-purpose browser shim: the store requires a Host and has no standalone browser fallback. For raw Host storage without the key-value convenience layer, use the [Host](/apps/product-sdk/host/) package directly."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-local-storage", "url": "https://developer.polkadot.com/apps/product-sdk/local-storage/#core-concepts", "page_title": "Local Storage", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1191, "end_char": 1814, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8861003ebf5f331d5302d3676d415be5fbcb31978bd0e275a2e738c7051ace77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Concepts\n\n- **`createLocalKvStore(options)`**: The single factory. It is async because it detects the Host storage backend, and it returns a `LocalKvStore`.\n- **`LocalKvStore`**: The returned store. It exposes `get`, `set`, and `remove` for strings, plus `getJSON` and `setJSON` for typed JSON values.\n- **Namespacing**: Pass a `prefix` to isolate this Product's keys from everything else in the Host's storage.\n- **Error-tolerant reads**: `get` and `getJSON` return `null` for a missing key or a failed read; writes and removes log failures rather than throwing. Only the factory throws, when no Host is present."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-local-storage", "url": "https://developer.polkadot.com/apps/product-sdk/local-storage/#persist-and-read-app-state", "page_title": "Local Storage", "index": 3, "depth": 2, "title": "Persist and Read App State", "anchor": "persist-and-read-app-state", "start_char": 1814, "end_char": 2337, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8861003ebf5f331d5302d3676d415be5fbcb31978bd0e275a2e738c7051ace77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Persist and Read App State\n\nCreate a namespaced store, then read and write both strings and JSON:\n\n```typescript\nimport { createLocalKvStore } from '@parity/product-sdk-local-storage';\n\nconst store = await createLocalKvStore({ prefix: 'my-product' });\n\nawait store.set('theme', 'dark');\nconst theme = await store.get('theme'); // string | null\n\nawait store.setJSON('draft', { title: 'Untitled', body: '' });\nconst draft = await store.getJSON<{ title: string; body: string }>('draft');\n\nawait store.remove('draft');\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-local-storage", "url": "https://developer.polkadot.com/apps/product-sdk/local-storage/#limitations", "page_title": "Local Storage", "index": 4, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 2337, "end_char": 2613, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8861003ebf5f331d5302d3676d415be5fbcb31978bd0e275a2e738c7051ace77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- `createLocalKvStore` throws if no Host storage is detected; the store is Host-only.\n- Write and remove failures are logged, not thrown, so a failed `set` looks like success to the caller.\n- Reads never throw: both errors and missing keys surface as `null`."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-local-storage", "url": "https://developer.polkadot.com/apps/product-sdk/local-storage/#where-to-go-next", "page_title": "Local Storage", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2613, "end_char": 3408, "estimated_token_count": 230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8861003ebf5f331d5302d3676d415be5fbcb31978bd0e275a2e738c7051ace77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Persist Data Locally**\n\n    ---\n\n    The task-focused recipe: JSON helpers, prefixes, and React usage, step by step.\n\n    [:octicons-arrow-right-24: Persist Data Locally](/apps/build/persist-data-locally/)\n\n-   <span class=\"badge learn\">Learn</span> **Keys**\n\n    ---\n\n    A common consumer of this store: the session-key manager persists its mnemonic here.\n\n    [:octicons-arrow-right-24: Keys](/apps/product-sdk/keys/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `local-storage` surface: `createLocalKvStore` and `LocalKvStore`.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/local-storage/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-signer", "url": "https://developer.polkadot.com/apps/product-sdk/signer/#introduction", "page_title": "Signer", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 11, "end_char": 731, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:62edb0cee82f87b963658a2f8ba686a5410d01a6ca1bf0e5c5f9b09b8c6a7396", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-signer`](https://paritytech.github.io/product-sdk/api/signer/) handles account discovery, selection, and signing, decoupled from where the keys actually live. Your Product talks to one class, `SignerManager`, and the same call sites work whether signing routes to the user's [Polkadot App](/reference/apps/hosts/polkadot-app/) in production or to local dev accounts in a test.\n\nEvery fallible method returns a typed `Result`, so you check `.ok` before reading `.value` rather than wrapping calls in `try`/`catch`.\n\n!!! note \"Products Devnet\"\n    Building on the PCF Products Devnet (`devnet` preset)? See [Sign transactions](/apps/build/platform-services-sdk/#sign-transactions)."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-signer", "url": "https://developer.polkadot.com/apps/product-sdk/signer/#when-to-use-it", "page_title": "Signer", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 731, "end_char": 1388, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:62edb0cee82f87b963658a2f8ba686a5410d01a6ca1bf0e5c5f9b09b8c6a7396", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## When to Use It\n\n- Whenever your Product needs to discover accounts, select one, and obtain a `PolkadotSigner` to sign transactions or raw bytes.\n- To manage the connection lifecycle: connect, disconnect, subscribe to state changes, and run once-per-session setup through the `onConnect` hook (for example, requesting permissions).\n- Use the host provider for real signing on [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) and the Polkadot App; use the dev provider for tests with well-known accounts such as Alice and Bob.\n- The product-account and Ring-VRF methods are Host-only; they return `HostUnavailableError` under the dev provider."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-signer", "url": "https://developer.polkadot.com/apps/product-sdk/signer/#core-concepts", "page_title": "Signer", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1388, "end_char": 2518, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:62edb0cee82f87b963658a2f8ba686a5410d01a6ca1bf0e5c5f9b09b8c6a7396", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Core Concepts\n\n- **`SignerManager`**: The central class. It wraps one or more providers behind a `Result`-typed API and holds a `SignerState` that it pushes to subscribers.\n- **`Result`, `ok`, `err`**: The return idiom across the package. Branch on `res.ok`, then read `res.value` or `res.error`; only unexpected internal failures throw.\n- **`SignerAccount`**: A signing-capable account. It exposes the SS58 `address`, the EVM-derived `h160Address` (for `pallet-revive`), the `publicKey`, an optional `name`, and `getSigner()`.\n- **Host vs dev providers**: `connect()` defaults to the Host; `connect('dev')` loads well-known dev accounts locally, so no Host is needed for tests.\n- **`onConnect` and `subscribe`**: `subscribe` fires on every state change; `onConnect` fires exactly once per transition into the connected state (and again after an auto-reconnect), which is where you request resources up front.\n- **Product accounts**: `getProductAccount(dotNsIdentifier, derivationIndex)` returns a per-Product account the Host derives, so different Products get different addresses for the same user. This is a Host-only API."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-signer", "url": "https://developer.polkadot.com/apps/product-sdk/signer/#connect-and-sign-raw-bytes", "page_title": "Signer", "index": 3, "depth": 2, "title": "Connect and Sign Raw Bytes", "anchor": "connect-and-sign-raw-bytes", "start_char": 2518, "end_char": 3734, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:62edb0cee82f87b963658a2f8ba686a5410d01a6ca1bf0e5c5f9b09b8c6a7396", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Connect and Sign Raw Bytes\n\nConstruct the manager once, connect, select an account, and sign. Each step returns a `Result`:\n\n```typescript\nimport { SignerManager } from '@parity/product-sdk-signer';\n\nasync function signHello() {\n  const manager = new SignerManager({ ss58Prefix: 0, dappName: 'my-product' });\n\n  const connectResult = await manager.connect();\n  if (!connectResult.ok) return; // HostUnavailableError outside a Host\n\n  const [account] = connectResult.value;\n  if (!account) return; // connected, but the Host returned no accounts\n\n  manager.selectAccount(account.address);\n\n  const signature = await manager.signRaw(new TextEncoder().encode('hello'));\n  if (signature.ok) {\n    console.log(signature.value); // Uint8Array\n  }\n}\n```\n\n!!! warning \"A successful connect can still yield zero accounts\"\n    `connect()` resolves with `ok([])` — not an error — when `dappName` is unset or the Host rejects the derivation, typically because the `.dot` identifier is not registered for that user. Destructure and check before indexing, or `value[0].address` throws on a path the SDK documents as normal. A Product in that state can still drive the explicit signing paths, such as `getLegacyAccountSigner`."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-signer", "url": "https://developer.polkadot.com/apps/product-sdk/signer/#request-permissions-once-per-session", "page_title": "Signer", "index": 4, "depth": 2, "title": "Request Permissions Once Per Session", "anchor": "request-permissions-once-per-session", "start_char": 3734, "end_char": 5829, "estimated_token_count": 478, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:62edb0cee82f87b963658a2f8ba686a5410d01a6ca1bf0e5c5f9b09b8c6a7396", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Request Permissions Once Per Session\n\nUse the `onConnect` hook to request resource allocations as soon as the connection is established, before any signing call. Unlike the rest of the package, `requestResourceAllocation` throws rather than returning a `Result`, so guard it:\n\n```typescript\nimport { SignerManager } from '@parity/product-sdk-signer';\n\nconst manager = new SignerManager({\n  ss58Prefix: 0,\n  dappName: 'my-product',\n  onConnect: async (_account, { requestResourceAllocation, signal }) => {\n    try {\n      const outcomes = await requestResourceAllocation([\n        { tag: 'BulletinAllowance', value: undefined },\n      ]);\n      if (signal.aborted) return; // user disconnected mid-request\n      if (outcomes.some((outcome) => outcome !== 'Allocated')) {\n        // Degrade gracefully: treat the capability as unavailable, not fatal.\n      }\n    } catch (cause) {\n      // Typed host error — the connection itself is unaffected.\n    }\n  },\n});\n```\n\nThree things that example is doing deliberately:\n\n- **`try`/`catch`**: `requestResourceAllocation` adapts the Host's `Result`-returning call into a throwing one, so an unguarded `await` can throw inside `onConnect`. Errors thrown here are logged and do not break the connected state, but you lose the chance to react.\n- **`signal.aborted`**: The `AbortSignal` fires if the user disconnects or the manager is destroyed while the request is still in flight. Check it before acting on the outcomes.\n- **Checking the outcomes**: Each is `'Allocated'`, `'Rejected'`, or `'NotAvailable'` — bare strings here, unlike the tagged objects the [`auth`](/apps/product-sdk/auth/) package returns. See [Allowances and Permissions](/apps/concepts/allowances/) for what each resource authorizes.\n\n!!! note \"Why not `AutoSigning` in this example\"\n    `AutoSigning` is the most interesting resource to request and the one you cannot rely on: it returns `NotAvailable` on both the Android and iOS wallets today. Request it if you want, but treat per-transaction signing as the real path and do not build a flow that depends on the grant landing."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-signer", "url": "https://developer.polkadot.com/apps/product-sdk/signer/#limitations", "page_title": "Signer", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 5829, "end_char": 6334, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:62edb0cee82f87b963658a2f8ba686a5410d01a6ca1bf0e5c5f9b09b8c6a7396", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Limitations\n\n- Most methods return a `Result`; branch on `.ok`. Only terminal conditions such as calling a destroyed manager surface as thrown errors.\n- `destroy()` is terminal: later calls return `DestroyedError`. Use `disconnect()` for a reversible reset.\n- `subscribe` does not prime with the current state; call `getState()` for the initial read, and use `onConnect` for once-per-connect logic.\n- `getProductAccount`, `getProductAccountAlias`, `createRingVRFProof`, and `getUserId` are Host-only."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-signer", "url": "https://developer.polkadot.com/apps/product-sdk/signer/#where-to-go-next", "page_title": "Signer", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6334, "end_char": 7184, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:62edb0cee82f87b963658a2f8ba686a5410d01a6ca1bf0e5c5f9b09b8c6a7396", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Sign and Submit Transactions**\n\n    ---\n\n    The task-focused recipe: derive a product account, sign, and submit a transaction end to end.\n\n    [:octicons-arrow-right-24: Sign and Submit Transactions](/apps/build/sign-and-submit/)\n\n-   <span class=\"badge learn\">Learn</span> **Transactions**\n\n    ---\n\n    Take the signer this package produces and submit and track a transaction to finality.\n\n    [:octicons-arrow-right-24: Transactions](/apps/product-sdk/tx/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `signer` surface: `SignerManager`, `SignerAccount`, providers, and the error hierarchy.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/signer/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-statement-store", "url": "https://developer.polkadot.com/apps/product-sdk/statement-store/#introduction", "page_title": "Statement Store", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 648, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eae6a0a95fde9aed08d1ecd4204017351f685dc21215eb5d3532960e5bc1a79", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-statement-store`](https://paritytech.github.io/product-sdk/api/statement-store/) is a publish/subscribe client over the [Statement Store](/reference/apps/infrastructure/statement-store/): signed, short-lived messages gossiped between instances of your Product, off-chain and with no fee per message. On top of raw pub/sub it adds an optional last-write-wins channel abstraction for per-key shared state.\n\nReach for it when your Product needs real-time state between users: presence, typing indicators, multiplayer cursors, or announcing where the latest snapshot of shared content lives."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-statement-store", "url": "https://developer.polkadot.com/apps/product-sdk/statement-store/#when-to-use-it", "page_title": "Statement Store", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 648, "end_char": 1208, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eae6a0a95fde9aed08d1ecd4204017351f685dc21215eb5d3532960e5bc1a79", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use It\n\n- For ephemeral, signed, topic-routed messaging between app instances: presence, signaling, and transient state (`publish` / `subscribe`).\n- For last-write-wins per-key state where the newest value for a key wins (`ChannelStore`).\n- For tests without a Host or network, using the in-memory transport from the `/testing` subpath.\n- Not for durable storage or large payloads: statements expire (default 30 seconds) and are capped at 512 bytes. Pair it with [Cloud Storage](/apps/product-sdk/cloud-storage/) when you need to keep the content."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-statement-store", "url": "https://developer.polkadot.com/apps/product-sdk/statement-store/#core-concepts", "page_title": "Statement Store", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1208, "end_char": 2303, "estimated_token_count": 273, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eae6a0a95fde9aed08d1ecd4204017351f685dc21215eb5d3532960e5bc1a79", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Concepts\n\n- **`StatementStoreClient`**: The main class. Construct it with an `appName` (which becomes the primary topic), then `connect`, `publish`, and `subscribe`.\n- **`publish` returns a `Result`, `subscribe` returns a handle**: Check `.ok` on the `publish` result; `subscribe` returns an `Unsubscribable` you call to stop listening.\n- **Topics and channels**: A topic routes messages between instances of the same Product; a channel is a named key whose latest value wins. Both are hashed identifiers derived from the names you choose.\n- **`ChannelStore`**: A last-write-wins map over the client. `write(name, value)` publishes a value, `read` and `readAll` return the current values, and `onChange` notifies you of updates.\n- **Size and TTL limits**: Statements are capped at 512 bytes and carry a default 30-second TTL. `encodeData` throws if a payload exceeds the cap, so keep statements small and treat them as signaling, not storage.\n- **Connection modes**: `host` mode signs through the Host's sponsored path; `local` mode signs locally with a supplied key, mainly for tests."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-statement-store", "url": "https://developer.polkadot.com/apps/product-sdk/statement-store/#publish-and-subscribe", "page_title": "Statement Store", "index": 3, "depth": 2, "title": "Publish and Subscribe", "anchor": "publish-and-subscribe", "start_char": 2303, "end_char": 2890, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eae6a0a95fde9aed08d1ecd4204017351f685dc21215eb5d3532960e5bc1a79", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Publish and Subscribe\n\nConnect in host mode, subscribe to incoming statements, and publish one to a room topic:\n\n```typescript\nimport { StatementStoreClient } from '@parity/product-sdk-statement-store';\n\nconst client = new StatementStoreClient({ appName: 'my-product' });\nawait client.connect({ mode: 'host' });\n\nconst subscription = client.subscribe((statement) => {\n  console.log(statement.data);\n});\n\nconst result = await client.publish(\n  { type: 'presence', text: 'gm', timestamp: Date.now() },\n  { topic2: 'lobby' },\n);\nif (!result.ok) console.error(result.error.message);\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-statement-store", "url": "https://developer.polkadot.com/apps/product-sdk/statement-store/#share-last-write-wins-state", "page_title": "Statement Store", "index": 4, "depth": 2, "title": "Share Last-Write-Wins State", "anchor": "share-last-write-wins-state", "start_char": 2890, "end_char": 3476, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eae6a0a95fde9aed08d1ecd4204017351f685dc21215eb5d3532960e5bc1a79", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Share Last-Write-Wins State\n\n`ChannelStore` keeps one live value per channel and reconciles updates by timestamp, so every participant converges on the newest value:\n\n```typescript\nimport {\n  StatementStoreClient,\n  ChannelStore,\n} from '@parity/product-sdk-statement-store';\n\nconst client = new StatementStoreClient({ appName: 'my-product' });\nawait client.connect({ mode: 'host' });\n\nconst channels = new ChannelStore(client);\nchannels.onChange((name, value) => {\n  console.log(name, value);\n});\n\nawait channels.write('presence', { status: 'online', timestamp: Date.now() });\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-statement-store", "url": "https://developer.polkadot.com/apps/product-sdk/statement-store/#limitations", "page_title": "Statement Store", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 3476, "end_char": 3963, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eae6a0a95fde9aed08d1ecd4204017351f685dc21215eb5d3532960e5bc1a79", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- Statements are hard-capped at 512 bytes; `encodeData` throws before submitting if you exceed it.\n- The default TTL is 30 seconds. Data is ephemeral, so late joiners see nothing until the next message.\n- The client is Host-only by default; `local` mode needs a signing key, or inject a custom transport for tests.\n- `publish` and `ChannelStore.write` return a `Result`, but `subscribe` and `onChange` return handles; malformed received statements are dropped silently."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-statement-store", "url": "https://developer.polkadot.com/apps/product-sdk/statement-store/#where-to-go-next", "page_title": "Statement Store", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3963, "end_char": 4866, "estimated_token_count": 255, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eae6a0a95fde9aed08d1ecd4204017351f685dc21215eb5d3532960e5bc1a79", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Publish and Subscribe to Off-Chain Data**\n\n    ---\n\n    The task-focused recipe: topics, channels, TTLs, and allowances, step by step.\n\n    [:octicons-arrow-right-24: Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/)\n\n-   <span class=\"badge guide\">Guide</span> **Build a Shared Todo App**\n\n    ---\n\n    A full tutorial that composes the statement store with cloud storage and local persistence.\n\n    [:octicons-arrow-right-24: Build a Shared Todo App](/apps/tutorials/shared-todo-app/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `statement-store` surface: `StatementStoreClient`, `ChannelStore`, and topics.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/statement-store/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-terminal", "url": "https://developer.polkadot.com/apps/product-sdk/terminal/#introduction", "page_title": "Terminal", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 938, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3d39ed14e6bd6dcc7705388e9fbfcf11fa1acc886bc7c6a13416f0bfd74c79c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-terminal`](https://paritytech.github.io/product-sdk/api/terminal/) brings the Polkadot App pairing flow to command-line tools. It prints a QR code, waits for the user to scan it with their phone, and hands back a `PolkadotSigner` that routes every signature to that phone, exactly as a Host does for a Product in a browser.\n\nThis is the package the [`playground` CLI](/apps/quick-start/) is built on. `pg login` is `createTerminalAdapter` plus a QR render plus `authenticate()`; `pg deploy`'s Bulletin uploads are signed by `getBulletinSigner`.\n\n!!! note \"Not for Products\"\n    A Polkadot Product runs inside a Host, which already owns the pairing and the signing route, so a Product uses [Signer](/apps/product-sdk/signer/) instead. Reach for this package when you are writing a Node CLI _alongside_ your Product — a deploy script, a migration tool, a CI job that has to sign as you."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-terminal", "url": "https://developer.polkadot.com/apps/product-sdk/terminal/#when-to-use-it", "page_title": "Terminal", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 938, "end_char": 1601, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3d39ed14e6bd6dcc7705388e9fbfcf11fa1acc886bc7c6a13416f0bfd74c79c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use It\n\n- To pair a Node CLI with the Polkadot App over a QR code and sign transactions as the paired account (`createTerminalAdapter`, `createSessionSigner`).\n- To write to the Bulletin Chain or publish to the Statement Store from a CLI, through an allowance slot the phone grants once (`getBulletinSigner`, `getStatementStoreProver`).\n- To check whether an allowance is already cached, so a health check or readiness probe never makes the user's phone buzz (`hasBulletinAllowance`, `hasStatementStoreAllowance`).\n- Not inside a Product, and not in a browser: this package assumes Node, a filesystem for its session store, and a terminal to draw in."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-terminal", "url": "https://developer.polkadot.com/apps/product-sdk/terminal/#core-concepts", "page_title": "Terminal", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1601, "end_char": 3197, "estimated_token_count": 362, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3d39ed14e6bd6dcc7705388e9fbfcf11fa1acc886bc7c6a13416f0bfd74c79c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Concepts\n\n- **`createTerminalAdapter(options)`**: The entry point. `appId` is the storage namespace and the product identity; `endpoints` defaults to Paseo, and `storageDir` overrides the on-disk session directory (`~/.polkadot-apps/` by default). `await destroy()` when finished — it returns a promise, and the WebSocket keeps the Node event loop alive until it settles.\n- **Pairing is a subscription, not a return value**: Subscribe to `adapter.sso.pairingStatus` and render the QR when a `pairing` status arrives, _then_ await `adapter.sso.authenticate()`. Printing before any interface mounts is what keeps the code scannable.\n- **Sessions load asynchronously**: They are read from disk after the adapter starts, so `waitForSessions(adapter, timeoutMs)` bridges the gap rather than an immediate read that would see an empty list.\n- **Two signer entry points**: `createSessionSigner(session, adapter)` signs as the session's default account (`derivationIndex: 0`) under the adapter's `appId`, which is what nearly every CLI wants. `createSessionSignerForAccount(session, ref)` is the escape hatch for a non-default sub-account or a different `productId`.\n- **Allowance signers are the canonical write path**: For Bulletin and Statement Store writes, ask the wallet for an allowance slot once and sign locally afterward. The first call prompts the phone; later calls return the cached slot key with no round trip.\n- **Cache-only probes never prompt**: `hasBulletinAllowance` reads the on-disk allowance file directly. Use it to decide whether to warn the user that a prompt is coming."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-terminal", "url": "https://developer.polkadot.com/apps/product-sdk/terminal/#pair-a-cli-and-sign", "page_title": "Terminal", "index": 3, "depth": 2, "title": "Pair a CLI and Sign", "anchor": "pair-a-cli-and-sign", "start_char": 3197, "end_char": 4236, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3d39ed14e6bd6dcc7705388e9fbfcf11fa1acc886bc7c6a13416f0bfd74c79c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Pair a CLI and Sign\n\nCreate the adapter, render the QR as pairing starts, authenticate, then build a signer:\n\n```typescript\nimport {\n  createTerminalAdapter,\n  createSessionSigner,\n  renderQrCode,\n  waitForSessions,\n} from '@parity/product-sdk-terminal';\n\nconst adapter = createTerminalAdapter({ appId: 'my-cli' });\n\ntry {\n  adapter.sso.pairingStatus.subscribe(async (status) => {\n    if (status.step === 'pairing') {\n      console.log(await renderQrCode(status.payload));\n      console.log('Scan with the Polkadot App…');\n    }\n  });\n\n  const result = await adapter.sso.authenticate();\n  result.match(\n    (session) => console.log('Logged in:', session?.id),\n    (error) => console.error('Failed:', error.message),\n  );\n\n  const [session] = await waitForSessions(adapter, 2000);\n  if (session) {\n    const signer = createSessionSigner(session, adapter);\n    // Pass `signer` to submitAndWatch, a contract .tx(), or any PAPI call.\n  }\n} finally {\n  await adapter.destroy(); // async, and required — otherwise the CLI never exits\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-terminal", "url": "https://developer.polkadot.com/apps/product-sdk/terminal/#get-an-allowance-signer", "page_title": "Terminal", "index": 4, "depth": 2, "title": "Get an Allowance Signer", "anchor": "get-an-allowance-signer", "start_char": 4236, "end_char": 5180, "estimated_token_count": 222, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3d39ed14e6bd6dcc7705388e9fbfcf11fa1acc886bc7c6a13416f0bfd74c79c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get an Allowance Signer\n\nFor Bulletin or Statement Store writes, request a slot and sign with what comes back. Probe the cache first if you want to warn the user before their phone lights up:\n\n```typescript\nimport {\n  getBulletinSigner,\n  hasBulletinAllowance,\n  AllowanceError,\n} from '@parity/product-sdk-terminal';\n\nif (!(await hasBulletinAllowance(adapter, 'my-cli.dot'))) {\n  console.log('Approve the allowance request on your phone…');\n}\n\ntry {\n  const signer = await getBulletinSigner(adapter, 'my-cli.dot');\n  // Sign Bulletin extrinsics with `signer`.\n} catch (error) {\n  if (error instanceof AllowanceError && error.reason === 'Rejected') {\n    console.error('The allowance request was declined on the phone.');\n  } else {\n    throw error;\n  }\n}\n```\n\nBoth helpers default `sessionId` to the only paired session. With zero or more than one paired session and no explicit id, they throw `AllowanceError` with `reason: 'NoSession'`."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-terminal", "url": "https://developer.polkadot.com/apps/product-sdk/terminal/#limitations", "page_title": "Terminal", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 5180, "end_char": 6556, "estimated_token_count": 314, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3d39ed14e6bd6dcc7705388e9fbfcf11fa1acc886bc7c6a13416f0bfd74c79c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- **Requires Node 21 or later.** The package relies on the global `WebSocket` that Node 21 was the first to expose. On Node 18 or 20 it installs fine and then fails at connect time with `WebSocket is not defined`.\n- Node only. There is no browser build, and sessions are stored on disk.\n- Allowance helpers throw rather than returning a `Result`, because they unwrap the underlying library's own result type. Catch `AllowanceError` and branch on `reason`.\n- `adapter.destroy()` is not optional: without it the WebSocket keeps the process alive and your CLI never exits. It is async, so `await` it, and call it from a `finally` block so a failed pairing still tears down.\n- `destroy()` suppresses one benign teardown line (`Client destroyed`) that the upstream statement-store logs to `console.error`, and exports the predicate it uses, `isBenignTeardownError`, for consumers filtering their own output. It does not cover an auth subscription left open at teardown, which still raises `Error: Not connected`.\n- The cache-only probes mirror an upstream codec that has no public probe API yet. The public surface will not change when the upstream one ships.\n- If you are on a release before 0.3, drop any `--import @parity/product-sdk-terminal/register` flag from your `node` or `tsx` invocation — that WASM loader hook has been removed and is no longer needed."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-terminal", "url": "https://developer.polkadot.com/apps/product-sdk/terminal/#where-to-go-next", "page_title": "Terminal", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6556, "end_char": 7376, "estimated_token_count": 233, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3d39ed14e6bd6dcc7705388e9fbfcf11fa1acc886bc7c6a13416f0bfd74c79c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Auth**\n\n    ---\n\n    The runtime-agnostic core beneath this package, if you want the sign-in flow without the terminal rendering.\n\n    [:octicons-arrow-right-24: Auth](/apps/product-sdk/auth/)\n\n-   <span class=\"badge learn\">Learn</span> **Signer**\n\n    ---\n\n    The equivalent for a Product running inside a Host, where pairing is already handled for you.\n\n    [:octicons-arrow-right-24: Signer](/apps/product-sdk/signer/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `terminal` surface: the adapter, session signers, allowance helpers, and the `/host` subpath.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/terminal/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-tx", "url": "https://developer.polkadot.com/apps/product-sdk/tx/#introduction", "page_title": "Transactions", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 731, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f240938bab57a8a08c565b5ec0eb417be447aeb72578ee45920928e1e1f3f6b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/product-sdk-tx`](https://paritytech.github.io/product-sdk/api/tx/) is the submission layer. It signs and broadcasts an extrinsic, follows it through its lifecycle to block inclusion or finality, and reports every status transition. It also covers the machinery around a submission: atomic batching, dry-run extraction, weight buffering, Asset Hub account mapping, retries, and readable error formatting.\n\nIt closes the loop that [Signer](/apps/product-sdk/signer/) and [Chain Client](/apps/product-sdk/chain-client/) open: the signer gives you a `PolkadotSigner`, the chain client gives you the typed API to build a transaction, and this package submits it and tells you what happened."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-tx", "url": "https://developer.polkadot.com/apps/product-sdk/tx/#when-to-use-it", "page_title": "Transactions", "index": 1, "depth": 2, "title": "When to Use It", "anchor": "when-to-use-it", "start_char": 731, "end_char": 1350, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f240938bab57a8a08c565b5ec0eb417be447aeb72578ee45920928e1e1f3f6b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use It\n\n- To sign, broadcast, and track a single extrinsic with per-status callbacks (`submitAndWatch`).\n- To submit several calls as one atomic batch through the Utility pallet (`batchSubmitAndWatch`).\n- For the surrounding steps: dry-run extraction and weight buffering, Asset Hub account mapping for `pallet-revive`, retries with backoff, and dev signers for tests.\n- Do not use it to build the transaction object or open connections; that is the typed API from the chain client. To submit a contract call, prefer the higher-level [Contracts](/apps/product-sdk/contracts/) package, which wraps this one."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-tx", "url": "https://developer.polkadot.com/apps/product-sdk/tx/#core-concepts", "page_title": "Transactions", "index": 2, "depth": 2, "title": "Core Concepts", "anchor": "core-concepts", "start_char": 1350, "end_char": 2524, "estimated_token_count": 297, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f240938bab57a8a08c565b5ec0eb417be447aeb72578ee45920928e1e1f3f6b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Concepts\n\n- **`submitAndWatch(tx, signer, options)`**: Signs, broadcasts, and watches through `signing`, `broadcasting`, `in-block`, and `finalized`. It returns a `Result`, resolving expected failures on the error channel rather than throwing.\n- **`TxResult` and `TxStatus`**: `TxResult` carries the `txHash`, the `block`, and the emitted `events`. `TxStatus` drives the `onStatus` callback for progress UI.\n- **One `Result` to check**: `result.ok` means the transaction was included and its dispatch succeeded. A dispatch that fails on chain is reported on `result.error` as a `TxDispatchError`, not as a successful result — so you branch on `result.ok`, not on a flag inside the value.\n- **Typed error hierarchy**: `TxError` is the base, with `TxTimeoutError`, `TxDispatchError` (dispatch failed on chain), `TxValidityError` (rejected before inclusion), `TxSigningRejectedError` (the user declined), `TxBatchError`, and `TxDryRunError`.\n- **`batchSubmitAndWatch(calls, api, signer, options)`**: Wraps calls in `Utility.batch_all` by default (or `batch` / `force_batch`) and submits them as one transaction. All calls must target the same chain as the passed API."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-tx", "url": "https://developer.polkadot.com/apps/product-sdk/tx/#submit-and-track-a-transaction", "page_title": "Transactions", "index": 3, "depth": 2, "title": "Submit and Track a Transaction", "anchor": "submit-and-track-a-transaction", "start_char": 2524, "end_char": 3085, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f240938bab57a8a08c565b5ec0eb417be447aeb72578ee45920928e1e1f3f6b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Submit and Track a Transaction\n\nBuild a transaction from the typed API, then submit it with a status callback:\n\n```typescript\nimport { submitAndWatch } from '@parity/product-sdk-tx';\nimport { Binary } from 'polkadot-api';\n\nconst tx = chain.assetHub.tx.System.remark({ remark: Binary.fromText('hello') });\n\nconst result = await submitAndWatch(tx, signer, {\n  onStatus: (status) => console.log(status.type),\n});\n\nif (result.ok) {\n  console.log(`Landed in block #${result.value.block.number}`);\n} else {\n  console.error(result.error.message); // TxError\n}\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-tx", "url": "https://developer.polkadot.com/apps/product-sdk/tx/#batch-calls-atomically", "page_title": "Transactions", "index": 4, "depth": 2, "title": "Batch Calls Atomically", "anchor": "batch-calls-atomically", "start_char": 3085, "end_char": 3602, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f240938bab57a8a08c565b5ec0eb417be447aeb72578ee45920928e1e1f3f6b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Batch Calls Atomically\n\nGroup several calls into one atomic transaction with `batchSubmitAndWatch`. With `batch_all`, either every call succeeds or the whole batch rolls back:\n\n```typescript\nimport { batchSubmitAndWatch } from '@parity/product-sdk-tx';\nimport { Binary } from 'polkadot-api';\n\nconst calls = [1, 2, 3].map((i) =>\n  chain.assetHub.tx.System.remark({ remark: Binary.fromText(`batch-${i}`) }),\n);\n\nconst result = await batchSubmitAndWatch(calls, chain.assetHub, signer, {\n  mode: 'batch_all',\n});\n```"}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-tx", "url": "https://developer.polkadot.com/apps/product-sdk/tx/#limitations", "page_title": "Transactions", "index": 5, "depth": 2, "title": "Limitations", "anchor": "limitations", "start_char": 3602, "end_char": 4124, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f240938bab57a8a08c565b5ec0eb417be447aeb72578ee45920928e1e1f3f6b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Limitations\n\n- Expected failures (dispatch error, timeout, signing rejection, validity error) arrive on the `Result` error channel, not as thrown exceptions.\n- A dispatch that fails on chain comes back on `result.error` as `TxDispatchError`; a `result.ok` transaction has both landed in a block and dispatched successfully.\n- The default `waitFor` is `'best-block'`; the default timeout is 300 seconds.\n- Every call in a batch must target the same chain as the passed API; an empty call list returns a `TxBatchError`."}
{"source": "polkadot-docs", "page_id": "apps-product-sdk-tx", "url": "https://developer.polkadot.com/apps/product-sdk/tx/#where-to-go-next", "page_title": "Transactions", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4124, "end_char": 4908, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f240938bab57a8a08c565b5ec0eb417be447aeb72578ee45920928e1e1f3f6b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Sign and Submit Transactions**\n\n    ---\n\n    The task-focused recipe: derive an account, sign, and submit end to end.\n\n    [:octicons-arrow-right-24: Sign and Submit Transactions](/apps/build/sign-and-submit/)\n\n-   <span class=\"badge learn\">Learn</span> **Signer**\n\n    ---\n\n    Where the `PolkadotSigner` this package consumes comes from.\n\n    [:octicons-arrow-right-24: Signer](/apps/product-sdk/signer/)\n\n-   <span class=\"badge external\">External</span> **API Reference**\n\n    ---\n\n    The complete `tx` surface: `submitAndWatch`, `batchSubmitAndWatch`, and the error hierarchy.\n\n    [:octicons-arrow-right-24: Visit Site](https://paritytech.github.io/product-sdk/api/tx/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#before-you-start", "page_title": "Quick Start with the CLI", "index": 0, "depth": 2, "title": "Before You Start", "anchor": "before-you-start", "start_char": 1559, "end_char": 3672, "estimated_token_count": 515, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Before You Start\n\nGet these in order before your first deploy. The last two are easy to skip and fail silently later, so do not leave them out:\n\n1. **Install the [Polkadot App](/apps/)** on your phone and create an account. It pairs with `pg` and signs your deploy.\n2. **Have a terminal** with `curl` available and permission to install CLI tools in your user shell.\n3. **Have a Product project** on disk with a package-manager build command.\n4. **Fund your account with PAS** from the [faucet](/apps/get-started/get-testnet-tokens/). PAS pays transaction fees and the name deposit.\n5. **Get a Bulletin Chain storage authorization** for the account that will sign. Without it, uploads are rejected at deploy time even when your balance is fine — a prerequisite that surfaces only as a failed publish. See [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/).\n\n!!! warning \"Fund the account that actually signs\"\n    The PAS balance and the storage authorization are both per account, and the account that signs your deploy may not be the one you expect. If a deploy fails with `no allowance set for account`, see [Accounts and Signing](/apps/concepts/accounts/) and the [troubleshooting entry](/apps/troubleshooting/#no-allowance-set-for-account). Account mapping to an EVM address is handled for you for the product account you deploy with; a smart contract needs its signing account mapped explicitly, covered in [Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/).\n\n!!! note \"What a first deploy costs\"\n    In one test run, taking an app live cost about 10.4 PAS: roughly 10 PAS for the name and about 0.4 PAS for a 2.6 KB upload, with each on-chain step taking around a minute. Name cost depends on length and tier, so treat these as a ballpark. On TestNet, funding is rarely the constraint.\n\n!!! note \"CLI version\"\n    The CLI is in active development, and breaking changes between versions are expected. If a command below no longer matches, check this page's last update against the latest [playground-cli release](https://github.com/paritytech/playground-cli/releases)."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#install-the-cli", "page_title": "Quick Start with the CLI", "index": 1, "depth": 2, "title": "Install the CLI", "anchor": "install-the-cli", "start_char": 3672, "end_char": 4857, "estimated_token_count": 301, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install the CLI\n\nThe installer supports Linux and macOS. On Windows, work inside [WSL](https://learn.microsoft.com/windows/wsl/install) and follow the Debian/Ubuntu steps there.\n\n1. Install the base prerequisites. macOS needs no preparation: `curl` ships with the OS, and the Xcode Command Line Tools cover the rest. On a fresh Debian or Ubuntu system:\n\n    ```bash\n    sudo apt update && sudo apt install -y build-essential curl\n    ```\n\n2. Run the installer:\n\n    ```bash\n    curl -fsSL https://raw.githubusercontent.com/paritytech/playground-cli/main/install.sh | bash\n    ```\n\n    The binary lands in `~/.polkadot/bin/`, with both commands symlinked into `~/.local/bin/` and that path appended to your shell RC file.\n\n3. Open a new shell, or `source` your RC file, and verify the install:\n\n    ```bash\n    pg --version\n    ```\n\n!!! note \"Command aliases\"\n    The installer registers two interchangeable commands: `playground` (canonical) and `pg` (short alias). This guide uses `pg` throughout.\n\n!!! tip \"Pinning a version\"\n    Pass `VERSION` to install a specific release, for example `curl -fsSL … | VERSION=v0.47.0 bash`. Later, `pg update` moves you to the newest release."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#log-in", "page_title": "Quick Start with the CLI", "index": 2, "depth": 2, "title": "Log In", "anchor": "log-in", "start_char": 4857, "end_char": 7547, "estimated_token_count": 693, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Log In\n\n`pg login` is the first-run setup: it pairs the CLI with your signer, installs the toolchain, and requests your service allowances. It is safe to re-run; existing installs and sessions are detected and skipped. Do not reach for `pg init` here — that scaffolds a project from the starter template and pairs nothing.\n\n```bash\npg login\n```\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>pg login</span>\n    <span data-ty=\"progress\"></span>\n    <span data-ty>✔ logged in        5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY</span>\n    <span data-ty>✔ account in use   playground.dot/0 — 0x90b5ab205c6974c9ea841be688864633dc9ca8a3 · 5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty</span>\n</div>\n\n\nThree things happen, and the first two run concurrently:\n\n1. **Login**: A QR code is printed to the terminal. Scan it with the Polkadot App to pair. Skipped if you already have a session under `~/.polkadot-apps/`.\n2. **Toolchain install**: `git`, `curl`, a C linker, `rustup` with nightly and `rust-src`, `cargo-pvm-contract`, `wget`, and the `ipfs` CLI (Kubo). Existing installs are detected and skipped.\n3. **Account setup**: Once a session exists, your phone shows a single approval dialog requesting the `BulletInAllowance` (Bulletin uploads at deploy time) and `SmartContractAllowance` (which mints PGAS to your `playground.dot/0` product account and account-maps it on chain).\n\n!!! warning \"`pg deploy` needs the `ipfs` CLI, and `pg login` is what installs it\"\n    Do not skip this step. `pg deploy` requires the Kubo `ipfs` binary on your `PATH`; if you never log in, install it yourself with `brew install ipfs` or from [docs.ipfs.tech/install](https://docs.ipfs.tech/install/). This is a temporary requirement while the pure-JS merkleizer is being fixed.\n\n!!! note \"Signer modes\"\n    Signer choice is made at deploy time, not at login, through `pg deploy --signer`:\n\n    - **Mobile signer** (`--signer phone`): Signs with the account you paired here, approving each on-chain step on your phone. Recommended for any deploy you intend to keep.\n    - **Dev-only signer** (`--signer dev`): No phone needed; uses shared development keys (pair it with `--suri //Alice` to pin a known keypair). The deployed Product will be owned by the shared dev account, not by you.\n\n!!! note \"Funding is opt-in\"\n    `pg login` never sends tokens. If your product account needs a testnet balance, run `pg drip` to top it up (1 PAS per run, up to 10 PAS, from a shared dev funder), or use the [faucet](/apps/get-started/get-testnet-tokens/). Run `pg status` at any time to see your product account address, its balances, and your allowance state."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#build", "page_title": "Quick Start with the CLI", "index": 3, "depth": 2, "title": "Build", "anchor": "build", "start_char": 7547, "end_char": 7840, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Build\n\n`pg build` auto-detects and runs your project build.\n\n```bash\npg build\n```\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>pg build</span>\n    <span data-ty=\"progress\"></span>\n    <span data-ty>✔ Build succeeded → dist/</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#deploy", "page_title": "Quick Start with the CLI", "index": 4, "depth": 2, "title": "Deploy", "anchor": "deploy", "start_char": 7840, "end_char": 13922, "estimated_token_count": 1504, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Deploy\n\n`pg deploy` runs the full pipeline: build the frontend, upload artifacts to the Polkadot Bulletin Chain, and register a dotNS domain under the environment's TLD (`.paseo` on Paseo Next v2). Before building, it always runs your package manager's install step to keep dependencies in sync.\n\n```bash\n# Interactive - pg prompts for signer, domain, and build directory\npg deploy\n\n# Dev signer - no phone needed (the deployed Product is owned by the shared dev account)\npg deploy --signer dev --suri //Alice --domain my-product\n```\n\nPass the bare label to `--domain`. The CLI appends the environment's TLD, so `my-product` becomes `my-product.paseo` on Paseo Next v2. Name availability depends on the label's length, counted as written; see [Choose a Name](/apps/register-dot-domain/#choose-a-name) for the rules the prompt enforces.\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>pg deploy --signer dev --suri //Alice --domain my-product</span>\n    <span data-ty=\"progress\"></span>\n    <span data-ty>✔ my-product.paseo is available</span>\n    <span data-ty>✔ Deploy complete</span>\n    <span data-ty>  URL         https://my-product.paseo.li</span>\n    <span data-ty>  Domain      my-product.paseo</span>\n    <span data-ty>  App CID     bafybeihvru3e6ojhopxj7xxwtafrpyvsha6kylzklryon5k67u4clr26re</span>\n</div>\n\n\n!!! note \"Your phone will prompt — check it\"\n    With the phone signer, each on-chain step waits for you to approve it in the Polkadot App, and no push notification announces the prompt. If the deploy seems to pause (including a deliberate ~60-second wait while your name is registered), open the app and approve the pending request. See [Troubleshooting](/apps/troubleshooting/#the-app-seems-frozen-after-an-action).\n\n!!! note\n    `pg deploy` includes a memory watchdog that aborts the deploy if the process exceeds 4 GB RSS. If you hit this limit, set `DOT_MEMORY_TRACE=1` alongside `DOT_DEPLOY_VERBOSE=1` to capture per-second RSS and heap samples.\n\nFor the full interactive deploy walkthrough, including the domain-name rules, contract redeploys, and the confirmation summary, see [Deploy Your App](/apps/deploy-your-app/).\n\n??? note \"More CLI commands\"\n\n    **Account and session**\n\n    - **`pg status`**: Prints your signed-in product account in both encodings (SS58 and H160), its PAS and PGAS balances, and the state of your Bulletin and smart-contract allowances. Read-only: it signs nothing and submits nothing, so it is safe to run at any time. With no session paired it prints a \"log in first\" notice and exits cleanly.\n\n        ```bash\n        pg status\n        ```\n\n    - **`pg drip`**: Tops up your product account with a little TestNet PAS: 1 PAS per run, up to a 10 PAS cap, from a shared dev funder rather than the public faucet. It only ever funds the caller's own account, resolved from the active session, so there is no address flag. Login never calls it for you.\n\n        ```bash\n        pg drip\n        ```\n\n    - **`pg logout`**: Signs out of the paired account, tells the paired phone to drop its side of the connection, and clears session files under `~/.polkadot-apps/`. A no-op if you are not signed in.\n\n        ```bash\n        pg logout\n        ```\n\n    **Projects and deploys**\n\n    - **`pg init`**: Scaffolds a new project from the playground starter template. A shorthand for `pg mod playground-template`.\n\n        ```bash\n        pg init\n        ```\n\n    - **`pg mod`**: Clones a moddable app from the Playground registry so you can customize and redeploy it as your own Product. Only apps that opted into `--moddable` at deploy time are listed. Pass a domain label, such as `my-product` or `my-product.paseo`, to clone directly, or omit it to open an interactive picker showing every moddable app. Source is fetched as a tarball over HTTPS, so neither `git` nor `gh` is required.\n\n        ```bash\n        pg mod [domain]\n        ```\n\n    - **`pg decentralize`**: Takes a static site you already have — a live URL to mirror, or a local build directory — uploads it to the Bulletin Chain, and registers a dotNS name pointing at it. The counterpart to `pg deploy`, which builds your project first.\n\n        ```bash\n        pg decentralize --site https://example.com\n        pg decentralize --path ./dist\n        ```\n\n    - **`pg deploy-all`**: Deploys several apps listed in a JSON manifest in one invocation. Builds run in parallel, while all on-chain work is serialized per signing account so concurrent deploys never collide on a nonce. Non-interactive by design.\n\n        ```bash\n        pg deploy-all --manifest apps.json --signer dev --playground\n        ```\n\n    - **`pg contract`**: The playground-native path to contracts, backed by `cdm`. `pg contract deploy` builds, deploys, and registers your contracts signed by your logged-in account; `pg contract install` writes `cdm.json` and the generated type outputs. See [Add a Smart Contract to Your Product](/apps/build/deploy-a-smart-contract/) for the workflow, including when to call `cdm` directly instead.\n\n        ```bash\n        pg contract deploy\n        pg contract install [libraries...]\n        ```\n\n    - **`pg update`**: Updates `pg` to the latest version from the GitHub releases page.\n\n        ```bash\n        pg update\n        ```\n\n!!! tip \"Scripting a deploy, or handing one to an agent\"\n    `pg deploy -y` runs non-interactively using defaults, skipping every prompt. It requires `--domain`, and `--signer` defaults to `dev`. For full control in CI, pass `--signer`, `--domain`, `--buildDir`, and `--playground` explicitly; add `--suri //Alice` with `--signer dev` so the dev signer uses a known keypair. See [Set Up Your AI Agent](/apps/get-started/set-up-your-ai-agent/) for orienting a coding agent around this toolchain.\n\nYou have deployed a Polkadot Product. To keep building it with your own editor and toolchain, head to the Build guides; they open with [project setup](/apps/build/#set-up-your-project) so Polkadot Desktop can load your Product from `localhost` while you iterate with live reload."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#where-to-go-next", "page_title": "Quick Start with the CLI", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 13922, "end_char": 15961, "estimated_token_count": 524, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> **Product SDK**\n\n    ---\n\n    Understand the SDK that powers your Product: what each package does and how the pieces fit together.\n\n    [:octicons-arrow-right-24: Product SDK](/apps/product-sdk/)\n\n-   <span class=\"badge guide\">Guide</span> **Build Guides**\n\n    ---\n\n    Set up the local dev loop, then add capabilities to your Product: signing, on-chain reads, decentralized storage, off-chain pub/sub, local persistence, and smart contracts.\n\n    [:octicons-arrow-right-24: Open Build Guides](/apps/build/)\n\n-   <span class=\"badge guide\">Guide</span> **Deploy Your App**\n\n    ---\n\n    The full deploy flow in depth: build the bundle, register a dotNS name, publish to the playground, and go live on the Bulletin Chain.\n\n    [:octicons-arrow-right-24: Deploy Your App](/apps/deploy-your-app/)\n\n</div>\n\n# Quick Start with RevX\n\nGenerate and publish a Polkadot Product in the browser with RevX App Builder. RevX gives you a browser-based IDE, scaffolds a Product from a natural-language prompt, and publishes it to a `.dot` name after you sign the final step with the Polkadot App.\n\nThis route does not require a local development environment. By the end, you will have configured an AI provider in App Builder, generated a Polkadot Product from a prompt, inspected the generated code, and published it to `.dot`.\n\n!!! warning \"TestNet names end in `.paseo`, not `.dot`\"\n    dotNS top-level domains are per network. On Paseo Next v2, the TestNet the Apps tooling targets by default, names are minted under `.paseo`: publish `myproject57` and you get `myproject57.paseo`, served at `https://myproject57.paseo.li`. Whether you supply the bare label or the full name depends on the tool; see [Choose a Name](/apps/register-dot-domain/#choose-a-name).\n\n\n!!! note \"Products Devnet\"\n    This page uses Paseo Next v2 (`paseo` preset). For the PCF Products Devnet (`devnet` preset), see [Get started as a developer](/apps/get-started/developers/)."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#prerequisites", "page_title": "Quick Start with the CLI", "index": 6, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 15961, "end_char": 16216, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- The [Polkadot App](/apps/) installed on your phone with an account created; it signs the final publish step.\n- An API key for an AI provider supported by App Builder, such as OpenAI or Anthropic."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#open-revx", "page_title": "Quick Start with the CLI", "index": 7, "depth": 2, "title": "Open RevX", "anchor": "open-revx", "start_char": 16216, "end_char": 16483, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Open RevX\n\nOpen [RevX](https://revx.dev/) in your browser. RevX is a browser-based IDE; you will use the App Builder track to scaffold a Polkadot Product end to end.\n\n![RevX IDE landing view showing the main workspace](/images/apps/quick-start/revx/revx-01.webp)"}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#open-app-builder", "page_title": "Quick Start with the CLI", "index": 8, "depth": 2, "title": "Open App Builder", "anchor": "open-app-builder", "start_char": 16483, "end_char": 16738, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Open App Builder\n\nFrom the sidebar, select **App Builder**. App Builder is RevX's track for generating Polkadot Products using AI-assisted workflows.\n\n![RevX sidebar with the App Builder option highlighted](/images/apps/quick-start/revx/revx-02.webp)"}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#create-a-new-app", "page_title": "Quick Start with the CLI", "index": 9, "depth": 2, "title": "Create a New App", "anchor": "create-a-new-app", "start_char": 16738, "end_char": 17763, "estimated_token_count": 217, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Create a New App\n\nClick **Create App** to start a new project. RevX automatically installs the required dependencies and initializes the project environment so you can move straight into configuration and prompting.\n\n![RevX App Builder showing the Create App action and the initialized project environment](/images/apps/quick-start/revx/revx-03.webp)\n\nAfter clicking **Create App**, you will see a loading screen while the IDE initializes the project environment.\n\n![RevX App Builder showing the loading screen while the IDE initializes the project environment](/images/apps/quick-start/revx/revx-04.webp)\n\n!!! note\n    Initial setup may take a moment while dependencies install. Wait for the environment to finish initializing before configuring the builder.\n\nOnce the environment is initialized, you will see a minimal app scaffolded in the editor and running in the terminal.\n\n![RevX App Builder showing the minimal app scaffolded in the editor and running in the terminal](/images/apps/quick-start/revx/revx-05.webp)"}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#configure-the-builder", "page_title": "Quick Start with the CLI", "index": 10, "depth": 2, "title": "Configure the Builder", "anchor": "configure-the-builder", "start_char": 17763, "end_char": 18462, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Configure the Builder\n\nFrom the App Builder view, click the **Settings** icon to open the AI configuration panel.\n\n![RevX App Builder settings icon](/images/apps/quick-start/revx/revx-06.webp)\n\nConfigure the following:\n\n- **AI provider**: The backend service that powers code generation.\n- **API key**: The credential for your AI provider.\n- **Model**: The specific model to use from the selected provider.\n\n![RevX App Builder configuration panel showing API key, AI provider, and model fields](/images/apps/quick-start/revx/revx-07.webp)\n\nThese settings let the IDE generate applications using the selected AI backend. You can change them at any time if you want to switch providers or models."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#generate-an-app", "page_title": "Quick Start with the CLI", "index": 11, "depth": 2, "title": "Generate an App", "anchor": "generate-an-app", "start_char": 18462, "end_char": 19133, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Generate an App\n\nUse the chat interface to describe the app you want to build. RevX generates the application structure and code automatically based on your prompt.\n\n!!! example \"Example prompt\"\n    Build a Product that shows the balance of Alice (a standard Substrate dev account)\n\nAfter you submit the prompt, the IDE produces the project files and scaffolds the app for you to review.\n\n![RevX chat interface with a prompt entered and the generated app structure on the right](/images/apps/quick-start/revx/revx-08.webp)\n\n!!! tip\n    Keep prompts concrete and scoped. Short, specific prompts tend to produce app structures that are easier to review and iterate on."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#inspect-the-generated-code", "page_title": "Quick Start with the CLI", "index": 12, "depth": 2, "title": "Inspect the Generated Code", "anchor": "inspect-the-generated-code", "start_char": 19133, "end_char": 19538, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Inspect the Generated Code\n\nOnce generation completes, open the generated files in the editor to review what was produced. You can continue iterating on the application from within RevX: refine the prompt, edit code directly, or layer additional changes through the chat interface.\n\n![RevX editor showing the generated app source files open for inspection](/images/apps/quick-start/revx/revx-09.webp)"}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#publish-to-dot", "page_title": "Quick Start with the CLI", "index": 13, "depth": 2, "title": "Publish to `.dot`", "anchor": "publish-to-dot", "start_char": 19538, "end_char": 20407, "estimated_token_count": 221, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Publish to `.dot`\n\nWhen your app is ready, click **Publish to .dot** to deploy the application to the Polkadot ecosystem. The publish action takes the app you generated in RevX and makes it available under a `.dot` name.\n\n![RevX App Builder showing the Publish to .dot action](/images/apps/quick-start/revx/revx-10.webp)\n\nAfter clicking **Start Deploy**, you will be asked to sign the transaction with your Polkadot App.\n\n![RevX App Builder showing the transaction signing prompt](/images/apps/quick-start/revx/revx-11.webp)\n\nAfter signing the transaction, you will see the deployment progress in the terminal. The action is labeled **Publish to .dot**, but the name you receive carries the network's TLD, so on Paseo Next v2 your Product is live under its `.paseo` name. Open it in Polkadot Desktop, or on Polkadot Web at `https://<name>.paseo.li` in any browser."}
{"source": "polkadot-docs", "page_id": "apps-quick-start", "url": "https://developer.polkadot.com/apps/quick-start/#where-to-go-next", "page_title": "Quick Start with the CLI", "index": 14, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 20407, "end_char": 20765, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74adb1c5271efec99696ba5d8aa786a6215a29fdd1bcb9154b538f4aca3a1c65", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Build Guides**\n\n    ---\n\n    Set up the local dev loop, then add capabilities to your Product: signing, on-chain reads, decentralized storage, off-chain pub/sub, and local persistence.\n\n    [:octicons-arrow-right-24: Open Build Guides](/apps/build/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#key-chains-and-identifiers", "page_title": "apps-reference-addresses", "index": 0, "depth": 2, "title": "Key chains and identifiers", "anchor": "key-chains-and-identifiers", "start_char": 864, "end_char": 1605, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Key chains and identifiers\n\nThe Devnet runs on the community-operated Paseo network: a relay chain plus a\nset of system parachains. Product developers usually start with Asset Hub (para\n1000) for contracts and assets, People (para 1004) for identity, and Bulletin\n(para 1010) for app bundle storage.\n\n| Chain | Para ID | Role |\n| --- | --- | --- |\n| Asset Hub | `1000` | Contracts (`pallet-revive`), assets, DotNS gateway |\n| People | `1004` | Identity and proof-of-personhood |\n| Bulletin | `1010` | Web-app bundle storage |\n\n| Field | Value |\n| --- | --- |\n| EVM chain id (Asset Hub `pallet-revive`) | `420420417` |\n| Native token | PAS, 10 decimals |\n| SS58 prefix (Devnet) | `42` |\n| Web gateway | [dev-dot.li](https://dev-dot.li) |"}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#native-token-and-stablecoins", "page_title": "apps-reference-addresses", "index": 1, "depth": 2, "title": "Native token and stablecoins", "anchor": "native-token-and-stablecoins", "start_char": 1605, "end_char": 2203, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Native token and stablecoins\n\nCASH, the balance users see in the app, is a Devnet digital-dollar asset. On\nAsset Hub its asset ID is `50000413`. The same logical asset can be represented\non the People chain for app-facing CASH flows.\n\n| Asset | Asset Hub u32 id | Decimals | Notes |\n| --- | --- | --- | --- |\n| pUSD (Digital Dollar / \"CASH\") | `50000413` | 6 | The main CASH asset used by the Devnet |\n| USDt (Tether USD) | `1984` | 6 | |\n\nThe native token is PAS, with 10 decimals. Devnet tokens carry no value. You\ncan get Devnet funds from the [Polkadot faucet](https://faucet.polkadot.io)."}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#on-chain-registries", "page_title": "apps-reference-addresses", "index": 2, "depth": 2, "title": "On-chain registries", "anchor": "on-chain-registries", "start_char": 2203, "end_char": 2394, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## On-chain registries\n\nTwo registries make the platform's names and apps discoverable. Each network\nhas its own deployment, so always resolve the address for the network you are\ntargeting."}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#dotns-the-dot-naming-system", "page_title": "apps-reference-addresses", "index": 3, "depth": 3, "title": "DotNS (the `.dot` naming system)", "anchor": "dotns-the-dot-naming-system", "start_char": 2394, "end_char": 3859, "estimated_token_count": 244, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### DotNS (the `.dot` naming system)\n\nDotNS records who owns a `.dot` domain and which app bundle it points to. The\ngateway reads that record to load the app.\n\nDevnet runs DotNS v1.0.0 (`protocolVersion()` on `DotnsProtocolRegistry`).\n\n| Contract | Devnet address |\n| --- | --- |\n| DotnsProtocolRegistry | `0xdDF3D3838Ff056F15602fC5a65927f185679C36F` |\n| DotnsRegistrar (ERC-721) | `0xc609e0c2DAB4433d55a32FB098Db8788C1956302` |\n| DotnsRegistrarController | `0x59dcF8BfFFa7239243785C3fC336D8Bb22312e8c` |\n| DotnsRegistry | `0xb052E5EfC5ADEff1f21d48DEfb5169Cb394A1a73` |\n| DotnsResolver | `0xFcB74C073a2d14dc65B178Bb873f4dE51318DDC2` |\n| DotnsReverseResolver | `0x736e067290AE71f841399575ABfc8b2BAA5Eed7E` |\n| DotnsContentResolver | `0x7e75491ecfb04900EB05ee63CABA2B33900aABB5` |\n| DotnsPopController | `0xC3a3EdAb753F91488fD84E6134b5b0325dc22452` |\n| DotnsPopResolver | `0x398912c9bb03180Ff049f0E034FE2E0024fb8406` |\n| PopRules | `0xD5Ee34610F06f7FF4668aB4fabE2393B65a43AE7` |\n| DotnsNameEscrow | `0xb50269322010DeeF2afb162c009Caf897971952C` |\n| StoreFactory | `0x5Df012daA06cA2602DA153309C2E3A83284Cb879` |\n| Multicall3 | `0x92640655c5c7ee7E42F0B5aD68D205a8A767b81C` |\n\nSome supporting DotNS contracts vary by network and are not listed here. Read\nthem from `DotnsProtocolRegistry` (`get(key)`) or from the `dotns-sdk` address\nbook for the `devnet` preset when you need them.\n\nSee [Naming (DotNS)](../architecture/naming.md) for how these contracts fit\ntogether."}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#browse-publisher", "page_title": "apps-reference-addresses", "index": 4, "depth": 3, "title": "Browse `Publisher`", "anchor": "browse-publisher", "start_char": 3859, "end_char": 4367, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Browse `Publisher`\n\nBrowse is the app-discovery directory. `Publisher` records which `.dot` apps are\ndiscoverable; display metadata lives in DotNS records.\n\n| Contract | Devnet address |\n| --- | --- |\n| Publisher | `0x8d3CE7Bb2ED68C06306b4C1d5EEe79435AAE0A10` |\n\nBrowse also reads attestation-resolver contracts for compliance badges. Those\naddresses are network-specific, so read them from the Browse address book for\nthe network you target. See\n[App discovery (Browse)](../architecture/discovery.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#polkadot-app-accountdatastore", "page_title": "apps-reference-addresses", "index": 5, "depth": 3, "title": "Polkadot app `AccountDataStore`", "anchor": "polkadot-app-accountdatastore", "start_char": 4367, "end_char": 4892, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Polkadot app `AccountDataStore`\n\n`AccountDataStore` is the contract the Polkadot app uses to back up coinage\ninstallations. Each install stores a small, client-encrypted record under the\naccount's own address, so restoring the same recovery phrase on a new device can\nfind coins held by earlier installs. The contract has no owner or admin, and\nonly the device holding the key can read a record's contents.\n\n| Contract | Devnet address |\n| --- | --- |\n| AccountDataStore | `0x58c9963308c7735cf72ab633e8a9d892f5ab9e05` |"}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#attestation-protocol", "page_title": "apps-reference-addresses", "index": 6, "depth": 3, "title": "Attestation protocol", "anchor": "attestation-protocol", "start_char": 4892, "end_char": 5383, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Attestation protocol\n\nAn EAS-style attestation suite (`SchemaRegistry` + `AttestationService`)\nprovides general, permissionless attestations, used by Browse compliance badges\nand others. Both contracts run on Asset Hub via `pallet-revive`.\n\nThe `SchemaRegistry` and `AttestationService` addresses are network-specific\nand are not listed here. Read them from the\n[`attestation-protocol`](https://github.com/paritytech/attestation-protocol)\ndeployment records for the network you target."}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#runtime-precompiles", "page_title": "apps-reference-addresses", "index": 7, "depth": 2, "title": "Runtime precompiles", "anchor": "runtime-precompiles", "start_char": 5383, "end_char": 5783, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Runtime precompiles\n\nSome capabilities are available to contracts at fixed precompile addresses,\nnot as deployed contracts:\n\n| Precompile | Address | Purpose |\n| --- | --- | --- |\n| Personhood | `0x000000000000000000000000000000000a010000` | `personhoodStatus(address, bytes32 context)` → tier + per-app alias |\n\n[Identity & personhood](../architecture/identity.md) explains how Products use\nit."}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#how-addresses-are-resolved-by-tooling", "page_title": "apps-reference-addresses", "index": 8, "depth": 2, "title": "How addresses are resolved by tooling", "anchor": "how-addresses-are-resolved-by-tooling", "start_char": 5783, "end_char": 6166, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How addresses are resolved by tooling\n\nYou rarely paste these addresses by hand. The CLIs select the `devnet` network\npreset (`--env devnet`), and that preset carries the RPC endpoints and the full\naddress book. Apps and frontends resolve names to addresses at runtime through\nthe registries above. When you need a value directly, read it from the preset\ninstead of assuming it."}
{"source": "polkadot-docs", "page_id": "apps-reference-addresses", "url": "https://developer.polkadot.com/apps/reference/addresses/#sources", "page_title": "apps-reference-addresses", "index": 9, "depth": 2, "title": "Sources", "anchor": "sources", "start_char": 6166, "end_char": 6567, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b117c0961c3d6e38f4d2e6fc8f0916305131b4ea9421f38b795de9616ca9353", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Sources\n\n- [paseo-network/runtimes](https://github.com/paseo-network/runtimes): parachains, assets, precompiles\n- Contract source: [dotns](https://github.com/paritytech/dotns) · [browse](https://github.com/paritytech/browse) · [attestation-protocol](https://github.com/paritytech/attestation-protocol) · [AccountDataStore](https://github.com/paritytech/polkadot-mobile-datastore-contract-community)"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#platform-and-entry-points", "page_title": "apps-reference-glossary", "index": 0, "depth": 2, "title": "Platform and entry points", "anchor": "platform-and-entry-points", "start_char": 119, "end_char": 149, "estimated_token_count": 6, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Platform and entry points"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#product", "page_title": "apps-reference-glossary", "index": 1, "depth": 3, "title": "Product", "anchor": "product", "start_char": 149, "end_char": 420, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Product\n\nAn app published to the Devnet under a `.dot` domain and opened inside the\nPolkadot app or the web gateway. These docs say \"Product\" when they mean the\npublished, named app, and not a web app in general. See\n[App delivery](../architecture/app-delivery.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#polkadot-products-devnet", "page_title": "apps-reference-glossary", "index": 2, "depth": 3, "title": "Polkadot Products Devnet", "anchor": "polkadot-products-devnet", "start_char": 420, "end_char": 674, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Polkadot Products Devnet\n\nThe public developer preview these docs describe. It runs on the\ncommunity-operated Paseo network. Product developers mainly use Asset Hub for\ncontracts and assets, People for identity, and Bulletin for app bundle storage."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#polkadot-app", "page_title": "apps-reference-glossary", "index": 3, "depth": 3, "title": "Polkadot app", "anchor": "polkadot-app", "start_char": 674, "end_char": 909, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Polkadot app\n\nThe app people use to reach the platform, on mobile and desktop. Products run\ninside it, and it handles signing, storage, chain access and identity for the\nuser. Download links are in [More resources](resources.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#dev-dotli", "page_title": "apps-reference-glossary", "index": 4, "depth": 3, "title": "dev-dot.li", "anchor": "dev-dotli", "start_char": 909, "end_char": 1116, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### dev-dot.li\n\nThe web gateway that serves `.dot` apps in an ordinary browser, reachable at\n<https://dev-dot.li>. It resolves a `.dot` domain, fetches the app bundle, and\nrenders it in a sandboxed iframe."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#naming-and-discovery", "page_title": "apps-reference-glossary", "index": 5, "depth": 2, "title": "Naming and discovery", "anchor": "naming-and-discovery", "start_char": 1116, "end_char": 1141, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Naming and discovery"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#dot-domain", "page_title": "apps-reference-glossary", "index": 6, "depth": 3, "title": "`.dot` domain", "anchor": "dot-domain", "start_char": 1141, "end_char": 1364, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### `.dot` domain\n\nA readable name, such as `calculator.dot`, that points to a deployed app\nbundle. For users it works like an app name. For developers it is the name you\nregister, update and publish with the DotNS tools."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#dotns", "page_title": "apps-reference-glossary", "index": 7, "depth": 3, "title": "DotNS", "anchor": "dotns", "start_char": 1364, "end_char": 1562, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### DotNS\n\nThe `.dot` naming system. You use it to register an app name, point that name\nat content, or look up where an app is published. See the\n[naming architecture](../architecture/naming.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#browse-publisher", "page_title": "apps-reference-glossary", "index": 8, "depth": 3, "title": "Browse / Publisher", "anchor": "browse-publisher", "start_char": 1562, "end_char": 1849, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Browse / Publisher\n\nBrowse is the app-discovery directory for the Devnet\n(<https://browse.dev-dot.li>). Use it to find published Products, or to check\nthat your own app appears after you list it. Publishing requires ownership of the\n`.dot` domain and may require personhood checks."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#contracts", "page_title": "apps-reference-glossary", "index": 9, "depth": 2, "title": "Contracts", "anchor": "contracts", "start_char": 1849, "end_char": 1863, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Contracts"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#polkavm-revive", "page_title": "apps-reference-glossary", "index": 10, "depth": 3, "title": "PolkaVM / revive", "anchor": "polkavm-revive", "start_char": 1863, "end_char": 2130, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### PolkaVM / revive\n\nPolkaVM is the contract execution layer on Asset Hub, available through\n`pallet-revive`. If your Product needs custom on-chain logic, this is most\nlikely where your contracts run. See the\n[contracts architecture](../architecture/contracts.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#storage-and-delivery", "page_title": "apps-reference-glossary", "index": 11, "depth": 2, "title": "Storage and delivery", "anchor": "storage-and-delivery", "start_char": 2130, "end_char": 2155, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Storage and delivery"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#bulletin", "page_title": "apps-reference-glossary", "index": 12, "depth": 3, "title": "Bulletin", "anchor": "bulletin", "start_char": 2155, "end_char": 2428, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Bulletin\n\nThe Bulletin chain stores published web-app bundles and contract metadata.\nStored content is addressed by CID. Uploads need a storage authorization: a\ndeploy account must hold a live one before it can upload, and authorizations\nexpire and must be refreshed."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#cid", "page_title": "apps-reference-glossary", "index": 13, "depth": 3, "title": "CID", "anchor": "cid", "start_char": 2428, "end_char": 2617, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### CID\n\nThe content identifier of a stored bundle or file. A `.dot` domain resolves to\na CID, and the CID is what the client fetches. See\n[App delivery](../architecture/app-delivery.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#statement-store", "page_title": "apps-reference-glossary", "index": 14, "depth": 3, "title": "Statement store", "anchor": "statement-store", "start_char": 2617, "end_char": 2825, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Statement store\n\nA People-chain store of short signed statements. The app uses it as the transport\nfor encrypted chat messages and call signalling. See\n[Messaging & calls](../architecture/messaging.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#developer-sdks", "page_title": "apps-reference-glossary", "index": 15, "depth": 2, "title": "Developer SDKs", "anchor": "developer-sdks", "start_char": 2825, "end_char": 2844, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Developer SDKs"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#product-sdk", "page_title": "apps-reference-glossary", "index": 16, "depth": 3, "title": "Product SDK", "anchor": "product-sdk", "start_char": 2844, "end_char": 3156, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Product SDK\n\n`@parity/product-sdk` is the main TypeScript SDK for building Products. It\ngives your app the wallet, chain, storage, contract and identity services that\nthe host provides. It runs inside the Polkadot app or the web gateway, and is\nnot a standalone wallet. See [Packages & tools](packages.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#truapi-host-protocol", "page_title": "apps-reference-glossary", "index": 17, "depth": 3, "title": "TrUAPI (host protocol)", "anchor": "truapi-host-protocol", "start_char": 3156, "end_char": 3576, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### TrUAPI (host protocol)\n\nTrUAPI is the protocol between a Product and its host (the Polkadot app or the\nweb gateway). It covers accounts, signing, permissions, storage, chat, payments\nand chain access. `@parity/truapi` is the Product-side client, and\n`@parity/product-sdk-host` speaks it for you. It replaced the earlier Host API\n(`@novasamatech/host-api`). See\n[Packages & tools](packages.md#host-protocol-truapi)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#deploy-cli-pad", "page_title": "apps-reference-glossary", "index": 18, "depth": 3, "title": "Deploy CLI (`pad`)", "anchor": "deploy-cli-pad", "start_char": 3576, "end_char": 3837, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Deploy CLI (`pad`)\n\n`@polkadot-community-foundation/polkadot-app-deploy` (bin: `pad`) is the CLI\nthat publishes a built static bundle and points a `.dot` domain at it. On this\nDevnet, use the `devnet` preset: `pad` and `dotns` take it with\n`--env devnet`."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#identity-and-personhood", "page_title": "apps-reference-glossary", "index": 19, "depth": 2, "title": "Identity and personhood", "anchor": "identity-and-personhood", "start_char": 3837, "end_char": 3865, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Identity and personhood"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#proof-of-personhood", "page_title": "apps-reference-glossary", "index": 20, "depth": 3, "title": "Proof of personhood", "anchor": "proof-of-personhood", "start_char": 3865, "end_char": 4320, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Proof of personhood\n\nHow an account is recognized as a distinct human without revealing who that\nhuman is. It has two tiers, and either can unlock product flows such as app\nlisting, naming, rewards or rate limits.\n\n- Lite: an attested username. Most users hold this tier.\n- Full: a stronger guarantee of one account per human, reached by redeeming an\n  invitation. See\n  [Username & proof of personhood](../using-the-app/username-and-personhood.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#alias", "page_title": "apps-reference-glossary", "index": 21, "depth": 3, "title": "Alias", "anchor": "alias", "start_char": 4320, "end_char": 4546, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Alias\n\nA per-application pseudonym derived for your account, so an app can recognize a\nreturning person without learning who they are or linking them across apps. See\n[Identity & personhood](../architecture/identity.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#people-asset-hub", "page_title": "apps-reference-glossary", "index": 22, "depth": 3, "title": "People / Asset Hub", "anchor": "people-asset-hub", "start_char": 4546, "end_char": 4697, "estimated_token_count": 30, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### People / Asset Hub\n\nTwo of the system parachains Products use. Asset Hub hosts contracts, assets\nand DotNS. People hosts identity and personhood."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#accounts-and-addresses", "page_title": "apps-reference-glossary", "index": 23, "depth": 2, "title": "Accounts and addresses", "anchor": "accounts-and-addresses", "start_char": 4697, "end_char": 4724, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Accounts and addresses"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#ss58", "page_title": "apps-reference-glossary", "index": 24, "depth": 3, "title": "SS58", "anchor": "ss58", "start_char": 4724, "end_char": 4960, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### SS58\n\nThe Substrate address format an account is shown in (Devnet prefix `42`).\nFaucets and chain tools take the SS58 address. Contract tooling uses the mapped\nEVM `0x…` address instead. See [Addresses & registries](addresses.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#money", "page_title": "apps-reference-glossary", "index": 25, "depth": 2, "title": "Money", "anchor": "money", "start_char": 4960, "end_char": 4970, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Money"}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#cash", "page_title": "apps-reference-glossary", "index": 26, "depth": 3, "title": "CASH", "anchor": "cash", "start_char": 4970, "end_char": 5200, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### CASH\n\nThe name users see for a Devnet digital-dollar asset. Users get CASH inside\nthe Polkadot app, through in-app flows or rewards, depending on the current\nbuild. See [Get & use CASH](../using-the-app/get-and-use-cash.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#pas", "page_title": "apps-reference-glossary", "index": 27, "depth": 3, "title": "PAS", "anchor": "pas", "start_char": 5200, "end_char": 5431, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### PAS\n\nThe native token of the underlying Paseo network, used to pay transaction fees\nand keep an account alive. It is not CASH. It comes from the faucet: see\n[Create an account & get funds](../using-the-app/create-account.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#pocket", "page_title": "apps-reference-glossary", "index": 28, "depth": 3, "title": "Pocket", "anchor": "pocket", "start_char": 5431, "end_char": 5565, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Pocket\n\nThe wallet surface in the Polkadot app: the screen holding your balances,\nincluding the CASH card and its top-up button."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#coinage", "page_title": "apps-reference-glossary", "index": 29, "depth": 3, "title": "Coinage", "anchor": "coinage", "start_char": 5565, "end_char": 5721, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Coinage\n\nThe privacy-preserving payment system on the People chain that CASH is spent\nthrough. See [Money (CASH & funding)](../architecture/money.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-glossary", "url": "https://developer.polkadot.com/apps/reference/glossary/#learn-more", "page_title": "apps-reference-glossary", "index": 30, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 5721, "end_char": 5928, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f7f11b1fce80bf204de5ab12563ad8b51dbeac086d90605f7d55536d252336f", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Learn more\n\n- [Packages & tools](packages.md): what to install\n- [Networks & endpoints](networks.md): chains, the `devnet` preset and endpoints\n- [More resources](resources.md): apps, downloads and source"}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#the-devnet-at-a-glance", "page_title": "apps-reference-networks", "index": 0, "depth": 2, "title": "The Devnet at a glance", "anchor": "the-devnet-at-a-glance", "start_char": 309, "end_char": 686, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## The Devnet at a glance\n\nThe Devnet runs on the community-operated Paseo network.\n[The network](../architecture/network.md) explains what each chain is\nresponsible for.\n\n| Parameter | Value |\n| --- | --- |\n| Contract execution | `pallet-revive` on Asset Hub (PolkaVM / EVM) |\n| EVM chain id | `420420417` |\n| Native token | PAS, 10 decimals |\n| Web gateway | `dev-dot.li` |"}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#how-tools-pick-a-network", "page_title": "apps-reference-networks", "index": 1, "depth": 2, "title": "How tools pick a network", "anchor": "how-tools-pick-a-network", "start_char": 686, "end_char": 1162, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How tools pick a network\n\nBoth CLIs take a network preset with `--env`:\n\n```bash\npad ./dist my-app.dot --env devnet      # @polkadot-community-foundation/polkadot-app-deploy\ndotns ... --env devnet                  # @polkadot-community-foundation/dotns-cli\n```\n\nFor this Devnet the preset is `devnet`. A preset bundles the endpoints and\nregistry addresses a tool needs, so a wrong preset points the tool at the wrong\nendpoints or contract addresses. Don't guess the name."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#parachains-and-para-ids", "page_title": "apps-reference-networks", "index": 2, "depth": 2, "title": "Parachains and para IDs", "anchor": "parachains-and-para-ids", "start_char": 1162, "end_char": 1353, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Parachains and para IDs\n\nProduct development targets Asset Hub (1000), People (1004) and Bulletin\n(1010). Other system parachains share the relay but are not part of the Product\nsurface."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#public-endpoints-and-gateways", "page_title": "apps-reference-networks", "index": 3, "depth": 2, "title": "Public endpoints and gateways", "anchor": "public-endpoints-and-gateways", "start_char": 1353, "end_char": 1387, "estimated_token_count": 6, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Public endpoints and gateways"}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#web-gateway", "page_title": "apps-reference-networks", "index": 4, "depth": 3, "title": "Web gateway", "anchor": "web-gateway", "start_char": 1387, "end_char": 1645, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Web gateway\n\nThe web gateway is a client-side resolver that serves `.dot` apps over HTTPS:\n\n- Gateway: [https://dev-dot.li](https://dev-dot.li)\n- Any deployed app resolves at `https://<label>.dev-dot.li` (for example\n  `https://calculator.dev-dot.li`)."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#reference-apps-and-app-installs", "page_title": "apps-reference-networks", "index": 5, "depth": 3, "title": "Reference apps and app installs", "anchor": "reference-apps-and-app-installs", "start_char": 1645, "end_char": 1792, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Reference apps and app installs\n\nThe deployed reference Products and the Polkadot app download links are in\n[More resources](./resources.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#faucet", "page_title": "apps-reference-networks", "index": 6, "depth": 3, "title": "Faucet", "anchor": "faucet", "start_char": 1792, "end_char": 2778, "estimated_token_count": 259, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Faucet\n\nDevnet funds come from the [Polkadot faucet](https://faucet.polkadot.io). It\nserves several networks, so you have to pick two things: Paseo, and the right\nparachain. These links pre-select both:\n\n| You need fees for | Use |\n| --- | --- |\n| Contracts, `.dot` names, publishing | [Paseo Asset Hub (1000)](https://faucet.polkadot.io/paseo?parachain=1000) |\n| Sending CASH, usernames, personhood | [Paseo People (1004)](https://faucet.polkadot.io/paseo?parachain=1004) |\n\nPaste your SS58 address (the one the app shows on its receive screen, or\n`dotns account address` for CLI work), not an EVM `0x…` address. The faucet\npays the native token, PAS.\n\n!!! warning \"Do not pick an *Asset Hub Next* or *People Next* chain\"\n    The faucet also lists Asset Hub Next (1500) and People Next (1502). Those\n    belong to Paseo Next v2 (`paseo` preset), a different network. Funds sent\n    there will not appear on this Devnet, and the balance you are waiting for\n    will never arrive."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#storage-authorization", "page_title": "apps-reference-networks", "index": 7, "depth": 3, "title": "Storage authorization", "anchor": "storage-authorization", "start_char": 2778, "end_char": 3298, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Storage authorization\n\nPublishing an app writes to the Bulletin Chain, which works by authorization,\nnot by fees. This is separate from the token faucet above: a deploy account\nneeds an authorization grant (a byte and transaction quota) before it can\nupload. Grant one from the Faucet tab of the\n[Bulletin Chain Console](https://paritytech.github.io/polkadot-bulletin-chain/)\nafter selecting the **Products Devnet** network. See\n[Get storage authorization](../build/build-and-publish.md#get-storage-authorization)."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#node-rpc-endpoints", "page_title": "apps-reference-networks", "index": 8, "depth": 3, "title": "Node RPC endpoints", "anchor": "node-rpc-endpoints", "start_char": 3298, "end_char": 5242, "estimated_token_count": 533, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Node RPC endpoints\n\nThe `devnet` preset already has an endpoint for each chain, so the CLIs connect\nwithout any setup. Use the lists below when you need to point a tool or a\nbrowser-based explorer at a chain directly, or when the endpoint a preset\npicked is down.\n\nPaseo is community-operated. Each chain is served by several independent\nproviders, and any single endpoint can go offline or move. If one fails, try\nanother from the same list. The `devnet` preset tracks a working set, so prefer\nit over pasting a URL by hand.\n\nThe CLIs reconnect on their own. A run that prints several `Unable to connect`\nlines normally still completes, so only switch endpoints if the command\nfails.\n\n**Relay**\n\n- `wss://paseo-rpc.n.dwellir.com`\n- `wss://paseo-v2.rpc.turboflakes.io`\n- `wss://rpc-paseo.stakeworld.io`\n- `wss://rpc.interweb-it.com/paseo`\n\n**Asset Hub (1000)**\n\n- `wss://asset-hub-paseo-rpc.n.dwellir.com`\n- `wss://sys.turboflakes.io/asset-hub-paseo`\n\n**People (1004)**\n\n- `wss://people-paseo.rotko.net`\n- `wss://people-paseo.gatotech.network`\n- `wss://rpc.interweb-it.com/people-paseo`\n\n**Bulletin (1010)**\n\n- `wss://bulletin-paseo.tservices.es:8443`\n- `wss://bullet.sik.rocks`\n- `wss://bullet.tunastaking.eu`\n\n#### Ethereum JSON-RPC\n\nContract tooling that speaks Ethereum JSON-RPC (Hardhat, `cast`, viem) needs\nthe ETH-RPC endpoint for Asset Hub, not a Substrate WebSocket endpoint:\n\n- `https://eth-rpc-testnet.polkadot.io`\n\n#### Bulletin IPFS gateways\n\nAn app bundle stored on Bulletin is addressed by CID. Serving it over HTTP\ntakes an IPFS gateway peered to a Bulletin node. The Bulletin RPC endpoints\nabove do not serve `/ipfs/` themselves.\n\n- `https://devnet-ipfs.api.polkadotcommunity.foundation`: operated by the\n  Polkadot Community Foundation, and the gateway the deploy tooling uses by\n  default\n\nTools append `/ipfs/<cid>` to this bare origin.\n\nContract and registry addresses are in\n[Addresses & registries](./addresses.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#source-of-the-runtimes", "page_title": "apps-reference-networks", "index": 9, "depth": 2, "title": "Source of the runtimes", "anchor": "source-of-the-runtimes", "start_char": 5242, "end_char": 5494, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Source of the runtimes\n\nThe Paseo relay and system parachain runtimes live in\n[`paseo-network/runtimes`](https://github.com/paseo-network/runtimes). Go there\nto check chain-level details such as para IDs, pallets, precompiles or runtime\nconstants."}
{"source": "polkadot-docs", "page_id": "apps-reference-networks", "url": "https://developer.polkadot.com/apps/reference/networks/#learn-more", "page_title": "apps-reference-networks", "index": 10, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 5494, "end_char": 5651, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e95cf321504d78d5848d7fe6a9d9a43b8482e5ca867e542b607d460f195052e", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- [The network](../architecture/network.md): what each chain is responsible for\n- [Addresses & registries](./addresses.md): contract addresses"}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#developer-packages", "page_title": "apps-reference-packages", "index": 0, "depth": 2, "title": "Developer packages", "anchor": "developer-packages", "start_char": 361, "end_char": 2062, "estimated_token_count": 483, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Developer packages\n\nMost projects only need a few direct dependencies:\n\n| Package | Install | Purpose | Bin |\n|---------|---------|---------|-----|\n| [`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk) | `npm i @parity/product-sdk@0.39.0` | TypeScript SDK for building apps: multi-chain access, transactions, signing, contract calls, cloud storage, and identity. Pinned: see [Install the SDK version the hosts speak](#install-the-sdk-version-the-hosts-speak). | — |\n| [`@polkadot-community-foundation/dotns-cli`](https://www.npmjs.com/package/@polkadot-community-foundation/dotns-cli) | `npm i -g @polkadot-community-foundation/dotns-cli@latest` | CLI for the `.dot` naming system: register names, set content/address records, manage reverse names and stores. | `dotns` |\n| [`@polkadot-community-foundation/polkadot-app-deploy`](https://www.npmjs.com/package/@polkadot-community-foundation/polkadot-app-deploy) | `npm i -g @polkadot-community-foundation/polkadot-app-deploy@latest` | Deploy CLI: uploads a built static bundle to Bulletin, and binds it to a `.dot` domain. `pad-bootstrap` (same package) authorizes the Bulletin storage pool. | `pad`, `pad-bootstrap` |\n\n`pad` requires Node 22+. On Node 20 it fails at startup with an\nunrelated-looking error, so check `node --version` first.\n\nInstall the CLIs at their latest release, and re-run the same command to\nupgrade. They carry network presets and contract addresses, and a stale copy is\nthe usual cause of a command that succeeds while nothing changes on chain. The\nProduct SDK is the one package to pin, as described below.\n\nBoth CLIs select a network preset with `--env`, and for this Devnet it is\n`--env devnet`."}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#product-sdk-family", "page_title": "apps-reference-packages", "index": 1, "depth": 2, "title": "Product SDK family", "anchor": "product-sdk-family", "start_char": 2062, "end_char": 3210, "estimated_token_count": 300, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Product SDK family\n\n`@parity/product-sdk` is the main dependency for Product app code. It gives an\napp access to wallet, storage, chain, contract and identity services through\nthe host: the Polkadot app or the web gateway. This is deliberate. Your app\nshould not manage private keys or build its own wallet layer.\n\n| Package | Purpose |\n|---------|---------|\n| `@parity/product-sdk` | Main SDK entry point for Product apps. |\n| `@parity/product-sdk-chain-client` | Typed access to the Devnet chains. |\n| `@parity/product-sdk-descriptors` | Chain descriptors used by the SDK. |\n| `@parity/product-sdk-signer` | Host-backed signing, plus development signers for tests. |\n| `@parity/product-sdk-contracts` | Contract calls and ABI handling for PolkaVM contracts. |\n| `@parity/product-sdk-cloud-storage` | Bulletin-backed content storage helpers. |\n| `@parity/product-sdk-host` | Host detection and host-provided services. |\n\nThese packages live in the\n[Product SDK monorepo](https://github.com/paritytech/product-sdk) and are\nversioned separately. `@parity/product-sdk` pins a matching version of each, so\ninstall them through it, not one by one."}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#install-the-sdk-version-the-hosts-speak", "page_title": "apps-reference-packages", "index": 2, "depth": 3, "title": "Install the SDK version the hosts speak", "anchor": "install-the-sdk-version-the-hosts-speak", "start_char": 3210, "end_char": 3606, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Install the SDK version the hosts speak\n\nApps talk to their host over TrUAPI. The Devnet hosts speak the TrUAPI version\nthat Product SDK 0.39.0 speaks, so install exactly that version:\n\n```bash\nnpm i @parity/product-sdk@0.39.0\n```\n\nNewer SDK releases speak a newer TrUAPI that these hosts do not. If you add SDK\npackages one by one, use the versions `@parity/product-sdk@0.39.0` depends on."}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#current-devnet-chain-metadata", "page_title": "apps-reference-packages", "index": 3, "depth": 3, "title": "Current Devnet chain metadata", "anchor": "current-devnet-chain-metadata", "start_char": 3606, "end_char": 4741, "estimated_token_count": 308, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Current Devnet chain metadata\n\nThe Devnet chains run newer runtimes than the metadata in\n`@parity/product-sdk-descriptors`. For typed access to the current pallets,\nswap in the Polkadot Community Foundation's build of the same package. Add it\nas a dependency and as an override, with the same value in both:\n\n=== \"npm\"\n\n    ```json\n    {\n      \"dependencies\": {\n        \"@parity/product-sdk-descriptors\": \"npm:@polkadot-community-foundation/product-sdk-descriptors@0.14.0-pcf.1\"\n      },\n      \"overrides\": {\n        \"@parity/product-sdk-descriptors\": \"npm:@polkadot-community-foundation/product-sdk-descriptors@0.14.0-pcf.1\"\n      }\n    }\n    ```\n\n=== \"pnpm\"\n\n    ```json\n    {\n      \"dependencies\": {\n        \"@parity/product-sdk-descriptors\": \"npm:@polkadot-community-foundation/product-sdk-descriptors@0.14.0-pcf.1\"\n      },\n      \"pnpm\": {\n        \"overrides\": {\n          \"@parity/product-sdk-descriptors\": \"npm:@polkadot-community-foundation/product-sdk-descriptors@0.14.0-pcf.1\"\n        }\n      }\n    }\n    ```\n\nYour imports stay the same (`@parity/product-sdk-descriptors/...`), and every\nSDK package uses the same copy."}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#host-protocol-truapi", "page_title": "apps-reference-packages", "index": 4, "depth": 2, "title": "Host protocol (TrUAPI)", "anchor": "host-protocol-truapi", "start_char": 4741, "end_char": 5312, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Host protocol (TrUAPI)\n\n`@parity/product-sdk-host` speaks TrUAPI to the host for you, so apps rarely\nimport it directly. For end-to-end tests, use the test host in\n[`@parity/truapi-host`](https://www.npmjs.com/package/@parity/truapi-host); see\n[Test without the real host](../build/platform-services-sdk.md#test-without-the-real-host).\nTrUAPI lives in [trinity-user-agents](https://github.com/paritytech/trinity-user-agents).\n\n`@novasamatech/host-api`, `@novasamatech/host-api-wrapper` and\n`@parity/host-api-test-sdk` do not speak the Devnet hosts' current protocol."}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#command-line-tools", "page_title": "apps-reference-packages", "index": 5, "depth": 2, "title": "Command-line tools", "anchor": "command-line-tools", "start_char": 5312, "end_char": 6310, "estimated_token_count": 298, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Command-line tools\n\n| CLI | Package | Bin | What it does |\n|-----|---------|-----|--------------|\n| Deploy | `@polkadot-community-foundation/polkadot-app-deploy` | `pad` | Publishes a built static bundle, stores it on Bulletin, and points a `.dot` domain at it. |\n| Storage bootstrap | `@polkadot-community-foundation/polkadot-app-deploy` | `pad-bootstrap` | Authorizes the Bulletin storage pool `pad` uploads with, using an authorizer key. Ships in the same package as `pad`. |\n| DotNS | `@polkadot-community-foundation/dotns-cli` | `dotns` | Registers and manages `.dot` domains: `register`, `lookup`, `content`, `primary`, `transfer`, `store`, `pop`, and more. |\n\nA typical deploy binds a built bundle to a name on a chosen network:\n\n```bash\npad ./dist my-app.dot --env devnet\n```\n\nThe account `pad` deploys with must hold a live Bulletin storage authorization,\nbecause `pad` never authorizes itself. See\n[Get storage authorization](../build/build-and-publish.md#get-storage-authorization)."}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#where-your-app-runs", "page_title": "apps-reference-packages", "index": 6, "depth": 2, "title": "Where your app runs", "anchor": "where-your-app-runs", "start_char": 6310, "end_char": 6510, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where your app runs\n\nYour Product runs inside the Polkadot app or the web gateway. Download links,\nthe deployed reference Products and source repositories are in\n[More resources](./resources.md)."}
{"source": "polkadot-docs", "page_id": "apps-reference-packages", "url": "https://developer.polkadot.com/apps/reference/packages/#learn-more", "page_title": "apps-reference-packages", "index": 7, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 6510, "end_char": 6917, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:52882e90a519f41ddc1fa1a091db9298ee1a52c553265f99a0955d5607010ab7", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Learn more\n\n- Source: [product-sdk](https://github.com/paritytech/product-sdk) · [trinity-user-agents](https://github.com/paritytech/trinity-user-agents) (TrUAPI) · [polkadot-app-deploy](https://github.com/Polkadot-Community-Foundation/polkadot-app-deploy) · [dotns-sdk](https://github.com/Polkadot-Community-Foundation/dotns-sdk)\n- [Networks & endpoints](./networks.md): which network these tools target"}
{"source": "polkadot-docs", "page_id": "apps-reference-resources", "url": "https://developer.polkadot.com/apps/reference/resources/#get-the-app", "page_title": "apps-reference-resources", "index": 0, "depth": 2, "title": "Get the app", "anchor": "get-the-app", "start_char": 494, "end_char": 2041, "estimated_token_count": 369, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f5e30965a27cc50bd00c9963d6d7e28aadfdc9f432599d16cff26571f925544", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Get the app\n\nThe Polkadot app is where people use Products, on mobile and desktop. The web\ngateway works in any browser if you only want to look around.\n\nThese are devnet builds. The Polkadot releases on Google Play and the App Store\nconnect to a different network and do not work with these docs.\n\n| Platform | Where to get it |\n| --- | --- |\n| Android (recommended) | [join the tester group](https://appdistribution.firebase.dev/i/f3b79521380b40b9) to get each new build automatically |\n| Android (manual APK) | the [latest Android release](https://github.com/Polkadot-Community-Foundation/polkadot-android-community/releases/latest) |\n| iOS (TestFlight) | [join the TestFlight beta](https://testflight.apple.com/join/HnBX59vz) |\n| Desktop (macOS / Windows / Linux) | the [latest desktop release](https://github.com/Polkadot-Community-Foundation/polkadot-desktop-community/releases/latest) |\n| Web gateway (no install) | <https://dev-dot.li> |\n\nOn Android, the tester group is the easiest route. Accept the invitation with a\nGoogle account and you are notified of each new build.\n\nTo install by hand instead, take `app-polkadot-devnet.apk` (~200 MB) from the\nlatest release and allow installs from unknown sources. The same APK runs with\nor without Google Play services.\n\niOS builds are only distributed through TestFlight. The first build of each\nversion reaches the group once Beta App Review approves it.\n\n\nIf an account cannot submit a transaction, it probably needs devnet funds. Get\nthem from the [faucet](https://faucet.polkadot.io)."}
{"source": "polkadot-docs", "page_id": "apps-reference-resources", "url": "https://developer.polkadot.com/apps/reference/resources/#reference-products-to-open", "page_title": "apps-reference-resources", "index": 1, "depth": 2, "title": "Reference Products to open", "anchor": "reference-products-to-open", "start_char": 2041, "end_char": 2882, "estimated_token_count": 261, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f5e30965a27cc50bd00c9963d6d7e28aadfdc9f432599d16cff26571f925544", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Reference Products to open\n\nThese apps run on the Devnet. They are developer-preview examples, not audited\nproduction applications.\n\n| App | Open | `.dot` name | What it does |\n| --- | --- | --- | --- |\n| Calculator | <https://calculator.dev-dot.li> | `calculator.dot` | A basic calculator |\n| Stopwatch | <https://stopwatch.dev-dot.li> | `stopwatch.dot` | A stopwatch |\n| Countdown Timer | <https://countdown-timer.dev-dot.li> | `countdown-timer.dot` | Counts down from a time you set |\n| Alarm Clock | <https://alarm-clock.dev-dot.li> | `alarm-clock.dot` | Rings at the time you set |\n| Chess Clock | <https://chess-clock.dev-dot.li> | `chess-clock.dot` | Two clocks for a two-player game; tap to pass the turn |\n| Unit Converter | <https://unit-converter.dev-dot.li> | `unit-converter.dot` | Converts units, such as metres to feet |"}
{"source": "polkadot-docs", "page_id": "apps-reference-resources", "url": "https://developer.polkadot.com/apps/reference/resources/#source-repositories", "page_title": "apps-reference-resources", "index": 2, "depth": 2, "title": "Source repositories", "anchor": "source-repositories", "start_char": 2882, "end_char": 4538, "estimated_token_count": 476, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f5e30965a27cc50bd00c9963d6d7e28aadfdc9f432599d16cff26571f925544", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Source repositories\n\nFor detail these docs do not cover, go to the source.\n\n**Platform and tooling**\n\n- [product-sdk](https://github.com/paritytech/product-sdk): the Product SDK, also a [Claude Code plugin](https://github.com/paritytech/product-sdk#claude-code-plugin) with [agent skills](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills)\n- [trinity-user-agents](https://github.com/paritytech/trinity-user-agents): TrUAPI, the host protocol client and the host runtime\n- [polkadot-app-deploy](https://github.com/Polkadot-Community-Foundation/polkadot-app-deploy): the `pad` deploy CLI\n- [dotns](https://github.com/paritytech/dotns) · [dotns-sdk](https://github.com/Polkadot-Community-Foundation/dotns-sdk): naming contracts, CLI and UI\n- [browse](https://github.com/paritytech/browse): the discovery directory\n- [dotli-community](https://github.com/paritytech/dotli-community): the web gateway\n- [paseo-network/runtimes](https://github.com/paseo-network/runtimes): chain runtimes\n\n**Polkadot app clients**\n\n- [Android](https://github.com/Polkadot-Community-Foundation/polkadot-android-community)\n  · [iOS](https://github.com/Polkadot-Community-Foundation/polkadot-ios-community)\n  · [Desktop](https://github.com/Polkadot-Community-Foundation/polkadot-desktop-community)\n\n**Reference Products**\n\n- [Calculator, Stopwatch, Countdown Timer, Alarm Clock, Chess Clock and Unit Converter](https://github.com/paritytech/browse/tree/main/apps/registry/tests/fixture-projects): the reference apps above\n- [playground-app-template](https://github.com/Polkadot-Community-Foundation/playground-app-template): a starter app on the Product SDK"}
{"source": "polkadot-docs", "page_id": "apps-reference-resources", "url": "https://developer.polkadot.com/apps/reference/resources/#protocol-background", "page_title": "apps-reference-resources", "index": 3, "depth": 2, "title": "Protocol background", "anchor": "protocol-background", "start_char": 4538, "end_char": 4698, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f5e30965a27cc50bd00c9963d6d7e28aadfdc9f432599d16cff26571f925544", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Protocol background\n\nFor the underlying Polkadot protocol, tooling and network concepts, see the\nofficial [Polkadot developer documentation](../../index.md)."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#introduction", "page_title": "Register a .dot Domain", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 1841, "estimated_token_count": 443, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nEvery published Polkadot Product is reached by a dotNS name, such as `awesome.dot`. That name is registered with [dotNS](/reference/apps/infrastructure/dotns/), Polkadot's decentralized, on-chain name service. dotNS turns a human-readable name into the Product bundle it points at, and it is the lookup every Host runs when a user navigates to it.\n\n!!! warning \"TestNet names end in `.paseo`, not `.dot`\"\n    dotNS top-level domains are per network. On Paseo Next v2, the TestNet the Apps tooling targets by default, names are minted under `.paseo`: publish `myproject57` and you get `myproject57.paseo`, served at `https://myproject57.paseo.li`. Whether you supply the bare label or the full name depends on the tool; see [Choose a Name](/apps/register-dot-domain/#choose-a-name).\n\n\nThe registry (names, owners, and the content record each name points at) lives as contract state on Polkadot Hub. Resolution runs `name → namehash → contenthash → CID`: the name hashes to a deterministic key, the record's `contenthash` points at your bundle's CID, and the Host fetches and content-verifies the bundle before loading it.\n\nRegistration happens on chain, so the name rules below hold whichever tool you use. Three CLIs can register a name: the [`playground` CLI](/apps/quick-start/) folds it into a deploy, `pad` publishes a built bundle and registers its name in one command, and the [dotNS CLI](/reference/apps/infrastructure/dotns/cli/) drives the registry directly. This guide explains how to choose a name your account is allowed to register, which path to take, and how to manage the name afterward.\n\n!!! note \"Products Devnet\"\n    This page uses Paseo Next v2 (`paseo` preset). For the PCF Products Devnet (`devnet` preset), see [Register a .dot domain](/apps/build/register-a-dot-name/)."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#prerequisites", "page_title": "Register a .dot Domain", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1841, "end_char": 2431, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Prerequisites\n\nBefore registering, ensure you have:\n\n- Completed [Install Desktop and Pair](/apps/get-started/) and [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/); your account needs PAS to pay fees and any name deposit.\n- One of the CLIs in [Ways to Register](#ways-to-register) installed. On the `playground` path that means `pg login` has paired it with your signer.\n- A Product project ready to deploy, if you are registering as part of a deploy with `playground` or `pad`. Registering with the dotNS CLI needs no bundle. See [Deploy Your App](/apps/deploy-your-app/)."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#choose-a-name", "page_title": "Register a .dot Domain", "index": 2, "depth": 2, "title": "Choose a Name", "anchor": "choose-a-name", "start_char": 2431, "end_char": 2747, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Choose a Name\n\nA name is a bare label plus the network's TLD, as in `johnsmith57.paseo`. How you supply it depends on the tool: `playground` and the dotNS CLI take the bare label (`johnsmith57`) and append the TLD for you, rejecting a label that already carries a different one, while `pad` takes the full name."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#label-rules", "page_title": "Register a .dot Domain", "index": 3, "depth": 3, "title": "Label Rules", "anchor": "label-rules", "start_char": 2747, "end_char": 3530, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Label Rules\n\nA label must satisfy all of these, or registration is rejected before anything is submitted on chain:\n\n- **Length**: 3 to 63 characters.\n- **Character set**: lowercase letters, digits, and dashes (`a-z`, `0-9`, `-`) only.\n- **Dashes**: cannot start or end with a dash.\n- **Digits**: allowed anywhere, in any quantity. A trailing run of digits no longer carries any special meaning.\n\n!!! note \"Out-of-date tooling is stricter\"\n    Releases built against the previous label rules cap a trailing run of digits at two and reject a longer one, which the chain no longer does. `@parity/dotns-cli` lifted the cap in `0.9.0`. If a label with three or more trailing digits is refused before anything is submitted on chain, update your tooling rather than changing the name."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#length-bands", "page_title": "Register a .dot Domain", "index": 4, "depth": 3, "title": "Length Bands", "anchor": "length-bands", "start_char": 3530, "end_char": 5636, "estimated_token_count": 509, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "### Length Bands\n\nWhich band a name falls into depends on its length, counted as written. Digits count like any other character:\n\n| Length                 | Requirement                                              |\n|------------------------|----------------------------------------------------------|\n| 9 characters or longer | Open to everyone, with no personhood check               |\n| 6 to 8 characters      | Not sold on this path; earned in the Polkadot App        |\n| 5 characters or fewer  | Reserved for governance, not sold on this path           |\n\nSo `johnsmith57` is open to anyone because it is 11 characters, and so is `johnsmith` at exactly nine. `johnny` and `johnny01`, at six and eight characters, cannot be registered on this path whatever personhood status the account holds, and neither can `john` at four. `johnny` can still be earned as a personhood name in the Polkadot App. `johnny01` cannot be earned there either, because a gateway name never carries digits without a separator. Adding digits no longer lowers the tier a name demands: it only makes the name longer, which can move it into the open band.\n\nThe six-to-eight band is closed on this path by a governance switch in `PopRules`, which is off by default. While it is off, registering a name of that length fails with `Short names are not for sale`.\n\nEvery name this path admits pays the same refundable deposit, whatever its length. See the [PopRules and Pricing reference](/reference/apps/infrastructure/dotns/poprules-pricing/) for the bands and the deposit.\n\n!!! note \"Personhood and the network\"\n    Proof of Personhood is obtained in the Polkadot App on your device; there is no CLI path to a tier. On this path, pick a name of nine characters or more, which registers with no personhood check. A name of six to eight characters is available only as a device or personhood name, such as `johnny.42` or `johnny`, which is earned through the personhood gateway rather than registered here. See [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/) for how names, deposits, and personhood interact on TestNet."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#ways-to-register", "page_title": "Register a .dot Domain", "index": 5, "depth": 2, "title": "Ways to Register", "anchor": "ways-to-register", "start_char": 5636, "end_char": 6879, "estimated_token_count": 370, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Ways to Register\n\nAll three CLIs write to the same registry, so the name rules above apply identically to each. They differ in how much of the deploy they own:\n\n|                 Tool                  |                    Best for                     |                                      What it does                                       |\n|:-------------------------------------:|:-----------------------------------------------:|:---------------------------------------------------------------------------------------:|\n| [`playground`](/apps/quick-start/)    | A first Product, and hackathons                  | Registers the name as one step of an interactive `playground deploy`                     |\n| `pad`                                 | Scripted or CI deploys of a built bundle         | Uploads the bundle, registers the name if needed, and writes the content record in one command |\n| [`dotns`](/reference/apps/infrastructure/dotns/cli/) | Managing names on their own, with no deploy | Registration, lookups, content records, transfers, subnames, and escrow                  |\n\nThe choice is not permanent. A name registered by any of them is an ordinary name owned by your account, and the others operate on it afterward."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#register-with-the-playground-cli", "page_title": "Register a .dot Domain", "index": 6, "depth": 2, "title": "Register with the `playground` CLI", "anchor": "register-with-the-playground-cli", "start_char": 6879, "end_char": 8683, "estimated_token_count": 423, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Register with the `playground` CLI\n\nWhen you run `playground deploy` and reach the `domain` prompt, enter the name you want:\n\n<div class=\"termynal\" data-termynal>\n<span data-ty><pre>  domain\n    › johnsmith57█</pre></span>\n</div>\n\nFrom there, the CLI registers the name on chain. If you deploy with the phone signer, each on-chain step is a separate approval in the Polkadot App, in this order:\n\n1. **Reserve domain**: Submits a dotNS commitment for the name without revealing it in the clear.\n2. **Finalize domain**: Claims the name for your account.\n3. **Link content**: Points the name's `contenthash` at your uploaded bundle's CID, so the name now resolves to your Product.\n\n!!! note \"The ~60-second pause is expected\"\n    Between reserve and finalize, the deploy pauses for about 60 seconds. Most of that is the tooling waiting for the commitment to settle: the contract requires only that the commitment be six seconds old before the name is claimed. The two-step handshake is what stops a watcher seeing your desired name and racing to register it ahead of you. The deploy is not stuck.\n\n!!! note \"An abandoned commitment expires after a day\"\n    A commitment is valid for one day. If a deploy fails between reserve and finalize and you come back later than that, the commitment is no longer claimable and the handshake starts over from the beginning.\n\nNames are first come, first served. If the CLI reports that a name is [already registered](/apps/troubleshooting/#the-name-is-already-registered), choose another; if it reports that [short names are not for sale](/apps/troubleshooting/#short-names-are-not-for-sale), pick a name of nine characters or more. With the dev signer, these steps run without phone prompts; the deployed name is owned by the shared dev account rather than by you."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#register-with-pad", "page_title": "Register a .dot Domain", "index": 7, "depth": 2, "title": "Register with `pad`", "anchor": "register-with-pad", "start_char": 8683, "end_char": 9992, "estimated_token_count": 305, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Register with `pad`\n\n[`polkadot-app-deploy`](https://github.com/paritytech/polkadot-app-deploy) publishes a built bundle and registers its name in a single command, which suits a scripted or CI deploy:\n\n```bash\nnpm i -g @parity/polkadot-app-deploy\npad ./dist johnsmith57.paseo --mnemonic \"$MNEMONIC\"\n```\n\n`pad` uploads the bundle to the Bulletin Chain, skipping unchanged blocks on repeat deploys, registers the name if you do not already own it, and writes the content record on Polkadot Hub. It also has a `login` mode: on TestNet a local worker registers the name and then transfers it to the signed-in account, so the deploy runs without phone taps unless you pass `--no-transfer-to-signedin-user`. `pad` does not read the dotNS keystore, so supply the key explicitly when you are not using `login`.\n\n!!! warning \"Keep the mnemonic out of your shell history\"\n    Pass the phrase through an environment variable, never as a literal on the command line, and never commit it. A deploy key that registers names controls them.\n\n!!! note \"Node 22 or newer\"\n    `pad` requires Node 22+ and fails at startup on older versions with an unrelated-looking error. It also describes itself as a prototype reference implementation, so check `pad --help` against the version you installed before scripting around it."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#register-with-the-dotns-cli", "page_title": "Register a .dot Domain", "index": 8, "depth": 2, "title": "Register with the dotNS CLI", "anchor": "register-with-the-dotns-cli", "start_char": 9992, "end_char": 11296, "estimated_token_count": 297, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Register with the dotNS CLI\n\nThe [dotNS CLI](/reference/apps/infrastructure/dotns/cli/) registers a name on its own, with no bundle and no deploy involved. Reach for it when you want to hold a name before the Product is ready, script a batch of names, or debug a registration that failed.\n\nFrom `1.0.0`, the CLI targets Polkadot by default, where a registration spends DOT. To register on the TestNet this guide uses, set `DOTNS_ENV=paseo-v2` or pass `--env paseo-v2` on each command:\n\n```bash\nnpm i -g @parity/dotns-cli\nexport DOTNS_ENV=paseo-v2\ndotns register domain --help\n```\n\nRegistration runs the same commit-reveal handshake described above, so expect a comparable pause whichever tool drives it. The CLI can also preview `PopRules` eligibility for a proposed name and account, showing the band and the deposit before you submit.\n\n!!! warning \"Check the flags against your version\"\n    The dotNS CLI's per-command flags are still being confirmed against the published package, which is why the [CLI reference](/reference/apps/infrastructure/dotns/cli/) lists command families rather than a flag table. Run `--help` on the version you installed rather than copying flags from elsewhere; the PCF publishes its own build of this tool under a different scope, and the two are not interchangeable."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#update-the-bundle-a-name-points-at", "page_title": "Register a .dot Domain", "index": 9, "depth": 2, "title": "Update the Bundle a Name Points At", "anchor": "update-the-bundle-a-name-points-at", "start_char": 11296, "end_char": 12286, "estimated_token_count": 224, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Update the Bundle a Name Points At\n\nRegistration binds the name to your account once. Publishing a new version of your Product does not re-register the name; it updates the name's `contenthash` to the new CID. Every path handles this the same way, and re-running against a name you already own skips the reservation steps, so later deploys need fewer approvals:\n\n- **`playground`**: Re-run `playground deploy` against the same name.\n- **`pad`**: Re-run the same command; it uploads only the changed blocks and rewrites the content record.\n- **`dotns`**: Set the record directly with the CLI's `content set` command once you have the new CID, targeting the same network you registered the name on.\n\nBecause a name's content record is mutable and the owner can transfer or repoint it, treat a name as a pointer rather than a permanent identity. Code that consumes another Product should verify the `contenthash` it resolves at use time, not assume a name maps to the same bundle forever."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#manage-your-name", "page_title": "Register a .dot Domain", "index": 10, "depth": 2, "title": "Manage Your Name", "anchor": "manage-your-name", "start_char": 12286, "end_char": 13538, "estimated_token_count": 277, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Manage Your Name\n\nEverything past registration is the [dotNS CLI](/reference/apps/infrastructure/dotns/cli/)'s job. A deploy tool repoints the one name it just published; `dotns` operates on any name your account owns:\n\n- **Transfer**: A name registered on this path is owned by a Polkadot Hub account and can be transferred to another account. A transfer changes only the owner; the name and its current content record are unchanged, so users keep seeing the same bundle until the new owner updates it. Proof of Personhood status and reservations do not transfer with the name. A device or personhood name cannot be transferred at all, and some moves carry a fee. See the [transfer reference](/reference/apps/infrastructure/dotns/transfer/).\n- **Subnames**: The dotNS CLI can register subnames under a name you own.\n- **Content records**: The dotNS CLI can view and set a name's content record outside a deploy.\n\n!!! warning \"These CLIs are still moving\"\n    `@parity/dotns-cli` is in active development with breaking changes expected between versions, and `pad` describes itself as a prototype reference implementation. Both work today; treat the commands here as a snapshot and confirm them with `--help` before depending on them in a pipeline."}
{"source": "polkadot-docs", "page_id": "apps-register-dot-domain", "url": "https://developer.polkadot.com/apps/register-dot-domain/#where-to-go-next", "page_title": "Register a .dot Domain", "index": 11, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 13538, "end_char": 14299, "estimated_token_count": 213, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:086c30e4dbb26c3426a1d5b16bc69f407301fbff4635686326d04a6674fb7c7f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Deploy Your App**\n\n    ---\n\n    The full deploy flow that registers your name and uploads your bundle in one pass.\n\n    [:octicons-arrow-right-24: Deploy Your App](/apps/deploy-your-app/)\n\n-   <span class=\"badge guide\">Guide</span> **List Your App**\n\n    ---\n\n    Once your name resolves, list your Product so others can discover it.\n\n    [:octicons-arrow-right-24: List Your App](/apps/list-your-app/)\n\n-   <span class=\"badge learn\">Learn</span> **dotNS Reference**\n\n    ---\n\n    The name mechanism, PopRules pricing, contract architecture, and transfer model in depth.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#no-allowance-set-for-account", "page_title": "Troubleshooting", "index": 0, "depth": 2, "title": "`no allowance set for account`", "anchor": "no-allowance-set-for-account", "start_char": 1888, "end_char": 3146, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## `no allowance set for account`\n\n**Cause**: [Allowances](/apps/concepts/allowances/) are granted per account. This error means the account that actually signed the request has no allowance — almost always because the allowance was granted to a _different_ account than the one signing. Common ways this happens: you funded a dev key but signed with your phone account (or the reverse), or your Product derived its [per-app account](/apps/concepts/accounts/) under a different `productId` than the one you granted the allowance under (for example, running from `localhost`, which derives under `playground.dot`, versus a `<name>.dot.li` URL, which derives under `<name>.dot`).\n\n**Resolution**:\n\n1. Determine which account actually signs. A Product running inside a Host can read its product account address (SS58 and H160) through the [`signer`](/apps/product-sdk/signer/) package; surface it in your dev UI. See [Accounts and Signing](/apps/concepts/accounts/#see-the-signing-address).\n2. Grant the allowance (or storage authorization) to _that_ account. See [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/).\n3. Keep the `productId` consistent between where you request the allowance and where you sign, so the same account is used throughout."}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#the-app-seems-frozen-after-an-action", "page_title": "Troubleshooting", "index": 1, "depth": 2, "title": "The App Seems Frozen After an Action", "anchor": "the-app-seems-frozen-after-an-action", "start_char": 3146, "end_char": 3792, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The App Seems Frozen After an Action\n\n**Cause**: Signing happens on your phone, and there is no push notification telling you the phone is waiting. After you trigger a signable action, the interface can look stuck while an approval prompt sits unopened in the Polkadot App.\n\n**Resolution**: Open the Polkadot App and check for a pending approval. Approve or reject it there, and the flow continues. When building, show a non-blocking \"check your phone\" state after any signable action rather than a spinner that looks frozen. See [Sign and Submit Transactions](/apps/build/sign-and-submit/) for designing around cross-device signing latency."}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#the-deploy-pauses-for-about-a-minute", "page_title": "Troubleshooting", "index": 2, "depth": 2, "title": "The Deploy Pauses for About a Minute", "anchor": "the-deploy-pauses-for-about-a-minute", "start_char": 3792, "end_char": 4336, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Deploy Pauses for About a Minute\n\n**Cause**: During `playground deploy`, there is a deliberate pause of about 60 seconds between reserving and finalizing your dotNS name. Most of that is the tooling waiting for the commitment to settle; the [dotNS](/apps/register-dot-domain/) contract itself requires only that the commitment be six seconds old. The two-step handshake prevents someone from front-running your name.\n\n**Resolution**: Wait. The deploy is not stuck. The next approval appears in the Polkadot App once the window elapses."}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#short-names-are-not-for-sale", "page_title": "Troubleshooting", "index": 3, "depth": 2, "title": "Short Names Are Not for Sale", "anchor": "short-names-are-not-for-sale", "start_char": 4336, "end_char": 5208, "estimated_token_count": 213, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Short Names Are Not for Sale\n\n**Cause**: Registering a name of eight characters or fewer fails with `Short names are not for sale`. The public registration path that `playground`, `pad`, and the dotNS CLI use sells only names of nine characters or more. The six-to-eight band is closed by a governance switch in `PopRules`, which is off by default, so [Proof of Personhood](/apps/concepts/identity/) does not open it. A name of five characters or fewer stays closed on this path even when the switch is on, because it is reserved for governance. Length is counted as written, so digits do not change which band a name falls in.\n\n**Resolution**: Choose a name of nine characters or more. A name of six to eight characters is available as a personhood or device name, earned in the Polkadot App. See [Register a `.dot` Domain](/apps/register-dot-domain/#choose-a-name)."}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#the-name-is-already-registered", "page_title": "Troubleshooting", "index": 4, "depth": 2, "title": "The Name Is Already Registered", "anchor": "the-name-is-already-registered", "start_char": 5208, "end_char": 5406, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Name Is Already Registered\n\n**Cause**: dotNS names are first come, first served.\n\n**Resolution**: Choose a different name. Re-deploying a name you already own is fine and does not conflict."}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#uploads-are-rejected-or-host-storage-unavailable", "page_title": "Troubleshooting", "index": 5, "depth": 2, "title": "Uploads Are Rejected or `Host storage unavailable`", "anchor": "uploads-are-rejected-or-host-storage-unavailable", "start_char": 5406, "end_char": 6194, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Uploads Are Rejected or `Host storage unavailable`\n\n**Cause**: Two different problems share this symptom. Storing on the Bulletin Chain requires an explicit storage authorization on the signing account — without it, the store is rejected regardless of your token balance. Separately, `Host storage unavailable` means code that needs a Host is running outside one.\n\n**Resolution**: Request a storage authorization for the signing account (see [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/)), and confirm you granted it to the account that actually signs (see the allowance entry above). For `Host storage unavailable`, run your Product inside [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/), or use the SDK's dev and testing paths for out-of-Host development."}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#the-app-does-not-appear-right-after-deploy", "page_title": "Troubleshooting", "index": 6, "depth": 2, "title": "The App Does Not Appear Right After Deploy", "anchor": "the-app-does-not-appear-right-after-deploy", "start_char": 6194, "end_char": 6739, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The App Does Not Appear Right After Deploy\n\n**Cause**: On-chain state takes a short time to propagate after the deploy transaction finalizes, and the web gateway resolves your name through an in-browser light client.\n\n**Resolution**: Wait a few seconds and refresh. A `curl` or script against the gateway URL returns a generic gateway shell, not your app — open it in a real browser to see the resolved Product. If it still does not resolve after a minute, confirm the deploy finalized and check network status with the developer community."}
{"source": "polkadot-docs", "page_id": "apps-troubleshooting", "url": "https://developer.polkadot.com/apps/troubleshooting/#connecting-to-a-chain-throws-outside-a-host", "page_title": "Troubleshooting", "index": 7, "depth": 2, "title": "Connecting to a Chain Throws Outside a Host", "anchor": "connecting-to-a-chain-throws-outside-a-host", "start_char": 6739, "end_char": 7181, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7e928bfcdbafe71a1a6d3c756cf4ea58d9193c79980410219df23ac1e3a03d8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Connecting to a Chain Throws Outside a Host\n\n**Cause**: The [`chain-client`](/apps/product-sdk/chain-client/) routes every connection through the Host and has no direct-WebSocket fallback, so it throws when no Host provider is present.\n\n**Resolution**: Run your Product inside a Host. For out-of-Host development and tests, use the SDK's testing fakes rather than a live connection. See [Read On-Chain Data](/apps/build/read-chain-state/)."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#introduction", "page_title": "Build a Shared Todo App", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 28, "end_char": 3326, "estimated_token_count": 836, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nEach [Build guide](/apps/build/) takes one `product-sdk` capability from zero to working code. This tutorial is the capstone: it combines four of them into one product, a Shared Todo Board where every participant sees changes live and the board survives durably on chain.\n\nWhat you will build, and which package carries each part:\n\n|      Capability      |                  Package                   |                                                     Role in the app                                                     |\n| :------------------: | :----------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: |\n| Identity and signing | `signer` (via the umbrella's `wallet` API) | Connect to the Host and get the account that authors and signs everything                                               |\n| Local persistence    | `local-storage`                            | The board renders instantly from the device's last known state                                                          |\n| Real-time sharing    | `statement-store`                          | Every mutation gossips to other participants as a signed statement                                                      |\n| Durable storage      | `cloud-storage`                            | Snapshots of the board live on the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/), addressable by CID |\n\n![The Shared Todo Board running inside Polkadot Desktop, with the connected account in the header, a synced todo list, and the latest snapshot CID in the footer](/images/apps/tutorials/shared-todo-app/shared-todo-app-01.webp)\n\nThe guides cover the individual calls. This tutorial focuses on how the layers compose. Statements are capped at 512 bytes and expire after 30 seconds, so they carry individual mutations, not the whole board. The Bulletin Chain holds full snapshots, and a last-write-wins channel announces the latest snapshot's CID. This is the same split [Polkadot App](/reference/apps/hosts/polkadot-app/)'s Chat uses: gossip for signaling, Bulletin for content.\n\nThe code here targets `@parity/product-sdk` v0.30.0. It was written against `@parity/product-sdk-statement-store` v0.6.7 and `@parity/product-sdk-cloud-storage` v0.11.1, and every symbol it imports from them is still exported in v0.6.12 and v0.12.2. It needs at least `product-sdk` v0.30.0, the release that takes the Product's identity from the Host, and `statement-store` v0.5.0, which introduced the sponsored host-signing path.\n\n!!! warning \"Upgrading from an SDK before 0.18.0\"\n    Version 0.18.0 moved several calls this app uses from throwing (or returning a bare value) to returning a typed `Result`: `app.cloudStorage.upload` and `.fetch`, `checkAuthorization`, and `StatementStoreClient.publish` and `ChannelStore.write` (previously `Promise<boolean>`). Code written against an earlier release keeps compiling in places but stops working, because a `Result` object is always truthy, so `if (!accepted)` on a publish never fires, and `if (!status.authorized)` always does. The snippets below check `.ok` throughout. If you are porting older code, audit every call site rather than trusting it to fail loudly."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#prerequisites", "page_title": "Build a Shared Todo App", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 3326, "end_char": 3959, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have:\n\n- Node.js 20 or later.\n- Polkadot Desktop installed and paired. See [Install Desktop and Pair](/apps/get-started/).\n- A statement allowance and a Bulletin Chain storage authorization for your wallet account. See [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/) and the [Bulletin Chain authorizations](https://paritytech.github.io/polkadot-bulletin-chain/authorizations) reference. Without the storage authorization, snapshot uploads are rejected.\n- The individual [Build guides](/apps/build/) are optional but helpful because they cover each capability in more depth."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#scaffold-the-project", "page_title": "Build a Shared Todo App", "index": 2, "depth": 2, "title": "Scaffold the Project", "anchor": "scaffold-the-project", "start_char": 3959, "end_char": 8716, "estimated_token_count": 1171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Scaffold the Project\n\nCreate a Next.js app and install the SDK:\n\n```bash\nnpx create-next-app@latest shared-todo-board --typescript --tailwind --eslint --app --no-src-dir\ncd shared-todo-board\nnpm install @parity/product-sdk @parity/product-sdk-statement-store @parity/product-sdk-cloud-storage\n```\n\nThree dependencies, for three reasons:\n\n- **`@parity/product-sdk`**: The umbrella package. It re-exports the wallet, local-storage, and cloud-storage capabilities this app uses, plus the React provider. See [Umbrella or Individual Packages](/apps/build/#umbrella-or-individual-packages) if you would rather install per-capability packages.\n- **`@parity/product-sdk-statement-store`**: The pub/sub client. It is not re-exported by the umbrella, so it is always its own dependency.\n- **`@parity/product-sdk-cloud-storage`**: Installed explicitly because the app imports `CloudStorageClient` and `getBulletinAllowanceStatus` directly for its allowance pre-flight; relying on the umbrella's transitive copy would depend on npm hoisting.\n\n!!! note \"If the build fails on `@polkadot-api/json-rpc-provider`\"\n    Earlier SDK releases had transitive dependencies pinning `@polkadot-api/json-rpc-provider@0.0.1`, which npm hoisted to the top of `node_modules` and broke the build. The current dependency tree resolves `0.2.0` throughout, so no workaround should be needed. If you do hit it, declare `@polkadot-api/json-rpc-provider@^0.2.0` as a direct dependency to force the resolution — no `overrides` or patching required.\n\nWrap the app in `ProductSDKProvider` so every component can reach the SDK through `useProductSDK()`:\n\n```tsx title=\"app/providers.tsx\"\n'use client';\n\nimport { ProductSDKProvider } from '@parity/product-sdk/react';\nimport type { ReactNode } from 'react';\n\nexport function Providers({ children }: { children: ReactNode }) {\n  return (\n    <ProductSDKProvider\n      fallback={<div className=\"p-6 font-mono text-sm\">Initializing SDK…</div>}\n    >\n      {children}\n    </ProductSDKProvider>\n  );\n}\n\n```\n\nThen mount it in the root layout. The inline script is a Polkadot Desktop workaround: it sets the host webview mark synchronously, so the SDK's container detection returns true before its bundle evaluates. It forces host mode unconditionally, which is acceptable here because every capability in this app needs the Host anyway. Drop the line if you want honest container detection — for a Product that renders a useful \"open me in a Host\" state instead of failing, say — but note that nothing in this app functions outside one:\n\n```tsx title=\"app/layout.tsx\"\nimport type { Metadata } from 'next';\nimport { Geist, Geist_Mono } from 'next/font/google';\nimport { Providers } from './providers';\nimport './globals.css';\n\nconst geistSans = Geist({\n  variable: '--font-geist-sans',\n  subsets: ['latin'],\n});\n\nconst geistMono = Geist_Mono({\n  variable: '--font-geist-mono',\n  subsets: ['latin'],\n});\n\nexport const metadata: Metadata = {\n  title: 'Shared Todo Board',\n  description: 'Build a Full Product tutorial companion app',\n};\n\nexport default function RootLayout({\n  children,\n}: Readonly<{\n  children: React.ReactNode;\n}>) {\n  return (\n    <html\n      lang=\"en\"\n      className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}\n    >\n      <body className=\"min-h-full flex flex-col\">\n        {/* Sets the mark synchronously so isWebview() returns true before the SDK bundle evaluates */}\n        <script\n          dangerouslySetInnerHTML={{\n            __html: 'window.__HOST_WEBVIEW_MARK__=true;',\n          }}\n        />\n        <Providers>{children}</Providers>\n      </body>\n    </html>\n  );\n}\n\n```\n\nAll SDK logic in this tutorial lives in a `lib/` directory, one file per capability, so each section that follows is one focused module. Start with the shared types: a `Todo` carries its author and an `updatedAt` timestamp, and the timestamps are what every later layer uses to resolve conflicts.\n\n```typescript title=\"lib/types.ts\"\nimport type { useProductSDK } from '@parity/product-sdk/react';\n\n/** The SDK App instance, as returned by useProductSDK(). */\nexport type App = ReturnType<typeof useProductSDK>;\n\n/** A single todo on the shared board. */\nexport interface Todo {\n  id: string;\n  text: string;\n  done: boolean;\n  /** SS58 address of the participant who created the todo. */\n  author: string;\n  /** Milliseconds since epoch of the last mutation. */\n  updatedAt: number;\n}\n\n/** The full board state — synced per todo (last write wins), never broadcast whole. */\nexport interface Board {\n  todos: Todo[];\n  /** Timestamp of the latest mutation; receivers keep the newest board. */\n  updatedAt: number;\n  /** CID of the latest Bulletin Chain snapshot, if one has been saved. */\n  snapshotCid?: string;\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#connect-and-get-an-identity", "page_title": "Build a Shared Todo App", "index": 3, "depth": 2, "title": "Connect and Get an Identity", "anchor": "connect-and-get-an-identity", "start_char": 8716, "end_char": 11277, "estimated_token_count": 581, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Connect and Get an Identity\n\nThe app publishes todos, statements, and snapshots, and each item is attributed to an account, so identity comes first. `connectIdentity` connects to the Host, selects the first available account, and prefers the product-scoped account when the Host provides one:\n\n```typescript title=\"lib/signer.ts\"\nimport type { App } from './types';\n\n/** Identity for the current participant on the board. */\nexport interface BoardIdentity {\n  /** SS58 address used as the todo author and signing identity. */\n  address: string;\n  /** Display name reported by the provider, if any. */\n  name?: string;\n  /** True when the address is a product-scoped account from the host. */\n  isProductAccount: boolean;\n}\n\n/**\n * Connect to the host, select the first available account, and resolve the\n * identity used for the board. Prefers the product-scoped account when the\n * app runs inside a host container; falls back to the selected account.\n */\nexport async function connectIdentity(app: App): Promise<BoardIdentity> {\n  const { accounts } = await app.wallet.connect();\n  if (accounts.length === 0) {\n    throw new Error('No accounts available from the host');\n  }\n\n  if (!app.wallet.getSelectedAccount()) {\n    app.wallet.selectAccount(accounts[0].address);\n  }\n\n  const productAccount = app.wallet.getProductAccount();\n  if (productAccount) {\n    return {\n      address: productAccount.address,\n      name: productAccount.name,\n      isProductAccount: true,\n    };\n  }\n\n  const selected = app.wallet.getSelectedAccount() ?? accounts[0];\n  return {\n    address: selected.address,\n    name: selected.name,\n    isProductAccount: false,\n  };\n}\n\n```\n\nThe product account is a per-Product, privacy-preserving identity derived by the Host. See [Sign and Submit Transactions](/apps/build/sign-and-submit/) for how derivation and approval routing work. Outside a host container, `connect()` fails, which the page surfaces as an error banner; there is deliberately no fallback path here because every later capability needs the Host anyway.\n\n!!! note \"If Connect reports no accounts\"\n    `connectIdentity` throws `No accounts available from the host` when `connect()` succeeds but hands back an empty list. That is a real outcome, not a bug: the Host derives the account from the product ID it loaded the app under, and if it declines to derive one (for example, because you are signed out of Polkadot Desktop), you get zero accounts and no error. See [A Minimal Product](/apps/product-sdk/#a-minimal-product) for the same trap on the `createApp` path."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#keep-state-on-the-device", "page_title": "Build a Shared Todo App", "index": 4, "depth": 2, "title": "Keep State on the Device", "anchor": "keep-state-on-the-device", "start_char": 11277, "end_char": 12908, "estimated_token_count": 387, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Keep State on the Device\n\nThe board should render instantly on launch before the Host connection and before any network. `local-storage` gives each Product an isolated key-value store on the device, so the whole persistence layer is one key:\n\n```typescript title=\"lib/board.ts\"\nimport type { App, Board, Todo } from './types';\n\nconst BOARD_KEY = 'board';\n\nexport function emptyBoard(): Board {\n  return { todos: [], updatedAt: 0 };\n}\n\n/** Load the board from per-product local storage (null if never saved). */\nexport async function loadBoard(app: App): Promise<Board | null> {\n  return app.localStorage.getJSON<Board>(BOARD_KEY);\n}\n\n/** Persist the board to per-product local storage. */\nexport async function saveBoard(app: App, board: Board): Promise<void> {\n  await app.localStorage.setJSON(BOARD_KEY, board);\n}\n\n/** Create a new todo authored by the given account address. */\nexport function createTodo(text: string, author: string): Todo {\n  return {\n    id: crypto.randomUUID(),\n    text,\n    done: false,\n    author,\n    updatedAt: Date.now(),\n  };\n}\n\n```\n\nThe `getJSON` and `setJSON` helpers handle serialization, and the SDK namespaces keys per Product automatically, so no prefixing is needed. The store is backed by the Host — there is no browser `localStorage` fallback, so these calls only work inside a container. See [Persist Data Locally](/apps/build/persist-data-locally/).\n\nNote what this file _does not_ contain: mutation logic. Adding, toggling, and deleting todos are defined in the next section as events, so that a change made locally and a change arriving from the network flow through identical code."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#share-the-board-in-real-time", "page_title": "Build a Shared Todo App", "index": 5, "depth": 2, "title": "Share the Board in Real Time", "anchor": "share-the-board-in-real-time", "start_char": 12908, "end_char": 17622, "estimated_token_count": 1103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Share the Board in Real Time\n\nThe [Statement Store](/reference/apps/infrastructure/statement-store/) gossips small signed payloads between instances of your Product. See [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/) for the full model. Two of its limits shape this app's protocol:\n\n- The whole board does not fit inside the 512-byte statement cap, so each statement carries one mutation: an upsert of a single todo, or a deletion.\n- Statements have a 30-second TTL. They are signaling, not storage. A participant who joins late sees nothing until the next mutation; that gap is closed by the durable snapshots in the next section.\n\n??? code \"lib/sync.ts\"\n    ```typescript title=\"lib/sync.ts\"\n    import {\n      StatementStoreClient,\n      type Unsubscribable,\n    } from '@parity/product-sdk-statement-store';\n    import type { Board, Todo } from './types';\n    \n    /** Hashed with blake2b as the primary statement topic — scopes gossip to this app. */\n    const APP_NAME = 'shared-todo-board';\n    \n    /**\n     * One board mutation, published as a single statement.\n     * Statements are capped at 512 bytes, so we broadcast per-todo events\n     * rather than the whole board.\n     */\n    export type BoardEvent =\n      | { kind: 'upsert'; todo: Todo }\n      | { kind: 'delete'; id: string; updatedAt: number };\n    \n    /** Event for a toggled todo. */\n    export function toggleEvent(todo: Todo): BoardEvent {\n      return {\n        kind: 'upsert',\n        todo: { ...todo, done: !todo.done, updatedAt: Date.now() },\n      };\n    }\n    \n    /** Event removing a todo. */\n    export function deleteEvent(todo: Todo): BoardEvent {\n      return { kind: 'delete', id: todo.id, updatedAt: Date.now() };\n    }\n    \n    /**\n     * Connect a statement store client. In host mode the Host signs each statement\n     * with the Product's allowance account, so no account is passed in.\n     */\n    export async function createSyncClient(): Promise<StatementStoreClient> {\n      const client = new StatementStoreClient({ appName: APP_NAME });\n      await client.connect({ mode: 'host' });\n      return client;\n    }\n    \n    /**\n     * Broadcast a mutation to every other participant. Resolves with a `Result`:\n     * check `.ok` — a rejected statement carries the reason on `.error`.\n     */\n    export function publishEvent(client: StatementStoreClient, event: BoardEvent) {\n      return client.publish<BoardEvent>(event);\n    }\n    \n    /** Receive mutations from other participants (and replays of our own). */\n    export function subscribeToBoard(\n      client: StatementStoreClient,\n      onEvent: (event: BoardEvent) => void,\n    ): Unsubscribable {\n      return client.subscribe<BoardEvent>((statement) => {\n        if (statement.data && 'kind' in statement.data) {\n          onEvent(statement.data);\n        }\n      });\n    }\n    \n    /**\n     * Merge an incoming event into the board — last write wins per todo,\n     * compared by `updatedAt`. Idempotent, so replayed statements are harmless.\n     */\n    export function applyEvent(board: Board, event: BoardEvent): Board {\n      if (event.kind === 'delete') {\n        const existing = board.todos.find((t) => t.id === event.id);\n        if (!existing || existing.updatedAt > event.updatedAt) return board;\n        return {\n          ...board,\n          todos: board.todos.filter((t) => t.id !== event.id),\n          updatedAt: Math.max(board.updatedAt, event.updatedAt),\n        };\n      }\n    \n      const incoming: Todo = event.todo;\n      const existing = board.todos.find((t) => t.id === incoming.id);\n      if (existing && existing.updatedAt >= incoming.updatedAt) return board;\n    \n      const todos = existing\n        ? board.todos.map((t) => (t.id === incoming.id ? incoming : t))\n        : [...board.todos, incoming];\n      return {\n        ...board,\n        todos,\n        updatedAt: Math.max(board.updatedAt, incoming.updatedAt),\n      };\n    }\n    \n    ```\n\nThe pieces:\n\n- **`createSyncClient`**: Connects a `StatementStoreClient` in host mode. The `appName` is hashed into the statement topic, so instances of this Product only see each other's traffic. Host mode takes no account: since `statement-store` v0.5.0 the Host signs each statement itself, through the sponsored path, using the Product's allowance account. Older examples pass an `accountId` to `connect()`; it is accepted for compatibility and ignored.\n\n- **`publishEvent` / `subscribeToBoard`**: Thin typed wrappers over `publish` and `subscribe`.\n- **`applyEvent`**: The merge rule: per-todo last write wins, compared by `updatedAt`. It is idempotent, so replayed statements (including your own, which the node echoes back) are harmless no-ops."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#make-the-board-durable", "page_title": "Build a Shared Todo App", "index": 6, "depth": 2, "title": "Make the Board Durable", "anchor": "make-the-board-durable", "start_char": 17622, "end_char": 26548, "estimated_token_count": 1858, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Make the Board Durable\n\nStatements vanish after 30 seconds; the board should not. The [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/) stores content-addressed data on chain: upload bytes, get back a CID, and fetch by CID from anywhere. The app uploads the whole board as a JSON snapshot, then announces the CID on a last-write-wins channel so every participant knows where the freshest snapshot lives. Announcements are published with a one-hour TTL because the default 30 seconds would make the board undiscoverable almost immediately. A participant who joins within that window receives the latest live announcement on subscribe and loads the board from the Bulletin Chain; beyond it, the board appears once any participant saves again:\n\n??? code \"lib/snapshot.ts\"\n    ```typescript title=\"lib/snapshot.ts\"\n    import {\n      ChannelStore,\n      type StatementStoreClient,\n      type Unsubscribable,\n    } from '@parity/product-sdk-statement-store';\n    import type { App, Board } from './types';\n    \n    const SNAPSHOT_CHANNEL = 'board-snapshot';\n    \n    /**\n     * Statements default to a 30-second TTL — far too short for late joiners to\n     * discover the board. Announcements request a one-hour retention instead\n     * (the pallet caps the maximum); beyond that window a new participant sees\n     * an empty board until the next save.\n     */\n    const SNAPSHOT_TTL_SECONDS = 3600;\n    \n    let authorizationVerified = false;\n    \n    /**\n     * Pre-flight: verify the signing account can store to the Bulletin Chain right\n     * now. Without a live allowance the chain rejects uploads with a bare\n     * `Invalid: Payment` — this turns that into an actionable error.\n     *\n     * `getBulletinAllowanceStatus` adds one `System.Number` read on top of\n     * `checkAuthorization` and derives `usable`, which is true only when the\n     * account is authorized, the authorization has not expired, and quota remains.\n     * Checking `authorized` alone would pass an expired or exhausted allowance.\n     */\n    async function ensureAuthorized(app: App, byteLength: number): Promise<void> {\n      if (authorizationVerified) return;\n      const address = app.wallet.getSelectedAccount()?.address;\n      if (!address) throw new Error('No account selected');\n    \n      const { CloudStorageClient, createLazySigner, getBulletinAllowanceStatus } =\n        await import('@parity/product-sdk-cloud-storage');\n      const readOnly = await CloudStorageClient.create({\n        environment: 'paseo',\n        signer: createLazySigner(() => null, 'read-only client'),\n      });\n    \n      const status = await getBulletinAllowanceStatus(readOnly.api, address);\n      if (!status.ok) {\n        throw new Error(\n          `Could not read the storage allowance: ${status.error.message}`,\n        );\n      }\n      if (!status.value.usable) {\n        throw new Error(\n          `Account ${address} has no usable Bulletin Chain allowance (authorized: ${status.value.authorized}, blocks left: ${status.value.remainingBlocks}) — request one, then retry`,\n        );\n      }\n      // `usable` does not size-check the payload; the chain rejects an oversized store.\n      if (status.value.remainingBytes < BigInt(byteLength)) {\n        throw new Error(\n          `Snapshot is ${byteLength} bytes but only ${status.value.remainingBytes} remain in the allowance`,\n        );\n      }\n      authorizationVerified = true;\n    }\n    \n    /**\n     * Announcement of the latest durable snapshot, written to a last-write-wins\n     * channel. The board itself lives on the Bulletin Chain; only its CID travels\n     * through the statement store, which keeps the payload well under 512 bytes.\n     */\n    export interface SnapshotAnnouncement {\n      cid: string;\n      /** Board.updatedAt at the time of the snapshot. */\n      updatedAt: number;\n      /** Stamped by ChannelStore when omitted. */\n      timestamp?: number;\n    }\n    \n    /** Upload the board as JSON to the Bulletin Chain. Returns the CID. */\n    export async function uploadSnapshot(app: App, board: Board): Promise<string> {\n      if (!app.cloudStorage) {\n        throw new Error('Cloud storage is disabled for this app');\n      }\n      const payload = JSON.stringify(board);\n      await ensureAuthorized(app, new TextEncoder().encode(payload).length);\n      const stored = await app.cloudStorage.upload(payload);\n      if (!stored.ok) {\n        throw new Error(`Snapshot upload failed: ${stored.error.message}`);\n      }\n      return stored.value;\n    }\n    \n    /** Fetch and decode a board snapshot by CID. */\n    export async function fetchSnapshot(app: App, cid: string): Promise<Board> {\n      if (!app.cloudStorage) {\n        throw new Error('Cloud storage is disabled for this app');\n      }\n      const fetched = await app.cloudStorage.fetch(cid);\n      if (!fetched.ok) {\n        throw new Error(`Could not fetch snapshot ${cid}: ${fetched.error.message}`);\n      }\n      return JSON.parse(new TextDecoder().decode(fetched.value)) as Board;\n    }\n    \n    /** Create the snapshot-announcement channel on top of the sync client. */\n    export function createSnapshotChannel(\n      client: StatementStoreClient,\n    ): ChannelStore<SnapshotAnnouncement> {\n      return new ChannelStore<SnapshotAnnouncement>(client);\n    }\n    \n    /**\n     * Announce a new snapshot CID to every participant. Published directly\n     * through the client (not ChannelStore.write) so the statement can carry a\n     * long TTL — late joiners receive the latest live announcement on subscribe.\n     */\n    export function announceSnapshot(\n      client: StatementStoreClient,\n      cid: string,\n      updatedAt: number,\n    ) {\n      return client.publish<SnapshotAnnouncement>(\n        { cid, updatedAt, timestamp: Date.now() },\n        { channel: SNAPSHOT_CHANNEL, ttlSeconds: SNAPSHOT_TTL_SECONDS },\n      );\n    }\n    \n    /**\n     * React to snapshot announcements — including the replay a late joiner\n     * receives on subscribe. The app only uses one channel, so no name filtering\n     * is needed.\n     */\n    export function onSnapshotAnnounced(\n      channels: ChannelStore<SnapshotAnnouncement>,\n      callback: (announcement: SnapshotAnnouncement) => void,\n    ): Unsubscribable {\n      return channels.onChange((_name, value) => callback(value));\n    }\n    \n    /**\n     * Merge a snapshot into the local board — per-todo last write wins, same rule\n     * as live sync. Union by id, so todos deleted after the snapshot was taken\n     * can reappear; the next snapshot clears them again.\n     */\n    export function mergeBoards(local: Board, remote: Board): Board {\n      const byId = new Map(local.todos.map((t) => [t.id, t]));\n      for (const todo of remote.todos) {\n        const existing = byId.get(todo.id);\n        if (!existing || todo.updatedAt > existing.updatedAt) {\n          byId.set(todo.id, todo);\n        }\n      }\n      return {\n        todos: [...byId.values()],\n        updatedAt: Math.max(local.updatedAt, remote.updatedAt),\n        snapshotCid:\n          remote.updatedAt > local.updatedAt\n            ? (remote.snapshotCid ?? local.snapshotCid)\n            : local.snapshotCid,\n      };\n    }\n    \n    ```\n\nThe pieces:\n\n- **`uploadSnapshot` / `fetchSnapshot`**: Use `app.cloudStorage` from the umbrella. `upload` signs and submits the storage transaction through the Host and resolves with the CID; `fetch` is permissionless. [Store Data on Chain](/apps/build/store-data-on-chain/) covers chunking, renewal, and the lower-level client.\n- **`ensureAuthorized`**: A pre-flight that runs before every upload, turning a missing [storage allowance](https://paritytech.github.io/polkadot-bulletin-chain/authorizations) into an actionable error instead of a bare on-chain rejection. It uses `getBulletinAllowanceStatus`, which costs one extra block read over `checkAuthorization` and derives `usable` — authorized, unexpired, and with quota left. Checking `authorized` alone would wave through an expired or exhausted allowance. Because `usable` does not know your payload size, the function also compares `remainingBytes` against the encoded snapshot.\n- **`announceSnapshot` / `onSnapshotAnnounced`**: Use the statement store's channel mechanism. Each channel keeps only its latest value per signer (one live announcement per account; `receiveSnapshot` reconciles announcements from different participants by `updatedAt`). Publishing goes through `client.publish` directly rather than `ChannelStore.write` so the statement can carry the long TTL; receiving still uses `ChannelStore`, which replays the latest live value to new subscribers. The announcement is `{ cid, updatedAt }`, comfortably inside the 512-byte cap. This is the composition the platform recommends: the channel is the index, the Bulletin Chain is the data.\n- **`mergeBoards`**: Folds a fetched snapshot into local state with the same per-todo last-write-wins rule as live sync."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#wire-up-the-page", "page_title": "Build a Shared Todo App", "index": 7, "depth": 2, "title": "Wire Up the Page", "anchor": "wire-up-the-page", "start_char": 26548, "end_char": 36566, "estimated_token_count": 2163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Wire Up the Page\n\nThe UI is a single client component. All the SDK behavior you have built lives in `lib/`; the page wires it to React state. The two functions worth reading closely are `dispatch` (apply a local mutation, persist it, broadcast it) and `receiveEvent` (apply a remote mutation through the _same_ merge), plus `handleSaveBoard` and `receiveSnapshot` doing the equivalent pair for snapshots:\n\n??? code \"app/page.tsx\"\n    ```tsx title=\"app/page.tsx\"\n    'use client';\n    \n    import { useEffect, useRef, useState } from 'react';\n    import { useProductSDK } from '@parity/product-sdk/react';\n    import type {\n      ChannelStore,\n      StatementStoreClient,\n    } from '@parity/product-sdk-statement-store';\n    import { connectIdentity, type BoardIdentity } from '@/lib/signer';\n    import { createTodo, emptyBoard, loadBoard, saveBoard } from '@/lib/board';\n    import {\n      applyEvent,\n      createSyncClient,\n      deleteEvent,\n      publishEvent,\n      subscribeToBoard,\n      toggleEvent,\n      type BoardEvent,\n    } from '@/lib/sync';\n    import {\n      announceSnapshot,\n      createSnapshotChannel,\n      fetchSnapshot,\n      mergeBoards,\n      onSnapshotAnnounced,\n      uploadSnapshot,\n      type SnapshotAnnouncement,\n    } from '@/lib/snapshot';\n    import type { Board, Todo } from '@/lib/types';\n    \n    function shortAddress(address: string): string {\n      return `${address.slice(0, 6)}…${address.slice(-6)}`;\n    }\n    \n    export default function Home() {\n      const app = useProductSDK();\n      const [identity, setIdentity] = useState<BoardIdentity | null>(null);\n      const [connecting, setConnecting] = useState(false);\n      const [error, setError] = useState<string | null>(null);\n      const [board, setBoard] = useState<Board | null>(null);\n      const [draft, setDraft] = useState('');\n      const [live, setLive] = useState(false);\n      const [saving, setSaving] = useState(false);\n      const syncRef = useRef<StatementStoreClient | null>(null);\n      const channelsRef = useRef<ChannelStore<SnapshotAnnouncement> | null>(null);\n      const boardRef = useRef<Board | null>(null);\n    \n      // Load whatever this device last saw, before any host interaction\n      useEffect(() => {\n        loadBoard(app).then((stored) => setBoard(stored ?? emptyBoard()));\n      }, [app]);\n    \n      useEffect(() => {\n        boardRef.current = board;\n      }, [board]);\n    \n      useEffect(() => {\n        return () => syncRef.current?.destroy();\n      }, []);\n    \n      /** Merge an event into local state and persist the result. */\n      function receiveEvent(event: BoardEvent) {\n        setBoard((prev) => {\n          if (!prev) return prev;\n          const next = applyEvent(prev, event);\n          if (next !== prev) void saveBoard(app, next);\n          return next;\n        });\n      }\n    \n      /** Apply a local mutation and broadcast it to other participants. */\n      function dispatch(event: BoardEvent) {\n        receiveEvent(event);\n        const client = syncRef.current;\n        if (client) {\n          publishEvent(client, event).then((result) => {\n            if (!result.ok) setError(`Statement rejected: ${result.error.message}`);\n          });\n        }\n      }\n    \n      /** Pull a newer snapshot from the Bulletin Chain and merge it in. */\n      async function receiveSnapshot(announcement: SnapshotAnnouncement) {\n        const current = boardRef.current;\n        if (!current) return;\n        if (announcement.updatedAt <= current.updatedAt && current.snapshotCid)\n          return;\n        try {\n          const remote = await fetchSnapshot(app, announcement.cid);\n          remote.snapshotCid = announcement.cid;\n          setBoard((prev) => {\n            if (!prev) return prev;\n            const next = mergeBoards(prev, remote);\n            void saveBoard(app, next);\n            return next;\n          });\n        } catch (e) {\n          setError(e instanceof Error ? e.message : String(e));\n        }\n      }\n    \n      async function handleConnect() {\n        setConnecting(true);\n        setError(null);\n        try {\n          const id = await connectIdentity(app);\n          setIdentity(id);\n          const client = await createSyncClient();\n          syncRef.current = client;\n          subscribeToBoard(client, receiveEvent);\n          const channels = createSnapshotChannel(client);\n          channelsRef.current = channels;\n          onSnapshotAnnounced(\n            channels,\n            (announcement) => void receiveSnapshot(announcement),\n          );\n          setLive(true);\n        } catch (e) {\n          setError(e instanceof Error ? e.message : String(e));\n        } finally {\n          setConnecting(false);\n        }\n      }\n    \n      async function handleSaveBoard() {\n        const client = syncRef.current;\n        if (!board || !client) return;\n        setSaving(true);\n        setError(null);\n        try {\n          const cid = await uploadSnapshot(app, board);\n          await announceSnapshot(client, cid, board.updatedAt);\n          setBoard((prev) => {\n            if (!prev) return prev;\n            const next = { ...prev, snapshotCid: cid };\n            void saveBoard(app, next);\n            return next;\n          });\n        } catch (e) {\n          setError(e instanceof Error ? e.message : String(e));\n        } finally {\n          setSaving(false);\n        }\n      }\n    \n      function handleAdd(e: React.FormEvent) {\n        e.preventDefault();\n        if (!identity || !draft.trim()) return;\n        dispatch({\n          kind: 'upsert',\n          todo: createTodo(draft.trim(), identity.address),\n        });\n        setDraft('');\n      }\n    \n      function handleToggle(todo: Todo) {\n        dispatch(toggleEvent(todo));\n      }\n    \n      function handleRemove(todo: Todo) {\n        dispatch(deleteEvent(todo));\n      }\n    \n      return (\n        <main className=\"flex flex-1 flex-col mx-auto w-full max-w-2xl p-6 gap-6\">\n          <header className=\"flex items-center justify-between border-b border-foreground/10 pb-4\">\n            <div className=\"flex items-center gap-3\">\n              <h1 className=\"text-2xl font-semibold\">Shared Todo Board</h1>\n              {live && (\n                <span className=\"rounded-full bg-green-500/15 px-2 py-0.5 text-xs text-green-600\">\n                  live\n                </span>\n              )}\n            </div>\n            {identity ? (\n              <div className=\"text-right text-sm\">\n                <p className=\"font-mono\">{shortAddress(identity.address)}</p>\n                <p className=\"text-xs opacity-60\">\n                  {identity.isProductAccount\n                    ? 'product account'\n                    : (identity.name ?? 'account')}\n                </p>\n              </div>\n            ) : (\n              <button\n                onClick={handleConnect}\n                disabled={connecting}\n                className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background disabled:opacity-50\"\n              >\n                {connecting ? 'Connecting…' : 'Connect'}\n              </button>\n            )}\n          </header>\n    \n          {error && (\n            <p className=\"rounded-lg bg-red-500/10 p-3 text-sm text-red-500\">\n              {error}\n            </p>\n          )}\n    \n          <form onSubmit={handleAdd} className=\"flex gap-2\">\n            <input\n              value={draft}\n              onChange={(e) => setDraft(e.target.value)}\n              placeholder={identity ? 'Add a todo…' : 'Connect to add todos'}\n              disabled={!identity || !board}\n              className=\"flex-1 rounded-lg border border-foreground/15 bg-transparent px-3 py-2 text-sm outline-none focus:border-foreground/40 disabled:opacity-50\"\n            />\n            <button\n              type=\"submit\"\n              disabled={!identity || !board || !draft.trim()}\n              className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background disabled:opacity-50\"\n            >\n              Add\n            </button>\n          </form>\n    \n          {board && board.todos.length === 0 && (\n            <p className=\"text-sm opacity-60\">No todos yet. Add the first one.</p>\n          )}\n    \n          <ul className=\"flex flex-col gap-2\">\n            {board?.todos.map((todo) => (\n              <li\n                key={todo.id}\n                className=\"flex items-center gap-3 rounded-lg border border-foreground/10 px-3 py-2\"\n              >\n                <input\n                  type=\"checkbox\"\n                  checked={todo.done}\n                  onChange={() => handleToggle(todo)}\n                  className=\"size-4 accent-foreground\"\n                />\n                <span\n                  className={`flex-1 text-sm ${todo.done ? 'line-through opacity-50' : ''}`}\n                >\n                  {todo.text}\n                </span>\n                <span className=\"font-mono text-xs opacity-40\">\n                  {shortAddress(todo.author)}\n                </span>\n                <button\n                  onClick={() => handleRemove(todo)}\n                  className=\"text-xs opacity-40 hover:opacity-100\"\n                  aria-label={`Delete ${todo.text}`}\n                >\n                  ✕\n                </button>\n              </li>\n            ))}\n          </ul>\n    \n          <footer className=\"mt-auto flex items-center justify-between border-t border-foreground/10 pt-4\">\n            <p className=\"font-mono text-xs opacity-40\">\n              {board?.snapshotCid\n                ? `snapshot: ${board.snapshotCid}`\n                : 'no snapshot yet'}\n            </p>\n            <button\n              onClick={handleSaveBoard}\n              disabled={!live || !board || saving}\n              className=\"rounded-lg border border-foreground/20 px-4 py-2 text-sm font-medium disabled:opacity-50\"\n            >\n              {saving ? 'Saving…' : 'Save board'}\n            </button>\n          </footer>\n        </main>\n      );\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#run-it", "page_title": "Build a Shared Todo App", "index": 8, "depth": 2, "title": "Run It", "anchor": "run-it", "start_char": 36566, "end_char": 37467, "estimated_token_count": 221, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run It\n\nStart the dev server and load the Product in Polkadot Desktop (per [Set Up Your Project](/apps/build/#set-up-your-project)):\n\n```bash\nnpm run dev\n```\n\nThen walk the same checks this tutorial's reference app was verified with:\n\n1. **Identity**: Click **Connect**; your account address appears in the header and a green live badge confirms the statement subscription.\n2. **Local persistence**: Add todos, reload the page, and the board comes back instantly from device storage.\n3. **Real-time sync**: Open the Product in a second host client and connect; a todo added in one appears in the other within a couple of seconds.\n4. **Durability**: Click **Save board**; after the signing approval, the snapshot CID appears in the footer. Connect a third client with no local state within the announcement's one-hour TTL: it receives the announced CID and loads the board from the Bulletin Chain."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#ship-it", "page_title": "Build a Shared Todo App", "index": 9, "depth": 2, "title": "Ship It", "anchor": "ship-it", "start_char": 37467, "end_char": 37880, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ship It\n\nThe board runs from `localhost` inside your host container. The remaining step is making it a real, discoverable Product. [Deploy Your App](/apps/deploy-your-app/) walks through bundling, publishing, and registering a dotNS name for it. Once it is live, the same bundle opens in Polkadot Desktop and on [Polkadot Web](/reference/apps/hosts/polkadot-web/) at `https://<name>.paseo.li` in any browser."}
{"source": "polkadot-docs", "page_id": "apps-tutorials-shared-todo-app", "url": "https://developer.polkadot.com/apps/tutorials/shared-todo-app/#where-to-go-next", "page_title": "Build a Shared Todo App", "index": 10, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 37880, "end_char": 39209, "estimated_token_count": 378, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1a76927767b0f10f997b2a491535c62ac034d26902c9c1ccb5ec68ee67d93240", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nEach capability this tutorial composed has a guide that owns the depth:\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> **Sign and Submit Transactions**\n\n    ---\n\n    Product accounts, raw-byte signing, full transaction submission, and error handling.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/sign-and-submit/)\n\n-   <span class=\"badge guide\">Guide</span> **Persist Data Locally**\n\n    ---\n\n    The local key-value store in depth: JSON helpers, React hooks, prefixes.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/persist-data-locally/)\n\n-   <span class=\"badge guide\">Guide</span> **Publish and Subscribe to Off-Chain Data**\n\n    ---\n\n    Statement Store internals: topics, channels, TTLs, and allowances.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/pub-sub-off-chain-data/)\n\n-   <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    Bulletin Chain in depth: chunking, authorization, and renewal.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/store-data-on-chain/)\n\n-   <span class=\"badge guide\">Guide</span> **Read On-Chain Data**\n\n    ---\n\n    The one capability this app did not need: typed, host-routed chain reads.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/read-chain-state/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#before-you-update-the-mobile-app", "page_title": "apps-updates-2026-09-devnet-update", "index": 0, "depth": 2, "title": "Before you update the mobile app", "anchor": "before-you-update-the-mobile-app", "start_char": 660, "end_char": 2162, "estimated_token_count": 383, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Before you update the mobile app\n\nThe update needs a fresh account, so the app must not restore your old one from\nthe cloud backup. Your `.dot` domains stay with the old account, and its\nrecovery phrase is the only way to keep managing them once you have a new one.\nDo these steps **in this order**, before installing the new build:\n\n1. **Write down your recovery phrase.** In the app, open **Settings → Security\n   & privacy → Backup → View recovery phrase**. Skip this only if you have no\n   published `.dot` domain you care about.\n2. **Delete your cloud backup.** Shake your phone to open the\n   [debug menu](../using-the-app/back-up-your-account.md#the-hidden-debug-menu) and\n   tap **Clear backup**. With the backup gone, the reinstalled app lets you\n   create a new account instead of restoring the old one.\n3. **Uninstall the app.**\n4. **Reinstall it** from the links under [Get the update](#get-the-update).\n\n!!! danger \"Phrase first, then clear\"\n    Clearing the backup before you have written the phrase down loses the old\n    account, and every `.dot` domain it owns, for good.\n\nYour `.dot` names are tied to the account behind that recovery phrase. Restore\nfrom the same phrase after reinstalling and you keep them. Create a fresh\naccount instead and the names stay with the old one. To keep managing a domain\nfrom the old account, import its phrase into the `dotns` CLI with\n`dotns auth set` as described in\n[Register a .dot domain](../build/register-a-dot-name.md#set-up-an-account)."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#whats-changing", "page_title": "apps-updates-2026-09-devnet-update", "index": 1, "depth": 2, "title": "What's changing", "anchor": "whats-changing", "start_char": 2162, "end_char": 3178, "estimated_token_count": 239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## What's changing\n\nFour platform changes drive the update:\n\n- **Stronger chat encryption.** Chat encryption moves from P-256 to X25519, a\n  modern elliptic curve built for fast, lightweight key exchange. Keys in the\n  old format cannot be converted, which is why contacts and messages start\n  fresh. See [Messaging & calls](../architecture/messaging.md#encryption).\n- **Cleaner personhood pseudonyms.** The cryptographic context behind your\n  pseudonym is updated, which is why you create a new username. See\n  [Identity & personhood](../architecture/identity.md).\n- **A fixed contract registry.** The CDM registry is redeployed at a new\n  address to resolve a failure when publishing a brand-new contract name. What\n  developers must do is under [Tooling updates](#tooling-updates).\n- **A new DotNS deployment.** The `.dot` name system moves to a new set of\n  contracts. Registered names carry over. See\n  [Check your published apps](#check-your-published-apps) and\n  [Naming (DotNS)](../architecture/naming.md)."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#desktop-app", "page_title": "apps-updates-2026-09-devnet-update", "index": 2, "depth": 3, "title": "Desktop app", "anchor": "desktop-app", "start_char": 3178, "end_char": 3345, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Desktop app\n\n- Audio and video calls. Until now the desktop app only offered *Open Mobile\n  App to call*.\n- Chat search across chats, contacts, and message text."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#mobile-apps", "page_title": "apps-updates-2026-09-devnet-update", "index": 3, "depth": 3, "title": "Mobile apps", "anchor": "mobile-apps", "start_char": 3345, "end_char": 3692, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Mobile apps\n\n- Chat search\n- New tab bar UI\n- General UI / UX improvements\n- Reply to a transfer inside chat\n- Improved multimedia download in chat\n- Audio-device picker for calls\n- Registration queue explainers and per-operation progress states\n- Improved error messaging\n- Coinage management improvements (durability layer)\n- Improved PGAS"}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#get-the-update", "page_title": "apps-updates-2026-09-devnet-update", "index": 4, "depth": 2, "title": "Get the update", "anchor": "get-the-update", "start_char": 3692, "end_char": 4485, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Get the update\n\nFinish the [steps above](#before-you-update-the-mobile-app) first, then install\nthe new build:\n\n| Platform | Where to get it |\n| --- | --- |\n| Android | [Firebase App Distribution](https://appdistribution.firebase.dev/i/f3b79521380b40b9) for registered testers, or the APK on the [latest release](https://github.com/Polkadot-Community-Foundation/polkadot-android-community/releases/latest) |\n| iOS | [TestFlight](https://testflight.apple.com/join/HnBX59vz) |\n| Desktop (macOS / Windows / Linux) | [latest desktop release](https://github.com/Polkadot-Community-Foundation/polkadot-desktop-community/releases/latest) |\n\nThe desktop app holds no keys of its own: it pairs with your phone. Once your\nnew account exists, open the desktop app and scan its QR code to pair again."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#check-your-published-apps", "page_title": "apps-updates-2026-09-devnet-update", "index": 5, "depth": 2, "title": "Check your published apps", "anchor": "check-your-published-apps", "start_char": 4485, "end_char": 5787, "estimated_token_count": 317, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Check your published apps\n\nThe DotNS migration moved every registered `.dot` name to the new contracts.\n**You keep your names.** The app records attached to them, the content hash\nand the app manifest, were re-created from a snapshot of the old deployment,\nand most apps came across intact. Not all of them did, and we cannot guarantee\nyours is one of them.\n\nAfter you update, open your app in the Polkadot app or at\n`https://<your-name>.dev-dot.li`. If it loads, you are done. If it fails to\nload, shows *Can't find product*, or shows an older version, republish it:\n\n```bash\nnpm i -g @polkadot-community-foundation/polkadot-app-deploy@latest  # pad\nnpm i -g @polkadot-community-foundation/dotns-cli@latest            # dotns\npad ./dist <your-name>.dot --env devnet --publish\n```\n\nUpdate the tooling first. Older releases of `pad` and `dotns` still point at\nthe retired DotNS contracts, and a publish through them succeeds without error\nwhile nothing changes for anyone on the new apps. Anything you published or\nregistered on the old deployment after the snapshot was taken is not on the\nnew one, so republish that too.\n\nYour data on Bulletin is not affected. Republishing only rewrites the pointer\non your name. The full flow is in\n[Build & Publish Applications](../build/build-and-publish.md)."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#tooling-updates", "page_title": "apps-updates-2026-09-devnet-update", "index": 6, "depth": 2, "title": "Tooling updates", "anchor": "tooling-updates", "start_char": 5787, "end_char": 5807, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Tooling updates"}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#dotns-moves-to-a-new-contract-set", "page_title": "apps-updates-2026-09-devnet-update", "index": 7, "depth": 3, "title": "DotNS moves to a new contract set", "anchor": "dotns-moves-to-a-new-contract-set", "start_char": 5807, "end_char": 6337, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### DotNS moves to a new contract set\n\nThe current DotNS contract addresses are in\n[Addresses & registries](../reference/addresses.md#dotns-the-dot-naming-system).\nThey ship inside `@polkadot-community-foundation/dotns-cli` and\n`@polkadot-community-foundation/polkadot-app-deploy`, so installing the latest\nrelease of those two packages is all most projects need. Only addresses you\nwrote by hand need manual attention. The retired contracts stay readable, which\nis why an old tool keeps \"working\" against them without an error."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#the-contract-registry-moves", "page_title": "apps-updates-2026-09-devnet-update", "index": 8, "depth": 3, "title": "The contract registry moves", "anchor": "the-contract-registry-moves", "start_char": 6337, "end_char": 7981, "estimated_token_count": 351, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### The contract registry moves\n\nThe CDM `ContractRegistry` is redeployed at\n`0x05662b3dbd5dd9f2ff92d67630477e84b0b37c1f` to fix a failure when publishing\na brand-new contract name. Every name and version from the old registry at\n`0x59b0245778917af55224e5f8fb55f7f8d452619f` was migrated with its owner, so\nyou keep your names. The current addresses live in\n[Addresses & registries](../reference/addresses.md).\n\nUpgrade in this order:\n\n1. **Update your tooling.** The registry address ships inside the CDM\n   packages, so installing the latest `@polkadot-community-foundation/cdm-cli`\n   and `@polkadot-community-foundation/cdm-env` handles most of it. If you\n   read the address through `getRegistryAddress(\"devnet\")` or a preset rather\n   than writing it yourself, updating the package is all you need.\n2. **Regenerate your `cdm.json`.** Your project file pins the registry at the\n   top level as `\"registry\": \"0x59b0…\"`, and updating the package does not\n   rewrite that pin. Re-resolve your dependencies with `cdm install -n devnet`\n   so the new address is written in.\n3. **Then check anything custom.** Only addresses you wrote by hand, outside\n   the tooling and outside `cdm.json`, need manual attention.\n\n!!! warning \"The old registry keeps answering\"\n    The old registry stays readable after the switch, so nothing breaks at\n    cutover. But it cannot be frozen, and anything registered on it after the\n    migration snapshot does not appear in the new registry. **Do not register\n    new contract names on the old registry.** If you keep pointing at the old\n    address, you keep reading an old registry with no error to tell you."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#descriptors-need-re-pinning", "page_title": "apps-updates-2026-09-devnet-update", "index": 9, "depth": 3, "title": "Descriptors need re-pinning", "anchor": "descriptors-need-re-pinning", "start_char": 7981, "end_char": 8626, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Descriptors need re-pinning\n\nAfter the runtime upgrades land, regenerate and re-pin your chain descriptors\nfor Bulletin, Asset Hub, and People. Publishing or querying with stale\ndescriptors fails at decode. How descriptors are loaded and overridden is in\n[Use platform services from the SDK](../build/platform-services-sdk.md#connect-to-the-chains).\n\nSpecifically, the Bulletin authorization structure changes shape: the value\n`bytesPermanent` moves from the top level into a nested `extra` field.\nAnything that reads authorization extents by field name breaks until re-pinned.\nYour published data is not affected, only the way it is read."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-09-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-09-devnet-update/#questions", "page_title": "apps-updates-2026-09-devnet-update", "index": 10, "depth": 2, "title": "Questions", "anchor": "questions", "start_char": 8626, "end_char": 8775, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3822c9a2382ab2b5996124133b522a7a433dbf01ed0620f0b839687324e92096", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Questions\n\nAsk in the Devnet chat for developers on Matrix:\n[#polkadot-products-public](https://matrix.to/#/#polkadot-products-public:matrix.org)."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-10-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-10-devnet-update/#if-you-use-the-app", "page_title": "apps-updates-2026-10-devnet-update", "index": 0, "depth": 2, "title": "If you use the app", "anchor": "if-you-use-the-app", "start_char": 307, "end_char": 1105, "estimated_token_count": 228, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ca584dec89c5c33f74e6b8bd72ef175fb09774b4beb1a3bea1bdf6148dec8b0", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## If you use the app\n\nUpdate the host you use. Older builds cannot run apps built on the current\nProduct SDK.\n\n- **Android:** the [tester group](https://appdistribution.firebase.dev/i/f3b79521380b40b9)\n  delivers the new build. To install by hand, take the APK from the\n  [latest Android release](https://github.com/Polkadot-Community-Foundation/polkadot-android-community/releases/latest).\n- **iOS:** install the new build from\n  [TestFlight](https://testflight.apple.com/join/HnBX59vz).\n- **Desktop:** install the\n  [latest desktop release](https://github.com/Polkadot-Community-Foundation/polkadot-desktop-community/releases/latest).\n- **Web:** nothing to install. [dev-dot.li](https://dev-dot.li) is already\n  updated.\n\nMore detail is in [Get the app](../reference/resources.md#get-the-app)."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-10-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-10-devnet-update/#updated-apps", "page_title": "apps-updates-2026-10-devnet-update", "index": 1, "depth": 2, "title": "Updated apps", "anchor": "updated-apps", "start_char": 1105, "end_char": 1315, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ca584dec89c5c33f74e6b8bd72ef175fb09774b4beb1a3bea1bdf6148dec8b0", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Updated apps\n\nThese Devnet apps are updated for TrUAPI 0.25:\n\n- **DotNS** (`dotns.dot`), for registering and looking up `.dot` names, is now\n  version 0.8.0.\n- **Browse** (`browse.dot`), the app directory."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-10-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-10-devnet-update/#if-you-build-apps", "page_title": "apps-updates-2026-10-devnet-update", "index": 2, "depth": 2, "title": "If you build apps", "anchor": "if-you-build-apps", "start_char": 1315, "end_char": 1337, "estimated_token_count": 6, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ca584dec89c5c33f74e6b8bd72ef175fb09774b4beb1a3bea1bdf6148dec8b0", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## If you build apps"}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-10-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-10-devnet-update/#move-your-app-to-product-sdk-0390", "page_title": "apps-updates-2026-10-devnet-update", "index": 3, "depth": 3, "title": "Move your app to Product SDK 0.39.0", "anchor": "move-your-app-to-product-sdk-0390", "start_char": 1337, "end_char": 2101, "estimated_token_count": 214, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ca584dec89c5c33f74e6b8bd72ef175fb09774b4beb1a3bea1bdf6148dec8b0", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Move your app to Product SDK 0.39.0\n\n1. Pin the Product SDK to 0.39.0, the release that speaks TrUAPI 0.25:\n\n    ```bash\n    npm i @parity/product-sdk@0.39.0\n    ```\n\n    Later releases speak TrUAPI 0.26, which the Devnet hosts do not support.\n\n2. Move to `polkadot-api` 3 if your app is on an older SDK. An app built\n   directly on `@novasamatech/host-api` has to switch to the SDK.\n3. Add the descriptors override to get the current Devnet chain metadata, as\n   shown in\n   [Current Devnet chain metadata](../reference/packages.md#current-devnet-chain-metadata).\n4. Run your end-to-end tests against the TrUAPI test host in\n   `@parity/truapi-host`, as shown in\n   [Test without the real host](../build/platform-services-sdk.md#test-without-the-real-host)."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-10-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-10-devnet-update/#start-a-new-app", "page_title": "apps-updates-2026-10-devnet-update", "index": 4, "depth": 3, "title": "Start a new app", "anchor": "start-a-new-app", "start_char": 2101, "end_char": 2306, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ca584dec89c5c33f74e6b8bd72ef175fb09774b4beb1a3bea1bdf6148dec8b0", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Start a new app\n\nThe\n[playground-app-template](https://github.com/Polkadot-Community-Foundation/playground-app-template)\nis updated to Product SDK 0.39.0, so it works with TrUAPI 0.25 out of the box."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-10-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-10-devnet-update/#update-the-clis", "page_title": "apps-updates-2026-10-devnet-update", "index": 5, "depth": 3, "title": "Update the CLIs", "anchor": "update-the-clis", "start_char": 2306, "end_char": 2770, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ca584dec89c5c33f74e6b8bd72ef175fb09774b4beb1a3bea1bdf6148dec8b0", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Update the CLIs\n\nReinstall `pad` and `dotns` to get `pad` 0.22.1 and `dotns` 1.0.0:\n\n```bash\nnpm i -g @polkadot-community-foundation/polkadot-app-deploy@latest @polkadot-community-foundation/dotns-cli@latest\n```\n\nWhat changes for you:\n\n- Both CLIs default to `devnet`. Keep passing `--env devnet` anyway.\n- `pad` no longer lists apps in Browse: `--publish` and `--unpublish` are gone.\n- `dotns lookup transfer` takes `--destination` (`-d`) instead of `--to`."}
{"source": "polkadot-docs", "page_id": "apps-updates-2026-10-devnet-update", "url": "https://developer.polkadot.com/apps/updates/2026-10-devnet-update/#questions", "page_title": "apps-updates-2026-10-devnet-update", "index": 6, "depth": 2, "title": "Questions", "anchor": "questions", "start_char": 2770, "end_char": 2919, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ca584dec89c5c33f74e6b8bd72ef175fb09774b4beb1a3bea1bdf6148dec8b0", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Questions\n\nAsk in the Devnet chat for developers on Matrix:\n[#polkadot-products-public](https://matrix.to/#/#polkadot-products-public:matrix.org)."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#what-a-backup-covers", "page_title": "apps-using-the-app-back-up-your-account", "index": 0, "depth": 2, "title": "What a backup covers", "anchor": "what-a-backup-covers", "start_char": 689, "end_char": 1352, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a backup covers\n\nA backup saves one thing: your 12-word phrase. That is enough to bring back your\naccount, your username, your CASH and your collectables, because those belong to\nthe account and not to the phone.\n\nAnything that only ever lived on the phone does not come back. Chat history and\ndownloaded photos start fresh on a restored app.\n\n| | Cloud backup | Written-down phrase |\n| --- | --- | --- |\n| Where it goes | Your Google Drive (Android) or iCloud (iOS) | Paper, kept somewhere safe |\n| Covers you if | You lose, break or replace the phone | You also lose your Google or Apple account |\n| Effort | Two taps | A minute with a pen |\n\nDo both."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#turn-on-the-cloud-backup", "page_title": "apps-using-the-app-back-up-your-account", "index": 1, "depth": 2, "title": "Turn on the cloud backup", "anchor": "turn-on-the-cloud-backup", "start_char": 1352, "end_char": 1512, "estimated_token_count": 39, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Turn on the cloud backup\n\nThe app tries to set this up when you first create your account, so it is often\nalready on. Check, and switch it on if it is not."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#android", "page_title": "apps-using-the-app-back-up-your-account", "index": 2, "depth": 3, "title": "Android", "anchor": "android", "start_char": 1512, "end_char": 2737, "estimated_token_count": 310, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Android\n\n1. Open the **Settings** tab. A warning dot on the tab means you have no backup.\n2. Under **Security & privacy**, tap **Backup**.\n3. You will see one of these:\n\n    | What it says | What to do |\n    | --- | --- |\n    | **Account is backed up** | Nothing, you are set |\n    | **Backup your account** | Tap **Backup Your account** and choose a Google account |\n    | **Enable Google Drive** | Tap **Enable Google Drive**, allow access, then back up |\n    | **Backup conflict** | You already backed up a different account. See below. |\n\nYour backup is saved in your own Google Drive, in a folder called\n**`Polkadot App - DO NOT DELETE`**. Do not delete or rename that folder.\n\nIf you see **Backup conflict**: Google Drive keeps one Polkadot backup at a\ntime. Backing up a second account offers to **Override existing backup**, and\nmakes you tick a box saying *\"I fully understand the risk\"*. The account you\nreplace cannot be recovered unless you already have its phrase on paper, so go\nand write that down first.\n\nIf your phone has no Google Play: the app runs without Google Play services,\nbut Google Drive backup needs them. On such a phone, writing the\nphrase down is your only backup, so do it straight away."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#ios", "page_title": "apps-using-the-app-back-up-your-account", "index": 3, "depth": 3, "title": "iOS", "anchor": "ios", "start_char": 2737, "end_char": 3780, "estimated_token_count": 265, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### iOS\n\n1. Open the **Settings** tab.\n2. Under **Security & privacy**, tap **Backup**.\n3. You will see one of these:\n\n    | What it says | What to do |\n    | --- | --- |\n    | **Account is Backed Up** | Nothing, you are set |\n    | **Backup your account** | Tap **Backup Your Account** |\n    | **Enable iCloud backup** | The app cannot reach iCloud. See below. |\n\n**Enable iCloud backup** talks you through signing in to iCloud and turning on\niCloud Drive, with an **Open settings** button. It misses one setting you also\nneed: your phrase is stored in the iCloud Keychain, so turn that on too under\n**Settings → *your name* → iCloud → Passwords and Keychain**. Then come back and\ntap **Backup Your Account**.\n\n!!! warning \"You need the same account to get it back\"\n    A backup only opens for the account that made it. An Android backup can only\n    be restored by signing in to the same Google account, and an iOS backup only\n    reappears on a phone signed in to the same Apple Account. Make sure you can\n    still get into that account."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#write-down-the-recovery-phrase", "page_title": "apps-using-the-app-back-up-your-account", "index": 4, "depth": 2, "title": "Write down the recovery phrase", "anchor": "write-down-the-recovery-phrase", "start_char": 3780, "end_char": 4729, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Write down the recovery phrase\n\nDo this even if the cloud backup is on. You can do it at any time, whether or\nnot you have a backup yet.\n\n1. **Settings → Security & privacy → Backup**.\n2. Tap **View recovery phrase** on Android, or **View Secret Recovery Phrase**\n   on iOS.\n3. Read the warning and tap **Show recovery phrase**.\n4. Unlock. Android asks for your usual screen lock (*\"Verify it's you\"*); iOS\n   asks for Face ID, Touch ID or your passcode. If iOS will not let you through,\n   check that you have a passcode or Face ID set up on the phone.\n5. Tap **Tap to reveal**, then copy the 12 words onto paper, in order.\n\nKeep the paper somewhere only you can get to. Android has no copy button on\npurpose. iOS does have **Copy to clipboard** under the words, for keeping the\nphrase in a password manager. If you use it, paste the phrase and then copy\nsomething else straight away, because other apps can read whatever is on your\nclipboard."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#get-your-account-back-on-another-phone", "page_title": "apps-using-the-app-back-up-your-account", "index": 5, "depth": 2, "title": "Get your account back on another phone", "anchor": "get-your-account-back-on-another-phone", "start_char": 4729, "end_char": 4940, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get your account back on another phone\n\nYou can only restore onto an app that has no account on it yet. If the app on\nthat phone is already set up with a different account, uninstall and reinstall it\nfirst."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#android_1", "page_title": "apps-using-the-app-back-up-your-account", "index": 6, "depth": 3, "title": "Android", "anchor": "android_1", "start_char": 4940, "end_char": 5541, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Android\n\n1. Open the app. It starts on **Pick a username**.\n2. Tap **Already using Polkadot? Recover here**.\n3. Either tap **Backup from Google Drive** and sign in with the Google account\n   that holds your backup, or tap **Import recovery phrase**, type your words in,\n   and tap **Restore account**.\n4. You will see **Account restored**. Confirm your username to finish.\n\nIf you start creating a new account while a backup already exists, the app stops\nyou with **We found an existing backup** and offers **Recover this backup** or\n**Replace with a new backup**. Replacing it cannot be undone."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#ios_1", "page_title": "apps-using-the-app-back-up-your-account", "index": 7, "depth": 3, "title": "iOS", "anchor": "ios_1", "start_char": 5541, "end_char": 6023, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### iOS\n\niOS does this for you. If it finds your iCloud backup when you open the freshly\ninstalled app, it restores the account on its own. You don't need to tap\nanything.\n\nIf it shows you **Pick Your Username** instead, the phone is signed in to a\ndifferent Apple Account, or iCloud Keychain is switched off. Fix that in the iOS\nSettings app and reinstall. To use your written phrase instead, tap **Already\nusing Polkadot? Recover here** and type it into **Recover Polkadot ID**."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#desktop", "page_title": "apps-using-the-app-back-up-your-account", "index": 8, "depth": 3, "title": "Desktop", "anchor": "desktop", "start_char": 6023, "end_char": 6370, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Desktop\n\nThe desktop app has no account of its own. It works by pairing with your phone,\nand everything is approved on the phone, so there is nothing to back up. Get\nyour phone working again, then open the desktop app and scan its QR code to pair\nonce more. See [the client architecture](../architecture/client.md) for why it\nworks this way."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#the-hidden-debug-menu", "page_title": "apps-using-the-app-back-up-your-account", "index": 9, "depth": 2, "title": "The hidden debug menu", "anchor": "the-hidden-debug-menu", "start_char": 6370, "end_char": 7257, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The hidden debug menu\n\nThis test version of the app has a debug menu that the public Polkadot app does\nnot. Shake your phone to open it, or on Android use **Settings → Debug →\nDebug menu**. It is meant for testing, and two things in it can cost you an\naccount.\n\nOn Android, **Copy wallet mnemonic** copies your 12 words without asking for your\nscreen lock, so anyone holding your unlocked phone could take them. **Clear\nbackup** deletes your Google Drive backup.\n\nOn iOS there is no copy shortcut. **Clear Backup** deletes your iCloud backup,\nand **Replace Entropy (Random)** throws your account away and starts a new one,\nwhich you cannot undo without your written phrase.\n\n!!! danger \"Nothing here asks you to confirm\"\n    Use the debug menu on accounts you do not mind losing, and have your recovery\n    phrase written down before you tap anything that says *clear* or *replace*."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-back-up-your-account", "url": "https://developer.polkadot.com/apps/using-the-app/back-up-your-account/#learn-more", "page_title": "apps-using-the-app-back-up-your-account", "index": 10, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 7257, "end_char": 7585, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:911c05ab13aeaea04c55245aaeda06f44defb6a6ee862d8a21a5129d3ecaea77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Learn more\n\n- [Create an account & get funds](create-account.md): set the account up in the first place\n- [Username & proof of personhood](username-and-personhood.md): the username that comes back with the account\n- [The Polkadot app (client tier)](../architecture/client.md): where keys live and why the desktop app has none"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-create-account", "url": "https://developer.polkadot.com/apps/using-the-app/create-account/#1-create-or-import-the-account", "page_title": "apps-using-the-app-create-account", "index": 0, "depth": 2, "title": "1. Create or import the account", "anchor": "1-create-or-import-the-account", "start_char": 494, "end_char": 1511, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1b33b1ceb8f63dfb457509ce206e7cb347041058b327c3dd1fd2ab5fe0ffbad2", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## 1. Create or import the account\n\n1. Open the app. It starts by asking for a username, and creates the account\n   for you once you pick one. There is no separate \"create account\" step.\n2. If you already have a recovery phrase, tap **Already using Polkadot? Recover\n   here** on that same screen instead, and restore from it.\n3. The app does not show you your recovery phrase on its own. Get it from\n   **Settings → Security & privacy → Backup**, as described in\n   [Back up & restore your account](back-up-your-account.md).\n\nThe app is self-custodial: your keys are created and stored on your own device.\nThe app's backend never holds them, and every signature happens on the device\nafter you approve it.\n\n!!! warning \"Your recovery phrase is the account\"\n    Anyone who holds your recovery phrase controls the account, and losing it\n    means losing access. Write it down, store it offline, and never paste it\n    into a website, a chat, or a support request. The Polkadot app will never\n    ask you to share it."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-create-account", "url": "https://developer.polkadot.com/apps/using-the-app/create-account/#log-in-on-the-desktop-app", "page_title": "apps-using-the-app-create-account", "index": 1, "depth": 3, "title": "Log in on the desktop app", "anchor": "log-in-on-the-desktop-app", "start_char": 1511, "end_char": 1990, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1b33b1ceb8f63dfb457509ce206e7cb347041058b327c3dd1fd2ab5fe0ffbad2", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Log in on the desktop app\n\nThe desktop (and web) app holds no keys of its own. It pairs with your phone,\nand signing stays on the phone. So set up the account on mobile first:\n\n1. Create or import your account in the mobile app, as above.\n2. Open the desktop app and scan the QR code it shows to pair the two devices.\n3. If macOS asks for network options, choose **dev only**.\n\n[The client architecture](../architecture/client.md) explains why signing\nhappens on the phone."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-create-account", "url": "https://developer.polkadot.com/apps/using-the-app/create-account/#2-get-devnet-funds", "page_title": "apps-using-the-app-create-account", "index": 2, "depth": 2, "title": "2. Get devnet funds", "anchor": "2-get-devnet-funds", "start_char": 1990, "end_char": 2514, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1b33b1ceb8f63dfb457509ce206e7cb347041058b327c3dd1fd2ab5fe0ffbad2", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## 2. Get devnet funds\n\nNothing funds a new account automatically. You need two different things, from\ntwo different places:\n\n| What | What it is for | Where to get it |\n| --- | --- | --- |\n| CASH | The balance you spend inside the app | The **\"+\"** top-up in the app. See [Get & use CASH](get-and-use-cash.md) |\n| Native tokens (PAS) | Transaction fees, and keeping the account alive | The faucet, below |\n\nThe faucet does not give you CASH, and the in-app top-up does not give you\nfees. A new account usually needs both."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-create-account", "url": "https://developer.polkadot.com/apps/using-the-app/create-account/#fund-the-account-from-the-faucet", "page_title": "apps-using-the-app-create-account", "index": 3, "depth": 3, "title": "Fund the account from the faucet", "anchor": "fund-the-account-from-the-faucet", "start_char": 2514, "end_char": 3618, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1b33b1ceb8f63dfb457509ce206e7cb347041058b327c3dd1fd2ab5fe0ffbad2", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Fund the account from the faucet\n\nDevnet funds come from the [Polkadot faucet](https://faucet.polkadot.io). It\nserves several networks, so you have to pick two things: Paseo, and the right\nparachain. These links pre-select both:\n\n| You need fees for | Use |\n| --- | --- |\n| Contracts, `.dot` names, publishing | [Paseo Asset Hub (1000)](https://faucet.polkadot.io/paseo?parachain=1000) |\n| Sending CASH, usernames, personhood | [Paseo People (1004)](https://faucet.polkadot.io/paseo?parachain=1004) |\n\nPaste your SS58 address (the one the app shows on its receive screen, or\n`dotns account address` for CLI work), not an EVM `0x…` address. The faucet\npays the native token, PAS.\n\n!!! warning \"Do not pick an *Asset Hub Next* or *People Next* chain\"\n    The faucet also lists Asset Hub Next (1500) and People Next (1502). Those\n    belong to Paseo Next v2 (`paseo` preset), a different network. Funds sent\n    there will not appear on this Devnet, and the balance you are waiting for\n    will never arrive.\n\n\nA request pays 5,000 PAS and normally lands within a block or two, which is a\nfew seconds."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-create-account", "url": "https://developer.polkadot.com/apps/using-the-app/create-account/#check-the-funds-arrived", "page_title": "apps-using-the-app-create-account", "index": 4, "depth": 3, "title": "Check the funds arrived", "anchor": "check-the-funds-arrived", "start_char": 3618, "end_char": 4318, "estimated_token_count": 196, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1b33b1ceb8f63dfb457509ce206e7cb347041058b327c3dd1fd2ab5fe0ffbad2", "last_updated": "2026-10-28T08:44:36+00:00", "text": "### Check the funds arrived\n\nThe app shows the balance once it refreshes. To check it yourself, open\nPolkadot-JS Apps on the chain you funded\n([Asset Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fasset-hub-paseo-rpc.n.dwellir.com#/chainstate)\nor\n[People](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpeople-paseo.rotko.net#/chainstate)),\nselect `system` → `account`, paste your SS58 address and read `data.free`.\n\nIf it is still zero a minute later, the request went to a different chain from\nthe one you are using. Request again from the link for the chain you need.\n\nAfterwards, keep a small PAS balance. As on other Substrate-based chains, an\naccount needs one to stay active and pay fees."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-create-account", "url": "https://developer.polkadot.com/apps/using-the-app/create-account/#learn-more", "page_title": "apps-using-the-app-create-account", "index": 5, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 4318, "end_char": 4569, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1b33b1ceb8f63dfb457509ce206e7cb347041058b327c3dd1fd2ab5fe0ffbad2", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Learn more\n\n- [Get & use CASH](get-and-use-cash.md): spend the balance you just funded\n- [Username & proof of personhood](username-and-personhood.md): claim a readable name\n- [Money (CASH & funding)](../architecture/money.md): how CASH and PAS work"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-discover-and-open-apps", "url": "https://developer.polkadot.com/apps/using-the-app/discover-and-open-apps/#ways-to-reach-an-app", "page_title": "apps-using-the-app-discover-and-open-apps", "index": 0, "depth": 2, "title": "Ways to reach an app", "anchor": "ways-to-reach-an-app", "start_char": 380, "end_char": 935, "estimated_token_count": 164, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c52ab48e414baf88e85771b52851a98d6e0ac58ea07d4e1395cd790a579e0f5c", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Ways to reach an app\n\n- Browse: the app directory at <https://browse.dev-dot.li>. Search and pick\n  from the list.\n- A `.dot` domain: each published app has a name such as `calculator.dot`. On\n  the desktop app you can type it into the address bar. The mobile app has no\n  general address bar, so on mobile you open apps from Browse or by following a\n  `.dot` / `.dev-dot.li` link.\n- A `dev-dot.li` link: the web gateway serves each app at\n  `https://<name>.dev-dot.li` (for example <https://calculator.dev-dot.li>).\n  Open it in an ordinary browser."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-discover-and-open-apps", "url": "https://developer.polkadot.com/apps/using-the-app/discover-and-open-apps/#find-apps-in-browse", "page_title": "apps-using-the-app-discover-and-open-apps", "index": 1, "depth": 2, "title": "Find apps in Browse", "anchor": "find-apps-in-browse", "start_char": 935, "end_char": 1627, "estimated_token_count": 164, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c52ab48e414baf88e85771b52851a98d6e0ac58ea07d4e1395cd790a579e0f5c", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Find apps in Browse\n\nBrowse lists the apps currently published on the network. You can't publish an\napp from Browse, but when you are signed in you can recommend (attest to) and\nbookmark apps.\n\n1. Open <https://browse.dev-dot.li>, or find **Browse** inside the Polkadot app.\n2. Use search and categories to narrow the list. Each app shows a name,\n   description and icon.\n3. Some cards carry certificate badges. Treat them as extra context. On a\n   devnet they are not a reason to be less careful.\n4. Select a card to open the app.\n\nBrowse reads the Devnet publishing registry and the names attached to published\napps. [App discovery (Browse)](../architecture/discovery.md) explains how."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-discover-and-open-apps", "url": "https://developer.polkadot.com/apps/using-the-app/discover-and-open-apps/#open-an-app-by-its-dot-domain", "page_title": "apps-using-the-app-discover-and-open-apps", "index": 2, "depth": 2, "title": "Open an app by its `.dot` domain", "anchor": "open-an-app-by-its-dot-domain", "start_char": 1627, "end_char": 2091, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c52ab48e414baf88e85771b52851a98d6e0ac58ea07d4e1395cd790a579e0f5c", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Open an app by its `.dot` domain\n\nOn the desktop app you can go straight to a name:\n\n1. Type the app's name, for example `calculator.dot`, into the address bar.\n2. The app resolves the name, fetches the app bundle and opens it in a\n   sandboxed webview.\n\nThe mobile app has no general address bar. On mobile, open the app from Browse\nor follow a link instead. In an ordinary web browser, use the gateway form of\nthe same name: `https://calculator.dev-dot.li`."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-discover-and-open-apps", "url": "https://developer.polkadot.com/apps/using-the-app/discover-and-open-apps/#when-a-name-does-not-resolve", "page_title": "apps-using-the-app-discover-and-open-apps", "index": 3, "depth": 2, "title": "When a name does not resolve", "anchor": "when-a-name-does-not-resolve", "start_char": 2091, "end_char": 2503, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c52ab48e414baf88e85771b52851a98d6e0ac58ea07d4e1395cd790a579e0f5c", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## When a name does not resolve\n\nThe gateway resolves names in the browser, so every `<name>.dev-dot.li` address\nfirst serves the same Polkadot loader shell. A typo, an unpublished name and a\nworking app look the same until resolution completes. If the shell never hands\nover to an app, check the spelling, then look the name up in\n<https://browse.dev-dot.li>. A name that is not listed there is not published."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-discover-and-open-apps", "url": "https://developer.polkadot.com/apps/using-the-app/discover-and-open-apps/#apps-to-try", "page_title": "apps-using-the-app-discover-and-open-apps", "index": 4, "depth": 2, "title": "Apps to try", "anchor": "apps-to-try", "start_char": 2503, "end_char": 3264, "estimated_token_count": 249, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c52ab48e414baf88e85771b52851a98d6e0ac58ea07d4e1395cd790a579e0f5c", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Apps to try\n\nThese apps are deployed on the Devnet:\n\n| App | Open | `.dot` name | What it does |\n| --- | --- | --- | --- |\n| Calculator | <https://calculator.dev-dot.li> | `calculator.dot` | A basic calculator |\n| Stopwatch | <https://stopwatch.dev-dot.li> | `stopwatch.dot` | A stopwatch |\n| Countdown Timer | <https://countdown-timer.dev-dot.li> | `countdown-timer.dot` | Counts down from a time you set |\n| Alarm Clock | <https://alarm-clock.dev-dot.li> | `alarm-clock.dot` | Rings at the time you set |\n| Chess Clock | <https://chess-clock.dev-dot.li> | `chess-clock.dot` | Two clocks for a two-player game; tap to pass the turn |\n| Unit Converter | <https://unit-converter.dev-dot.li> | `unit-converter.dot` | Converts units, such as metres to feet |"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-discover-and-open-apps", "url": "https://developer.polkadot.com/apps/using-the-app/discover-and-open-apps/#what-happens-when-you-open-an-app", "page_title": "apps-using-the-app-discover-and-open-apps", "index": 5, "depth": 2, "title": "What happens when you open an app", "anchor": "what-happens-when-you-open-an-app", "start_char": 3264, "end_char": 4077, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c52ab48e414baf88e85771b52851a98d6e0ac58ea07d4e1395cd790a579e0f5c", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## What happens when you open an app\n\nWhen you open an app, the Polkadot app (or the web gateway) resolves the name,\nfetches the app's content and runs it in a sandbox. If the app needs accounts,\nsigning, chain access or payments, it has to ask the Polkadot app or the\ngateway for them.\n\nTwo things follow from that:\n\n- Each app is isolated. It cannot read another app's data or reach your keys\n  directly.\n- You approve every action. When an app needs a signature or a payment, the\n  Polkadot app shows you a prompt, and your key signs only after you approve.\n  Your recovery phrase and private keys never leave your device.\n\nInside the Polkadot app, opening one app from another stays inside the\nPolkadot app. In a plain browser, the same action opens the other app at its\n`https://<name>.dev-dot.li` address."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-discover-and-open-apps", "url": "https://developer.polkadot.com/apps/using-the-app/discover-and-open-apps/#learn-more", "page_title": "apps-using-the-app-discover-and-open-apps", "index": 6, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 4077, "end_char": 4274, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c52ab48e414baf88e85771b52851a98d6e0ac58ea07d4e1395cd790a579e0f5c", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Learn more\n\n- [App discovery (Browse)](../architecture/discovery.md): how the directory is built\n- [Create an account & get funds](create-account.md): most apps need this before they do anything"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-get-and-use-cash", "url": "https://developer.polkadot.com/apps/using-the-app/get-and-use-cash/#before-you-start", "page_title": "apps-using-the-app-get-and-use-cash", "index": 0, "depth": 2, "title": "Before you start", "anchor": "before-you-start", "start_char": 201, "end_char": 817, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a5ff10277818e02c54a76be213d4896832dfac4ced02dba138e4c2d40f06cc1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Before you start\n\n- An account in the Polkadot app. If you don't have one yet, see\n  [Create an account & get funds](create-account.md).\n- The mobile app. The top-up button is only in the mobile app (devnet builds).\n  The desktop app has no CASH card.\n- Some PAS for fees, if you want to send CASH. Topping up with the **\"+\"**\n  button costs nothing, but sending or spending CASH is an on-chain transaction\n  on the People chain, and that needs a small amount of PAS for the fee. Get it\n  from the faucet, as described in\n  [Fund the account from the faucet](create-account.md#fund-the-account-from-the-faucet)."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-get-and-use-cash", "url": "https://developer.polkadot.com/apps/using-the-app/get-and-use-cash/#what-cash-is", "page_title": "apps-using-the-app-get-and-use-cash", "index": 1, "depth": 2, "title": "What CASH is", "anchor": "what-cash-is", "start_char": 817, "end_char": 1215, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a5ff10277818e02c54a76be213d4896832dfac4ced02dba138e4c2d40f06cc1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What CASH is\n\n\"CASH\" is the app's name for the Devnet digital-dollar balance. The app shows it\nas a single balance and does the chain-specific work for you. If the CASH card\nshows a balance, you can use it in app payment flows.\n\nIf you are a developer: CASH is spent through Coinage on the People chain, and\nthe same logical asset can also be represented on Asset Hub with asset id\n`50000413`."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-get-and-use-cash", "url": "https://developer.polkadot.com/apps/using-the-app/get-and-use-cash/#get-cash", "page_title": "apps-using-the-app-get-and-use-cash", "index": 2, "depth": 2, "title": "Get CASH", "anchor": "get-cash", "start_char": 1215, "end_char": 1228, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a5ff10277818e02c54a76be213d4896832dfac4ced02dba138e4c2d40f06cc1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get CASH"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-get-and-use-cash", "url": "https://developer.polkadot.com/apps/using-the-app/get-and-use-cash/#top-up-in-the-app-mobile", "page_title": "apps-using-the-app-get-and-use-cash", "index": 3, "depth": 3, "title": "Top up in the app (mobile)", "anchor": "top-up-in-the-app-mobile", "start_char": 1228, "end_char": 1961, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a5ff10277818e02c54a76be213d4896832dfac4ced02dba138e4c2d40f06cc1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Top up in the app (mobile)\n\nDevnet builds of the app can top up your account directly. This is the fastest\nway to get CASH.\n\n1. Open the Polkadot app on Android or iOS.\n2. Open your Pocket, go to the CASH card and tap the **\"+\"** (top-up) button\n   next to **Get CASH**. The button only appears on non-production (devnet)\n   builds.\n3. The app requests a devnet top-up and prepares the funds for spending.\n4. The deposit settles in a few seconds and the CASH card shows the new\n   balance. If it has not changed after a minute, reopen the Pocket to refresh\n   the view and tap **\"+\"** again.\n\nNew accounts are not funded automatically, so you do this yourself. The faucet\nis a separate step, and it pays PAS for fees, not CASH."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-get-and-use-cash", "url": "https://developer.polkadot.com/apps/using-the-app/get-and-use-cash/#earn-it", "page_title": "apps-using-the-app-get-and-use-cash", "index": 4, "depth": 3, "title": "Earn it", "anchor": "earn-it", "start_char": 1961, "end_char": 2133, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a5ff10277818e02c54a76be213d4896832dfac4ced02dba138e4c2d40f06cc1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Earn it\n\nYou can also earn CASH through Devnet reward flows, such as games, judgements,\ninvitations or prize events. Rewards land in the same CASH balance as top-ups."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-get-and-use-cash", "url": "https://developer.polkadot.com/apps/using-the-app/get-and-use-cash/#send-cash", "page_title": "apps-using-the-app-get-and-use-cash", "index": 5, "depth": 2, "title": "Send CASH", "anchor": "send-cash", "start_char": 2133, "end_char": 2689, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a5ff10277818e02c54a76be213d4896832dfac4ced02dba138e4c2d40f06cc1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Send CASH\n\n1. Open your CASH card and choose **Send CASH**.\n2. Enter the recipient and the amount.\n3. Check both, then confirm. The app prepares the transfer, asks for your\n   approval, submits it and waits for it to settle before it reports success.\n\nThe desktop app has no CASH card and no **Get CASH** button. On desktop you\nsend and receive CASH inside chat conversations. Top up on the mobile app\nfirst.\n\nKeep a small amount of PAS on the account as well. CASH does not pay fees, and\nthe account needs PAS to stay active and pay transaction fees."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-get-and-use-cash", "url": "https://developer.polkadot.com/apps/using-the-app/get-and-use-cash/#learn-more", "page_title": "apps-using-the-app-get-and-use-cash", "index": 6, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 2689, "end_char": 2840, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a5ff10277818e02c54a76be213d4896832dfac4ced02dba138e4c2d40f06cc1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Learn more\n\n- [Create an account & get funds](create-account.md)\n- [Money (CASH & funding)](../architecture/money.md): why CASH and PAS are separate"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app", "url": "https://developer.polkadot.com/apps/using-the-app/#for-users", "page_title": "apps-using-the-app", "index": 0, "depth": 2, "title": "For users", "anchor": "for-users", "start_char": 65, "end_char": 889, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:585978637999e606ed92a9effe22c643891540170e889d074f4d49c5ffb7ddf6", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## For users\n\nFor using the Polkadot app, or opening apps through the web gateway at\n[dev-dot.li](https://dev-dot.li).\n\n- [Create an account & get funds](create-account.md): set up an account and get\n  the funds you need on the Devnet.\n- [Back up & restore your account](back-up-your-account.md): save the recovery\n  phrase, turn on the cloud backup and restore onto a new device.\n- [Get & use CASH](get-and-use-cash.md): top up the balance the app shows and\n  send it to another user.\n- [Username & proof of personhood](username-and-personhood.md): claim a People\n  Chain username and get personhood.\n- [Discover & open apps](discover-and-open-apps.md): find apps in\n  [Browse](https://browse.dev-dot.li) and open them by their `.dot` domain.\n- [Messaging & calls](messaging-and-calls.md): chat with and call other users."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app", "url": "https://developer.polkadot.com/apps/using-the-app/#for-developers", "page_title": "apps-using-the-app", "index": 1, "depth": 2, "title": "For developers", "anchor": "for-developers", "start_char": 889, "end_char": 1822, "estimated_token_count": 264, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:585978637999e606ed92a9effe22c643891540170e889d074f4d49c5ffb7ddf6", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## For developers\n\nFor building a Product. You mostly work with a static web app, the Product SDK\nand two CLIs, `pad` and `dotns`. On this Devnet both take the `devnet` preset\nwith `--env devnet`. See [Networks & endpoints](../reference/networks.md).\n\n- [Build & publish an app](../build/build-and-publish.md): scaffold an app on the\n  Product SDK and publish it with the `pad` deploy CLI.\n- [Register a .dot domain](../build/register-a-dot-name.md): reserve and configure a\n  DotNS name with `@polkadot-community-foundation/dotns-cli`.\n- [Use platform services from the SDK](../build/platform-services-sdk.md): call chain,\n  contract, cloud storage, identity and signing APIs from `@parity/product-sdk`.\n\nNew to building here? Start with\n[Get started as a developer](../get-started/developers.md). The\n[Architecture](../architecture/index.md) and [Reference](../reference/index.md)\nsections have the background and the exact values."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-messaging-and-calls", "url": "https://developer.polkadot.com/apps/using-the-app/messaging-and-calls/#before-you-start", "page_title": "apps-using-the-app-messaging-and-calls", "index": 0, "depth": 2, "title": "Before you start", "anchor": "before-you-start", "start_char": 560, "end_char": 997, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d20b593197cb387ec901762fd8eab4f3430b9780c31de469e5c426109a2af5b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Before you start\n\nYou need the Polkadot app installed (downloads are in\n[Get the app](../reference/resources.md#get-the-app)) and an account on the\ndevice.\n\nMessaging is tied to your on-chain identity. You and the person you want to\nreach both need an account, and in practice you need to have added each other\nas contacts.\n\nCalls and sending attachments only work in the mobile app, on Android or iOS.\nThe desktop app is for chats."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-messaging-and-calls", "url": "https://developer.polkadot.com/apps/using-the-app/messaging-and-calls/#start-a-chat", "page_title": "apps-using-the-app-messaging-and-calls", "index": 1, "depth": 2, "title": "Start a chat", "anchor": "start-a-chat", "start_char": 997, "end_char": 1526, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d20b593197cb387ec901762fd8eab4f3430b9780c31de469e5c426109a2af5b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Start a chat\n\n1. Open the app and go to the chats section.\n2. Add or select a contact. Contacts are keyed to their on-chain identity, so\n   you are messaging an account, not a phone number or email address.\n3. Type your message and send it. The app encrypts it on your device and\n   submits it through the statement store.\n4. Your contact's app, which is subscribed to the statement store, receives the\n   message, decrypts it and shows it.\n\nThe same encrypted channel carries replies, reactions and in-chat token\ntransfers."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-messaging-and-calls", "url": "https://developer.polkadot.com/apps/using-the-app/messaging-and-calls/#send-media", "page_title": "apps-using-the-app-messaging-and-calls", "index": 2, "depth": 2, "title": "Send media", "anchor": "send-media", "start_char": 1526, "end_char": 1941, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d20b593197cb387ec901762fd8eab4f3430b9780c31de469e5c426109a2af5b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Send media\n\n1. In a chat, attach an image, video or file.\n2. The app encrypts the file and uploads it through Bulletin-backed storage.\n3. A reference to the stored file goes into a normal encrypted chat message.\n4. Your contact's app receives the message, fetches the encrypted chunks from\n   the Bulletin Chain and decrypts them on the device.\n\nDesktop takes part in chats, but it cannot send attachments yet."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-messaging-and-calls", "url": "https://developer.polkadot.com/apps/using-the-app/messaging-and-calls/#make-a-voice-or-video-call", "page_title": "apps-using-the-app-messaging-and-calls", "index": 3, "depth": 2, "title": "Make a voice or video call", "anchor": "make-a-voice-or-video-call", "start_char": 1941, "end_char": 2637, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d20b593197cb387ec901762fd8eab4f3430b9780c31de469e5c426109a2af5b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Make a voice or video call\n\nThe desktop app has no call UI, so you place and receive calls on Android or\niOS.\n\n1. Open a chat with the contact and start an audio or video call.\n2. The app creates a WebRTC peer connection. If the two devices cannot connect\n   directly, it can fall back to relay infrastructure.\n3. The call offer, answer and connection candidates travel as encrypted chat\n   messages over the statement store.\n4. Once the connection is set up, audio and video flow peer to peer over\n   WebRTC, either directly or relayed through TURN.\n\nWhether a call goes direct or through a relay depends on your network. When a\ndirect path is not possible, the app falls back to the relay."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-messaging-and-calls", "url": "https://developer.polkadot.com/apps/using-the-app/messaging-and-calls/#device-sync", "page_title": "apps-using-the-app-messaging-and-calls", "index": 4, "depth": 2, "title": "Device sync", "anchor": "device-sync", "start_char": 2637, "end_char": 2886, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d20b593197cb387ec901762fd8eab4f3430b9780c31de469e5c426109a2af5b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Device sync\n\nDesktop and mobile can keep contacts and chats in sync over an encrypted\npeer-to-peer channel. The devices set up that channel through the same\nstatement store path used for calls, then copy contacts and chats across once\nit opens."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-messaging-and-calls", "url": "https://developer.polkadot.com/apps/using-the-app/messaging-and-calls/#learn-more", "page_title": "apps-using-the-app-messaging-and-calls", "index": 5, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 2886, "end_char": 3096, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d20b593197cb387ec901762fd8eab4f3430b9780c31de469e5c426109a2af5b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Learn more\n\n- [Messaging & calls](../architecture/messaging.md): the transports behind chat and calls\n- [Polkadot Android](https://github.com/Polkadot-Community-Foundation/polkadot-android-community): source"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-username-and-personhood", "url": "https://developer.polkadot.com/apps/using-the-app/username-and-personhood/#what-personhood-means", "page_title": "apps-using-the-app-username-and-personhood", "index": 0, "depth": 2, "title": "What personhood means", "anchor": "what-personhood-means", "start_char": 340, "end_char": 1062, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5061aa0a6c9b164874ccce21d4af00def482c863d040852ff812e7d775b02ca8", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## What personhood means\n\nPersonhood tells apps that an account belongs to a distinct human, without\nsaying who that human is. There are two tiers:\n\n- Lite: you get it by registering an attested username. Most users have this\n  tier.\n- Full: you get it by redeeming an invitation. It gives a stronger guarantee of\n  one account per human.\n\nApps and smart contracts can read your tier on-chain and change what they offer\nbased on it. An app only needs to know whether you have no personhood, Lite\npersonhood or Full personhood.\n\nWhen an app checks your personhood, it does not learn your identity. It gets an\nalias: a pseudonym unique to that one app. So the same person cannot be\ntracked or linked across different apps."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-username-and-personhood", "url": "https://developer.polkadot.com/apps/using-the-app/username-and-personhood/#before-you-start", "page_title": "apps-using-the-app-username-and-personhood", "index": 1, "depth": 2, "title": "Before you start", "anchor": "before-you-start", "start_char": 1062, "end_char": 1322, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5061aa0a6c9b164874ccce21d4af00def482c863d040852ff812e7d775b02ca8", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Before you start\n\nYou need an account with a small amount of devnet funds. If you don't have one\nyet, follow [Create an account & get funds](create-account.md) first.\n\nDownload links for the app are in\n[Get the app](../reference/resources.md#get-the-app)."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-username-and-personhood", "url": "https://developer.polkadot.com/apps/using-the-app/username-and-personhood/#claim-a-username", "page_title": "apps-using-the-app-username-and-personhood", "index": 2, "depth": 2, "title": "Claim a username", "anchor": "claim-a-username", "start_char": 1322, "end_char": 2336, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5061aa0a6c9b164874ccce21d4af00def482c863d040852ff812e7d775b02ca8", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Claim a username\n\n1. Open the app, go to the profile or identity section, and choose to claim a\n   username.\n2. Enter a base name. Base names need at least six lowercase letters. The app\n   checks the name and tells you if it is unavailable or does not meet the\n   network's formatting rules.\n3. The app adds a two-digit suffix to your base name, for example `alicia.07`.\n   The suffix `00` is never used, and the app skips digits that are already\n   taken, so different people can share the same base name.\n4. Confirm. The app signs the registration request on your device, and your\n   keys never leave it. It does not submit the registration itself. It sends\n   the signed request to the network's attester service (the identity\n   backend), which vouches for you and submits it to the People chain on your\n   behalf.\n5. The attester queues the request before submitting it, so the username\n   appears a few seconds after you confirm. Once it is on-chain, you are a lite\n   person and your username is live."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-username-and-personhood", "url": "https://developer.polkadot.com/apps/using-the-app/username-and-personhood/#reach-full-personhood-optional", "page_title": "apps-using-the-app-username-and-personhood", "index": 3, "depth": 2, "title": "Reach Full personhood (optional)", "anchor": "reach-full-personhood-optional", "start_char": 2336, "end_char": 2943, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5061aa0a6c9b164874ccce21d4af00def482c863d040852ff812e7d775b02ca8", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Reach Full personhood (optional)\n\nFull personhood needs an invitation. The app redeems a one-time invitation\nvoucher, which then moves your verification forward on-chain. You can't request\na voucher yourself. The team hands them out directly, for example as a QR code\nat an event. Without one, your tier is Lite.\n\nThat is expected, and nothing is wrong. Lite covers every user flow in these\nguides. The only thing Full adds is claiming a `.dot` name with a\nsix-to-eight-character stem and no digits (see\n[Reserved and short-name gating](../build/register-a-dot-name.md#reserved-and-short-name-gating))."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-username-and-personhood", "url": "https://developer.polkadot.com/apps/using-the-app/username-and-personhood/#why-some-features-need-personhood", "page_title": "apps-using-the-app-username-and-personhood", "index": 4, "depth": 2, "title": "Why some features need personhood", "anchor": "why-some-features-need-personhood", "start_char": 2943, "end_char": 3745, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5061aa0a6c9b164874ccce21d4af00def482c863d040852ff812e7d775b02ca8", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Why some features need personhood\n\nPersonhood lets apps offer one-person-one-action experiences fairly, such as a\nsingle vote, a single claim or one entry per human. Without it, one user could\nact many times from many accounts. Apps read your tier, and your alias for that\napp, directly from the chain, so they can enforce these limits without learning\nwho you are.\n\nClaiming a username can also mirror it into `.dot` naming, so the same name\nworks across app and discovery flows. Operator-run infrastructure does this,\nnot a transaction of your own. To see whether yours\nwas mirrored, search the name in the [DotNS UI](https://dotns.dev-dot.li).\nNothing else about your account depends on it. Short names are the ones a tier\nunlocks: see [Register a .dot domain](../build/register-a-dot-name.md)."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-username-and-personhood", "url": "https://developer.polkadot.com/apps/using-the-app/username-and-personhood/#if-something-blocks-you", "page_title": "apps-using-the-app-username-and-personhood", "index": 5, "depth": 2, "title": "If something blocks you", "anchor": "if-something-blocks-you", "start_char": 3745, "end_char": 4174, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5061aa0a6c9b164874ccce21d4af00def482c863d040852ff812e7d775b02ca8", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## If something blocks you\n\n- The name is unavailable: try another base name, or accept the suffix the app\n  proposes.\n- The registration does not finalize: check that your account has enough PAS\n  for fees.\n- Full personhood is not offered: that is expected without an invitation\n  voucher. These guides assume Lite.\n- An app does not recognize your status yet: wait for the on-chain update to\n  finalize, then reopen the app."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-username-and-personhood", "url": "https://developer.polkadot.com/apps/using-the-app/username-and-personhood/#learn-more", "page_title": "apps-using-the-app-username-and-personhood", "index": 6, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 4174, "end_char": 4359, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5061aa0a6c9b164874ccce21d4af00def482c863d040852ff812e7d775b02ca8", "last_updated": "2026-10-28T08:44:36+00:00", "text": "## Learn more\n\n- [Identity & personhood](../architecture/identity.md): tiers, aliases and the precompile\n- [Register a .dot domain](../build/register-a-dot-name.md): what a tier unlocks"}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-users", "url": "https://developer.polkadot.com/apps/using-the-app/users/#install-the-app", "page_title": "apps-using-the-app-users", "index": 0, "depth": 2, "title": "Install the app", "anchor": "install-the-app", "start_char": 718, "end_char": 2214, "estimated_token_count": 368, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b4fdcd7f4572f97870a090786a7da255105b5798b5f2f2db6888c95908c35ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Install the app\n\nThese are devnet builds. The Polkadot releases on Google Play and the App Store\nconnect to a different network and do not work with these docs.\n\n| Platform | Where to get it |\n| --- | --- |\n| Android (recommended) | [join the tester group](https://appdistribution.firebase.dev/i/f3b79521380b40b9) to get each new build automatically |\n| Android (manual APK) | the [latest Android release](https://github.com/Polkadot-Community-Foundation/polkadot-android-community/releases/latest) |\n| iOS (TestFlight) | [join the TestFlight beta](https://testflight.apple.com/join/HnBX59vz) |\n| Desktop (macOS / Windows / Linux) | the [latest desktop release](https://github.com/Polkadot-Community-Foundation/polkadot-desktop-community/releases/latest) |\n| Web gateway (no install) | <https://dev-dot.li> |\n\nOn Android, the tester group is the easiest route. Accept the invitation with a\nGoogle account and you are notified of each new build.\n\nTo install by hand instead, take `app-polkadot-devnet.apk` (~200 MB) from the\nlatest release and allow installs from unknown sources. The same APK runs with\nor without Google Play services.\n\niOS builds are only distributed through TestFlight. The first build of each\nversion reaches the group once Beta App Review approves it.\n\n\nIf you only want to open a few apps, you can skip the install and use the web\ngateway at [dev-dot.li](https://dev-dot.li) in any browser. For an on-device\naccount, payments and signing, install one of the apps above."}
{"source": "polkadot-docs", "page_id": "apps-using-the-app-users", "url": "https://developer.polkadot.com/apps/using-the-app/users/#what-to-do-next", "page_title": "apps-using-the-app-users", "index": 1, "depth": 2, "title": "What to do next", "anchor": "what-to-do-next", "start_char": 2214, "end_char": 2925, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b4fdcd7f4572f97870a090786a7da255105b5798b5f2f2db6888c95908c35ae", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## What to do next\n\nWork through these guides in order:\n\n1. [Create an account & get funds](create-account.md). Create or\n   import an account and fund it.\n2. [Back up & restore your account](back-up-your-account.md). Save\n   the recovery phrase and turn on the cloud backup before you need them.\n3. [Get & use CASH](get-and-use-cash.md). Top up your balance and\n   send some to someone.\n4. [Username & proof of personhood](username-and-personhood.md).\n   Claim a readable name to use instead of a long address.\n5. [Discover & open apps](discover-and-open-apps.md). Find apps in\n   Browse and open them by their `.dot` domain.\n6. [Messaging & calls](messaging-and-calls.md). Chat with and call\n   your contacts."}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-create-account", "url": "https://developer.polkadot.com/chain-interactions/accounts/create-account/#introduction", "page_title": "Create an Account", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 750, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:49b7b3bf75e5b270f55429ac1e8e5b059d68b42da3ec32e208ce514b2a97fdc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nCreating accounts is a fundamental operation when building applications on Polkadot and its parachains. Accounts serve as the basis for identity, asset ownership, and transaction signing. Understanding how to generate and manage accounts programmatically enables you to build wallets, automate operations, and create seamless user experiences.\n\nPolkadot accounts are based on the SR25519 signature scheme by default, though ED25519 and ECDSA are also supported. Each account consists of a public key (address) and a private key (seed/mnemonic). **Keep your private keys secure and never share them**.\n\nThis tutorial will guide you through creating accounts using different programming languages and libraries."}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-create-account", "url": "https://developer.polkadot.com/chain-interactions/accounts/create-account/#prerequisites", "page_title": "Create an Account", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 750, "end_char": 983, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:49b7b3bf75e5b270f55429ac1e8e5b059d68b42da3ec32e208ce514b2a97fdc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- Basic understanding of public-key cryptography concepts\n- Development environment set up for your chosen language\n- Familiarity with the programming language you'll be using"}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-create-account", "url": "https://developer.polkadot.com/chain-interactions/accounts/create-account/#use-javascripttypescript", "page_title": "Create an Account", "index": 2, "depth": 2, "title": "Use JavaScript/TypeScript", "anchor": "use-javascripttypescript", "start_char": 983, "end_char": 2963, "estimated_token_count": 467, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:49b7b3bf75e5b270f55429ac1e8e5b059d68b42da3ec32e208ce514b2a97fdc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use JavaScript/TypeScript\n\nJavaScript/TypeScript developers can use the Polkadot.js API to create and manage Polkadot accounts.\n\n1. Create a new project directory and initialize it:\n\n    ```bash\n    mkdir account-creator\n    cd account-creator\n    npm init -y && npm pkg set type=module\n    ```\n\n2. Install the required packages:\n\n    ```bash\n    npm install @polkadot/util-crypto @polkadot/keyring\n    npm install --save-dev typescript tsx\n    ```\n\n3. Create a file named `create-account.ts` and add the following code to it:\n\n    ```typescript title=\"create-account.ts\"\n    import { cryptoWaitReady, mnemonicGenerate } from '@polkadot/util-crypto';\n    import { Keyring } from '@polkadot/keyring';\n    \n    async function main() {\n      await cryptoWaitReady();\n    \n      const mnemonic = mnemonicGenerate(12);\n      const keyring = new Keyring({ type: 'sr25519', ss58Format: 0 });\n      const pair = keyring.addFromMnemonic(mnemonic);\n    \n      console.log(`Address: ${pair.address}`);\n      console.log(`Mnemonic: ${mnemonic}`);\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    Key aspects of the code:\n\n    - **Mnemonic generation**: Uses `mnemonicGenerate()` to create a 12-word BIP39 mnemonic phrase for human-readable key backup.\n    - **Keyring**: The `Keyring` class manages accounts with a specified signature scheme and address format.\n    - **SS58 format**: Setting `ss58Format: 0` configures addresses for the Polkadot relay chain.\n\n4. Execute the script using `tsx`:\n\n    ```bash\n    npx tsx create-account.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx create-account.ts</span>\n        <span data-ty=\"progress\"></span>\n        <span data-ty>Address: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty>Mnemonic: cushion dog echo people vendor curve truck begin latin romance rebuild ...</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-create-account", "url": "https://developer.polkadot.com/chain-interactions/accounts/create-account/#python", "page_title": "Create an Account", "index": 3, "depth": 2, "title": "Python", "anchor": "python", "start_char": 2963, "end_char": 4424, "estimated_token_count": 321, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:49b7b3bf75e5b270f55429ac1e8e5b059d68b42da3ec32e208ce514b2a97fdc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Python\n\nPython developers can use the `substrate-interface` library to create and manage Polkadot accounts.\n\n1. Create a new project directory and set up a virtual environment:\n\n    ```bash\n    mkdir account-creator-python\n    cd account-creator-python\n    python3 -m venv venv\n    source venv/bin/activate  # On Windows: venv\\Scripts\\activate\n    ```\n\n2. Install the required package:\n\n    ```bash\n    pip install substrate-interface\n    ```\n\n3. Create a file named `create_account.py`:\n\n    ```python title=\"create_account.py\"\n    from substrateinterface import Keypair\n    \n    mnemonic = Keypair.generate_mnemonic()\n    keypair = Keypair.create_from_mnemonic(mnemonic)\n    \n    print(f\"Address: {keypair.ss58_address}\")\n    print(f\"Mnemonic: {mnemonic}\")\n    \n    ```\n\n    Key aspects of the code:\n\n    - **Mnemonic generation**: The `generate_mnemonic()` function creates a BIP39-compatible phrase.\n    - **Keypair creation**: `Keypair.create_from_mnemonic()` derives keys from the mnemonic.\n\n4. Execute the script:\n\n    ```bash\n    python create_account.py\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>python create_account.py</span>\n        <span data-ty>Address: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty>Mnemonic: cushion dog echo people vendor curve truck begin latin romance rebuild ...</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-create-account", "url": "https://developer.polkadot.com/chain-interactions/accounts/create-account/#rust", "page_title": "Create an Account", "index": 4, "depth": 2, "title": "Rust", "anchor": "rust", "start_char": 4424, "end_char": 6243, "estimated_token_count": 492, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:49b7b3bf75e5b270f55429ac1e8e5b059d68b42da3ec32e208ce514b2a97fdc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Rust\n\nRust provides low-level access to Substrate primitives for account creation through the `sp-core` and `sp-keyring` crates.\n\n1. Create a new Rust project:\n\n    ```bash\n    cargo new account-creator-rust\n    cd account-creator-rust\n    ```\n\n2. Add dependencies to your `Cargo.toml`:\n\n    ```toml title=\"Cargo.toml\"\n    [package]\n    name = \"account-creator-rust\"\n    version = \"0.1.0\"\n    edition = \"2021\"\n\n    [dependencies]\n    sp-core = \"28.0\"\n    sp-runtime = \"31.0\"\n    ```\n\n3. Create your account generation code in `src/main.rs`:\n\n    ```rust title=\"src/main.rs\"\n    use sp_core::{crypto::Ss58Codec, Pair};\n    \n    fn main() {\n        let (pair, phrase, _) = sp_core::sr25519::Pair::generate_with_phrase(None);\n        let address = pair.public().to_ss58check();\n        \n        println!(\"Address: {}\", address);\n        println!(\"Mnemonic: {}\", phrase);\n    }\n    ```\n\n    Key aspects of the code:\n\n    - **Keypair generation**: [`sr25519::Pair::generate_with_phrase()`](https://docs.rs/sp-core/latest/sp_core/crypto/trait.Pair.html#method.generate_with_phrase) creates a new key pair with mnemonic.\n    - **Public key extraction**: The [`public()`](https://docs.rs/sp-core/latest/sp_core/crypto/trait.Pair.html#tymethod.public) method retrieves the public key from the pair.\n    - **SS58 encoding**: Uses Polkadot's address format for the human-readable address.\n\n4. Build and run the project:\n\n    ```bash\n    cargo run\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>cargo run</span>\n        <span data-ty>Address: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty>Mnemonic: cushion dog echo people vendor curve truck begin latin romance rebuild ...</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-create-account", "url": "https://developer.polkadot.com/chain-interactions/accounts/create-account/#where-to-go-next", "page_title": "Create an Account", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6243, "end_char": 7173, "estimated_token_count": 221, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:49b7b3bf75e5b270f55429ac1e8e5b059d68b42da3ec32e208ce514b2a97fdc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Send Transactions with SDKs__\n\n    ---\n\n    Learn how to send signed transactions using your newly created accounts with Polkadot-API and Polkadot.js API libraries.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/with-sdks/)\n\n-   <span class=\"badge guide\">Guide</span> __Calculate Transaction Fees__\n\n    ---\n\n    Learn how to estimate transaction fees before sending transactions from your accounts.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/calculate-transaction-fees/)\n\n-   <span class=\"badge guide\">Guide</span> __Query Chain Data__\n\n    ---\n\n    Explore different methods for querying blockchain data, including account balances and other chain state.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/query-sdks/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-query-accounts", "url": "https://developer.polkadot.com/chain-interactions/accounts/query-accounts/#introduction", "page_title": "Query Account Information with SDKs", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 40, "end_char": 1061, "estimated_token_count": 225, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd00f3f70483dc0b9b85d0c15ed252ac3552159aad69d277c12b8d2889607a75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nQuerying account information is a fundamental operation when interacting with Polkadot SDK-based blockchains. Account queries allow you to retrieve balances, nonces, account data, and other state information stored on-chain. Each SDK provides different methods for accessing this data efficiently.\n\nThis guide demonstrates how to query account information using five popular SDKs:\n\n- **[Polkadot API (PAPI)](/reference/tools/papi/)**: Modern TypeScript library with type-safe APIs\n- **[Polkadot.js API](/reference/tools/polkadot-js-api/)**: Comprehensive JavaScript library (maintenance mode)\n- **[Dedot](/reference/tools/dedot/)**: Lightweight TypeScript library optimized for performance\n- **[Python Substrate Interface](/reference/tools/py-substrate-interface/)**: Python library for Substrate chains\n- **[Subxt](/reference/tools/subxt/)**: Rust library with compile-time type safety\n\nSelect your preferred SDK below to see complete, runnable examples that query account information on Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-query-accounts", "url": "https://developer.polkadot.com/chain-interactions/accounts/query-accounts/#prerequisites", "page_title": "Query Account Information with SDKs", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1061, "end_char": 1216, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd00f3f70483dc0b9b85d0c15ed252ac3552159aad69d277c12b8d2889607a75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\n- Access to a Polkadot SDK-compatible blockchain endpoint (WebSocket URL)\n- An account address to query (can be any valid SS58 address)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-query-accounts", "url": "https://developer.polkadot.com/chain-interactions/accounts/query-accounts/#query-account-information", "page_title": "Query Account Information with SDKs", "index": 2, "depth": 2, "title": "Query Account Information", "anchor": "query-account-information", "start_char": 1216, "end_char": 23660, "estimated_token_count": 5642, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd00f3f70483dc0b9b85d0c15ed252ac3552159aad69d277c12b8d2889607a75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Account Information\n\n=== \"PAPI\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir papi-query-account-example && cd papi-query-account-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install polkadot-api@3.3.0 && \\\n        npm install --save-dev @types/node tsx typescript\n        ```\n\n    3. Generate types for Polkadot Hub:\n\n        ```bash\n        npx papi add polkadotTestNet -w wss://asset-hub-paseo.dotters.network\n        ```\n\n    **Query Account Data**\n\n    The following example queries account information including balance, nonce, and other account data.\n\n    Create a file named `query-account.ts` and add the following code to it:\n\n    ```typescript title=\"query-account.ts\"\n    import { createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { polkadotTestNet } from '@polkadot-api/descriptors';\n    \n    const POLKADOT_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    const ACCOUNT_ADDRESS = 'INSERT_ACCOUNT_ADDRESS';\n    const PAS_UNITS = 10_000_000_000;\n    \n    async function main() {\n      try {\n        // Create the client connection\n        const client = createClient(getWsProvider(POLKADOT_HUB_RPC));\n    \n        // Get the typed API\n        const api = client.getTypedApi(polkadotTestNet);\n        console.log('Connected to Polkadot Hub');\n    \n        console.log(`\\nQuerying account: ${ACCOUNT_ADDRESS}\\n`);\n    \n        // Query account information\n        const accountInfo = await api.query.System.Account.getValue(\n          ACCOUNT_ADDRESS\n        );\n    \n        // Display account information\n        console.log('Account Information:');\n        console.log('===================');\n        console.log(`Nonce: ${accountInfo.nonce}`);\n        console.log(`Consumers: ${accountInfo.consumers}`);\n        console.log(`Providers: ${accountInfo.providers}`);\n        console.log(`Sufficients: ${accountInfo.sufficients}`);\n    \n        console.log('\\nBalance Details:');\n        console.log('================');\n        console.log(\n          `Free Balance: ${accountInfo.data.free} (${\n            Number(accountInfo.data.free) / PAS_UNITS\n          } PAS)`\n        );\n        console.log(\n          `Reserved Balance: ${accountInfo.data.reserved} (${\n            Number(accountInfo.data.reserved) / PAS_UNITS\n          } PAS)`\n        );\n        console.log(\n          `Frozen Balance: ${accountInfo.data.frozen} (${\n            Number(accountInfo.data.frozen) / PAS_UNITS\n          } PAS)`\n        );\n    \n        const total =\n          Number(accountInfo.data.free) + Number(accountInfo.data.reserved);\n        console.log(`\\nTotal Balance: ${total} (${total / PAS_UNITS} PAS)`);\n    \n        await client.destroy();\n        console.log('\\nDisconnected');\n      } catch (error) {\n        console.error('Error:', error);\n        process.exit(1);\n      }\n    }\n    \n    main();\n    \n    ```\n\n    !!! note    \n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx query-account.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx query-account.ts</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty></span>\n        <span data-ty>Querying account: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>===================</span>\n        <span data-ty>Nonce: 15</span>\n        <span data-ty>Consumers: 0</span>\n        <span data-ty>Providers: 1</span>\n        <span data-ty>Sufficients: 0</span>\n        <span data-ty></span>\n        <span data-ty>Balance Details:</span>\n        <span data-ty>================</span>\n        <span data-ty>Free Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty>Reserved Balance: 0 (0 PAS)</span>\n        <span data-ty>Frozen Balance: 0 (0 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Total Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Disconnected</span>\n    </div>\n\n\n=== \"Polkadot.js\"\n\n    !!! warning \"Maintenance Mode Only\"\n        The Polkadot.js API is no longer actively developed. New projects should use [PAPI](/reference/tools/papi/) or [Dedot](/reference/tools/dedot/) as actively maintained alternatives.\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir pjs-query-account-example && cd pjs-query-account-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install @polkadot/api\n        ```\n\n    **Query Account Data**\n\n    The following example queries account information including balance, nonce, and other account data.\n\n    Create a file named `query-account.js` and add the following code to it:\n\n    ```javascript title=\"query-account.js\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    const POLKADOT_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    const ACCOUNT_ADDRESS = 'INSERT_ACCOUNT_ADDRESS';\n    const PAS_UNITS = 10_000_000_000;\n    \n    async function main() {\n      // Create a WebSocket provider\n      const wsProvider = new WsProvider(POLKADOT_HUB_RPC);\n    \n      // Initialize the API\n      const api = await ApiPromise.create({ provider: wsProvider });\n      console.log('Connected to Polkadot Hub');\n    \n      console.log(`\\nQuerying account: ${ACCOUNT_ADDRESS}\\n`);\n    \n      // Query account information\n      const accountInfo = await api.query.system.account(ACCOUNT_ADDRESS);\n    \n      // Display account information\n      console.log('Account Information:');\n      console.log('===================');\n      console.log(`Nonce: ${accountInfo.nonce.toString()}`);\n      console.log(`Consumers: ${accountInfo.consumers.toString()}`);\n      console.log(`Providers: ${accountInfo.providers.toString()}`);\n      console.log(`Sufficients: ${accountInfo.sufficients.toString()}`);\n    \n      console.log('\\nBalance Details:');\n      console.log('================');\n      console.log(\n        `Free Balance: ${accountInfo.data.free.toString()} (${\n          Number(accountInfo.data.free.toBigInt()) / PAS_UNITS\n        } PAS)`\n      );\n      console.log(\n        `Reserved Balance: ${accountInfo.data.reserved.toString()} (${\n          Number(accountInfo.data.reserved.toBigInt()) / PAS_UNITS\n        } PAS)`\n      );\n      console.log(\n        `Frozen Balance: ${accountInfo.data.frozen.toString()} (${\n          Number(accountInfo.data.frozen.toBigInt()) / PAS_UNITS\n        } PAS)`\n      );\n    \n      const total =\n        Number(accountInfo.data.free.toBigInt()) +\n        Number(accountInfo.data.reserved.toBigInt());\n      console.log(`\\nTotal Balance: ${total} (${total / PAS_UNITS} PAS)`);\n    \n      // Disconnect from the node\n      await api.disconnect();\n      console.log('\\nDisconnected');\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note    \n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    node query-account.js\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>node query-account.js</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty></span>\n        <span data-ty>Querying account: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>===================</span>\n        <span data-ty>Nonce: 15</span>\n        <span data-ty>Consumers: 0</span>\n        <span data-ty>Providers: 1</span>\n        <span data-ty>Sufficients: 0</span>\n        <span data-ty></span>\n        <span data-ty>Balance Details:</span>\n        <span data-ty>================</span>\n        <span data-ty>Free Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty>Reserved Balance: 0 (0 PAS)</span>\n        <span data-ty>Frozen Balance: 0 (0 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Total Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Disconnected</span>\n    </div>\n\n=== \"Dedot\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir dedot-query-account-example && cd dedot-query-account-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install dedot && \\\n        npm install --save-dev @dedot/chaintypes @types/node tsx typescript\n        ```\n\n    **Query Account Data**\n\n    The following example queries account information including balance, nonce, and other account data.\n\n    Create a file named `query-account.ts` and add the following code to it:\n\n    ```typescript title=\"query-account.ts\"\n    import { DedotClient, WsProvider } from 'dedot';\n    import type { PolkadotAssetHubApi } from '@dedot/chaintypes';\n    \n    const POLKADOT_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    const ACCOUNT_ADDRESS = 'INSERT_ACCOUNT_ADDRESS';\n    const PAS_UNITS = 10_000_000_000;\n    \n    async function main() {\n      // Initialize provider and client with Asset Hub types\n      const provider = new WsProvider(POLKADOT_HUB_RPC);\n      const client = await DedotClient.new<PolkadotAssetHubApi>(provider);\n    \n      console.log('Connected to Polkadot Hub');\n    \n      console.log(`\\nQuerying account: ${ACCOUNT_ADDRESS}\\n`);\n    \n      // Query account information\n      const accountInfo = await client.query.system.account(ACCOUNT_ADDRESS);\n    \n      // Display account information\n      console.log('Account Information:');\n      console.log('===================');\n      console.log(`Nonce: ${accountInfo.nonce}`);\n      console.log(`Consumers: ${accountInfo.consumers}`);\n      console.log(`Providers: ${accountInfo.providers}`);\n      console.log(`Sufficients: ${accountInfo.sufficients}`);\n    \n      console.log('\\nBalance Details:');\n      console.log('================');\n      console.log(\n        `Free Balance: ${accountInfo.data.free} (${\n          Number(accountInfo.data.free) / PAS_UNITS\n        } PAS)`\n      );\n      console.log(\n        `Reserved Balance: ${accountInfo.data.reserved} (${\n          Number(accountInfo.data.reserved) / PAS_UNITS\n        } PAS)`\n      );\n      console.log(\n        `Frozen Balance: ${accountInfo.data.frozen} (${\n          Number(accountInfo.data.frozen) / PAS_UNITS\n        } PAS)`\n      );\n    \n      const total =\n        Number(accountInfo.data.free) + Number(accountInfo.data.reserved);\n      console.log(`\\nTotal Balance: ${total} (${total / PAS_UNITS} PAS)`);\n    \n      // Disconnect the client\n      await client.disconnect();\n      console.log('\\nDisconnected from Polkadot Hub');\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note    \n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx query-account.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx query-account.ts</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty></span>\n        <span data-ty>Querying account: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>===================</span>\n        <span data-ty>Nonce: 15</span>\n        <span data-ty>Consumers: 0</span>\n        <span data-ty>Providers: 1</span>\n        <span data-ty>Sufficients: 0</span>\n        <span data-ty></span>\n        <span data-ty>Balance Details:</span>\n        <span data-ty>================</span>\n        <span data-ty>Free Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty>Reserved Balance: 0 (0 PAS)</span>\n        <span data-ty>Frozen Balance: 0 (0 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Total Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Disconnected from Polkadot Hub</span>\n    </div>\n\n=== \"Python Substrate Interface\"\n\n    **Prerequisites**\n\n    - [Python](https://www.python.org/) 3.8 or higher\n    - pip package manager\n\n    **Environment Setup**\n\n    1. Create a new project directory and set up a virtual environment:\n\n        ```bash\n        mkdir psi-query-account-example && cd psi-query-account-example && \\\n        python3 -m venv venv && source venv/bin/activate\n        ```\n\n    2. Install the substrate-interface package:\n\n        ```bash\n        pip install substrate-interface\n        ```\n\n    **Query Account Data**\n\n    The following example queries account information including balance, nonce, and other account data.\n\n    Create a file named `query_account.py` and add the following code to it:\n\n    ```python title=\"query_account.py\"\n        from substrateinterface import SubstrateInterface\n    \n        POLKADOT_HUB_RPC = \"INSERT_WS_ENDPOINT\"\n        ACCOUNT_ADDRESS = \"INSERT_ACCOUNT_ADDRESS\"\n        PAS_UNITS = 10_000_000_000\n    \n        def main():\n            # Connect to Polkadot Hub\n            substrate = SubstrateInterface(url=POLKADOT_HUB_RPC)\n    \n            print(\"Connected to Polkadot Hub\")\n    \n            print(f\"\\nQuerying account: {ACCOUNT_ADDRESS}\\n\")\n    \n            # Query account information\n            account_info = substrate.query(\n                module=\"System\", storage_function=\"Account\", params=[ACCOUNT_ADDRESS]\n            )\n    \n            # Display account information\n            print(\"Account Information:\")\n            print(\"===================\")\n            print(f\"Nonce: {account_info.value['nonce']}\")\n            print(f\"Consumers: {account_info.value['consumers']}\")\n            print(f\"Providers: {account_info.value['providers']}\")\n            print(f\"Sufficients: {account_info.value['sufficients']}\")\n    \n            print(\"\\nBalance Details:\")\n            print(\"================\")\n            free_balance = account_info.value[\"data\"][\"free\"]\n            reserved_balance = account_info.value[\"data\"][\"reserved\"]\n            frozen_balance = account_info.value[\"data\"][\"frozen\"]\n    \n            print(f\"Free Balance: {free_balance} ({free_balance / PAS_UNITS} PAS)\")\n            print(\n                f\"Reserved Balance: {reserved_balance} ({reserved_balance / PAS_UNITS} PAS)\"\n            )\n            print(f\"Frozen Balance: {frozen_balance} ({frozen_balance / PAS_UNITS} PAS)\")\n    \n            total = free_balance + reserved_balance\n            print(f\"\\nTotal Balance: {total} ({total / PAS_UNITS} PAS)\")\n    \n            # Close connection\n            substrate.close()\n            print(\"\\nDisconnected\")\n    \n    \n        if __name__ == \"__main__\":\n            main()\n    ```\n\n    !!! note    \n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    python query_account.py\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>python3 query_account.py</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty></span>\n        <span data-ty>Querying account: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>===================</span>\n        <span data-ty>Nonce: 15</span>\n        <span data-ty>Consumers: 0</span>\n        <span data-ty>Providers: 1</span>\n        <span data-ty>Sufficients: 0</span>\n        <span data-ty></span>\n        <span data-ty>Balance Details:</span>\n        <span data-ty>================</span>\n        <span data-ty>Free Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty>Reserved Balance: 0 (0.0 PAS)</span>\n        <span data-ty>Frozen Balance: 0 (0.0 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Total Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Disconnected</span>\n    </div>\n\n=== \"Subxt\"\n\n    **Prerequisites**\n\n    - [Rust](https://rustup.rs/) toolchain (latest stable)\n    - Cargo package manager\n\n    **Environment Setup**\n\n    1. Create a new Rust project:\n\n        ```bash\n        cargo new subxt-query-account-example && cd subxt-query-account-example\n        ```\n\n    2. Install the Subxt CLI:\n\n        ```bash\n        cargo install subxt-cli@0.50.0\n        ```\n\n    3. Download the Polkadot Hub metadata:\n\n        ```bash\n        subxt metadata --url INSERT_WS_ENDPOINT -o polkadot_testnet_metadata.scale\n        ```\n\n    4. Update `Cargo.toml` with the required dependencies:\n\n        ```toml title=\"Cargo.toml\"\n        [package]\n        name = \"subxt-query-account-example\"\n        version = \"0.1.0\"\n        edition = \"2021\"\n\n        [[bin]]\n        name = \"query_account\"\n        path = \"src/bin/query_account.rs\"\n\n        [dependencies]\n        subxt = { version = \"0.50.0\" }\n        tokio = { version = \"1.36.0\", features = [\"macros\", \"rt\"] }\n        ```\n\n    **Query Account Data**\n\n    The following example queries account information including balance, nonce, and other account data.\n\n    Create a file at `src/bin/query_account.rs` and add the following code to it:\n\n    ```rust title=\"src/bin/query_account.rs\"\n    use std::str::FromStr;\n    use subxt::utils::AccountId32;\n    use subxt::{OnlineClient, PolkadotConfig};\n    \n    // Generate an interface from the node's metadata\n    #[subxt::subxt(runtime_metadata_path = \"polkadot_testnet_metadata.scale\")]\n    pub mod polkadot_testnet {}\n    \n    const POLKADOT_TESTNET_RPC: &str = \"INSERT_WS_ENDPOINT\";\n    const ACCOUNT_ADDRESS: &str = \"INSERT_ACCOUNT_ADDRESS\";\n    const PAS_UNITS: u128 = 10_000_000_000;\n    \n    #[tokio::main(flavor = \"current_thread\")]\n    async fn main() -> Result<(), Box<dyn std::error::Error>> {\n        // Initialize the Subxt client\n        let api = OnlineClient::<PolkadotConfig>::from_url(POLKADOT_TESTNET_RPC).await?;\n    \n        // Anchor to the current block\n        let at_block = api.at_current_block().await?;\n    \n        println!(\"Connected to Polkadot Hub\");\n    \n        // Convert the account address into an AccountId32\n        let account = AccountId32::from_str(ACCOUNT_ADDRESS)?;\n    \n        println!(\"\\nQuerying account: {}\\n\", account);\n    \n        // Query account information\n        let account_storage = at_block\n            .storage()\n            .entry(polkadot_testnet::storage().system().account())?;\n        let info = account_storage\n            .fetch((account,))\n            .await?\n            .decode()?;\n    \n        // Display account information\n        println!(\"Account Information:\");\n        println!(\"===================\");\n        println!(\"Nonce: {}\", info.nonce);\n        println!(\"Consumers: {}\", info.consumers);\n        println!(\"Providers: {}\", info.providers);\n        println!(\"Sufficients: {}\", info.sufficients);\n    \n        println!(\"\\nBalance Details:\");\n        println!(\"================\");\n        println!(\n            \"Free Balance: {} ({} PAS)\",\n            info.data.free,\n            info.data.free as f64 / PAS_UNITS as f64\n        );\n        println!(\n            \"Reserved Balance: {} ({} PAS)\",\n            info.data.reserved,\n            info.data.reserved as f64 / PAS_UNITS as f64\n        );\n        println!(\n            \"Frozen Balance: {} ({} PAS)\",\n            info.data.frozen,\n            info.data.frozen as f64 / PAS_UNITS as f64\n        );\n    \n        let total = info.data.free + info.data.reserved;\n        println!(\n            \"\\nTotal Balance: {} ({} PAS)\",\n            total,\n            total as f64 / PAS_UNITS as f64\n        );\n    \n        println!(\"\\nDisconnected\");\n    \n        Ok(())\n    }\n    \n    ```\n\n    !!! note    \n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    cargo run --bin query_account\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>cargo run --bin query_account</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty></span>\n        <span data-ty>Querying account: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>===================</span>\n        <span data-ty>Nonce: 15</span>\n        <span data-ty>Consumers: 0</span>\n        <span data-ty>Providers: 1</span>\n        <span data-ty>Sufficients: 0</span>\n        <span data-ty></span>\n        <span data-ty>Balance Details:</span>\n        <span data-ty>================</span>\n        <span data-ty>Free Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty>Reserved Balance: 0 (0 PAS)</span>\n        <span data-ty>Frozen Balance: 0 (0 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Total Balance: 59781317040 (5.978131704 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Disconnected</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-query-accounts", "url": "https://developer.polkadot.com/chain-interactions/accounts/query-accounts/#understanding-account-data", "page_title": "Query Account Information with SDKs", "index": 3, "depth": 2, "title": "Understanding Account Data", "anchor": "understanding-account-data", "start_char": 23660, "end_char": 24436, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd00f3f70483dc0b9b85d0c15ed252ac3552159aad69d277c12b8d2889607a75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understanding Account Data\n\nWhen querying account information, you'll receive several key fields:\n\n- **Nonce**: The number of transactions sent from this account, used to prevent replay attacks.\n- **Consumers**: The number of modules depending on this account's existence.\n- **Providers**: The number of modules providing for this account's existence.\n- **Sufficients**: The number of modules that allow this account to exist on its own.\n- **Free Balance**: The transferable balance available for transactions.\n- **Reserved Balance**: Balance that is locked for specific purposes (staking, governance, etc.).\n- **Frozen Balance**: Balance that cannot be used for transfers but may be used for other operations.\n\nThe total balance is the sum of free and reserved balances."}
{"source": "polkadot-docs", "page_id": "chain-interactions-accounts-query-accounts", "url": "https://developer.polkadot.com/chain-interactions/accounts/query-accounts/#where-to-go-next", "page_title": "Query Account Information with SDKs", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 24436, "end_char": 24929, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd00f3f70483dc0b9b85d0c15ed252ac3552159aad69d277c12b8d2889607a75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Query On-Chain State**\n\n    ---\n\n    Explore other types of storage queries.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/query-sdks/)\n\n- <span class=\"badge guide\">Guide</span> **Send Transactions**\n\n    ---\n\n    Learn how to construct and submit transactions.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/with-sdks/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#introduction", "page_title": "Chain Interactions Overview", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 996, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nChain interactions form the foundation of building applications on Polkadot. Whether you're querying on-chain data, executing transactions, enabling cross-chain communication, or managing accounts, understanding how to interact with Polkadot-based chains is essential for application developers.\n\nThis section provides comprehensive guidance on the various ways to interact with Polkadot chains, from basic queries to complex cross-chain operations. You'll learn how to:\n\n- Query on-chain state and subscribe to blockchain events.\n- Send transactions and manage their lifecycle.\n- Enable interoperability between parachains through XCM.\n- Manage tokens and perform token operations.\n- Create and manage accounts programmatically.\n\nWhether you're building a frontend application, a backend service, or integrating with the Polkadot ecosystem, these guides will equip you with the knowledge and tools to effectively interact with chains across the network."}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#core-interaction-patterns", "page_title": "Chain Interactions Overview", "index": 1, "depth": 2, "title": "Core Interaction Patterns", "anchor": "core-interaction-patterns", "start_char": 996, "end_char": 1026, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Interaction Patterns"}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#query-on-chain-data", "page_title": "Chain Interactions Overview", "index": 2, "depth": 3, "title": "Query On-Chain Data", "anchor": "query-on-chain-data", "start_char": 1026, "end_char": 1227, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Query On-Chain Data\n\nAccessing blockchain state is fundamental to building responsive applications. Polkadot offers several methods to query on-chain data, each suited for different use cases."}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#send-transactions", "page_title": "Chain Interactions Overview", "index": 3, "depth": 3, "title": "Send Transactions", "anchor": "send-transactions", "start_char": 1227, "end_char": 1439, "estimated_token_count": 30, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Send Transactions\n\nTransactions are the primary mechanism for modifying blockchain state. Understanding transaction construction, signing, and submission is crucial for building interactive applications."}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#send-cross-chain-transactions", "page_title": "Chain Interactions Overview", "index": 4, "depth": 3, "title": "Send Cross-Chain Transactions", "anchor": "send-cross-chain-transactions", "start_char": 1439, "end_char": 1650, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Send Cross-Chain Transactions\n\nPolkadot enables native cross-chain capabilities through Cross-Consensus Messaging (XCM), allowing chains to securely communicate and transfer assets across the ecosystem."}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#manage-tokens", "page_title": "Chain Interactions Overview", "index": 5, "depth": 3, "title": "Manage Tokens", "anchor": "manage-tokens", "start_char": 1650, "end_char": 1856, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Manage Tokens\n\nPolkadot Hub provides a unified platform for managing assets across the ecosystem. Understanding token operations is essential for DeFi applications and multi-chain asset management."}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#manage-accounts", "page_title": "Chain Interactions Overview", "index": 6, "depth": 3, "title": "Manage Accounts", "anchor": "manage-accounts", "start_char": 1856, "end_char": 2046, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Manage Accounts\n\nAccount management forms the basis of user identity and authentication in blockchain applications. Learn how to create, manage, and query accounts programmatically."}
{"source": "polkadot-docs", "page_id": "chain-interactions", "url": "https://developer.polkadot.com/chain-interactions/#development-tools-and-sdks", "page_title": "Chain Interactions Overview", "index": 7, "depth": 2, "title": "Development Tools and SDKs", "anchor": "development-tools-and-sdks", "start_char": 2046, "end_char": 3065, "estimated_token_count": 244, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:539e34510d6dc9bac8c7e868e66702eecd8b442d0f7b0c0757c48f32cc5e448d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Development Tools and SDKs\n\nThe Polkadot ecosystem offers a rich set of tools and libraries to facilitate chain interactions:\n\n| Tool | Description |\n|------|-------------|\n| [Polkadot API (PAPI)](/reference/tools/papi/) | Modern, type-safe TypeScript library with full metadata support. |\n| [Polkadot.js](/reference/tools/polkadot-js-api/) | Comprehensive JavaScript library with extensive ecosystem support. |\n| [Dedot](/reference/tools/dedot/) | Lightweight TypeScript library optimized for performance. |\n| [Python Substrate Interface](/reference/tools/py-substrate-interface/) | Polkadot Substrate Interface for streamlined development. |\n| [Subxt](/reference/tools/subxt/) | Rust library for building robust substrate-based applications. |\n| [Polkadot.js Apps](https://polkadot.js.org/apps/) | Web-based interface for exploring and interacting with chains. |\n\nEach tool has its strengths, and choosing the right one depends on your project requirements, programming language preference, and specific use cases."}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#introduction", "page_title": "Query On-Chain State with Sidecar REST API", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 370, "end_char": 935, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Substrate API Sidecar](https://github.com/paritytech/substrate-api-sidecar) is a REST service that makes it easy to interact with Polkadot SDK-based blockchains. It provides a simple HTTP interface to query account balances, asset information, block data, and other on-chain state without requiring WebSocket connections or SDK integrations.\n\nThis guide demonstrates how to query on-chain storage using the Sidecar REST API with `curl` commands. You'll learn to retrieve account balances, asset metadata, and block information from Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#prerequisites", "page_title": "Query On-Chain State with Sidecar REST API", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 935, "end_char": 1055, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\n- [curl](https://curl.se/) or any HTTP client\n- Access to a Sidecar instance (public or self-hosted)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#running-sidecar-locally", "page_title": "Query On-Chain State with Sidecar REST API", "index": 2, "depth": 2, "title": "Running Sidecar Locally", "anchor": "running-sidecar-locally", "start_char": 1055, "end_char": 1733, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Running Sidecar Locally\n\nFor production applications or high-frequency queries, run your own Sidecar instance.\n\n=== \"Using npm\"\n\n    ```bash\n    # Install globally\n    npm install -g @substrate/api-sidecar\n\n    # Run with default settings (connects to ws://127.0.0.1:9944)\n    substrate-api-sidecar\n\n    # Run with custom node URL\n    SAS_SUBSTRATE_URL=wss://polkadot-asset-hub-rpc.polkadot.io substrate-api-sidecar\n    ```\n=== \"Using Docker\"\n\n    ```bash\n    docker run --rm -p 8080:8080 \\\n      -e SAS_SUBSTRATE_URL=wss://polkadot-asset-hub-rpc.polkadot.io \\\n      parity/substrate-api-sidecar\n    ```\n\nOnce running, access your local instance at `http://localhost:8080`."}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#public-sidecar-endpoints", "page_title": "Query On-Chain State with Sidecar REST API", "index": 3, "depth": 2, "title": "Public Sidecar Endpoints", "anchor": "public-sidecar-endpoints", "start_char": 1733, "end_char": 2338, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Public Sidecar Endpoints\n\nParity provides public Sidecar instances for Polkadot ecosystem chains:\n\n| Chain | Endpoint |\n|-------|----------|\n| Polkadot | `https://polkadot-public-sidecar.parity-chains.parity.io` |\n| Kusama | `https://kusama-public-sidecar.parity-chains.parity.io` |\n| Polkadot Hub | `https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io` |\n| Kusama Hub | `https://kusama-asset-hub-public-sidecar.parity-chains.parity.io` |\n\nFor production applications, consider running your own Sidecar instance. See [Running Sidecar Locally](#running-sidecar-locally) for instructions."}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#query-account-balance", "page_title": "Query On-Chain State with Sidecar REST API", "index": 4, "depth": 2, "title": "Query Account Balance", "anchor": "query-account-balance", "start_char": 2338, "end_char": 4197, "estimated_token_count": 535, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Account Balance\n\nThe `/accounts/{accountId}/balance-info` endpoint returns an account's native token balance, including free, reserved, and frozen amounts.\n\n**Request**\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/balance-info\"\n```\n\n**Response**\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>curl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/INSERT_ADDRESS/balance-info\"</span>\n  <pre>\n{\n  \"at\": {\n    \"hash\": \"0xb909e50be96fc0f939588c4a7730670f9ee53c67d95d516198530e5cfe189d6c\",\n    \"height\": \"10646569\"\n  },\n  \"nonce\": \"0\",\n  \"tokenSymbol\": \"DOT\",\n  \"free\": \"10000000000\",\n  \"reserved\": \"0\",\n  \"frozen\": \"0\",\n  \"transferable\": \"10000000000\",\n  \"locks\": []\n}\n</pre\n  >\n</div>\n\n\n**Response fields**\n\n| Field | Description |\n|-------|-------------|\n| `at.hash` | Block hash at which the query was executed |\n| `at.height` | Block number at which the query was executed |\n| `nonce` | Number of transactions sent from this account |\n| `tokenSymbol` | Native token symbol of the chain |\n| `free` | Balance available for transfers (in planck) |\n| `reserved` | Balance locked for on-chain activities |\n| `frozen` | Balance frozen and unavailable for transfers |\n| `transferable` | Actual balance available to transfer |\n| `locks` | Array of balance locks with their reasons |\n\n**Query at a specific block**\n\nYou can query the balance at a specific block height or hash using the `at` query parameter:\n\n```bash\n# Query at block height\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/balance-info?at=10000000\"\n\n# Query at block hash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/balance-info?at=0x...\"\n```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#query-asset-balances", "page_title": "Query On-Chain State with Sidecar REST API", "index": 5, "depth": 2, "title": "Query Asset Balances", "anchor": "query-asset-balances", "start_char": 4197, "end_char": 6957, "estimated_token_count": 766, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Asset Balances\n\nThe `/accounts/{accountId}/asset-balances` endpoint returns an account's balances for assets managed by the Assets pallet.\n\n**Request all asset balances**\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/asset-balances\"\n```\n\n**Request Specific Asset Balance**\n\nTo query a specific asset, provide the asset ID as a query parameter:\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/asset-balances?assets[]=<INSERT_ASSET_ID>\"\n```\n\n??? example \"Query USDT balance\"\n\n    USDT on Polkadot Hub has asset ID `1984`. To query a specific account's USDT balance:\n\n    ```bash\n    curl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/asset-balances?assets[]=1984\"\n    ```\n\n**Response**\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>curl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/INSERT_ADDRESS/asset-balances?assets[]=1984\"</span>\n  <pre>\n{\n  \"at\": {\n    \"hash\": \"0x826f74ae5f6fea33383075156231de5ca8e0ddb308b3f799c9bd64463ed8cb5b\",\n    \"height\": \"10646570\"\n  },\n  \"assets\": [\n    {\n      \"assetId\": \"1984\",\n      \"balance\": \"1000000\",\n      \"isFrozen\": false,\n      \"isSufficient\": false\n    }\n  ]\n}\n</pre\n  >\n</div>\n\n\n**Response fields**\n\n| Field | Description |\n|-------|-------------|\n| `at.hash` | Block hash at which the query was executed |\n| `at.height` | Block number at which the query was executed |\n| `assetId` | Unique identifier for the asset |\n| `balance` | Account's balance of this asset (in smallest unit) |\n| `isFrozen` | Whether the account's asset balance is frozen |\n| `isSufficient` | Whether this account's existence is being paid for by this asset balance (per-account flag, not the asset's global sufficiency setting) |\n\n!!! note\n    The `isSufficient` field in the asset balance response is a per-account flag. To check if an asset is configured as a sufficient asset (can pay for account existence), query the [Asset Details](#query-asset-details) endpoint and check the `isSufficient` field there.\n\n**Query multiple assets**\n\nYou can query multiple assets in a single request:\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/asset-balances?assets[]=<INSERT_ASSET_ID_1>&assets[]=<INSERT_ASSET_ID_2>\"\n```\n\n??? example \"Query USDT and USDC balances\"\n\n    Query both USDT (asset ID `1984`) and USDC (asset ID `1337`) in a single request:\n\n    ```bash\n    curl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/asset-balances?assets[]=1984&assets[]=1337\"\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#query-asset-metadata", "page_title": "Query On-Chain State with Sidecar REST API", "index": 6, "depth": 2, "title": "Query Asset Metadata", "anchor": "query-asset-metadata", "start_char": 6957, "end_char": 8740, "estimated_token_count": 506, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Asset Metadata\n\nUse the pallet storage endpoint to query asset metadata like name, symbol, and decimals.\n\n**Request**\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/pallets/assets/storage/Metadata?keys[]=1984\"\n```\n\n**Response**\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>curl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/pallets/assets/storage/Metadata?keys[]=1984\"</span>\n  <pre>\n{\n  \"at\": {\n    \"hash\": \"0xaf0628855a206da5e95e564b58b9a0bfc490cc8de047a0521252b631be77fac7\",\n    \"height\": \"10646571\"\n  },\n  \"pallet\": \"assets\",\n  \"palletIndex\": \"50\",\n  \"storageItem\": \"metadata\",\n  \"keys\": [\"1984\"],\n  \"value\": {\n    \"deposit\": \"2008200000\",\n    \"name\": \"0x54657468657220555344\",\n    \"symbol\": \"0x55534474\",\n    \"decimals\": \"6\",\n    \"isFrozen\": false\n  }\n}\n</pre\n  >\n</div>\n\n\n**Response fields**\n\n| Field | Description |\n|-------|-------------|\n| `at.hash` | Block hash at which the query was executed |\n| `at.height` | Block number at which the query was executed |\n| `pallet` | Name of the pallet containing the storage item |\n| `palletIndex` | Numeric index of the pallet in the runtime |\n| `storageItem` | Name of the storage item being queried |\n| `keys` | Array of keys used to query the storage map |\n| `value.deposit` | Deposit held for storing this metadata |\n| `value.name` | Asset name (hex-encoded string) |\n| `value.symbol` | Asset symbol (hex-encoded string) |\n| `value.decimals` | Number of decimal places for display |\n| `value.isFrozen` | Whether the asset metadata is frozen |\n\nThe `name` and `symbol` fields are returned as hex-encoded strings. To decode them:\n\n- `0x54657468657220555344` decodes to \"Tether USD\"\n- `0x55534474` decodes to \"USDt\""}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#query-asset-details", "page_title": "Query On-Chain State with Sidecar REST API", "index": 7, "depth": 2, "title": "Query Asset Details", "anchor": "query-asset-details", "start_char": 8740, "end_char": 11024, "estimated_token_count": 589, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Asset Details\n\nQuery the asset configuration including owner, supply, and account count:\n\n**Request**\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/pallets/assets/storage/Asset?keys[]=1984\"\n```\n\n**Response**\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>curl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/pallets/assets/storage/Asset?keys[]=1984\"</span>\n  <pre>\n{\n  \"at\": {\n    \"hash\": \"0xaf0628855a206da5e95e564b58b9a0bfc490cc8de047a0521252b631be77fac7\",\n    \"height\": \"10646571\"\n  },\n  \"pallet\": \"assets\",\n  \"palletIndex\": \"50\",\n  \"storageItem\": \"asset\",\n  \"keys\": [\"1984\"],\n  \"value\": {\n    \"owner\": \"15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X\",\n    \"issuer\": \"15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X\",\n    \"admin\": \"15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X\",\n    \"freezer\": \"15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X\",\n    \"supply\": \"77998622834557\",\n    \"deposit\": \"1000000000000\",\n    \"minBalance\": \"10000\",\n    \"isSufficient\": true,\n    \"accounts\": \"13572\",\n    \"sufficients\": \"13465\",\n    \"approvals\": \"18\",\n    \"status\": \"Live\"\n  }\n}\n</pre\n  >\n</div>\n\n\n**Response fields**\n\n| Field | Description |\n|-------|-------------|\n| `at.hash` | Block hash at which the query was executed |\n| `at.height` | Block number at which the query was executed |\n| `pallet` | Name of the pallet containing the storage item |\n| `palletIndex` | Numeric index of the pallet in the runtime |\n| `storageItem` | Name of the storage item being queried |\n| `keys` | Array of keys used to query the storage map |\n| `owner` | Account that owns the asset |\n| `issuer` | Account authorized to mint new tokens |\n| `admin` | Account with administrative privileges |\n| `freezer` | Account that can freeze balances |\n| `supply` | Total supply of the asset (in smallest unit) |\n| `minBalance` | Minimum balance required to hold this asset |\n| `isSufficient` | Whether this asset can pay for account existence (accounts holding only this asset don't need native tokens) |\n| `accounts` | Number of accounts holding this asset |\n| `sufficients` | Number of accounts whose existence is paid for by this asset |\n| `status` | Asset status (Live, Frozen, or Destroying) |"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#query-foreign-asset-balances", "page_title": "Query On-Chain State with Sidecar REST API", "index": 8, "depth": 2, "title": "Query Foreign Asset Balances", "anchor": "query-foreign-asset-balances", "start_char": 11024, "end_char": 11302, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Foreign Asset Balances\n\nFor cross-chain assets (foreign assets), use the `/accounts/{accountId}/foreign-asset-balances` endpoint:\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/<INSERT_ADDRESS>/foreign-asset-balances\"\n```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#query-block-information", "page_title": "Query On-Chain State with Sidecar REST API", "index": 9, "depth": 2, "title": "Query Block Information", "anchor": "query-block-information", "start_char": 11302, "end_char": 13110, "estimated_token_count": 470, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Block Information\n\nThe `/blocks/{blockId}` endpoint returns detailed block information including extrinsics and events.\n\n**Request latest block**\n\n```bash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/blocks/head\"\n```\n\n**Request specific block**\n\n```bash\n# By block number\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/blocks/10000000\"\n\n# By block hash\ncurl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/blocks/0x...\"\n```\n\n**Response**\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>curl -s \"https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/blocks/10646572\"</span>\n  <pre>\n{\n  \"number\": \"10646572\",\n  \"hash\": \"0x5abb54c72ffe3c342536f6e34a8558445ef23a460ae8a6fb366af6d9105c3950\",\n  \"parentHash\": \"0xaf0628855a206da5e95e564b58b9a0bfc490cc8de047a0521252b631be77fac7\",\n  \"stateRoot\": \"0x0be63683f15de9dff2d1553d4904ec3f446b244cfbf7aa69afa1b2faee824688\",\n  \"extrinsicsRoot\": \"0xb4f58daf2791928cebcd1cdee3c51487127824dc0ba4e9b4b9b4be6af6c09b79\",\n  \"authorId\": \"12owmS8Sobqxfx6KK9vk9e67FqnGpZdmxCFCRFptzZdsoujC\",\n  \"logs\": [\n    {\n      \"type\": \"PreRuntime\",\n      \"index\": \"6\",\n      \"value\": [\"0x61757261\", \"0x35fdc30800000000\"]\n    }\n  ],\n  \"onInitialize\": {\n    \"events\": []\n  },\n  \"extrinsics\": [\n    {\n      \"method\": {\n        \"pallet\": \"timestamp\",\n        \"method\": \"set\"\n      },\n      \"signature\": null,\n      \"nonce\": null,\n      \"args\": {\n        \"now\": \"1733237652000\"\n      },\n      \"tip\": null,\n      \"hash\": \"0x...\",\n      \"info\": {},\n      \"era\": {\n        \"immortalEra\": \"0x00\"\n      },\n      \"events\": [],\n      \"success\": true,\n      \"paysFee\": false\n    }\n  ],\n  \"onFinalize\": {\n    \"events\": []\n  },\n  \"finalized\": true\n}\n</pre\n  >\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#api-reference", "page_title": "Query On-Chain State with Sidecar REST API", "index": 10, "depth": 2, "title": "API Reference", "anchor": "api-reference", "start_char": 13110, "end_char": 13765, "estimated_token_count": 192, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## API Reference\n\nFor a complete list of endpoints and parameters, see the [Sidecar API Documentation](https://paritytech.github.io/substrate-api-sidecar/docsv2/).\n\n<div class=\"status-badge\" markdown>\n[![Query On-Chain State with Sidecar REST API](https://github.com/polkadot-developers/polkadot-cookbook/actions/workflows/polkadot-docs-query-rest.yml/badge.svg?event=push)](https://github.com/polkadot-developers/polkadot-cookbook/actions/workflows/polkadot-docs-query-rest.yml)\n[:material-code-tags: View tests](https://github.com/polkadot-developers/polkadot-cookbook/blob/master/polkadot-docs/chain-interactions/query-rest/tests/docs.test.ts)\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-rest", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-rest/#where-to-go-next", "page_title": "Query On-Chain State with Sidecar REST API", "index": 11, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 13765, "end_char": 14511, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6be41ba14e91cd5a6753a85792c2034ef4c968fef1475cbb890621d780ebf702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you understand how to query on-chain state with the REST API, explore these related topics:\n\n<div class=\"grid cards\" markdown>\n\n-   __Query with SDKs__\n\n    ---\n\n    Use TypeScript, Python, or Rust SDKs for programmatic access.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/query-sdks/)\n\n-   __Runtime API Calls__\n\n    ---\n\n    Learn how to execute Polkadot runtime APIs for specialized queries.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/runtime-api-calls/)\n\n-   __Send Transactions__\n\n    ---\n\n    Learn to construct and submit transactions.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/with-sdks)        \n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-sdks", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-sdks/#introduction", "page_title": "Query On-Chain State with SDKs", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 35, "end_char": 1007, "estimated_token_count": 223, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e7c4fda193919c4e265688cfff1b9a88019103a97b05db4f1c2a4e00b9bafdb2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot SDK-based blockchains store data in a key-value database that external applications can query. This on-chain state includes account balances, asset information, governance proposals, and any other data the runtime manages.\n\nThis guide demonstrates how to query on-chain storage using five popular SDKs:\n\n- **[Polkadot API (PAPI)](/reference/tools/papi/)**: Modern TypeScript library with type-safe APIs\n- **[Polkadot.js API](/reference/tools/polkadot-js-api/)**: Comprehensive JavaScript library (maintenance mode)\n- **[Dedot](/reference/tools/dedot/)**: Lightweight TypeScript library optimized for performance\n- **[Python Substrate Interface](/reference/tools/py-substrate-interface/)**: Python library for Substrate chains\n- **[Subxt](/reference/tools/subxt/)**: Rust library with compile-time type safety\n\nSelect your preferred SDK below to see complete, runnable examples that query Polkadot Hub for account balances and asset information."}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-sdks", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-sdks/#query-on-chain-data", "page_title": "Query On-Chain State with SDKs", "index": 1, "depth": 2, "title": "Query On-Chain Data", "anchor": "query-on-chain-data", "start_char": 1007, "end_char": 36488, "estimated_token_count": 8357, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e7c4fda193919c4e265688cfff1b9a88019103a97b05db4f1c2a4e00b9bafdb2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query On-Chain Data\n\n=== \"PAPI\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir papi-query-example && cd papi-query-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install polkadot-api@3.3.0 && \\\n        npm install --save-dev @types/node tsx typescript\n        ```\n\n    3. Generate types for Polkadot Hub:\n\n        ```bash\n        npx papi add pah -n polkadot_asset_hub\n        ```\n\n    **Query Account Balance**\n\n    The following example queries the `System.Account` storage to retrieve an account's native token balance.\n\n    Create a file named `query-balance.ts` and add the following code to it:\n\n    ```typescript title=\"query-balance.ts\"\n    import { createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { pah } from '@polkadot-api/descriptors';\n    \n    const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // Example address to query (Polkadot Hub address)\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Create the client connection\n      const client = createClient(getWsProvider(ASSET_HUB_RPC));\n    \n      // Get the typed API for Polkadot Hub\n      const api = client.getTypedApi(pah);\n    \n      console.log('Connected to Polkadot Hub');\n      console.log(`Querying balance for: ${ADDRESS}\\n`);\n    \n      // Query the System.Account storage\n      const accountInfo = await api.query.System.Account.getValue(ADDRESS);\n    \n      // Extract balance information\n      const { data, nonce } = accountInfo;\n      const { free, reserved, frozen } = data;\n    \n      console.log('Account Information:');\n      console.log(`  Nonce: ${nonce}`);\n      console.log(`  Free Balance: ${free}`);\n      console.log(`  Reserved: ${reserved}`);\n      console.log(`  Frozen: ${frozen}`);\n    \n      // Disconnect the client\n      client.destroy();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx query-balance.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx query-balance.ts</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>  Nonce: 0</span>\n        <span data-ty>  Free Balance: 0</span>\n        <span data-ty>  Reserved: 0</span>\n        <span data-ty>  Frozen: 0</span>\n    </div>\n    \n\n    **Query Asset Information**\n\n    The following example queries the `Assets` pallet to retrieve metadata and balance information for USDT (asset ID 1984).\n\n    Create a file named `query-asset.ts` and add the following code to it:\n\n    ```typescript title=\"query-asset.ts\"\n    import { Binary, createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { pah } from '@polkadot-api/descriptors';\n    \n    const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // USDT on Polkadot Hub\n    const USDT_ASSET_ID = 1984;\n    \n    // Example address to query asset balance\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Create the client connection\n      const client = createClient(getWsProvider(ASSET_HUB_RPC));\n    \n      // Get the typed API for Polkadot Hub\n      const api = client.getTypedApi(pah);\n    \n      console.log('Connected to Polkadot Hub');\n      console.log(`Querying asset ID: ${USDT_ASSET_ID}\\n`);\n    \n      // Query asset metadata\n      const assetMetadata = await api.query.Assets.Metadata.getValue(USDT_ASSET_ID);\n    \n      if (assetMetadata) {\n        console.log('Asset Metadata:');\n        console.log(`  Name: ${Binary.toText(assetMetadata.name)}`);\n        console.log(`  Symbol: ${Binary.toText(assetMetadata.symbol)}`);\n        console.log(`  Decimals: ${assetMetadata.decimals}`);\n      }\n    \n      // Query asset details\n      const assetDetails = await api.query.Assets.Asset.getValue(USDT_ASSET_ID);\n    \n      if (assetDetails) {\n        console.log('\\nAsset Details:');\n        console.log(`  Owner: ${assetDetails.owner}`);\n        console.log(`  Supply: ${assetDetails.supply}`);\n        console.log(`  Accounts: ${assetDetails.accounts}`);\n        console.log(`  Min Balance: ${assetDetails.min_balance}`);\n        console.log(`  Status: ${assetDetails.status.type}`);\n      }\n    \n      // Query account's asset balance\n      console.log(`\\nQuerying asset balance for: ${ADDRESS}`);\n      const assetAccount = await api.query.Assets.Account.getValue(\n        USDT_ASSET_ID,\n        ADDRESS\n      );\n    \n      if (assetAccount) {\n        console.log('\\nAsset Account:');\n        console.log(`  Balance: ${assetAccount.balance}`);\n        console.log(`  Status: ${assetAccount.status.type}`);\n      } else {\n        console.log('\\nNo asset balance found for this account');\n      }\n    \n      // Disconnect the client\n      client.destroy();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx query-asset.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx query-asset.ts</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying asset ID: 1984</span>\n        <span data-ty></span>\n        <span data-ty>Asset Metadata:</span>\n        <span data-ty>  Name: Tether USD</span>\n        <span data-ty>  Symbol: USDT</span>\n        <span data-ty>  Decimals: 6</span>\n        <span data-ty></span>\n        <span data-ty>Asset Details:</span>\n        <span data-ty>  Owner: 15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X</span>\n        <span data-ty>  Supply: 77998622834581</span>\n        <span data-ty>  Accounts: 13544</span>\n        <span data-ty>  Min Balance: 10000</span>\n        <span data-ty>  Status: Live</span>\n        <span data-ty></span>\n        <span data-ty>Querying asset balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>No asset balance found for this account</span>\n    </div>\n    \n\n=== \"Polkadot.js\"\n\n    !!! warning \"Maintenance Mode Only\"\n        The Polkadot.js API is no longer actively developed. New projects should use [PAPI](/reference/tools/papi/) or [Dedot](/reference/tools/dedot/) as actively maintained alternatives.\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir pjs-query-example && cd pjs-query-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install @polkadot/api\n        ```\n\n    **Query Account Balance**\n\n    The following example queries the `System.Account` storage to retrieve an account's native token balance.\n\n    Create a file named `query-balance.js` and add the following code to it:\n\n    ```javascript title=\"query-balance.js\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // Example address to query (Polkadot Hub address)\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Create a WebSocket provider\n      const wsProvider = new WsProvider(ASSET_HUB_RPC);\n    \n      // Initialize the API\n      const api = await ApiPromise.create({ provider: wsProvider });\n    \n      console.log('Connected to Polkadot Hub');\n      console.log(`Querying balance for: ${ADDRESS}\\n`);\n    \n      // Query the system.account storage\n      const accountInfo = await api.query.system.account(ADDRESS);\n    \n      // Extract balance information\n      const { nonce, data } = accountInfo;\n      const { free, reserved, frozen } = data;\n    \n      console.log('Account Information:');\n      console.log(`  Nonce: ${nonce.toString()}`);\n      console.log(`  Free Balance: ${free.toString()}`);\n      console.log(`  Reserved: ${reserved.toString()}`);\n      console.log(`  Frozen: ${frozen.toString()}`);\n    \n      // Disconnect from the node\n      await api.disconnect();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    node query-balance.js\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>node query-balance.js</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>  Nonce: 0</span>\n        <span data-ty>  Free Balance: 0</span>\n        <span data-ty>  Reserved: 0</span>\n        <span data-ty>  Frozen: 0</span>\n    </div>\n    \n\n    **Query Asset Information**\n\n    The following example queries the `Assets` pallet to retrieve metadata and balance information for USDT (asset ID 1984).\n\n    Create a file named `query-asset.js` and add the following code to it:\n\n    ```javascript title=\"query-asset.js\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // USDT on Polkadot Hub\n    const USDT_ASSET_ID = 1984;\n    \n    // Example address to query asset balance\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Create a WebSocket provider\n      const wsProvider = new WsProvider(ASSET_HUB_RPC);\n    \n      // Initialize the API\n      const api = await ApiPromise.create({ provider: wsProvider });\n    \n      console.log('Connected to Polkadot Hub');\n      console.log(`Querying asset ID: ${USDT_ASSET_ID}\\n`);\n    \n      // Query asset metadata\n      const assetMetadata = await api.query.assets.metadata(USDT_ASSET_ID);\n    \n      console.log('Asset Metadata:');\n      console.log(`  Name: ${assetMetadata.name.toUtf8()}`);\n      console.log(`  Symbol: ${assetMetadata.symbol.toUtf8()}`);\n      console.log(`  Decimals: ${assetMetadata.decimals.toString()}`);\n    \n      // Query asset details\n      const assetDetails = await api.query.assets.asset(USDT_ASSET_ID);\n    \n      if (assetDetails.isSome) {\n        const details = assetDetails.unwrap();\n        console.log('\\nAsset Details:');\n        console.log(`  Owner: ${details.owner.toString()}`);\n        console.log(`  Supply: ${details.supply.toString()}`);\n        console.log(`  Accounts: ${details.accounts.toString()}`);\n        console.log(`  Min Balance: ${details.minBalance.toString()}`);\n        console.log(`  Status: ${details.status.type}`);\n      }\n    \n      // Query account's asset balance\n      console.log(`\\nQuerying asset balance for: ${ADDRESS}`);\n      const assetAccount = await api.query.assets.account(USDT_ASSET_ID, ADDRESS);\n    \n      if (assetAccount.isSome) {\n        const account = assetAccount.unwrap();\n        console.log('\\nAsset Account:');\n        console.log(`  Balance: ${account.balance.toString()}`);\n        console.log(`  Status: ${account.status.type}`);\n      } else {\n        console.log('\\nNo asset balance found for this account');\n      }\n    \n      // Disconnect from the node\n      await api.disconnect();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n    \n    Run the script:\n\n    ```bash\n    node query-asset.js\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>node query-asset.js</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying asset ID: 1984</span>\n        <span data-ty></span>\n        <span data-ty>Asset Metadata:</span>\n        <span data-ty>  Name: Tether USD</span>\n        <span data-ty>  Symbol: USDT</span>\n        <span data-ty>  Decimals: 6</span>\n        <span data-ty></span>\n        <span data-ty>Asset Details:</span>\n        <span data-ty>  Owner: 15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X</span>\n        <span data-ty>  Supply: 77998622834581</span>\n        <span data-ty>  Accounts: 13544</span>\n        <span data-ty>  Min Balance: 10000</span>\n        <span data-ty>  Status: Live</span>\n        <span data-ty></span>\n        <span data-ty>Querying asset balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>No asset balance found for this account</span>\n    </div>\n    \n\n=== \"Dedot\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir dedot-query-example && cd dedot-query-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install dedot && \\\n        npm install --save-dev @dedot/chaintypes @types/node tsx typescript\n        ```\n\n    **Query Account Balance**\n\n    The following example queries the `System.Account` storage to retrieve an account's native token balance.\n\n    Create a file named `query-balance.ts` and add the following code to it:\n\n    ```typescript title=\"query-balance.ts\"\n    import { DedotClient, WsProvider } from 'dedot';\n    import type { PolkadotAssetHubApi } from '@dedot/chaintypes';\n    \n    const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // Example address to query (Polkadot Hub address)\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Initialize provider and client with Asset Hub types\n      const provider = new WsProvider(ASSET_HUB_RPC);\n      const client = await DedotClient.new<PolkadotAssetHubApi>(provider);\n    \n      console.log('Connected to Polkadot Hub');\n      console.log(`Querying balance for: ${ADDRESS}\\n`);\n    \n      // Query the system.account storage\n      const accountInfo = await client.query.system.account(ADDRESS);\n    \n      // Extract balance information\n      const { nonce, data } = accountInfo;\n      const { free, reserved, frozen } = data;\n    \n      console.log('Account Information:');\n      console.log(`  Nonce: ${nonce}`);\n      console.log(`  Free Balance: ${free}`);\n      console.log(`  Reserved: ${reserved}`);\n      console.log(`  Frozen: ${frozen}`);\n    \n      // Disconnect the client\n      await client.disconnect();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx query-balance.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx query-balance.ts</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>  Nonce: 0</span>\n        <span data-ty>  Free Balance: 0</span>\n        <span data-ty>  Reserved: 0</span>\n        <span data-ty>  Frozen: 0</span>\n    </div>\n    \n\n    **Query Asset Information**\n\n    The following example queries the `Assets` pallet to retrieve metadata and balance information for USDT (asset ID 1984).\n\n    Create a file named `query-asset.ts` and add the following code to it:\n\n    ```typescript title=\"query-asset.ts\"\n    import { DedotClient, WsProvider } from 'dedot';\n    import { hexToString } from 'dedot/utils';\n    import type { PolkadotAssetHubApi } from '@dedot/chaintypes';\n    \n    const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // USDT on Polkadot Hub\n    const USDT_ASSET_ID = 1984;\n    \n    // Example address to query asset balance\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Initialize provider and client with Asset Hub types\n      const provider = new WsProvider(ASSET_HUB_RPC);\n      const client = await DedotClient.new<PolkadotAssetHubApi>(provider);\n    \n      console.log('Connected to Polkadot Hub');\n      console.log(`Querying asset ID: ${USDT_ASSET_ID}\\n`);\n    \n      // Query asset metadata\n      const assetMetadata = await client.query.assets.metadata(USDT_ASSET_ID);\n    \n      console.log('Asset Metadata:');\n      console.log(`  Name: ${hexToString(assetMetadata.name)}`);\n      console.log(`  Symbol: ${hexToString(assetMetadata.symbol)}`);\n      console.log(`  Decimals: ${assetMetadata.decimals}`);\n    \n      // Query asset details\n      const assetDetails = await client.query.assets.asset(USDT_ASSET_ID);\n    \n      if (assetDetails) {\n        console.log('\\nAsset Details:');\n        console.log(`  Owner: ${assetDetails.owner.address()}`);\n        console.log(`  Supply: ${assetDetails.supply}`);\n        console.log(`  Accounts: ${assetDetails.accounts}`);\n        console.log(`  Min Balance: ${assetDetails.minBalance}`);\n        console.log(`  Status: ${JSON.stringify(assetDetails.status)}`);\n      }\n    \n      // Query account's asset balance\n      console.log(`\\nQuerying asset balance for: ${ADDRESS}`);\n      const assetAccount = await client.query.assets.account([\n        USDT_ASSET_ID,\n        ADDRESS,\n      ]);\n    \n      if (assetAccount) {\n        console.log('\\nAsset Account:');\n        console.log(`  Balance: ${assetAccount.balance}`);\n        console.log(`  Status: ${JSON.stringify(assetAccount.status)}`);\n      } else {\n        console.log('\\nNo asset balance found for this account');\n      }\n    \n      // Disconnect the client\n      await client.disconnect();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx query-asset.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx query-asset.ts</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying asset ID: 1984</span>\n        <span data-ty></span>\n        <span data-ty>Asset Metadata:</span>\n        <span data-ty>  Name: Tether USD</span>\n        <span data-ty>  Symbol: USDT</span>\n        <span data-ty>  Decimals: 6</span>\n        <span data-ty></span>\n        <span data-ty>Asset Details:</span>\n        <span data-ty>  Owner: 5Gy6UDPQNFG6vBLnwn3VyFSMAisgw1yP2kJuo2Gn8XhUD8V8</span>\n        <span data-ty>  Supply: 77998622834581</span>\n        <span data-ty>  Accounts: 13544</span>\n        <span data-ty>  Min Balance: 10000</span>\n        <span data-ty>  Status: \"Live\"</span>\n        <span data-ty></span>\n        <span data-ty>Querying asset balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>No asset balance found for this account</span>\n    </div>\n    \n\n=== \"Py Substrate Interface\"\n\n    **Prerequisites**\n\n    - [Python](https://www.python.org/) 3.8 or higher\n    - pip package manager\n\n    **Environment Setup**\n\n    1. Create a new project directory and set up a virtual environment:\n\n        ```bash\n        mkdir psi-query-example && cd psi-query-example && \\\n        python3 -m venv venv && source venv/bin/activate\n        ```\n\n    2. Install the substrate-interface package:\n\n        ```bash\n        pip install substrate-interface\n        ```\n\n    **Query Account Balance**\n\n    The following example queries the `System.Account` storage to retrieve an account's native token balance.\n\n    Create a file named `query_balance.py` and add the following code to it:\n\n    ```python title=\"query_balance.py\"\n    from substrateinterface import SubstrateInterface\n    \n    ASSET_HUB_RPC = \"INSERT_WS_ENDPOINT\"\n    \n    # Example address to query (Polkadot Hub address)\n    ADDRESS = \"INSERT_ADDRESS\"\n    \n    \n    def main():\n        # Connect to Polkadot Hub\n        substrate = SubstrateInterface(url=ASSET_HUB_RPC)\n    \n        print(\"Connected to Polkadot Hub\")\n        print(f\"Querying balance for: {ADDRESS}\\n\")\n    \n        # Query the System.Account storage\n        account_info = substrate.query(\n            module=\"System\",\n            storage_function=\"Account\",\n            params=[ADDRESS],\n        )\n    \n        # Extract balance information\n        nonce = account_info.value[\"nonce\"]\n        data = account_info.value[\"data\"]\n        free = data[\"free\"]\n        reserved = data[\"reserved\"]\n        frozen = data[\"frozen\"]\n    \n        print(\"Account Information:\")\n        print(f\"  Nonce: {nonce}\")\n        print(f\"  Free Balance: {free}\")\n        print(f\"  Reserved: {reserved}\")\n        print(f\"  Frozen: {frozen}\")\n    \n        # Close connection\n        substrate.close()\n    \n    \n    if __name__ == \"__main__\":\n        main()\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    python query_balance.py\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>python query_balance.py</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>Account Information:</span>\n        <span data-ty>  Nonce: 0</span>\n        <span data-ty>  Free Balance: 0</span>\n        <span data-ty>  Reserved: 0</span>\n        <span data-ty>  Frozen: 0</span>\n    </div>\n    \n\n    **Query Asset Information**\n\n    The following example queries the `Assets` pallet to retrieve metadata and balance information for USDT (asset ID 1984).\n\n    Create a file named `query_asset.py` and add the following code to it:\n\n    ```python title=\"query_asset.py\"\n    from substrateinterface import SubstrateInterface\n    \n    ASSET_HUB_RPC = \"INSERT_WS_ENDPOINT\"\n    \n    # USDT on Polkadot Hub\n    USDT_ASSET_ID = 1984\n    \n    # Example address to query asset balance\n    ADDRESS = \"INSERT_ADDRESS\"\n    \n    \n    def main():\n        # Connect to Polkadot Hub\n        substrate = SubstrateInterface(url=ASSET_HUB_RPC)\n    \n        print(\"Connected to Polkadot Hub\")\n        print(f\"Querying asset ID: {USDT_ASSET_ID}\\n\")\n    \n        # Query asset metadata\n        asset_metadata = substrate.query(\n            module=\"Assets\",\n            storage_function=\"Metadata\",\n            params=[USDT_ASSET_ID],\n        )\n    \n        if asset_metadata.value:\n            metadata = asset_metadata.value\n            print(\"Asset Metadata:\")\n            print(f\"  Name: {metadata['name']}\")\n            print(f\"  Symbol: {metadata['symbol']}\")\n            print(f\"  Decimals: {metadata['decimals']}\")\n    \n        # Query asset details\n        asset_details = substrate.query(\n            module=\"Assets\",\n            storage_function=\"Asset\",\n            params=[USDT_ASSET_ID],\n        )\n    \n        if asset_details.value:\n            details = asset_details.value\n            print(\"\\nAsset Details:\")\n            print(f\"  Owner: {details['owner']}\")\n            print(f\"  Supply: {details['supply']}\")\n            print(f\"  Accounts: {details['accounts']}\")\n            print(f\"  Min Balance: {details['min_balance']}\")\n            print(f\"  Status: {details['status']}\")\n    \n        # Query account's asset balance\n        print(f\"\\nQuerying asset balance for: {ADDRESS}\")\n        asset_account = substrate.query(\n            module=\"Assets\",\n            storage_function=\"Account\",\n            params=[USDT_ASSET_ID, ADDRESS],\n        )\n    \n        if asset_account.value:\n            account = asset_account.value\n            print(\"\\nAsset Account:\")\n            print(f\"  Balance: {account['balance']}\")\n            print(f\"  Status: {account['status']}\")\n        else:\n            print(\"\\nNo asset balance found for this account\")\n    \n        # Close connection\n        substrate.close()\n    \n    \n    if __name__ == \"__main__\":\n        main()\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    python query_asset.py\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>python query_asset.py</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying asset ID: 1984</span>\n        <span data-ty></span>\n        <span data-ty>Asset Metadata:</span>\n        <span data-ty>  Name: Tether USD</span>\n        <span data-ty>  Symbol: USDT</span>\n        <span data-ty>  Decimals: 6</span>\n        <span data-ty></span>\n        <span data-ty>Asset Details:</span>\n        <span data-ty>  Owner: 5Gy6UDPQNFG6vBLnwn3VyFSMAisgw1yP2kJuo2Gn8XhUD8V8</span>\n        <span data-ty>  Supply: 77998622834581</span>\n        <span data-ty>  Accounts: 13545</span>\n        <span data-ty>  Min Balance: 10000</span>\n        <span data-ty>  Status: Live</span>\n        <span data-ty></span>\n        <span data-ty>Querying asset balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>No asset balance found for this account</span>\n    </div>\n    \n\n=== \"Subxt\"\n\n    [Subxt](/reference/tools/subxt/) is a Rust library that provides compile-time type safety through code generation from chain metadata.\n\n    **Prerequisites**\n\n    - [Rust](https://rustup.rs/) toolchain (latest stable)\n    - Cargo package manager\n\n    **Environment Setup**\n\n    1. Create a new Rust project:\n\n        ```bash\n        cargo new subxt-query-example && cd subxt-query-example\n        ```\n\n    2. Install the Subxt CLI:\n\n        ```bash\n        cargo install subxt-cli@0.50.1\n        ```\n\n    3. Download the Polkadot Hub metadata:\n\n        ```bash\n        subxt metadata --url INSERT_WS_ENDPOINT -o asset_hub_metadata.scale\n        ```\n\n        !!! note\n            Ensure to replace `INSERT_WS_ENDPOINT` with the proper WebSocket endpoint, such as `wss://polkadot-asset-hub-rpc.polkadot.io` for Polkadot Hub.\n\n    4. Update `Cargo.toml` with the required dependencies:\n\n        ```toml title=\"Cargo.toml\"\n        [package]\n        name = \"subxt-query-example\"\n        version = \"0.1.0\"\n        edition = \"2021\"\n        \n        [[bin]]\n        name = \"query_balance\"\n        path = \"src/bin/query_balance.rs\"\n        \n        [[bin]]\n        name = \"query_asset\"\n        path = \"src/bin/query_asset.rs\"\n        \n        [dependencies]\n        subxt = \"0.50.0\"\n        tokio = { version = \"1\", features = [\"rt\", \"macros\"] }\n        \n        ```\n\n    **Query Account Balance**\n\n    The following example queries the `System.Account` storage to retrieve an account's native token balance.\n\n    Create a file at `src/bin/query_balance.rs` and add the following code to it:\n\n    ```rust title=\"src/bin/query_balance.rs\"\n    use std::str::FromStr;\n    use subxt::utils::AccountId32;\n    use subxt::{OnlineClient, PolkadotConfig};\n    \n    // Generate an interface from the node's metadata\n    #[subxt::subxt(runtime_metadata_path = \"asset_hub_metadata.scale\")]\n    pub mod asset_hub {}\n    \n    const ASSET_HUB_RPC: &str = \"INSERT_WS_ENDPOINT\";\n    \n    // Example address to query (Polkadot Hub address)\n    const ADDRESS: &str = \"INSERT_ADDRESS\";\n    \n    #[tokio::main(flavor = \"current_thread\")]\n    async fn main() -> Result<(), Box<dyn std::error::Error>> {\n        // Initialize the Subxt client\n        let api = OnlineClient::<PolkadotConfig>::from_url(ASSET_HUB_RPC).await?;\n    \n        // Anchor to the current block\n        let at_block = api.at_current_block().await?;\n    \n        println!(\"Connected to Polkadot Hub\");\n        println!(\"Querying balance for: {}\\n\", ADDRESS);\n    \n        // Parse the address\n        let account = AccountId32::from_str(ADDRESS)?;\n    \n        // Build storage entry for System.Account\n        let account_storage = at_block\n            .storage()\n            .entry(asset_hub::storage().system().account())?;\n    \n        // Fetch the account information\n        let info = account_storage\n            .fetch((account,))\n            .await?\n            .decode()?;\n    \n        println!(\"Account Information:\");\n        println!(\"  Nonce: {}\", info.nonce);\n        println!(\"  Free Balance: {}\", info.data.free);\n        println!(\"  Reserved: {}\", info.data.reserved);\n        println!(\"  Frozen: {}\", info.data.frozen);\n    \n        Ok(())\n    }\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    cargo run --bin query_balance\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>cargo run --bin query_balance</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>Account not found</span>\n    </div>\n    \n\n    !!! note\n        Subxt's `fetch()` method returns `None` for accounts with zero balance that have no on-chain storage entry, resulting in \"Account not found\". Accounts with activity will display their balance information.\n\n    **Query Asset Information**\n\n    The following example queries the `Assets` pallet to retrieve metadata and balance information for USDT (asset ID 1984).\n\n    Create a file at `src/bin/query_asset.rs` and add the following code to it:\n\n    ```rust title=\"src/bin/query_asset.rs\"\n    use std::str::FromStr;\n    use subxt::utils::AccountId32;\n    use subxt::{OnlineClient, PolkadotConfig};\n    \n    // Generate an interface from the node's metadata\n    #[subxt::subxt(runtime_metadata_path = \"asset_hub_metadata.scale\")]\n    pub mod asset_hub {}\n    \n    const ASSET_HUB_RPC: &str = \"INSERT_WS_ENDPOINT\";\n    \n    // USDT on Polkadot Hub\n    const USDT_ASSET_ID: u32 = 1984;\n    \n    // Example address to query asset balance\n    const ADDRESS: &str = \"INSERT_ADDRESS\";\n    \n    #[tokio::main(flavor = \"current_thread\")]\n    async fn main() -> Result<(), Box<dyn std::error::Error>> {\n        // Initialize the Subxt client\n        let api = OnlineClient::<PolkadotConfig>::from_url(ASSET_HUB_RPC).await?;\n    \n        // Anchor to the current block\n        let at_block = api.at_current_block().await?;\n    \n        println!(\"Connected to Polkadot Hub\");\n        println!(\"Querying asset ID: {}\\n\", USDT_ASSET_ID);\n    \n        // Query asset metadata\n        let metadata_storage = at_block\n            .storage()\n            .entry(asset_hub::storage().assets().metadata())?;\n        let meta = metadata_storage\n            .fetch((USDT_ASSET_ID,))\n            .await?\n            .decode()?;\n    \n        println!(\"Asset Metadata:\");\n        println!(\n            \"  Name: {}\",\n            String::from_utf8_lossy(&meta.name.0)\n        );\n        println!(\n            \"  Symbol: {}\",\n            String::from_utf8_lossy(&meta.symbol.0)\n        );\n        println!(\"  Decimals: {}\", meta.decimals);\n    \n        // Query asset details\n        let asset_storage = at_block\n            .storage()\n            .entry(asset_hub::storage().assets().asset())?;\n        let details = asset_storage\n            .fetch((USDT_ASSET_ID,))\n            .await?\n            .decode()?;\n    \n        println!(\"\\nAsset Details:\");\n        println!(\"  Owner: {}\", details.owner);\n        println!(\"  Supply: {}\", details.supply);\n        println!(\"  Accounts: {}\", details.accounts);\n        println!(\"  Min Balance: {}\", details.min_balance);\n    \n        // Query account's asset balance\n        let account = AccountId32::from_str(ADDRESS)?;\n        println!(\"\\nQuerying asset balance for: {}\", ADDRESS);\n    \n        let account_storage = at_block\n            .storage()\n            .entry(asset_hub::storage().assets().account())?;\n        let asset_account = account_storage\n            .fetch((USDT_ASSET_ID, account))\n            .await?\n            .decode()?;\n    \n        println!(\"\\nAsset Account:\");\n        println!(\"  Balance: {}\", asset_account.balance);\n    \n        Ok(())\n    }\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://polkadot-asset-hub-rpc.polkadot.io`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    cargo run --bin query_asset\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>cargo run --bin query_asset</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Querying asset ID: 1984</span>\n        <span data-ty></span>\n        <span data-ty>Asset Metadata:</span>\n        <span data-ty>  Name: Tether USD</span>\n        <span data-ty>  Symbol: USDT</span>\n        <span data-ty>  Decimals: 6</span>\n        <span data-ty></span>\n        <span data-ty>Asset Details:</span>\n        <span data-ty>  Owner: 5Gy6UDPQNFG6vBLnwn3VyFSMAisgw1yP2kJuo2Gn8XhUD8V8</span>\n        <span data-ty>  Supply: 77998622834581</span>\n        <span data-ty>  Accounts: 13545</span>\n        <span data-ty>  Min Balance: 10000</span>\n        <span data-ty></span>\n        <span data-ty>Querying asset balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty></span>\n        <span data-ty>No asset balance found for this account</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-query-sdks", "url": "https://developer.polkadot.com/chain-interactions/query-data/query-sdks/#where-to-go-next", "page_title": "Query On-Chain State with SDKs", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 36488, "end_char": 36991, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e7c4fda193919c4e265688cfff1b9a88019103a97b05db4f1c2a4e00b9bafdb2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Runtime API Calls**\n\n    ---\n\n    Execute runtime APIs for specialized queries.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/runtime-api-calls/)\n\n- <span class=\"badge guide\">Guide</span> **Send Transactions**\n\n    ---\n\n    Learn how to construct and submit transactions.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/with-sdks/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-runtime-api-calls", "url": "https://developer.polkadot.com/chain-interactions/query-data/runtime-api-calls/#introduction", "page_title": "Runtime API Calls", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 334, "end_char": 1057, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c331b23e7d13f2395a92619cb4ec7f7df4ecd714d73dce470d7329c54cc36889", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot SDK runtime APIs provide direct access to the blockchain's WebAssembly (Wasm) runtime, enabling specialized queries and computations that go beyond simple storage reads. Unlike storage queries that fetch static data, runtime APIs execute logic within the runtime to compute results dynamically.\n\nCommon runtime APIs include:\n\n- **AccountNonceApi**: Retrieves the current transaction nonce for an account.\n- **Metadata**: Queries available metadata versions and runtime information.\n- **TransactionPaymentApi**: Estimates transaction fees before submission.\n- **NominationPoolsApi**: Retrieves staking pool information and pending rewards.\n- **StakingApi**: Accesses staking-related computations."}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-runtime-api-calls", "url": "https://developer.polkadot.com/chain-interactions/query-data/runtime-api-calls/#call-runtime-apis", "page_title": "Runtime API Calls", "index": 1, "depth": 2, "title": "Call Runtime APIs", "anchor": "call-runtime-apis", "start_char": 1057, "end_char": 18836, "estimated_token_count": 4077, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c331b23e7d13f2395a92619cb4ec7f7df4ecd714d73dce470d7329c54cc36889", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Call Runtime APIs\n\nThis section demonstrates how to call runtime APIs using the following SDKs:\n\n- **Polkadot API (PAPI)**: Modern TypeScript library with type-safe APIs.\n- **Polkadot.js API**: Comprehensive JavaScript library (maintenance mode).\n- **Dedot**: Lightweight TypeScript library optimized for performance.\n- **Python Substrate Interface**: Python library for Substrate chains.\n- **Subxt**: Rust library with compile-time type safety.\n\nSelect your preferred SDK below to see complete, runnable examples that query Polkadot Hub TestNet for account nonces and metadata information.\n\n=== \"PAPI\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir papi-runtime-api-example && cd papi-runtime-api-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install polkadot-api@3.3.0 && \\\n        npm install --save-dev @types/node tsx typescript\n        ```\n\n    3. Generate types for Polkadot Hub TestNet:\n\n        ```bash\n        npx papi add polkadotTestNet -w wss://asset-hub-paseo.dotters.network\n        ```\n\n    **Call Runtime APIs**\n\n    The following example demonstrates calling several runtime APIs:\n\n    - **`AccountNonceApi.account_nonce`**: Gets the current nonce for an account.\n    - **`Metadata.metadata_versions`**: Retrieves supported metadata versions.\n\n    Create a file named `runtime-apis.ts` and add the following code:\n\n    ```typescript title=\"runtime-apis.ts\"\n    import { createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { polkadotTestNet } from '@polkadot-api/descriptors';\n    \n    const POLKADOT_TESTNET_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // Example address to query\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Create the client connection\n      const client = createClient(getWsProvider(POLKADOT_TESTNET_RPC));\n    \n      // Get the typed API for Polkadot Hub TestNet\n      const api = client.getTypedApi(polkadotTestNet);\n    \n      console.log('Connected to Polkadot Hub TestNet');\n      console.log(`Querying runtime APIs for: ${ADDRESS}\\n`);\n    \n      // Call AccountNonceApi to get the account nonce\n      const nonce = await api.apis.AccountNonceApi.account_nonce(ADDRESS);\n      console.log('AccountNonceApi Results:');\n      console.log(`  Account Nonce: ${nonce}`);\n    \n      // Query metadata versions using Metadata runtime API\n      const metadataVersions = await api.apis.Metadata.metadata_versions();\n      console.log('\\nMetadata API Results:');\n      console.log(`  Supported Metadata Versions: [${metadataVersions.join(', ')}]`);\n    \n      // Disconnect the client\n      client.destroy();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx runtime-apis.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx runtime-apis.ts</span>\n        <span data-ty=\"progress\"></span>\n        <span data-ty>Connected to Polkadot Hub TestNet</span>\n        <span data-ty>Querying runtime APIs for: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty></span>\n        <span data-ty>AccountNonceApi Results:</span>\n        <span data-ty>  Account Nonce: 11</span>\n        <span data-ty></span>\n        <span data-ty>Metadata API Results:</span>\n        <span data-ty>  Supported Metadata Versions: [14, 15, 16]</span>\n    </div>\n    \n\n=== \"Polkadot.js\"\n\n    !!! warning \"Maintenance Mode Only\"\n        The Polkadot.js API is no longer actively developed. New projects should use [PAPI](/reference/tools/papi/) or [Dedot](/reference/tools/dedot/) as actively maintained alternatives.\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir pjs-runtime-api-example && cd pjs-runtime-api-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install @polkadot/api\n        ```\n\n    **Call Runtime APIs**\n\n    The following example demonstrates calling several runtime APIs:\n\n    - **`accountNonceApi.accountNonce`**: Gets the current nonce for an account.\n    - **`metadata.metadataVersions`**: Retrieves supported metadata versions.\n\n    Create a file named `runtime-apis.js` and add the following code:\n\n    ```javascript title=\"runtime-apis.js\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    const POLKADOT_TESTNET_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // Example address to query\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Create a WebSocket provider\n      const wsProvider = new WsProvider(POLKADOT_TESTNET_RPC);\n    \n      // Initialize the API\n      const api = await ApiPromise.create({ provider: wsProvider });\n    \n      console.log('Connected to Polkadot Hub TestNet');\n      console.log(`Querying runtime APIs for: ${ADDRESS}\\n`);\n    \n      // Call AccountNonceApi to get the account nonce\n      const nonce = await api.call.accountNonceApi.accountNonce(ADDRESS);\n      console.log('AccountNonceApi Results:');\n      console.log(`  Account Nonce: ${nonce.toString()}`);\n    \n      // Query metadata versions using Metadata runtime API\n      const metadataVersions = await api.call.metadata.metadataVersions();\n      console.log('\\nMetadata API Results:');\n      console.log(\n        `  Supported Metadata Versions: [${metadataVersions.map((v) => v.toString()).join(', ')}]`\n      );\n    \n      // Disconnect from the node\n      await api.disconnect();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    node runtime-apis.js\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>node runtime-apis.js</span>\n        <span data-ty=\"progress\"></span>\n        <span data-ty>Connected to Polkadot Hub TestNet</span>\n        <span data-ty>Querying runtime APIs for: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty></span>\n        <span data-ty>AccountNonceApi Results:</span>\n        <span data-ty>  Account Nonce: 11</span>\n        <span data-ty></span>\n        <span data-ty>Metadata API Results:</span>\n        <span data-ty>  Supported Metadata Versions: [14, 15, 16]</span>\n    </div>\n    \n\n=== \"Dedot\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir dedot-runtime-api-example && cd dedot-runtime-api-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install dedot && \\\n        npm install --save-dev @dedot/chaintypes @types/node tsx typescript\n        ```\n\n    **Call Runtime APIs**\n\n    The following example demonstrates calling several runtime APIs:\n\n    - **`accountNonceApi.accountNonce`**: Gets the current nonce for an account.\n    - **`metadata.metadataVersions`**: Retrieves supported metadata versions.\n\n    Create a file named `runtime-apis.ts` and add the following code:\n\n    ```typescript title=\"runtime-apis.ts\"\n    import { DedotClient, WsProvider } from 'dedot';\n    import type { PolkadotAssetHubApi } from '@dedot/chaintypes';\n    \n    const POLKADOT_TESTNET_RPC = 'INSERT_WS_ENDPOINT';\n    \n    // Example address to query\n    const ADDRESS = 'INSERT_ADDRESS';\n    \n    async function main() {\n      // Initialize provider and client with Polkadot TestNet types\n      const provider = new WsProvider(POLKADOT_TESTNET_RPC);\n      const client = await DedotClient.new<PolkadotAssetHubApi>(provider);\n    \n      console.log('Connected to Polkadot Hub TestNet');\n      console.log(`Querying runtime APIs for: ${ADDRESS}\\n`);\n    \n      // Call AccountNonceApi to get the account nonce\n      const nonce = await client.call.accountNonceApi.accountNonce(ADDRESS);\n      console.log('AccountNonceApi Results:');\n      console.log(`  Account Nonce: ${nonce}`);\n    \n      // Query metadata versions using Metadata runtime API\n      const metadataVersions = await client.call.metadata.metadataVersions();\n      console.log('\\nMetadata API Results:');\n      console.log(`  Supported Metadata Versions: [${metadataVersions.join(', ')}]`);\n    \n      // Disconnect the client\n      await client.disconnect();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    npx tsx runtime-apis.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx runtime-apis.ts</span>\n        <span data-ty=\"progress\"></span>\n        <span data-ty>Connected to Polkadot Hub TestNet</span>\n        <span data-ty>Querying runtime APIs for: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty></span>\n        <span data-ty>AccountNonceApi Results:</span>\n        <span data-ty>  Account Nonce: 11</span>\n        <span data-ty></span>\n        <span data-ty>Metadata API Results:</span>\n        <span data-ty>  Supported Metadata Versions: [14, 15, 16]</span>\n    </div>\n    \n\n=== \"Py Substrate Interface\"\n\n    **Prerequisites**\n\n    - [Python](https://www.python.org/) 3.8 or higher\n    - pip package manager\n\n    **Environment Setup**\n\n    1. Create a new project directory and set up a virtual environment:\n\n        ```bash\n        mkdir psi-runtime-api-example && cd psi-runtime-api-example && \\\n        python3 -m venv venv && source venv/bin/activate\n        ```\n\n    2. Install the substrate-interface package:\n\n        ```bash\n        pip install substrate-interface\n        ```\n\n    **Call Runtime APIs**\n\n    The following example demonstrates calling several runtime APIs:\n\n    - **`AccountNonceApi.account_nonce`**: Gets the current nonce for an account.\n    - **`Core.version`**: Retrieves runtime version information.\n\n    Create a file named `runtime_apis.py` and add the following code:\n\n    ```python title=\"runtime_apis.py\"\n    from substrateinterface import SubstrateInterface\n    \n    POLKADOT_TESTNET_RPC = \"INSERT_WS_ENDPOINT\"\n    \n    # Example address to query\n    ADDRESS = \"INSERT_ADDRESS\"\n    \n    \n    def main():\n        # Connect to Polkadot Hub TestNet\n        substrate = SubstrateInterface(url=POLKADOT_TESTNET_RPC)\n    \n        print(\"Connected to Polkadot Hub TestNet\")\n        print(f\"Querying runtime APIs for: {ADDRESS}\\n\")\n    \n        # Call AccountNonceApi to get the account nonce\n        nonce = substrate.runtime_call(\"AccountNonceApi\", \"account_nonce\", [ADDRESS])\n        print(\"AccountNonceApi Results:\")\n        print(f\"  Account Nonce: {nonce.value}\")\n    \n        # Query runtime version using Core runtime API\n        version = substrate.runtime_call(\"Core\", \"version\", [])\n        print(\"\\nCore API Results:\")\n        print(f\"  Spec Name: {version.value['spec_name']}\")\n        print(f\"  Spec Version: {version.value['spec_version']}\")\n        print(f\"  Impl Version: {version.value['impl_version']}\")\n    \n        # Close connection\n        substrate.close()\n    \n    \n    if __name__ == \"__main__\":\n        main()\n    \n    ```\n\n    Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    python runtime_apis.py\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>python runtime_apis.py</span>\n        <span data-ty=\"progress\"></span>\n        <span data-ty>Connected to Polkadot Hub TestNet</span>\n        <span data-ty>Querying runtime APIs for: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty></span>\n        <span data-ty>AccountNonceApi Results:</span>\n        <span data-ty>  Account Nonce: 11</span>\n        <span data-ty></span>\n        <span data-ty>Core API Results:</span>\n        <span data-ty>  Spec Name: asset-hub-paseo</span>\n        <span data-ty>  Spec Version: 1004001</span>\n        <span data-ty>  Impl Version: 0</span>\n    </div>\n    \n\n=== \"Subxt\"\n\n    [Subxt](/reference/tools/subxt/) is a Rust library that provides compile-time type safety through code generation from chain metadata.\n\n    **Prerequisites**\n\n    - [Rust](https://rustup.rs/) toolchain (latest stable)\n    - Cargo package manager\n\n    **Environment Setup**\n\n    1. Create a new Rust project:\n\n        ```bash\n        cargo new subxt-runtime-api-example && cd subxt-runtime-api-example\n        ```\n\n    2. Install the Subxt CLI:\n\n        ```bash\n        cargo install subxt-cli@0.50.1\n        ```\n\n    3. Download the Polkadot Hub TestNet metadata:\n\n        ```bash\n        subxt metadata --url INSERT_WS_ENDPOINT -o polkadot_testnet_metadata.scale\n        ```\n\n        Ensure to replace `INSERT_WS_ENDPOINT` with the proper WebSocket endpoint, such as `wss://asset-hub-paseo.dotters.network` for Polkadot Hub TestNet.\n\n    4. Update `Cargo.toml` with the required dependencies:\n\n        ```toml title=\"Cargo.toml\"\n        [package]\n        name = \"subxt-runtime-api-example\"\n        version = \"0.1.0\"\n        edition = \"2021\"\n        \n        [[bin]]\n        name = \"runtime_apis\"\n        path = \"src/bin/runtime_apis.rs\"\n        \n        [dependencies]\n        subxt = \"0.50.0\"\n        tokio = { version = \"1\", features = [\"rt\", \"macros\"] }\n        \n        ```\n\n    **Call Runtime APIs**\n\n    The following example demonstrates calling several runtime APIs:\n\n    - **`AccountNonceApi.account_nonce`**: Gets the current nonce using the static interface.\n    - **`Metadata.metadata_versions`**: Retrieves supported metadata versions using the dynamic interface.\n\n    Create a file at `src/bin/runtime_apis.rs` and add the following code:\n\n    ```rust title=\"src/bin/runtime_apis.rs\"\n    use std::str::FromStr;\n    use subxt::dynamic::Value;\n    use subxt::utils::AccountId32;\n    use subxt::{OnlineClient, PolkadotConfig};\n    \n    // Generate an interface from the node's metadata\n    #[subxt::subxt(runtime_metadata_path = \"polkadot_testnet_metadata.scale\")]\n    pub mod polkadot_testnet {}\n    \n    const POLKADOT_TESTNET_RPC: &str = \"INSERT_WS_ENDPOINT\";\n    \n    // Example address to query\n    const ADDRESS: &str = \"INSERT_ADDRESS\";\n    \n    #[tokio::main(flavor = \"current_thread\")]\n    async fn main() -> Result<(), Box<dyn std::error::Error>> {\n        // Initialize the Subxt client\n        let api = OnlineClient::<PolkadotConfig>::from_url(POLKADOT_TESTNET_RPC).await?;\n    \n        // Anchor to the current block\n        let at_block = api.at_current_block().await?;\n    \n        println!(\"Connected to Polkadot Hub TestNet\");\n        println!(\"Querying runtime APIs for: {}\\n\", ADDRESS);\n    \n        // Parse the address\n        let account = AccountId32::from_str(ADDRESS)?;\n    \n        // Call AccountNonceApi using static interface\n        let nonce_call = polkadot_testnet::runtime_apis()\n            .account_nonce_api()\n            .account_nonce(account.clone());\n        let nonce = at_block.runtime_apis().call(nonce_call).await?;\n        println!(\"AccountNonceApi Results:\");\n        println!(\"  Account Nonce: {}\", nonce);\n    \n        // Call Metadata API to get supported versions using dynamic call\n        let metadata_versions_call =\n            subxt::dynamic::runtime_api_call::<_, Value>(\"Metadata\", \"metadata_versions\", ());\n        let versions_result = at_block\n            .runtime_apis()\n            .call(metadata_versions_call)\n            .await?;\n        println!(\"\\nMetadata API Results:\");\n        println!(\n            \"  Supported Metadata Versions: {}\",\n            versions_result\n        );\n    \n        Ok(())\n    }\n    \n    ```\n\n    Ensure to replace `INSERT_WS_ENDPOINT` with a valid WebSocket endpoint (e.g., `wss://asset-hub-paseo.dotters.network`) and `INSERT_ADDRESS` with the account address you want to query.\n\n    Run the script:\n\n    ```bash\n    cargo run --bin runtime_apis\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>cargo run --bin runtime_apis</span>\n        <span data-ty=\"progress\"></span>\n        <span data-ty>Connected to Polkadot Hub TestNet</span>\n        <span data-ty>Querying runtime APIs for: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5</span>\n        <span data-ty></span>\n        <span data-ty>AccountNonceApi Results:</span>\n        <span data-ty>  Account Nonce: 11</span>\n        <span data-ty></span>\n        <span data-ty>Metadata API Results:</span>\n        <span data-ty>  Supported Metadata Versions: (14, 15, 16)</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-runtime-api-calls", "url": "https://developer.polkadot.com/chain-interactions/query-data/runtime-api-calls/#available-runtime-apis", "page_title": "Runtime API Calls", "index": 2, "depth": 2, "title": "Available Runtime APIs", "anchor": "available-runtime-apis", "start_char": 18836, "end_char": 20366, "estimated_token_count": 363, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c331b23e7d13f2395a92619cb4ec7f7df4ecd714d73dce470d7329c54cc36889", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Available Runtime APIs\n\nThe following runtime APIs are commonly available on Polkadot SDK-based chains:\n\n| API | Description |\n|-----|-------------|\n| `AccountNonceApi` | Get current transaction nonce for an account |\n| `TransactionPaymentApi` | Query transaction fees and weight information |\n| `TransactionPaymentCallApi` | Estimate fees for a call without creating an extrinsic |\n| `Metadata` | Query metadata versions and runtime metadata |\n| `BlockBuilder` | Access block building functionality |\n| `Core` | Core runtime version and execution |\n| `TaggedTransactionQueue` | Validate transactions in the pool |\n| `OffchainWorkerApi` | Offchain worker functionality |\n| `SessionKeys` | Session key management |\n| `GrandpaApi` | GRANDPA finality information |\n| `BabeApi` | BABE consensus information |\n| `NominationPoolsApi` | Nomination pools data and pending rewards |\n| `StakingApi` | Staking-related computations |\n\n!!! note\n    Available runtime APIs vary by chain. Check your target chain's metadata to see which APIs are exposed.\n\n<div class=\"status-badge\" markdown>\n[![Runtime API Calls](https://github.com/polkadot-developers/polkadot-cookbook/actions/workflows/polkadot-docs-runtime-api-calls.yml/badge.svg?event=push)](https://github.com/polkadot-developers/polkadot-cookbook/actions/workflows/polkadot-docs-runtime-api-calls.yml)\n[:material-code-tags: View tests](https://github.com/polkadot-developers/polkadot-cookbook/blob/master/polkadot-docs/chain-interactions/runtime-api-calls/tests/docs.test.ts)\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-query-data-runtime-api-calls", "url": "https://developer.polkadot.com/chain-interactions/query-data/runtime-api-calls/#where-to-go-next", "page_title": "Runtime API Calls", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 20366, "end_char": 21139, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c331b23e7d13f2395a92619cb4ec7f7df4ecd714d73dce470d7329c54cc36889", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you understand how to call runtime APIs to execute logic within the runtime, explore these related topics:\n\n<div class=\"grid cards\" markdown>\n\n-   __Query with SDKs__\n\n    ---\n\n    Use TypeScript, Python, or Rust SDKs for programmatic access.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/query-sdks/)\n\n-   __Query On-Chain State with Sidecar REST API__\n\n    ---\n\n    Learn how to query on-chain state using the Sidecar REST API\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/query-rest/)\n\n-   __Send Transactions__\n\n    ---\n\n    Learn to construct and submit transactions.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/with-sdks/)        \n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-calculate-transaction-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/calculate-transaction-fees/#introduction", "page_title": "Calculate Transaction Fees", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 31, "end_char": 365, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6669f860efcfdb9c8d36c2d4f0d2dadf575f634edbd1b583179ff1c881c6f44f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nTransaction fees are essential costs for executing operations on Polkadot and its parachains. Understanding how to estimate these fees helps you manage account balances and build better user experiences in your applications. \n\nThis tutorial will guide you through different methods for calculating transaction fees."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-calculate-transaction-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/calculate-transaction-fees/#prerequisites", "page_title": "Calculate Transaction Fees", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 365, "end_char": 870, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6669f860efcfdb9c8d36c2d4f0d2dadf575f634edbd1b583179ff1c881c6f44f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- [Node.js](https://nodejs.org/) version 18 or higher installed\n- Basic understanding of JavaScript/TypeScript\n- Test accounts with sufficient balance to pay transaction fees\n\n!!! note\n    Transaction fees on Polkadot are calculated based on three components: a base fee, a length fee (proportional to transaction size), and a weight fee (proportional to computational complexity). An optional tip can be added to prioritize transaction inclusion."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-calculate-transaction-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/calculate-transaction-fees/#polkadot-api-papi", "page_title": "Calculate Transaction Fees", "index": 2, "depth": 2, "title": "Polkadot-API (PAPI)", "anchor": "polkadot-api-papi", "start_char": 870, "end_char": 4462, "estimated_token_count": 861, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6669f860efcfdb9c8d36c2d4f0d2dadf575f634edbd1b583179ff1c881c6f44f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot-API (PAPI)\n\n[Polkadot-API](/reference/tools/papi) is the modern, recommended library for building TypeScript applications with type safety and light client support.\n\nCreate a new project directory and initialize it:\n\n```bash\nmkdir fee-calculator\ncd fee-calculator\nnpm init -y && npm pkg set type=module\n```\n\nInstall the required packages:\n\n```bash\nnpm install polkadot-api@3.3.0\nnpm install --save-dev typescript tsx\n```\n\nAdd the Polkadot relay chain to generate type-safe descriptors:\n\n```bash\nnpx papi add polkadotTestNet -w INSERT_WS_ENDPOINT\n```\n\nThis command downloads the latest Polkadot metadata and generates TypeScript descriptors in the `@polkadot-api/descriptors` package. Ensure to replace `INSERT_WS_ENDPOINT` with the proper websocket endpoint. For this example, we will use the Polkadot Testnet (`wss://pas-rpc.stakeworld.io/assethub`).\n\nCreate a file named `papi-fee-calculator.ts`:\n\n```typescript title=\"papi-fee-calculator.ts\"\nimport { createClient } from 'polkadot-api';\nimport { polkadotTestNet } from '@polkadot-api/descriptors';\nimport { getWsProvider } from 'polkadot-api/ws';\nimport { getFakeTxCreator } from 'polkadot-api/tx-creator';\n\nasync function calculateFees() {\n  // Connect to chain\n  const client = createClient(getWsProvider('INSERT_WS_ENDPOINT'));\n\n  // Get typed API\n  const api = client.getTypedApi(polkadotTestNet);\n\n  // Define sender and recipient addresses\n  const aliceAddress = 'INSERT_ALICE_ADDRESS';\n  const bobAddress = 'INSERT_BOB_ADDRESS';\n\n  // Amount to transfer (1 DOT = 10^10 plancks)\n  const amount = 10_000_000_000n; // 1 DOT\n\n  try {\n    // Create the transaction\n    const tx = api.tx.Balances.transfer_keep_alive({\n      dest: {\n        type: 'Id',\n        value: bobAddress,\n      },\n      value: amount,\n    });\n\n    // Estimate fees\n    // Polkadot Hub TestNet requires a value for its RestrictOrigins extension\n    const estimatedFees = await tx.getEstimatedFees(\n      getFakeTxCreator(aliceAddress),\n      { customSignedExtensions: { RestrictOrigins: { value: true } } }\n    );\n\n    console.log(`Estimated fee: ${Number(estimatedFees) / 1e10} DOT`);\n    console.log(`Transaction amount: ${Number(amount) / 1e10} DOT`);\n    console.log(`Total deducted: ${Number(estimatedFees + amount) / 1e10} DOT`);\n  } catch (error) {\n    console.error('Error calculating fees:', error);\n  } finally {\n    // Clean up\n    client.destroy();\n  }\n}\n\ncalculateFees();\n\n```\n\nEnsure to replace `INSERT_WS_ENDPOINT` with your WebSocket endpoint, `INSERT_ALICE_ADDRESS` with the sender's address, and `INSERT_BOB_ADDRESS` with the recipient's address.\n\nKey aspects of the code:\n\n- **Transaction creation**: The `api.tx.Balances.transfer_keep_alive()` method constructs a balance transfer transaction.\n- **`dest` parameter**: Specifies the recipient using a `MultiAddress` type with `Id` variant.\n- **`getFakeTxCreator()`**: Creates a transaction creator from the sender's address that uses a dummy signature, so you can estimate fees without the sender's private key.\n- **`getEstimatedFees()`**: Returns the estimated fee in plancks (the smallest unit, where 1 DOT = 10^10 plancks).\n\nExecute the script using `tsx`:\n\n```bash\nnpx tsx papi-fee-calculator.ts\n```\n\nYou should see output similar to:\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx papi-fee-calculator.ts</span>\n    <span data-ty=\"progress\"></span>\n    <span data-ty>Estimated fee: 0.0014668864 DOT</span>\n    <span data-ty>Transaction amount: 1 DOT</span>\n    <span data-ty>Total deducted: 1.0014668864 DOT</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-calculate-transaction-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/calculate-transaction-fees/#polkadotjs-api", "page_title": "Calculate Transaction Fees", "index": 3, "depth": 2, "title": "Polkadot.js API", "anchor": "polkadotjs-api", "start_char": 4462, "end_char": 7108, "estimated_token_count": 642, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6669f860efcfdb9c8d36c2d4f0d2dadf575f634edbd1b583179ff1c881c6f44f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot.js API\n\n[Polkadot.js API](https://polkadot.js.org/docs/api/) is a mature JavaScript/TypeScript library for interacting with Polkadot SDK-based chains, providing comprehensive RPC client functionality and transaction building capabilities.\n\nIn the same project directory (or a new one), install the Polkadot.js packages:\n\n```bash\nnpm install @polkadot/api\n```\n\nCreate a file named `polkadotjs-fee-calculator.ts`:\n\n```typescript title=\"polkadotjs-fee-calculator.ts\"\nimport { ApiPromise, WsProvider } from '@polkadot/api';\n\nasync function calculateFees() {\n  // Connect to chain\n  const wsProvider = new WsProvider('INSERT_WS_ENDPOINT');\n  const api = await ApiPromise.create({ provider: wsProvider });\n\n  // Wait for API to be ready\n  await api.isReady;\n\n  // Define sender and recipient addresses\n  const aliceAddress = 'INSERT_ALICE_ADDRESS';\n  const bobAddress = 'INSERT_BOB_ADDRESS';\n\n  // Amount to transfer (1 DOT = 10^10 plancks)\n  const amount = 10_000_000_000n; // 1 DOT\n\n  try {\n    // Create the transaction\n    const tx = api.tx.balances.transferKeepAlive(bobAddress, amount);\n\n    // Get payment information\n    const paymentInfo = await tx.paymentInfo(aliceAddress);\n\n    console.log(\n      `Estimated fee: ${Number(paymentInfo.partialFee.toBigInt()) / 1e10} DOT`\n    );\n    console.log(`Transaction amount: ${Number(amount) / 1e10} DOT`);\n    console.log(\n      `Total deducted: ${\n        Number(paymentInfo.partialFee.toBigInt() + amount) / 1e10\n      } DOT`\n    );\n  } catch (error) {\n    console.error('Error calculating fees:', error);\n  } finally {\n    // Clean up\n    await api.disconnect();\n  }\n}\n\ncalculateFees();\n```\n\nEnsure to replace `INSERT_WS_ENDPOINT` with your WebSocket endpoint, `INSERT_ALICE_ADDRESS` with the sender's address, and `INSERT_BOB_ADDRESS` with the recipient's address.\n\nKey aspects of the code:\n\n- **Transaction creation**: The `api.tx.balances.transferKeepAlive()` method constructs a balance transfer transaction.\n- **`paymentInfo()`**: Applies a dummy signature and queries the RPC endpoint for fee estimation.\n- **Return values**: The `partialFee` property contains the estimated fee in the smallest unit (plancks).\n\nExecute the script using `tsx`:\n\n```bash\nnpx tsx polkadotjs-fee-calculator.ts\n```\n\nYou should see output similar to:\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx polkadotjs-fee-calculator.ts</span>\n    <span data-ty=\"progress\"></span>\n    <span data-ty>Estimated fee: 0.0014668864 DOT</span>\n    <span data-ty>Transaction amount: 1 DOT</span>\n    <span data-ty>Total deducted: 1.0014668864 DOT</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-calculate-transaction-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/calculate-transaction-fees/#polkadotjs-apps-interface", "page_title": "Calculate Transaction Fees", "index": 4, "depth": 2, "title": "Polkadot.js Apps Interface", "anchor": "polkadotjs-apps-interface", "start_char": 7108, "end_char": 7418, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6669f860efcfdb9c8d36c2d4f0d2dadf575f634edbd1b583179ff1c881c6f44f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot.js Apps Interface\n\nFor non-programmatic fee inspection, the PolkadotJS Apps interface provides a visual way to estimate transaction fees.\n\nNavigate to the [Polkadot.js Apps interface](https://polkadot.js.org/apps) and ensure you're connected to the Polkadot relay chain (or your desired network)."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-calculate-transaction-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/calculate-transaction-fees/#estimate-fees-via-transfer-interface", "page_title": "Calculate Transaction Fees", "index": 5, "depth": 3, "title": "Estimate Fees via Transfer Interface", "anchor": "estimate-fees-via-transfer-interface", "start_char": 7418, "end_char": 7988, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6669f860efcfdb9c8d36c2d4f0d2dadf575f634edbd1b583179ff1c881c6f44f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Estimate Fees via Transfer Interface\n\nTo see fees before submitting a transfer:\n\n1. Navigate to **Accounts** > **Accounts** in the top menu.\n2. Choose an account and click **send**.\n3. Fill in the transfer details:\n    - **Send to address**: Enter Bob's address.\n    - **Amount**: Enter the amount you wish to transfer (e.g., 1 DOT).\n4. Click **Sign and Submit**.\n5. The transaction fee will be displayed in the confirmation dialog before you sign.\n\n    ![](/images/chain-interactions/send-transactions/calculate-transaction-fees/calculate-transaction-fees-01.gif)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-calculate-transaction-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/calculate-transaction-fees/#where-to-go-next", "page_title": "Calculate Transaction Fees", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 7988, "end_char": 9038, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6669f860efcfdb9c8d36c2d4f0d2dadf575f634edbd1b583179ff1c881c6f44f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you can calculate transaction fees, explore related guides to send transactions and manage fees in your applications.\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Pay Fees with Different Tokens__\n\n    ---\n\n    Learn how to send transactions while paying fees using alternative tokens instead of the native chain token.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/pay-fees-with-different-tokens/)\n\n-   <span class=\"badge guide\">Guide</span> __Send Transactions with SDKs__\n\n    ---\n\n    Learn how to send signed transactions using Polkadot-API and Polkadot.js API libraries.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/with-sdks/)\n\n-   <span class=\"badge guide\">Guide</span> __Query Chain Data__\n\n    ---\n\n    Explore different methods for querying blockchain data using REST APIs, SDKs, and runtime API calls.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/query-sdks/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#introduction", "page_title": "Replay and Dry Run XCMs", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 45, "end_char": 660, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis guide demonstrates how to replay and dry-run XCMs using [Chopsticks](/reference/tools/chopsticks/), a powerful tool for forking live Polkadot SDK-based chains in your local environment. These techniques are essential for debugging cross-chain message failures, tracing execution across relay chains and parachains, analyzing weight usage and error types, and safely simulating XCMs without committing state changes.\n\nBy following this guide, you will learn how to set up a local fork, capture and replay real XCMs, and use dry-run features to diagnose and resolve complex cross-chain issues."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#prerequisites", "page_title": "Replay and Dry Run XCMs", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 660, "end_char": 956, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, make sure you have:\n\n- [Chopsticks](/reference/tools/chopsticks/) installed\n- Access to the endpoint or genesis file of the parachain you want to fork\n- The block number or hash where the XCM was sent\n- (Optional) A Chopsticks config file for repeated setups"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#set-up-your-project", "page_title": "Replay and Dry Run XCMs", "index": 2, "depth": 2, "title": "Set Up Your Project", "anchor": "set-up-your-project", "start_char": 956, "end_char": 1829, "estimated_token_count": 217, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up Your Project\n\nStart by creating a dedicated workspace for your XCM replay and dry-run experiments:\n\n1. Create a new directory and navigate into it:\n\n    ```bash\n    mkdir -p replay-xcm-tests\n    cd replay-xcm-tests\n    ```\n\n2. Initialize a new Node project:\n\n    ```bash\n    npm init -y && npm pkg set type=module\n    ```\n\n3. Install Chopsticks globally (recommended to avoid conflicts with local installs):\n\n    ```bash\n    npm install -g @acala-network/chopsticks@latest\n    ```\n\n4. Install TypeScript and related tooling for local development:\n\n    ```bash\n    npm install --save-dev typescript @types/node tsx\n    ```\n\n5. Install the required Polkadot packages:\n\n    ```bash\n    npm install polkadot-api@3.3.0 @polkadot-labs/hdkd@0.0.32 @polkadot-labs/hdkd-helpers@0.0.34\n    ```\n\n6. Initialize the TypeScript config:\n\n    ```bash\n    npx tsc --init\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#capture-the-xcm-to-replay", "page_title": "Replay and Dry Run XCMs", "index": 3, "depth": 2, "title": "Capture the XCM to Replay", "anchor": "capture-the-xcm-to-replay", "start_char": 1829, "end_char": 2281, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Capture the XCM to Replay\n\nTo replay a specific XCM, identify:\n\n- The source and destination chains involved\n- The block number or height where the XCM was sent\n- Optionally, the call payload (if you plan to simulate it manually via development commands)\n\nYou can use Polkadot.js Apps, [papi console](https://dev.papi.how/), or indexers such as [Subscan](https://polkadot.subscan.io/xcm_dashboard) to locate and inspect the original XCM execution."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#fork-the-relevant-chains", "page_title": "Replay and Dry Run XCMs", "index": 4, "depth": 2, "title": "Fork the Relevant Chains", "anchor": "fork-the-relevant-chains", "start_char": 2281, "end_char": 2388, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fork the Relevant Chains\n\nUse Chopsticks to fork the required chains at the appropriate block heights."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#set-the-block-numbers", "page_title": "Replay and Dry Run XCMs", "index": 5, "depth": 3, "title": "Set the Block Numbers", "anchor": "set-the-block-numbers", "start_char": 2388, "end_char": 2670, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Set the Block Numbers\n\nCreate or edit a `.env` file with the block heights for each chain. These should be just before the XCM is sent to allow a full replay:\n\n```text title=\".env\"\nPOLKADOT_BLOCK_NUMBER=26481107\nPOLKADOT_HUB_BLOCK_NUMBER=9079591\nACALA_BLOCK_NUMBER=8826385\n```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#enable-logging-and-wasm-override", "page_title": "Replay and Dry Run XCMs", "index": 6, "depth": 3, "title": "Enable Logging and Wasm Override", "anchor": "enable-logging-and-wasm-override", "start_char": 2670, "end_char": 6491, "estimated_token_count": 1008, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Enable Logging and Wasm Override\n\nFull execution logs only work if the runtime was compiled with logging enabled. Most live chains are built using the `production` profile, which disables logs. To enable logging, you'll need to override the Wasm with a locally built `release` or `debug` version. The `release` profile is faster to load in Chopsticks.\n\n1. Clone the `polkadot-fellows/runtimes` repository:\n\n    ```bash\n    git clone git@github.com:polkadot-fellows/runtimes.git\n    ```\n\n2. Build the Polkadot Hub runtime:\n\n    ```bash\n    cd runtimes\n    # Build with the `debug` profile (default): \n    # cargo build -p asset-hub-polkadot-runtime\n\n    # Build with the `release` profile (faster to load in Chopsticks)\n    cargo build --release -p asset-hub-polkadot-runtime\n    ```\n\n3. Copy the compiled Wasm to your working directory:\n\n    ```bash\n    # Assuming you're still in the `runtimes` directory\n    mkdir -p ../wasms  # or your <replay-xcm-tests>/wasms path\n\n    # Copy the compiled Wasm to your working directory:\n\n    # If built with the `debug` profile:\n    # cp target/debug/wbuild/asset-hub-polkadot-runtime/asset_hub_polkadot_runtime.wasm ../wasms\n\n    # If built with the `release` profile:\n    cp target/release/wbuild/asset-hub-polkadot-runtime/asset_hub_polkadot_runtime.compact.compressed.wasm ../wasms\n    ```\n\n4. Download and modify a config file:\n\n    ```bash\n    # Still in the `runtimes` directory\n    cd .. # Return to your replay-xcm-tests root\n    mkdir -p configs\n    wget https://raw.githubusercontent.com/AcalaNetwork/chopsticks/master/configs/polkadot-asset-hub.yml -O configs/polkadot-asset-hub-override.yaml\n    ```\n\n5. Edit `configs/polkadot-asset-hub-override.yaml` to include:\n\n    ```yaml title=\"configs/polkadot-asset-hub-override.yaml\"\n    ...\n    runtime-log-level: 5\n    # wasm-override: wasms/asset_hub_polkadot_runtime.wasm                     # Uncomment if using the `debug` build\n    wasm-override: wasms/asset_hub_polkadot_runtime.compact.compressed.wasm    # Use this if you built with `release`\n    ...\n    ```\n\n6. Start the forked chains using your custom config:\n\n    ```bash\n    npx @acala-network/chopsticks xcm \\\n    -r polkadot \\\n    -p configs/polkadot-asset-hub-override.yaml \\\n    -p acala\n    ```\n\n    This command starts the relay chain and parachains locally with full runtime execution logs enabled. Once the chains are running, you should see output indicating that the following RPC endpoints are available:\n\n    - Polkadot Hub RPC on `http://localhost:8000`\n    - Acala RPC on `http://localhost:8001`\n    - Polkadot RPC on `http://localhost:8002`\n\n    You'll also see runtime logs such as:\n\n    <div class=\"termynal\" data-termynal>\n      <span data-ty=\"input\">npx @acala-network/chopsticks xcm \\ -r polkadot \\ -p configs/polkadot-asset-hub-override.yaml \\ -p acala</span>\n      <span data-ty>[09:29:14.988] INFO: Polkadot Asset Hub RPC listening on http://[::]:8000 and ws://[::]:8000</span>\n      <span data-ty>[09:29:14.988] INFO: Loading config file https://raw.githubusercontent.com/AcalaNetwork/chopsticks/master/configs/acala.yml</span>\n      <span data-ty>[09:29:15.984] INFO: Acala RPC listening on http://[::]:8001 and ws://[::]:8001</span>\n      <span data-ty>[09:29:15.990] INFO (xcm): Connected parachains [1000,2000]</span>\n      <span data-ty>[09:29:15.990] INFO: Loading config file https://raw.githubusercontent.com/AcalaNetwork/chopsticks/master/configs/polkadot.yml</span>\n      <span data-ty>[09:29:16.927] INFO: Polkadot RPC listening on http://[::]:8002 and ws://[::]:8002</span>\n      <span data-ty>[09:29:16.984] INFO (xcm): Connected relaychain 'Polkadot' with parachain 'Polkadot Asset Hub'</span>\n      <span data-ty>[09:29:17.028] INFO (xcm): Connected relaychain 'Polkadot' with parachain 'Acala'</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#identify-and-extract-the-xcm", "page_title": "Replay and Dry Run XCMs", "index": 7, "depth": 2, "title": "Identify and Extract the XCM", "anchor": "identify-and-extract-the-xcm", "start_char": 6491, "end_char": 8047, "estimated_token_count": 308, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Identify and Extract the XCM\n\nTo replay an XCM, you'll first need to identify the exact extrinsic that triggered it. This example uses block 9079592 on Polkadot Hub.\n\n1. Find and open the block on Subscan to inspect its extrinsics and events. In this case, the block is [9079592](https://assethub-polkadot.subscan.io/block/9079592).\n\n2. Copy the block hash. Look for the block hash at the top of the page. For block 9079592, the hash is:\n\n    ```bash title=\"Block Hash\"\n    0xeb5a5737d47367dc1c02b978232283cdb096eb7e51d2eb22366a106a011347f6\n    ```\n\n3. Explore and view the block in [Polkadot.js Apps](https://polkadot.js.org/apps) using this direct link: [Block Hash Explorer](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/explorer/query/0xeb5a5737d47367dc1c02b978232283cdb096eb7e51d2eb22366a106a011347f6).\n\n4. Locate and decode the XCM extrinsic. Once you've found the extrinsic (e.g., 9079592-2), extract and decode its call data. For example, the call data is:\n   \n    ```bash title=\"Call Data\"\n    0xad028400fc39fcf04a8071b7409823b7c82427ce67910c6ed80aa0e5093aff234624c820016a30461702adc48213e5c9ee4d15c5a481c578cb5cbc935f0bd11fe8aee489082a745ffbbe94282f91b67daa6cb44920d77c30849c1d25f5f6c3e59015a3e383440055040000011f0803010100411f0300010100fc39fcf04a8071b7409823b7c82427ce67910c6ed80aa0e5093aff234624c8200304000002043205011f0092e81d790000000000\n    ```\n\n5. From the decoded view, copy the **hex-encoded call** (e.g. `0x1f08...0000`). You'll pass this into `api.txFromCallData(...)` to replay the XCM locally."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#replay-the-xcm", "page_title": "Replay and Dry Run XCMs", "index": 8, "depth": 2, "title": "Replay the XCM", "anchor": "replay-the-xcm", "start_char": 8047, "end_char": 8297, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Replay the XCM\n\nOnce your project is set up, you're ready to replay the XCM locally.\n\nThis is useful for:\n\n- Diagnosing execution failures or weight limits\n- Inspecting all emitted events\n- Verifying behavior before submitting a real transaction"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#add-the-polkadot-hub-descriptor", "page_title": "Replay and Dry Run XCMs", "index": 9, "depth": 3, "title": "Add the Polkadot Hub Descriptor", "anchor": "add-the-polkadot-hub-descriptor", "start_char": 8297, "end_char": 8653, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add the Polkadot Hub Descriptor\n\nAdd the Polkadot Hub descriptor to use type-safe APIs with PAPI:\n\n```bash\nnpx papi add polkadotHub -w ws://localhost:8000\n```\n\n!!! note\n    The script assumes Polkadot Hub is served on `ws://localhost:8000`. If you're using a different port or configuration, update the WebSocket endpoint in the script or descriptor."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#create-a-replay-script", "page_title": "Replay and Dry Run XCMs", "index": 10, "depth": 3, "title": "Create a Replay Script", "anchor": "create-a-replay-script", "start_char": 8653, "end_char": 11370, "estimated_token_count": 626, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create a Replay Script\n\nCreate a file named `replay-xcm.ts` and add the following code to it:\n\n```ts title=\"replay-xcm.ts\"\nimport { Binary, createClient, Transaction } from 'polkadot-api';\nimport { getTxCreator } from 'polkadot-api/tx-creator';\nimport { getWsProvider } from 'polkadot-api/ws';\nimport { polkadotHub } from '@polkadot-api/descriptors';\nimport { sr25519CreateDerive } from '@polkadot-labs/hdkd';\nimport {\n  DEV_PHRASE,\n  entropyToMiniSecret,\n  mnemonicToEntropy,\n} from '@polkadot-labs/hdkd-helpers';\n\nconst toHuman = (_key: any, value: any) => {\n  if (typeof value === 'bigint') {\n    return Number(value);\n  }\n\n  // Raw binary values are Uint8Arrays rather than Binary instances.\n  if (value instanceof Uint8Array) {\n    return Binary.toHex(value);\n  }\n\n  return value;\n};\n\nfunction getSigner() {\n  const entropy = mnemonicToEntropy(DEV_PHRASE);\n  const miniSecret = entropyToMiniSecret(entropy);\n  const derive = sr25519CreateDerive(miniSecret);\n  const alice = derive('//Alice');\n\n  return getTxCreator(alice.publicKey, 'Sr25519', alice.sign);\n}\n\nasync function main() {\n  const client = createClient(getWsProvider('ws://localhost:8000'));\n  const api = client.getTypedApi(polkadotHub);\n  const aliceSigner = getSigner();\n\n  const callData = Binary.fromHex(\n    '0x1f0803010100411f0300010100fc39fcf04a8071b7409823b7c82427ce67910c6ed80aa0e5093aff234624c8200304000002043205011f0092e81d790000000000',\n  );\n  const tx: Transaction = await api.txFromCallData(callData);\n  console.log('👀 Executing XCM:', JSON.stringify(tx.decodedCall, toHuman, 2));\n\n  await new Promise<void>((resolve) => {\n    const subscription = tx.createSubmitAndWatch(aliceSigner).subscribe((ev) => {\n      if (ev.type === 'finalized' || ev.type === 'inBestBlock') {\n        console.log(\n          `📦 Included in block #${ev.block.number}: ${ev.block.hash}`,\n        );\n\n        if (!ev.ok) {\n          const dispatchError = ev.dispatchError;\n          if (dispatchError.type === 'Module') {\n            const modErr: any = dispatchError.value;\n            console.error(\n              `❌ Dispatch error in module: ${modErr.type} → ${modErr.value?.type}`,\n            );\n          } else {\n            console.error(\n              '❌ Dispatch error:',\n              JSON.stringify(dispatchError, toHuman, 2),\n            );\n          }\n        }\n\n        for (const event of ev.events) {\n          console.log(\n            '📣 Event:',\n            event.type,\n            JSON.stringify(event.value, toHuman, 2),\n          );\n        }\n\n        console.log('✅ Process completed, exiting...');\n        subscription.unsubscribe();\n        resolve();\n      }\n    });\n  });\n\n  client.destroy();\n}\n\nmain().catch(console.error);\n\n```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#execute-the-replay-script", "page_title": "Replay and Dry Run XCMs", "index": 11, "depth": 3, "title": "Execute the Replay Script", "anchor": "execute-the-replay-script", "start_char": 11370, "end_char": 11559, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Execute the Replay Script\n\nEnsure Chopsticks is running and serving a chain that includes `pallet-xcm`, such as a Polkadot Hub fork. Run the script:\n\n```bash\nnpx tsx replay-xcm.ts\n```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#expected-output", "page_title": "Replay and Dry Run XCMs", "index": 12, "depth": 3, "title": "Expected Output", "anchor": "expected-output", "start_char": 11559, "end_char": 13452, "estimated_token_count": 669, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Expected Output\n\nYou should see output similar to:\n\n<div class=\"termynal\" data-termynal>\n  <span data-ty=\"input\">npx tsx replay-xcm.ts</span>\n  <pre data-ty>\nexecuting xcm: {\n  \"type\": \"polkadotxcm\",\n  \"value\": {\n    \"type\": \"limited_reserve_transfer_assets\",\n    \"value\": {\n      \"dest\": { \"parents\": 0, \"interior\": { \"X1\": [{ \"Parachain\": 2006 }] } },\n      \"beneficiary\": { \"parents\": 0, \"interior\": { \"X1\": [{ \"AccountId32\": { \"network\": null, \"id\": \"0x...\" } }] } },\n      \"assets\": [{ \"id\": { \"Concrete\": { \"parents\": 0, \"interior\": \"Here\" } }, \"fun\": { \"Fungible\": 120000000000 } }],\n      \"fee_asset_item\": 0,\n      \"weight_limit\": { \"type\": \"Unlimited\" }\n    }\n  }\n}\n  </pre>\n  <span data-ty>📦 Included in block #9079592: 0x227a11c64f6051ba2e090a13abd17e5f7581640a80f6c03fc2d43fac66ab7949</span>\n  <span data-ty>📣 Event: Balances { \"type\": \"Upgraded\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: Balances { \"type\": \"Withdraw\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: Assets { \"type\": \"Transferred\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: PolkadotXcm { \"type\": \"Attempted\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: Balances { \"type\": \"Burned\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: Balances { \"type\": \"Minted\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: PolkadotXcm { \"type\": \"FeesPaid\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: XcmpQueue { \"type\": \"XcmpMessageSent\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: PolkadotXcm { \"type\": \"Sent\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: Balances { \"type\": \"Deposit\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: TransactionPayment { \"type\": \"TransactionFeePaid\", \"value\": { ... } }</span>\n  <span data-ty>📣 Event: System { \"type\": \"ExtrinsicSuccess\", \"value\": { ... } }</span>\n  <span data-ty>✅ Process completed, exiting...</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#dry-run-the-xcm", "page_title": "Replay and Dry Run XCMs", "index": 13, "depth": 2, "title": "Dry Run the XCM", "anchor": "dry-run-the-xcm", "start_char": 13452, "end_char": 13640, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Dry Run the XCM\n\nTo simulate the XCM without actually sending it, you can use the `dry_run_call` method. This lets you check whether the XCM would succeed without modifying any state."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#create-a-dry-run-script", "page_title": "Replay and Dry Run XCMs", "index": 14, "depth": 3, "title": "Create a Dry Run Script", "anchor": "create-a-dry-run-script", "start_char": 13640, "end_char": 15211, "estimated_token_count": 345, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create a Dry Run Script\n\nAssuming you have the `tx` transaction from the previous step, create a new script named `dry-run-call.ts` and add the following code to it:\n\n```ts title=\"dry-run-call.ts\"\nimport { Binary, createClient, Enum } from 'polkadot-api';\nimport { getWsProvider } from 'polkadot-api/ws';\nimport { polkadotHub } from '@polkadot-api/descriptors';\nimport { sr25519CreateDerive } from '@polkadot-labs/hdkd';\nimport {\n  DEV_PHRASE,\n  entropyToMiniSecret,\n  mnemonicToEntropy,\n  ss58Address,\n} from '@polkadot-labs/hdkd-helpers';\n\nconst XCM_VERSION = 5;\n\nasync function main() {\n  const client = createClient(getWsProvider('ws://localhost:8000'));\n  const api = client.getTypedApi(polkadotHub);\n\n  const entropy = mnemonicToEntropy(DEV_PHRASE);\n  const miniSecret = entropyToMiniSecret(entropy);\n  const derive = sr25519CreateDerive(miniSecret);\n  const alice = derive('//Alice');\n  const aliceAddress = ss58Address(alice.publicKey);\n\n  const callData = Binary.fromHex(\n    '0x1f0803010100411f0300010100fc39fcf04a8071b7409823b7c82427ce67910c6ed80aa0e5093aff234624c8200304000002043205011f0092e81d790000000000',\n  );\n  const tx: any = await api.txFromCallData(callData);\n  const origin = Enum('system', Enum('Signed', aliceAddress));\n  const dryRunResult: any = await api.apis.DryRunApi.dry_run_call(\n    origin,\n    tx.decodedCall,\n    XCM_VERSION,\n  );\n  console.dir(dryRunResult.value, { depth: null });\n\n  client.destroy();\n}\n\nmain().catch(console.error);\n\n```\n\nEnsure your local Chopsticks fork is running and the ports match those used in the script."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#execute-the-dry-run-script", "page_title": "Replay and Dry Run XCMs", "index": 15, "depth": 3, "title": "Execute the Dry Run Script", "anchor": "execute-the-dry-run-script", "start_char": 15211, "end_char": 16889, "estimated_token_count": 514, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Execute the Dry Run Script\n\nRun the script:\n\n```bash\nnpx tsx dry-run-call.ts\n```\n\nIf successful, the dry run confirms that the XCM would execute correctly:\n\n<div class=\"termynal\" data-termynal>\n  <span data-ty=\"input\">npx tsx dry-run-call.ts</span>\n  <pre data-ty>\nexecution_result: {\n  \"success\": true,\n  \"value\": {\n    \"post_info\": { \"actual_weight\": 123456, \"pays_fee\": \"Yes\" },\n    \"result\": \"Ok\"\n  }\n}\nemitted_events: [ { \"section\": \"Balances\", \"method\": \"Transfer\", \"data\": { \"from\": \"0x...\", \"to\": \"0x...\", \"amount\": 1000000000 } } ]\nlocal_xcm: { \"type\": \"SomeType\", \"value\": { ... } }\nforwarded_xcms: []\n  </pre>\n  <span data-ty>✅ Dry run succeeded</span>\n  <span data-ty>✅ Process completed, exiting...</span>\n</div>\n\n\nIf it fails, you'll receive detailed error information:\n\n<div class=\"termynal\" data-termynal>\n  <span data-ty=\"input\">npx tsx dry-run-call.ts</span>\n  <pre data-ty>\nexecution_result: {\n  \"success\": false,\n  \"value\": {\n    \"post_info\": { \"actual_weight\": 123456, \"pays_fee\": \"Yes\" },\n    \"error\": {\n      \"type\": \"Module\",\n      \"value\": {\n        \"type\": \"PolkadotXcm\",\n        \"value\": { \"type\": \"LocalExecutionIncomplete\", \"value\": null }\n      }\n    }\n  }\n}\n  </pre>\n  <span data-ty>❌ Dry run failed: LocalExecutionIncomplete</span>\n  <span data-ty>✅ Process completed, exiting...</span>\n</div>\n\n\nFor more information, see:\n\n- [Dry Run Call](https://paritytech.github.io/polkadot-sdk/master/xcm_runtime_apis/dry_run/trait.DryRunApi.html#method.dry_run_call) to simulate a full extrinsic.\n- [Dry Run XCM](https://paritytech.github.io/polkadot-sdk/master/xcm_runtime_apis/dry_run/trait.DryRunApi.html#method.dry_run_xcm) to simulate a raw XCM."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#review-and-debug", "page_title": "Replay and Dry Run XCMs", "index": 16, "depth": 2, "title": "Review and Debug", "anchor": "review-and-debug", "start_char": 16889, "end_char": 17228, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Review and Debug\n\nReplaying XCMs with full logging provides fine-grained control and visibility into cross-chain message behavior. Chopsticks makes this possible in a safe, local environment, empowering developers to debug complex message flows, identify root causes of XCM failures, and improve observability for future integrations."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-debug-and-preview-xcms", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/#where-to-go-next", "page_title": "Replay and Dry Run XCMs", "index": 17, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 17228, "end_char": 17790, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a77765aff0d8483624f877fe18226e1dc99012a197d9580b115749f7c39ba172", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge external\">External</span> **Chopsticks Repository**\n\n    ---\n\n    View the official Chopsticks GitHub repository.\n\n    [:octicons-arrow-right-24: Get Started](https://github.com/AcalaNetwork/chopsticks/)\n\n- <span class=\"badge guide\">Guide</span> **Get Started with XCM**\n\n    ---\n\n    Learn how to use XCM effectively for cross-chain communication.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#introduction", "page_title": "XCM Fee Estimation", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 442, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nWhen sending cross-chain messages, ensure that the transaction will be successful not only in the local chain but also in the destination chain and any intermediate chains.\n\nSending cross-chain messages requires estimating the fees for the operation. \n\nThis tutorial will demonstrate how to dry-run and estimate the fees for teleporting assets from the Polkadot Hub TestNet to the Paseo People Chain."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#fee-mechanism", "page_title": "XCM Fee Estimation", "index": 1, "depth": 2, "title": "Fee Mechanism", "anchor": "fee-mechanism", "start_char": 442, "end_char": 1410, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fee Mechanism\n\nThere are three types of fees that can be charged when sending a cross-chain message:\n\n- **Local execution fees**: Fees charged in the local chain for executing the message.\n- **Delivery fees**: Fees charged for delivering the message to the destination chain.\n- **Remote execution fees**: Fees charged in the destination chain for executing the message.\n\nIf there are multiple intermediate chains, delivery fees and remote execution fees will be charged for each one.\n\nIn this example, you will estimate the fees for teleporting assets from the Polkadot Hub to the Paseo People Chain. The fee structure will be as follows:\n\n```mermaid\nflowchart LR\n    PolkadotHub[Polkadot Hub] -->|Delivery Fees| PeopleChain[Paseo People Chain]\n    PolkadotHub -->|Local<br/>Execution<br/>Fees| PolkadotHub\n    PeopleChain -->|Remote<br/>Execution<br/>Fees| PeopleChain\n```\n\nThe overall fees are `local_execution_fees` + `delivery_fees` + `remote_execution_fees`."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#environment-setup", "page_title": "XCM Fee Estimation", "index": 2, "depth": 2, "title": "Environment Setup", "anchor": "environment-setup", "start_char": 1410, "end_char": 4107, "estimated_token_count": 598, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Environment Setup\n\nFirst, you need to set up your environment:\n\n1. Create a new directory and initialize the project:\n\n    ```bash\n    mkdir xcm-fee-estimation && \\\n    cd xcm-fee-estimation\n    ```\n\n2. Initialize the project:\n\n    ```bash\n    npm init -y\n    ```\n\n3. Install dev dependencies:\n\n    ```bash\n    npm install --save-dev @types/node@^22.12.0 ts-node@^10.9.2 typescript@^5.7.3\n    ```\n\n4. Install dependencies:\n\n    ```bash\n    npm install --save @polkadot-labs/hdkd@0.0.32 @polkadot-labs/hdkd-helpers@0.0.34 polkadot-api@3.3.0\n    ```\n\n5. Create TypeScript configuration:\n\n    ```bash\n    npx tsc --init\n    ```\n\n6. Generate the types for the Polkadot API for Paseo People Chain and Polkadot Hub TestNet:\n\n    ```bash\n    npx papi add polkadotHub -n paseo_asset_hub && \\\n    npx papi add paseoPeopleChain -w wss://people-paseo.rpc.amforc.com\n    ```\n\n    !!!info \"Polkadot Hub\"\n        The `paseo_asset_hub` is the identifier for the Polkadot Hub TestNet.\n\n7. Create a new file called `teleport-polkadot-hub-to-people-chain.ts`:\n\n    ```bash\n    touch teleport-polkadot-hub-to-people-chain.ts\n    ```\n\n8. Import the necessary modules. Add the following code to the `teleport-polkadot-hub-to-people-chain.ts` file:\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n    import { polkadotHub, paseoPeopleChain } from '@polkadot-api/descriptors';\n    import { AccountId, Binary, createClient, Enum } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import {\n      XcmVersionedLocation,\n      XcmVersionedAssetId,\n      XcmV3Junctions,\n      XcmV3MultiassetFungibility,\n      XcmVersionedXcm,\n      XcmV5Instruction,\n      XcmV5Junctions,\n      XcmV5Junction,\n      XcmV5AssetFilter,\n      XcmV5WildAsset,\n    } from '@polkadot-api/descriptors';\n    \n    ```\n\n9. Define constants and a `main` function where you will implement all the logic:\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n    const PAS_UNITS = 10_000_000_000n; // 1 PAS\n    const PAS_CENTS = 100_000_000n; // 0.01 PAS\n    \n    // Polkadot Hub constants\n    const POLKADOT_HUB_RPC_ENDPOINT = 'ws://localhost:8001';\n    const POLKADOT_HUB_ACCOUNT = '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5'; // Alice (Polkadot Hub)\n    \n    // People Chain destination\n    const PEOPLE_CHAIN_RPC_ENDPOINT = 'ws://localhost:8000';\n    const PEOPLE_CHAIN_PARA_ID = 1004;\n    const PEOPLE_CHAIN_BENEFICIARY =\n      '14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3'; // Bob (People Chain)\n\n    async function main() {\n      // Code will go here\n    }\n    ```\n\nAll the following code explained in the subsequent sections must be added inside the `main` function."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#client-and-api-setup", "page_title": "XCM Fee Estimation", "index": 3, "depth": 2, "title": "Client and API Setup", "anchor": "client-and-api-setup", "start_char": 4107, "end_char": 4859, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Client and API Setup\n\nNow you are ready to start implementing the logic for the fee estimation for the teleport you want to perform. In this step, you will create the client for the Polkadot Hub TestNet and generate the typed API to interact with the chain. Follow the steps below:\n\nCreate the API client. You will need to create a client for the Polkadot Hub TestNet:\n\n```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n    totalFees,\n  };\n}\n\nasync function main() {\n  // Connect to the Polkadot Hub parachain\n  const polkadotHubClient = createClient(\n```\n\nEnsure that you replace the endpoint URLs with the actual WebSocket endpoints. This example uses local chopsticks endpoints, but you can use public endpoints or run local nodes."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#create-the-xcm-message", "page_title": "XCM Fee Estimation", "index": 4, "depth": 2, "title": "Create the XCM Message", "anchor": "create-the-xcm-message", "start_char": 4859, "end_char": 6917, "estimated_token_count": 414, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the XCM Message\n\nNow, you can construct a proper XCM message using the new XCM V5 instructions for teleporting from Polkadot Hub TestNet to the People Chain:\n\n```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n// 32-byte hex representation.\nconst accountIdCodec = AccountId();\nconst ss58ToHex = (addr: string) => Binary.toHex(accountIdCodec.enc(addr));\n\n// Create the XCM message for teleport (Polkadot Hub → People Chain)\nfunction createTeleportXcmToPeopleChain(paraId: number) {\n  return XcmVersionedXcm.V5([\n    // Withdraw PAS from Polkadot Hub (PAS on parachains is parents:1, interior: Here)\n    XcmV5Instruction.WithdrawAsset([\n      {\n        id: { parents: 1, interior: XcmV5Junctions.Here() },\n        fun: XcmV3MultiassetFungibility.Fungible(1n * PAS_UNITS), // 1 PAS\n      },\n    ]),\n    // Pay local fees on Polkadot Hub in PAS\n    XcmV5Instruction.PayFees({\n      asset: {\n        id: { parents: 1, interior: XcmV5Junctions.Here() },\n        fun: XcmV3MultiassetFungibility.Fungible(10n * PAS_CENTS), // 0.01 PAS\n      },\n    }),\n    // Send to People Chain parachain (parents:1, interior: X1(Parachain(paraId)))\n    XcmV5Instruction.InitiateTransfer({\n      destination: {\n        parents: 1,\n        interior: XcmV5Junctions.X1(XcmV5Junction.Parachain(paraId)),\n      },\n      remote_fees: Enum(\n        'Teleport',\n        XcmV5AssetFilter.Definite([\n          {\n            id: { parents: 1, interior: XcmV5Junctions.Here() },\n            fun: XcmV3MultiassetFungibility.Fungible(10n * PAS_CENTS), // 0.01 PAS\n          },\n        ]),\n      ),\n      preserve_origin: false,\n      remote_xcm: [\n        XcmV5Instruction.DepositAsset({\n          assets: XcmV5AssetFilter.Wild(XcmV5WildAsset.AllCounted(1)),\n          beneficiary: {\n            parents: 0,\n            interior: XcmV5Junctions.X1(\n              XcmV5Junction.AccountId32({\n                network: undefined,\n                id: ss58ToHex(PEOPLE_CHAIN_BENEFICIARY),\n              }),\n            ),\n          },\n        }),\n      ],\n      assets: [\n```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#fee-estimation-function", "page_title": "XCM Fee Estimation", "index": 5, "depth": 2, "title": "Fee Estimation Function", "anchor": "fee-estimation-function", "start_char": 6917, "end_char": 20591, "estimated_token_count": 2666, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fee Estimation Function\n\nBelow is a four-step breakdown of the logic needed to estimate the fees for the teleport.\n\nFirst, you need to create the function that will estimate the fees for the teleport:\n\n```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n      ],\n    }),\n  ]);\n}\n  // Code will go here\n}\n```\n\n1. **Local execution fees on Polkadot Hub**: Compute the XCM weight locally, then convert that weight to PAS using Polkadot Hub's view of PAS (`parents: 1, interior: Here`). Add the code to the function:\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n    \n    async function estimateXcmFeesFromPolkadotHubToPeopleChain(\n      xcm: any,\n      polkadotHubApi: any,\n    ) {\n      console.log('=== Fee Estimation Process (Polkadot Hub → People Chain) ===');\n    \n      // 1. LOCAL EXECUTION FEES on Polkadot Hub\n      console.log('1. Calculating local execution fees on Polkadot Hub...');\n      let localExecutionFees = 0n;\n    \n      const weightResult =\n        await polkadotHubApi.apis.XcmPaymentApi.query_xcm_weight(xcm);\n      if (weightResult.success) {\n        console.log('✓ XCM weight (Polkadot Hub):', weightResult.value);\n    \n        // Convert weight to PAS fees from Polkadot Hub's perspective (parents:1, Here)\n        const executionFeesResult =\n          await polkadotHubApi.apis.XcmPaymentApi.query_weight_to_asset_fee(\n            weightResult.value,\n            XcmVersionedAssetId.V4({\n              parents: 1,\n              interior: XcmV3Junctions.Here(),\n            }),\n          );\n    \n        if (executionFeesResult.success) {\n          localExecutionFees = executionFeesResult.value;\n          console.log(\n            '✓ Local execution fees (Polkadot Hub):',\n            localExecutionFees.toString(),\n            'PAS units',\n          );\n        } else {\n          console.log(\n            '✗ Failed to calculate local execution fees:',\n            executionFeesResult.value,\n          );\n        }\n      } else {\n    ```\n\n2. **Dry-run and delivery fees to People Chain**: Dry-run the XCM on Polkadot Hub to capture forwarded messages, locate the one targeting People Chain (`parents: 1, interior: Here`), and ask for delivery fees. Add the code to the function:\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n        '✗ Failed to query XCM weight on Polkadot Hub:',\n        weightResult.value,\n      );\n    }\n    \n    // 2. DELIVERY FEES + REMOTE EXECUTION FEES\n    console.log('\\n2. Calculating delivery and remote execution fees...');\n    let deliveryFees = 0n;\n    let remoteExecutionFees = 0n; // Skipped (People Chain descriptor not available)\n    \n    // Origin from Polkadot Hub perspective\n    const origin = XcmVersionedLocation.V5({\n      parents: 0,\n      interior: XcmV5Junctions.X1(\n        XcmV5Junction.AccountId32({\n          id: ss58ToHex(POLKADOT_HUB_ACCOUNT),\n          network: undefined,\n        }),\n      ),\n    });\n    \n    // Dry run the XCM locally on Polkadot Hub\n    const dryRunResult = await polkadotHubApi.apis.DryRunApi.dry_run_xcm(\n      origin,\n      xcm,\n    );\n    \n    if (\n      dryRunResult.success &&\n      dryRunResult.value.execution_result.type === 'Complete'\n    ) {\n      console.log('✓ Local dry run on Polkadot Hub successful');\n    \n      const { forwarded_xcms: forwardedXcms } = dryRunResult.value;\n    \n      // Find the XCM message sent to People Chain (parents:1, interior: X1(Parachain(1004)))\n      const peopleChainXcmEntry = forwardedXcms.find(\n        ([location, _]: [any, any]) =>\n          (location.type === 'V4' || location.type === 'V5') &&\n          location.value.parents === 1 &&\n          location.value.interior?.type === 'X1' &&\n          location.value.interior.value?.type === 'Parachain' &&\n          location.value.interior.value.value === PEOPLE_CHAIN_PARA_ID,\n      );\n    \n      if (peopleChainXcmEntry) {\n        const [destination, messages] = peopleChainXcmEntry;\n        const remoteXcm = messages[0];\n    \n        console.log('✓ Found XCM message to People Chain');\n    \n        // Calculate delivery fees from Polkadot Hub to People Chain\n        const deliveryFeesResult =\n          await polkadotHubApi.apis.XcmPaymentApi.query_delivery_fees(\n            destination,\n            remoteXcm,\n          );\n    \n        if (\n          deliveryFeesResult.success &&\n          deliveryFeesResult.value.type === 'V5' &&\n          deliveryFeesResult.value.value[0]?.fun?.type === 'Fungible'\n        ) {\n    ```\n\n3. **Remote execution fees on People Chain**: Connect to People Chain, recompute the forwarded XCM weight there, and convert weight to PAS (`parents: 0, interior: Here`). Add the code to the function:\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n        console.log('✓ Delivery fees:', deliveryFees.toString(), 'PAS units');\n      } else {\n        console.log('✗ Failed to calculate delivery fees:', deliveryFeesResult);\n      }\n    \n      // 3. REMOTE EXECUTION FEES on People Chain\n      console.log('\\n3. Calculating remote execution fees on People Chain');\n      try {\n        const peopleChainClient = createClient(\n          getWsProvider(PEOPLE_CHAIN_RPC_ENDPOINT),\n        );\n        const peopleChainApi = peopleChainClient.getTypedApi(paseoPeopleChain);\n        const remoteWeightResult =\n          await peopleChainApi.apis.XcmPaymentApi.query_xcm_weight(remoteXcm);\n        const remoteFeesResult =\n          await peopleChainApi.apis.XcmPaymentApi.query_weight_to_asset_fee(\n            remoteWeightResult.value as {\n              ref_time: bigint;\n              proof_size: bigint;\n            },\n            XcmVersionedAssetId.V4({\n              parents: 1,\n              interior: XcmV3Junctions.Here(),\n            }),\n          );\n        peopleChainClient.destroy();\n        remoteExecutionFees = remoteFeesResult.value as bigint;\n        console.log(\n          '✓ Remote execution fees:',\n          remoteExecutionFees.toString(),\n          'PAS units',\n        );\n      } catch (error) {\n        console.error(\n          'Error calculating remote execution fees on People Chain:',\n          error,\n        );\n      }\n    } else {\n    ```\n\n4. **Sum and return totals**: Aggregate all parts, print a short summary, and return a structured result. Add the code to the function:\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n      }\n    } else {\n      console.log('✗ Local dry run failed on Polkadot Hub:', dryRunResult.value);\n    }\n    \n    // 4. TOTAL FEES\n    const totalFees = localExecutionFees + deliveryFees + remoteExecutionFees;\n    \n    console.log('\\n=== Fee Summary (Polkadot Hub → People Chain) ===');\n    console.log(\n      'Local execution fees:',\n      localExecutionFees.toString(),\n      'PAS units',\n    );\n    console.log('Delivery fees:', deliveryFees.toString(), 'PAS units');\n    console.log(\n      'Remote execution fees:',\n      remoteExecutionFees.toString(),\n      'PAS units',\n    );\n    console.log('TOTAL FEES:', totalFees.toString(), 'PAS units');\n    console.log(\n      'TOTAL FEES:',\n      (Number(totalFees) / Number(PAS_UNITS)).toFixed(4),\n      'PAS',\n    );\n    \n    return {\n      localExecutionFees,\n    ```\n\nThe full code for the fee estimation function is the following:\n\n??? code \"Fee Estimation Function\"\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n          ],\n        }),\n      ]);\n    }\n    \n    async function estimateXcmFeesFromPolkadotHubToPeopleChain(\n      xcm: any,\n      polkadotHubApi: any,\n    ) {\n      console.log('=== Fee Estimation Process (Polkadot Hub → People Chain) ===');\n    \n      // 1. LOCAL EXECUTION FEES on Polkadot Hub\n      console.log('1. Calculating local execution fees on Polkadot Hub...');\n      let localExecutionFees = 0n;\n    \n      const weightResult =\n        await polkadotHubApi.apis.XcmPaymentApi.query_xcm_weight(xcm);\n      if (weightResult.success) {\n        console.log('✓ XCM weight (Polkadot Hub):', weightResult.value);\n    \n        // Convert weight to PAS fees from Polkadot Hub's perspective (parents:1, Here)\n        const executionFeesResult =\n          await polkadotHubApi.apis.XcmPaymentApi.query_weight_to_asset_fee(\n            weightResult.value,\n            XcmVersionedAssetId.V4({\n              parents: 1,\n              interior: XcmV3Junctions.Here(),\n            }),\n          );\n    \n        if (executionFeesResult.success) {\n          localExecutionFees = executionFeesResult.value;\n          console.log(\n            '✓ Local execution fees (Polkadot Hub):',\n            localExecutionFees.toString(),\n            'PAS units',\n          );\n        } else {\n          console.log(\n            '✗ Failed to calculate local execution fees:',\n            executionFeesResult.value,\n          );\n        }\n      } else {\n        console.log(\n          '✗ Failed to query XCM weight on Polkadot Hub:',\n          weightResult.value,\n        );\n      }\n    \n      // 2. DELIVERY FEES + REMOTE EXECUTION FEES\n      console.log('\\n2. Calculating delivery and remote execution fees...');\n      let deliveryFees = 0n;\n      let remoteExecutionFees = 0n; // Skipped (People Chain descriptor not available)\n    \n      // Origin from Polkadot Hub perspective\n      const origin = XcmVersionedLocation.V5({\n        parents: 0,\n        interior: XcmV5Junctions.X1(\n          XcmV5Junction.AccountId32({\n            id: ss58ToHex(POLKADOT_HUB_ACCOUNT),\n            network: undefined,\n          }),\n        ),\n      });\n    \n      // Dry run the XCM locally on Polkadot Hub\n      const dryRunResult = await polkadotHubApi.apis.DryRunApi.dry_run_xcm(\n        origin,\n        xcm,\n      );\n    \n      if (\n        dryRunResult.success &&\n        dryRunResult.value.execution_result.type === 'Complete'\n      ) {\n        console.log('✓ Local dry run on Polkadot Hub successful');\n    \n        const { forwarded_xcms: forwardedXcms } = dryRunResult.value;\n    \n        // Find the XCM message sent to People Chain (parents:1, interior: X1(Parachain(1004)))\n        const peopleChainXcmEntry = forwardedXcms.find(\n          ([location, _]: [any, any]) =>\n            (location.type === 'V4' || location.type === 'V5') &&\n            location.value.parents === 1 &&\n            location.value.interior?.type === 'X1' &&\n            location.value.interior.value?.type === 'Parachain' &&\n            location.value.interior.value.value === PEOPLE_CHAIN_PARA_ID,\n        );\n    \n        if (peopleChainXcmEntry) {\n          const [destination, messages] = peopleChainXcmEntry;\n          const remoteXcm = messages[0];\n    \n          console.log('✓ Found XCM message to People Chain');\n    \n          // Calculate delivery fees from Polkadot Hub to People Chain\n          const deliveryFeesResult =\n            await polkadotHubApi.apis.XcmPaymentApi.query_delivery_fees(\n              destination,\n              remoteXcm,\n            );\n    \n          if (\n            deliveryFeesResult.success &&\n            deliveryFeesResult.value.type === 'V5' &&\n            deliveryFeesResult.value.value[0]?.fun?.type === 'Fungible'\n          ) {\n            deliveryFees = deliveryFeesResult.value.value[0].fun.value;\n            console.log('✓ Delivery fees:', deliveryFees.toString(), 'PAS units');\n          } else {\n            console.log('✗ Failed to calculate delivery fees:', deliveryFeesResult);\n          }\n    \n          // 3. REMOTE EXECUTION FEES on People Chain\n          console.log('\\n3. Calculating remote execution fees on People Chain');\n          try {\n            const peopleChainClient = createClient(\n              getWsProvider(PEOPLE_CHAIN_RPC_ENDPOINT),\n            );\n            const peopleChainApi = peopleChainClient.getTypedApi(paseoPeopleChain);\n            const remoteWeightResult =\n              await peopleChainApi.apis.XcmPaymentApi.query_xcm_weight(remoteXcm);\n            const remoteFeesResult =\n              await peopleChainApi.apis.XcmPaymentApi.query_weight_to_asset_fee(\n                remoteWeightResult.value as {\n                  ref_time: bigint;\n                  proof_size: bigint;\n                },\n                XcmVersionedAssetId.V4({\n                  parents: 1,\n                  interior: XcmV3Junctions.Here(),\n                }),\n              );\n            peopleChainClient.destroy();\n            remoteExecutionFees = remoteFeesResult.value as bigint;\n            console.log(\n              '✓ Remote execution fees:',\n              remoteExecutionFees.toString(),\n              'PAS units',\n            );\n          } catch (error) {\n            console.error(\n              'Error calculating remote execution fees on People Chain:',\n              error,\n            );\n          }\n        } else {\n          console.log('✗ No XCM message found to People Chain');\n        }\n      } else {\n        console.log('✗ Local dry run failed on Polkadot Hub:', dryRunResult.value);\n      }\n    \n      // 4. TOTAL FEES\n      const totalFees = localExecutionFees + deliveryFees + remoteExecutionFees;\n    \n      console.log('\\n=== Fee Summary (Polkadot Hub → People Chain) ===');\n      console.log(\n        'Local execution fees:',\n        localExecutionFees.toString(),\n        'PAS units',\n      );\n      console.log('Delivery fees:', deliveryFees.toString(), 'PAS units');\n      console.log(\n        'Remote execution fees:',\n        remoteExecutionFees.toString(),\n        'PAS units',\n      );\n      console.log('TOTAL FEES:', totalFees.toString(), 'PAS units');\n      console.log(\n        'TOTAL FEES:',\n        (Number(totalFees) / Number(PAS_UNITS)).toFixed(4),\n        'PAS',\n      );\n    \n      return {\n        localExecutionFees,\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#complete-implementation", "page_title": "XCM Fee Estimation", "index": 6, "depth": 2, "title": "Complete Implementation", "anchor": "complete-implementation", "start_char": 20591, "end_char": 22298, "estimated_token_count": 397, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Complete Implementation\n\nNow put it all together in the main function:\n\n```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n    remoteExecutionFees,\n    totalFees,\n  };\n}\n\nasync function main() {\n  // Connect to the Polkadot Hub parachain\n  const polkadotHubClient = createClient(\n    getWsProvider(POLKADOT_HUB_RPC_ENDPOINT),\n  );\n\n  // Get the typed API for Polkadot Hub\n  const polkadotHubApi = polkadotHubClient.getTypedApi(polkadotHub);\n\n  try {\n    // Create the XCM message for teleport (Polkadot Hub → People Chain)\n    const xcm = createTeleportXcmToPeopleChain(PEOPLE_CHAIN_PARA_ID);\n\n    console.log('=== XCM Teleport: Polkadot Hub → People Chain ===');\n    console.log('From:', POLKADOT_HUB_ACCOUNT, '(Alice on Polkadot Hub)');\n    console.log('To:', PEOPLE_CHAIN_BENEFICIARY, '(Beneficiary on People Chain)');\n    console.log('Amount:', '1 PAS');\n    console.log('');\n\n    // Estimate all fees\n    const fees = await estimateXcmFeesFromPolkadotHubToPeopleChain(xcm, polkadotHubApi);\n    void fees; // prevent unused var under isolatedModules\n\n    // Create the execute transaction on Polkadot Hub\n    const tx = polkadotHubApi.tx.PolkadotXcm.execute({\n      message: xcm,\n      max_weight: {\n        ref_time: 6000000000n,\n        proof_size: 65536n,\n      },\n    });\n\n    console.log('\\n=== Transaction Details ===');\n    console.log('Transaction hex:', Binary.toHex(await tx.getEncodedData()));\n    console.log('Ready to submit!');\n  } catch (error) {\n    console.log('Error stack:', (error as Error).stack);\n    console.error('Error occurred:', (error as Error).message);\n    if ((error as Error).cause) {\n      console.dir((error as Error).cause, { depth: null });\n    }\n```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#full-code", "page_title": "XCM Fee Estimation", "index": 7, "depth": 2, "title": "Full Code", "anchor": "full-code", "start_char": 22298, "end_char": 34122, "estimated_token_count": 2182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Full Code\n\nThe full code for the complete implementation is the following:\n\n??? code \"Teleport from Polkadot Hub to People Chain\"\n\n    ```typescript title=\"teleport-polkadot-hub-to-people-chain.ts\"\n    import { polkadotHub, paseoPeopleChain } from '@polkadot-api/descriptors';\n    import { AccountId, Binary, createClient, Enum } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import {\n      XcmVersionedLocation,\n      XcmVersionedAssetId,\n      XcmV3Junctions,\n      XcmV3MultiassetFungibility,\n      XcmVersionedXcm,\n      XcmV5Instruction,\n      XcmV5Junctions,\n      XcmV5Junction,\n      XcmV5AssetFilter,\n      XcmV5WildAsset,\n    } from '@polkadot-api/descriptors';\n    \n    // 1 PAS = 10^10 units\n    const PAS_UNITS = 10_000_000_000n; // 1 PAS\n    const PAS_CENTS = 100_000_000n; // 0.01 PAS\n    \n    // Polkadot Hub constants\n    const POLKADOT_HUB_RPC_ENDPOINT = 'ws://localhost:8001';\n    const POLKADOT_HUB_ACCOUNT = '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5'; // Alice (Polkadot Hub)\n    \n    // People Chain destination\n    const PEOPLE_CHAIN_RPC_ENDPOINT = 'ws://localhost:8000';\n    const PEOPLE_CHAIN_PARA_ID = 1004;\n    const PEOPLE_CHAIN_BENEFICIARY =\n      '14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3'; // Bob (People Chain)\n    \n    // In polkadot-api v2, FixedSizeBinary is replaced by hex strings typed as\n    // SizedHex<32>. Use the AccountId codec to convert an SS58 address into its\n    // 32-byte hex representation.\n    const accountIdCodec = AccountId();\n    const ss58ToHex = (addr: string) => Binary.toHex(accountIdCodec.enc(addr));\n    \n    // Create the XCM message for teleport (Polkadot Hub → People Chain)\n    function createTeleportXcmToPeopleChain(paraId: number) {\n      return XcmVersionedXcm.V5([\n        // Withdraw PAS from Polkadot Hub (PAS on parachains is parents:1, interior: Here)\n        XcmV5Instruction.WithdrawAsset([\n          {\n            id: { parents: 1, interior: XcmV5Junctions.Here() },\n            fun: XcmV3MultiassetFungibility.Fungible(1n * PAS_UNITS), // 1 PAS\n          },\n        ]),\n        // Pay local fees on Polkadot Hub in PAS\n        XcmV5Instruction.PayFees({\n          asset: {\n            id: { parents: 1, interior: XcmV5Junctions.Here() },\n            fun: XcmV3MultiassetFungibility.Fungible(10n * PAS_CENTS), // 0.01 PAS\n          },\n        }),\n        // Send to People Chain parachain (parents:1, interior: X1(Parachain(paraId)))\n        XcmV5Instruction.InitiateTransfer({\n          destination: {\n            parents: 1,\n            interior: XcmV5Junctions.X1(XcmV5Junction.Parachain(paraId)),\n          },\n          remote_fees: Enum(\n            'Teleport',\n            XcmV5AssetFilter.Definite([\n              {\n                id: { parents: 1, interior: XcmV5Junctions.Here() },\n                fun: XcmV3MultiassetFungibility.Fungible(10n * PAS_CENTS), // 0.01 PAS\n              },\n            ]),\n          ),\n          preserve_origin: false,\n          remote_xcm: [\n            XcmV5Instruction.DepositAsset({\n              assets: XcmV5AssetFilter.Wild(XcmV5WildAsset.AllCounted(1)),\n              beneficiary: {\n                parents: 0,\n                interior: XcmV5Junctions.X1(\n                  XcmV5Junction.AccountId32({\n                    network: undefined,\n                    id: ss58ToHex(PEOPLE_CHAIN_BENEFICIARY),\n                  }),\n                ),\n              },\n            }),\n          ],\n          assets: [\n            Enum('Teleport', XcmV5AssetFilter.Wild(XcmV5WildAsset.AllCounted(1))), // Send everything.\n          ],\n        }),\n      ]);\n    }\n    \n    async function estimateXcmFeesFromPolkadotHubToPeopleChain(\n      xcm: any,\n      polkadotHubApi: any,\n    ) {\n      console.log('=== Fee Estimation Process (Polkadot Hub → People Chain) ===');\n    \n      // 1. LOCAL EXECUTION FEES on Polkadot Hub\n      console.log('1. Calculating local execution fees on Polkadot Hub...');\n      let localExecutionFees = 0n;\n    \n      const weightResult =\n        await polkadotHubApi.apis.XcmPaymentApi.query_xcm_weight(xcm);\n      if (weightResult.success) {\n        console.log('✓ XCM weight (Polkadot Hub):', weightResult.value);\n    \n        // Convert weight to PAS fees from Polkadot Hub's perspective (parents:1, Here)\n        const executionFeesResult =\n          await polkadotHubApi.apis.XcmPaymentApi.query_weight_to_asset_fee(\n            weightResult.value,\n            XcmVersionedAssetId.V4({\n              parents: 1,\n              interior: XcmV3Junctions.Here(),\n            }),\n          );\n    \n        if (executionFeesResult.success) {\n          localExecutionFees = executionFeesResult.value;\n          console.log(\n            '✓ Local execution fees (Polkadot Hub):',\n            localExecutionFees.toString(),\n            'PAS units',\n          );\n        } else {\n          console.log(\n            '✗ Failed to calculate local execution fees:',\n            executionFeesResult.value,\n          );\n        }\n      } else {\n        console.log(\n          '✗ Failed to query XCM weight on Polkadot Hub:',\n          weightResult.value,\n        );\n      }\n    \n      // 2. DELIVERY FEES + REMOTE EXECUTION FEES\n      console.log('\\n2. Calculating delivery and remote execution fees...');\n      let deliveryFees = 0n;\n      let remoteExecutionFees = 0n; // Skipped (People Chain descriptor not available)\n    \n      // Origin from Polkadot Hub perspective\n      const origin = XcmVersionedLocation.V5({\n        parents: 0,\n        interior: XcmV5Junctions.X1(\n          XcmV5Junction.AccountId32({\n            id: ss58ToHex(POLKADOT_HUB_ACCOUNT),\n            network: undefined,\n          }),\n        ),\n      });\n    \n      // Dry run the XCM locally on Polkadot Hub\n      const dryRunResult = await polkadotHubApi.apis.DryRunApi.dry_run_xcm(\n        origin,\n        xcm,\n      );\n    \n      if (\n        dryRunResult.success &&\n        dryRunResult.value.execution_result.type === 'Complete'\n      ) {\n        console.log('✓ Local dry run on Polkadot Hub successful');\n    \n        const { forwarded_xcms: forwardedXcms } = dryRunResult.value;\n    \n        // Find the XCM message sent to People Chain (parents:1, interior: X1(Parachain(1004)))\n        const peopleChainXcmEntry = forwardedXcms.find(\n          ([location, _]: [any, any]) =>\n            (location.type === 'V4' || location.type === 'V5') &&\n            location.value.parents === 1 &&\n            location.value.interior?.type === 'X1' &&\n            location.value.interior.value?.type === 'Parachain' &&\n            location.value.interior.value.value === PEOPLE_CHAIN_PARA_ID,\n        );\n    \n        if (peopleChainXcmEntry) {\n          const [destination, messages] = peopleChainXcmEntry;\n          const remoteXcm = messages[0];\n    \n          console.log('✓ Found XCM message to People Chain');\n    \n          // Calculate delivery fees from Polkadot Hub to People Chain\n          const deliveryFeesResult =\n            await polkadotHubApi.apis.XcmPaymentApi.query_delivery_fees(\n              destination,\n              remoteXcm,\n            );\n    \n          if (\n            deliveryFeesResult.success &&\n            deliveryFeesResult.value.type === 'V5' &&\n            deliveryFeesResult.value.value[0]?.fun?.type === 'Fungible'\n          ) {\n            deliveryFees = deliveryFeesResult.value.value[0].fun.value;\n            console.log('✓ Delivery fees:', deliveryFees.toString(), 'PAS units');\n          } else {\n            console.log('✗ Failed to calculate delivery fees:', deliveryFeesResult);\n          }\n    \n          // 3. REMOTE EXECUTION FEES on People Chain\n          console.log('\\n3. Calculating remote execution fees on People Chain');\n          try {\n            const peopleChainClient = createClient(\n              getWsProvider(PEOPLE_CHAIN_RPC_ENDPOINT),\n            );\n            const peopleChainApi = peopleChainClient.getTypedApi(paseoPeopleChain);\n            const remoteWeightResult =\n              await peopleChainApi.apis.XcmPaymentApi.query_xcm_weight(remoteXcm);\n            const remoteFeesResult =\n              await peopleChainApi.apis.XcmPaymentApi.query_weight_to_asset_fee(\n                remoteWeightResult.value as {\n                  ref_time: bigint;\n                  proof_size: bigint;\n                },\n                XcmVersionedAssetId.V4({\n                  parents: 1,\n                  interior: XcmV3Junctions.Here(),\n                }),\n              );\n            peopleChainClient.destroy();\n            remoteExecutionFees = remoteFeesResult.value as bigint;\n            console.log(\n              '✓ Remote execution fees:',\n              remoteExecutionFees.toString(),\n              'PAS units',\n            );\n          } catch (error) {\n            console.error(\n              'Error calculating remote execution fees on People Chain:',\n              error,\n            );\n          }\n        } else {\n          console.log('✗ No XCM message found to People Chain');\n        }\n      } else {\n        console.log('✗ Local dry run failed on Polkadot Hub:', dryRunResult.value);\n      }\n    \n      // 4. TOTAL FEES\n      const totalFees = localExecutionFees + deliveryFees + remoteExecutionFees;\n    \n      console.log('\\n=== Fee Summary (Polkadot Hub → People Chain) ===');\n      console.log(\n        'Local execution fees:',\n        localExecutionFees.toString(),\n        'PAS units',\n      );\n      console.log('Delivery fees:', deliveryFees.toString(), 'PAS units');\n      console.log(\n        'Remote execution fees:',\n        remoteExecutionFees.toString(),\n        'PAS units',\n      );\n      console.log('TOTAL FEES:', totalFees.toString(), 'PAS units');\n      console.log(\n        'TOTAL FEES:',\n        (Number(totalFees) / Number(PAS_UNITS)).toFixed(4),\n        'PAS',\n      );\n    \n      return {\n        localExecutionFees,\n        deliveryFees,\n        remoteExecutionFees,\n        totalFees,\n      };\n    }\n    \n    async function main() {\n      // Connect to the Polkadot Hub parachain\n      const polkadotHubClient = createClient(\n        getWsProvider(POLKADOT_HUB_RPC_ENDPOINT),\n      );\n    \n      // Get the typed API for Polkadot Hub\n      const polkadotHubApi = polkadotHubClient.getTypedApi(polkadotHub);\n    \n      try {\n        // Create the XCM message for teleport (Polkadot Hub → People Chain)\n        const xcm = createTeleportXcmToPeopleChain(PEOPLE_CHAIN_PARA_ID);\n    \n        console.log('=== XCM Teleport: Polkadot Hub → People Chain ===');\n        console.log('From:', POLKADOT_HUB_ACCOUNT, '(Alice on Polkadot Hub)');\n        console.log('To:', PEOPLE_CHAIN_BENEFICIARY, '(Beneficiary on People Chain)');\n        console.log('Amount:', '1 PAS');\n        console.log('');\n    \n        // Estimate all fees\n        const fees = await estimateXcmFeesFromPolkadotHubToPeopleChain(xcm, polkadotHubApi);\n        void fees; // prevent unused var under isolatedModules\n    \n        // Create the execute transaction on Polkadot Hub\n        const tx = polkadotHubApi.tx.PolkadotXcm.execute({\n          message: xcm,\n          max_weight: {\n            ref_time: 6000000000n,\n            proof_size: 65536n,\n          },\n        });\n    \n        console.log('\\n=== Transaction Details ===');\n        console.log('Transaction hex:', Binary.toHex(await tx.getEncodedData()));\n        console.log('Ready to submit!');\n      } catch (error) {\n        console.log('Error stack:', (error as Error).stack);\n        console.error('Error occurred:', (error as Error).message);\n        if ((error as Error).cause) {\n          console.dir((error as Error).cause, { depth: null });\n        }\n      } finally {\n        // Ensure client is always destroyed\n        polkadotHubClient.destroy();\n      }\n    }\n    \n    main().catch(console.error);\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#running-the-script", "page_title": "XCM Fee Estimation", "index": 8, "depth": 2, "title": "Running the Script", "anchor": "running-the-script", "start_char": 34122, "end_char": 38469, "estimated_token_count": 939, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Running the Script\n\nBefore running the script, you can use chopsticks to fork the Polkadot Hub TestNet and Paseo People Chain locally. To do so, you can use the following files and commands:\n\n1. Create a new directory called `.chopsticks` and add the files:\n\n    ??? code \"paseo-people-chain.yml\"\n\n        ```yaml title=\".chopsticks/paseo-people-chain.yml\"\n        endpoint: wss://people-paseo.rpc.amforc.com\n        mock-signature-host: true\n        block: ${env.PASEO_PEOPLE_CHAIN_BLOCK_NUMBER}\n        db: ./db.sqlite\n        \n        import-storage:\n          Sudo:\n            Key: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY # Alice\n          System:\n            Account:\n              -\n                -\n                  - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY\n                - providers: 1\n                  data:\n                    free: '10000000000000000000'\n        \n        \n        ```\n    \n    ??? code \"paseo-asset-hub.yml\"\n\n        ```yaml title=\".chopsticks/paseo-asset-hub.yml\"\n        endpoint: wss://asset-hub-paseo-rpc.n.dwellir.com\n        mock-signature-host: true\n        block: ${env.PASEO_ASSET_HUB_BLOCK_NUMBER}\n        db: ./db.sqlite\n        \n        import-storage:\n          Sudo:\n            Key: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY # Alice\n          System:\n            Account:\n              -\n                -\n                  - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY\n                - providers: 1\n                  data:\n                    free: '10000000000000000000'\n        ```\n\n2. Run the following command to fork the Paseo People Chain:\n\n    ```bash\n    chopsticks --config=.chopsticks/paseo-people-chain.yml\n    ```\n\n    After running the command, you will see the following output:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>chopsticks --config=.chopsticks/paseo-people-chain.yml</span>\n      <span data-ty=\"output\">[15:55:22.770] INFO: Paseo People Chain RPC listening on http://[::]:8000 and ws://[::]:8000</span>\n      <span data-ty=\"output\">app: \"chopsticks\"</span>\n    </div>\n    \n    \n\n3. Run the following command to fork the Polkadot Hub TestNet chain:\n\n    ```bash\n    chopsticks --config=.chopsticks/paseo-asset-hub.yml\n    ```\n\n    After running the commands, you will see the following output:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>chopsticks --config=.chopsticks/paseo-asset-hub.yml</span>\n      <span data-ty=\"output\">[15:55:22.770] INFO: Paseo Asset Hub Testnet RPC listening on http://[::]:8001 and ws://[::]:8001</span>\n      <span data-ty=\"output\">app: \"chopsticks\"</span>\n    </div>\n    \n\n4. Run the script:\n\n    ```bash\n    npx ts-node teleport-polkadot-hub-to-people-chain.ts\n    ```\n\nAfter running the script, you will see the following output:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx ts-node teleport-polkadot-hub-to-people-chain.ts</span>\n  <pre>\n=== XCM Teleport: Polkadot Hub TestNet → People Chain ===\nFrom: 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5 (Alice on Polkadot Hub TestNet)\nTo: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3 (Beneficiary on People Chain)\nAmount: 1 PAS\n\n=== Fee Estimation Process (Polkadot Hub TestNet → People Chain) ===\n1. Calculating local execution fees on Polkadot Hub TestNet...\n✓ XCM weight (Polkadot Hub TestNet): { ref_time: 1462082000n, proof_size: 19578n }\n✓ Local execution fees (Polkadot Hub TestNet): 97890000 PAS units\n\n2. Calculating delivery and remote execution fees...\n✓ Local dry run on Polkadot Hub TestNet successful\n✓ Found XCM message to People Chain\n✓ Delivery fees: 305150000 PAS units\n\n3. Calculating remote execution fees on People Chain\n✓ Remote execution fees: 17965000 PAS units\n\n=== Fee Summary (Polkadot Hub TestNet → People Chain) ===\nLocal execution fees: 97890000 PAS units\nDelivery fees: 305150000 PAS units\nRemote execution fees: 17965000 PAS units\nTOTAL FEES: 421005000 PAS units\nTOTAL FEES: 0.0421 PAS\n\n=== Transaction Details ===\nTransaction hex: 0x1f03050c00040100000700e40b54023001000002286bee31010100a90f0100000401000002286bee000400010204040d010204000101008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480700bca0650102000400\nReady to submit!\n\n</pre\n  >\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-estimate-xcm-fees", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/estimate-xcm-fees/#conclusion", "page_title": "XCM Fee Estimation", "index": 9, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 38469, "end_char": 39077, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0ddb0ba1924b9ccde3c67e0cb30a0601206c64cff6382a36cb650d566beb1d42", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nThis approach provides accurate fee estimation for XCM teleports from Polkadot Hub TestNet to People Chain by properly simulating execution on both chains and utilizing dedicated runtime APIs for fee calculation. The fee breakdown helps you understand the cost structure of cross-chain operations (asset hub → system parachain) and ensures your transactions have sufficient funds to complete successfully.\n\nThe key insight is understanding how asset references change based on the perspective of each chain in the XCM ecosystem, which is crucial for proper fee estimation and XCM construction."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#introduction", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 48, "end_char": 420, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis guide walks you through transferring tokens from Ethereum to Polkadot using the [ParaSpell XCM SDK](/reference/tools/paraspell/) and [Snowbridge](https://docs.snowbridge.network/). Snowbridge is a trustless, decentralized bridge integrated into the Polkadot protocol that enables secure asset transfers between the Ethereum and Polkadot ecosystems."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#how-the-bridge-works", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 1, "depth": 3, "title": "How the Bridge Works", "anchor": "how-the-bridge-works", "start_char": 420, "end_char": 1165, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How the Bridge Works\n\nThe following diagram shows the complete flow when bridging WETH from Ethereum to Polkadot:\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant Ethereum\n    participant Relayers\n    participant Polkadot\n\n    User->>Ethereum: 1. Approve & send tokens\n    Ethereum->>Ethereum: Lock tokens\n    Note over Relayers: ~30 min relay\n    Relayers->>Polkadot: 2. Relay message\n    Polkadot->>Polkadot: Verify & mint tokens\n    Polkadot-->>User: 3. Tokens available\n```\n\nIn this guide, you will:\n\n- Set up an Ethereum development environment with the ParaSpell SDK\n- Approve tokens for the Snowbridge Gateway contract\n- Build and execute a bridge transfer from Ethereum to Polkadot Hub\n- Monitor the transfer status"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#prerequisites", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 2, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1165, "end_char": 1639, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following:\n\n- A basic understanding of [XCM](/parachains/interoperability/get-started/).\n- Familiarity with JavaScript/TypeScript and Ethereum development.\n- [Node.js](https://nodejs.org/) v18 or higher and npm installed.\n- An Ethereum wallet with WETH tokens. See [Prepare Tokens for Bridging](#prepare-tokens-for-bridging) for instructions to wrap ETH if needed.\n- A Polkadot account to receive the bridged assets."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#prepare-tokens-for-bridging", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 3, "depth": 2, "title": "Prepare Tokens for Bridging", "anchor": "prepare-tokens-for-bridging", "start_char": 1639, "end_char": 2466, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prepare Tokens for Bridging\n\nTo bridge ETH, you need to wrap it into WETH first. The WETH contract on Ethereum mainnet is:\n\n```\n0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\n```\n\n!!!note \"Why WETH instead of ETH?\"\n    Snowbridge only supports ERC-20 tokens—it cannot bridge native ETH directly. The bridge uses a standardized token interface to lock assets on Ethereum and mint corresponding representations on Polkadot. Since native ETH doesn't conform to the ERC-20 standard, you must first wrap it into WETH (Wrapped ETH), an ERC-20-compliant token pegged 1:1 to ETH.\n\nYou can wrap ETH by:\n\n1. Visiting the [WETH contract on Etherscan](https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2#writeContract)\n2. Connecting your wallet\n3. Calling the `deposit` function with the amount of ETH you want to wrap"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#initialize-your-project", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 4, "depth": 2, "title": "Initialize Your Project", "anchor": "initialize-your-project", "start_char": 2466, "end_char": 5136, "estimated_token_count": 626, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize Your Project\n\nFollow these steps to setup and initialize your project:\n1. Create the project folder using the following commands:\n\n```bash\nmkdir eth-to-polkadot-bridge && \\\ncd eth-to-polkadot-bridge\n```\n\n2. Initialize the JavaScript project:\n\n```bash\nnpm init -y && npm pkg set type=module\n```\n\nInstall dev dependencies:\n\n```bash\nnpm install --save-dev @types/node tsx typescript\n```\n\nInstall the ParaSpell SDK, its Snowbridge extension, and [viem](https://viem.sh/), which the extension uses to sign Ethereum transactions:\n\n```bash\nnpm install @paraspell/sdk@14.4.4 @paraspell/evm-snowbridge@14.4.4 polkadot-api@3.3.0 viem@2.57.12\n```\n\nNow add the following setup code to `index.ts`:\n\n```ts title=\"index.ts\"\nimport { Builder, getBridgeStatus } from '@paraspell/sdk';\nimport { approveToken, getTokenBalance } from '@paraspell/evm-snowbridge';\nimport { createClient } from 'polkadot-api';\nimport { getWsProvider } from 'polkadot-api/ws';\nimport { createPublicClient, createWalletClient, formatUnits, http, type Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { mainnet } from 'viem/chains';\n\n// Ethereum mainnet RPC endpoint (use your own API key)\nconst ETH_RPC = 'https://eth-mainnet.g.alchemy.com/v2/INSERT_API_KEY';\n\n// Polkadot Bridge Hub RPC endpoint, used to check the bridge status\nconst BRIDGE_HUB_RPC = 'wss://polkadot-bridge-hub-rpc.polkadot.io';\n\n// WETH contract address on Ethereum mainnet\nconst WETH_ADDRESS = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';\n\n// WETH has 18 decimals\nconst WETH_UNITS = 1_000_000_000_000_000_000n;\n\n// Amount to bridge: 0.001 WETH (raw units as bigint)\nconst AMOUNT = WETH_UNITS / 1000n;\n\n// Your Polkadot address to receive the bridged tokens (SS58 format)\nconst RECIPIENT_ADDRESS = 'INSERT_YOUR_POLKADOT_ADDRESS';\n\n// Connect to Ethereum mainnet\n// For a browser wallet (MetaMask), use custom(window.ethereum) as the transport\nconst walletClient = createWalletClient({\n  account: privateKeyToAccount('INSERT_PRIVATE_KEY' as Hex),\n  chain: mainnet,\n  transport: http(ETH_RPC),\n});\nconst publicClient = createPublicClient({ chain: mainnet, transport: http(ETH_RPC) });\n```\n\nReplace the following placeholders:\n\n- **`INSERT_API_KEY`**: Your Ethereum RPC provider API key.\n- **`INSERT_PRIVATE_KEY`**: The private key of the Ethereum account holding your WETH, as a `0x`-prefixed hex string.\n- **`INSERT_YOUR_POLKADOT_ADDRESS`**: The Polkadot account address (SS58 format) that will receive the bridged tokens on Polkadot Hub.\n\n!!!warning \"Security Warning\"\n    Never commit private keys or seed phrases to production code. Use environment variables or secure key management systems."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#approve-tokens-for-bridging", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 5, "depth": 2, "title": "Approve Tokens for Bridging", "anchor": "approve-tokens-for-bridging", "start_char": 5136, "end_char": 6893, "estimated_token_count": 426, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Approve Tokens for Bridging\n\nBefore bridging ERC-20 tokens, you must approve the Snowbridge Gateway contract to spend your tokens. The `@paraspell/evm-snowbridge` package provides helper functions to check your balance and current allowance and to approve spending:\n\n```ts title=\"index.ts\"\nasync function approveTokens() {\n  // Check current WETH balance and Snowbridge Gateway allowance\n  const { balance, gatewayAllowance } = await getTokenBalance(walletClient, 'WETH');\n  console.log(`Current WETH balance: ${formatUnits(balance, 18)}`);\n\n  if (balance === 0n) {\n    console.log('No WETH balance. Please wrap some ETH to WETH first.');\n    console.log(`WETH contract: ${WETH_ADDRESS}`);\n    process.exit(1);\n  }\n\n  if (gatewayAllowance >= AMOUNT) {\n    console.log('Gateway allowance already covers the transfer amount.');\n    return;\n  }\n\n  // Approve the Snowbridge Gateway contract to spend WETH\n  const approveTxHash = await approveToken(walletClient, AMOUNT, 'WETH');\n  console.log(`Approval transaction hash: ${approveTxHash}`);\n\n  // Wait for confirmation\n  await publicClient.waitForTransactionReceipt({ hash: approveTxHash });\n  console.log('Token approval confirmed!');\n}\n\napproveTokens();\n```\n\nRun the approval script:\n\n```bash\nnpx tsx index.ts\n```\n\nYou will see output confirming the token balance and approval similar to the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx index.ts</span>\n  <span data-ty>Current WETH balance: 0.05</span>\n  <span data-ty>Approval transaction hash: 0x1a2b3c4d5e6f7890abcdef1234567890abcdef1234567890abcdef1234567890</span>\n  <span data-ty>Token approval confirmed!</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#build-and-execute-the-bridge-transfer", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 6, "depth": 2, "title": "Build and Execute the Bridge Transfer", "anchor": "build-and-execute-the-bridge-transfer", "start_char": 6893, "end_char": 8830, "estimated_token_count": 471, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Build and Execute the Bridge Transfer\n\nNow build and execute the bridge transfer from Ethereum to Polkadot Hub:\n\n```ts title=\"index.ts\"\nasync function bridgeToPolkadot() {\n  console.log('Building bridge transaction...');\n  console.log(`Bridging ${formatUnits(AMOUNT, 18)} WETH to Polkadot Hub`);\n  console.log(`Recipient: ${RECIPIENT_ADDRESS}`);\n\n  // Build and execute the bridge transfer\n  // Note: 'AssetHubPolkadot' is the SDK identifier for Polkadot Hub\n  const builder = Builder()\n    .from('Ethereum')\n    .to('AssetHubPolkadot')\n    .currency({\n      symbol: 'WETH',\n      amount: AMOUNT,\n    })\n    .recipient(RECIPIENT_ADDRESS)\n    .sender(walletClient);\n\n  // Resolves once the Ethereum transaction is confirmed\n  const txHash = await builder.signAndSubmit();\n  await builder.disconnect();\n\n  console.log('Bridge transaction confirmed on Ethereum!');\n  console.log(`Transaction hash: ${txHash}`);\n  console.log('Transfer will arrive in approximately 30 minutes.');\n}\n\nbridgeToPolkadot();\n```\n\nComment out the `approveTokens()` call and run the transfer:\n\n```bash\nnpx tsx index.ts\n```\n\nThe `signAndSubmit()` call resolves once the transaction is confirmed on Ethereum and has emitted the bridge message. You will see the Ethereum transaction hash in the terminal output similar to the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx index.ts</span>\n  <span data-ty>Building bridge transaction...</span>\n  <span data-ty>Bridging 0.001 WETH to Polkadot Hub</span>\n  <span data-ty>Recipient: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY</span>\n  <span data-ty>Bridge transaction confirmed on Ethereum!</span>\n  <span data-ty>Transaction hash: 0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890</span>\n  <span data-ty>Transfer will arrive in approximately 30 minutes.</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#monitor-the-transfer", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 7, "depth": 2, "title": "Monitor the Transfer", "anchor": "monitor-the-transfer", "start_char": 8830, "end_char": 9976, "estimated_token_count": 287, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Monitor the Transfer\n\nBridge transfers from Ethereum to Polkadot take approximately 30 minutes. You can monitor the transfer status in several ways:\n\n- **Snowbridge App** - Visit [app.snowbridge.network](https://app.snowbridge.network/) to check the transfer history\n- **Etherscan** - Track your Ethereum transaction on [etherscan.io](https://etherscan.io/)\n- **Polkadot.js Apps** - Monitor incoming transfers on [Polkadot Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/accounts)\n\nYou can also check the bridge status programmatically. First, comment out the `bridgeToPolkadot()` call so the script doesn't send another transfer. Then add the following code to `index.ts`:\n\n```ts title=\"index.ts\"\nasync function checkBridgeStatus() {\n  // Check the current status of the Snowbridge\n  const client = createClient(getWsProvider(BRIDGE_HUB_RPC));\n  const status = await getBridgeStatus(client);\n  console.log('Bridge Status:', status);\n  client.destroy();\n}\n\ncheckBridgeStatus();\n```\n\nRun the script:\n\n```bash\nnpx tsx index.ts\n```\n\nThe script prints `Bridge Status: Normal` while the bridge is operating."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#supported-assets-and-destinations", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 8, "depth": 2, "title": "Supported Assets and Destinations", "anchor": "supported-assets-and-destinations", "start_char": 9976, "end_char": 17611, "estimated_token_count": 1824, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Supported Assets and Destinations\n\nSnowbridge can bridge any ERC-20 token from Ethereum, but the destination chain must have that asset registered as a foreign asset to receive it.\n\n!!!warning \"Verify Foreign Assets\"\n    Foreign asset creation on Polkadot Hub is permissionless—anyone can register a foreign asset. Before bridging, verify that the foreign asset registered on Polkadot Hub corresponds to the legitimate token on Ethereum by checking the asset's multilocation and confirming the Ethereum contract address matches the official token contract.\n\nYou can query which assets are supported for a specific route using the ParaSpell SDK as follows:\n\n```ts title=\"index.ts\"\nimport { getSupportedAssets } from '@paraspell/sdk';\n\n// Get assets supported for Ethereum → Polkadot Hub transfers\nconst supportedAssets = getSupportedAssets('Ethereum', 'AssetHubPolkadot');\nconsole.log('Supported assets:', supportedAssets.map(a => a.symbol));\n```\n\nRunning this script will return a list of supported assets in the terminal similar to the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx get-supported-assets.ts</span>\n  <span data-ty>Supported assets: [</span>\n  <span data-ty>  'sUSDe', 'WETH',   'PEPE',</span>\n  <span data-ty>  'LDO',   'sUSDS',  'LBTC',</span>\n  <span data-ty>  'EURC',  'SKY',    'USDC',</span>\n  <span data-ty>  'MYTH',  'CGT2.0', 'TRAC',</span>\n  <span data-ty>  'tBTC',  'wstETH', 'TONCOIN',</span>\n  <span data-ty>  'DAI',   'SHIB',   'XRT',</span>\n  <span data-ty>  'WBTC',  'TBTC',   'ETH',</span>\n  <span data-ty>  'KILT',  'USDT',   'LINK',</span>\n  <span data-ty>  'AAVE'</span>\n  <span data-ty>]</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>\n\n\nCommon supported tokens on Polkadot Hub include:\n\n| Token | Symbol | Description |\n|-------|--------|-------------|\n| Wrapped Ether | WETH | Ethereum's native token wrapped as ERC-20 |\n| Wrapped Bitcoin | WBTC | Bitcoin wrapped as an ERC-20 token |\n| Shiba Inu | SHIB | Popular ERC-20 meme token |\n\nTo transfer to a different destination, change the `.to()` parameter and verify the asset is supported using the following code:\n\n```ts title=\"index.ts\"\n// Check if WETH is supported on Hydration\nconst hydrationAssets = getSupportedAssets('Ethereum', 'Hydration');\nconst wethSupported = hydrationAssets.some(a => a.symbol === 'WETH');\nconsole.log('WETH supported on Hydration:', wethSupported);\n\nif (wethSupported) {\n  const txHash = await Builder()\n    .from('Ethereum')\n    .to('Hydration')\n    .currency({ symbol: 'WETH', amount: AMOUNT })\n    .recipient(RECIPIENT_ADDRESS)\n    .sender(walletClient)\n    .signAndSubmit();\n  console.log(`Transaction hash: ${txHash}`);\n}\n```\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx bridge-to-hydration.ts</span>\n  <span data-ty>WETH supported on Hydration: true</span>\n  <span data-ty>Transaction hash: 0x1234...abcd</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>\n\n\n???- code \"Complete `index.ts` script\"\n\n    !!! warning\n        The complete script calls `approveTokens()`, `bridgeToPolkadot()`, and `checkBridgeStatus()`. Every run of `bridgeToPolkadot()` sends another WETH transfer, so leave only the call for the step you want to run uncommented.\n\n    ```typescript title=\"index.ts\"\n    import { Builder, getBridgeStatus } from '@paraspell/sdk';\n    import { approveToken, getTokenBalance } from '@paraspell/evm-snowbridge';\n    import { createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { createPublicClient, createWalletClient, formatUnits, http, type Hex } from 'viem';\n    import { privateKeyToAccount } from 'viem/accounts';\n    import { mainnet } from 'viem/chains';\n    \n    // Ethereum mainnet RPC endpoint (use your own API key)\n    const ETH_RPC = 'https://eth-mainnet.g.alchemy.com/v2/INSERT_API_KEY';\n    \n    // Polkadot Bridge Hub RPC endpoint, used to check the bridge status\n    const BRIDGE_HUB_RPC = 'wss://polkadot-bridge-hub-rpc.polkadot.io';\n    \n    // WETH contract address on Ethereum mainnet\n    const WETH_ADDRESS = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';\n    \n    // WETH has 18 decimals\n    const WETH_UNITS = 1_000_000_000_000_000_000n;\n    \n    // Amount to bridge: 0.001 WETH (raw units as bigint)\n    const AMOUNT = WETH_UNITS / 1000n;\n    \n    // Your Polkadot address to receive the bridged tokens (SS58 format)\n    const RECIPIENT_ADDRESS = 'INSERT_YOUR_POLKADOT_ADDRESS';\n    \n    // Connect to Ethereum mainnet\n    // For a browser wallet (MetaMask), use custom(window.ethereum) as the transport\n    const walletClient = createWalletClient({\n      account: privateKeyToAccount('INSERT_PRIVATE_KEY' as Hex),\n      chain: mainnet,\n      transport: http(ETH_RPC),\n    });\n    const publicClient = createPublicClient({ chain: mainnet, transport: http(ETH_RPC) });\n    \n    async function approveTokens() {\n      // Check current WETH balance and Snowbridge Gateway allowance\n      const { balance, gatewayAllowance } = await getTokenBalance(walletClient, 'WETH');\n      console.log(`Current WETH balance: ${formatUnits(balance, 18)}`);\n    \n      if (balance === 0n) {\n        console.log('No WETH balance. Please wrap some ETH to WETH first.');\n        console.log(`WETH contract: ${WETH_ADDRESS}`);\n        process.exit(1);\n      }\n    \n      if (gatewayAllowance >= AMOUNT) {\n        console.log('Gateway allowance already covers the transfer amount.');\n        return;\n      }\n    \n      // Approve the Snowbridge Gateway contract to spend WETH\n      const approveTxHash = await approveToken(walletClient, AMOUNT, 'WETH');\n      console.log(`Approval transaction hash: ${approveTxHash}`);\n    \n      // Wait for confirmation\n      await publicClient.waitForTransactionReceipt({ hash: approveTxHash });\n      console.log('Token approval confirmed!');\n    }\n    \n    approveTokens();\n    \n    async function bridgeToPolkadot() {\n      console.log('Building bridge transaction...');\n      console.log(`Bridging ${formatUnits(AMOUNT, 18)} WETH to Polkadot Hub`);\n      console.log(`Recipient: ${RECIPIENT_ADDRESS}`);\n    \n      // Build and execute the bridge transfer\n      // Note: 'AssetHubPolkadot' is the SDK identifier for Polkadot Hub\n      const builder = Builder()\n        .from('Ethereum')\n        .to('AssetHubPolkadot')\n        .currency({\n          symbol: 'WETH',\n          amount: AMOUNT,\n        })\n        .recipient(RECIPIENT_ADDRESS)\n        .sender(walletClient);\n    \n      // Resolves once the Ethereum transaction is confirmed\n      const txHash = await builder.signAndSubmit();\n      await builder.disconnect();\n    \n      console.log('Bridge transaction confirmed on Ethereum!');\n      console.log(`Transaction hash: ${txHash}`);\n      console.log('Transfer will arrive in approximately 30 minutes.');\n    }\n    \n    bridgeToPolkadot();\n    \n    async function checkBridgeStatus() {\n      // Check the current status of the Snowbridge\n      const client = createClient(getWsProvider(BRIDGE_HUB_RPC));\n      const status = await getBridgeStatus(client);\n      console.log('Bridge Status:', status);\n      client.destroy();\n    }\n    \n    checkBridgeStatus();\n    \n    ```\n\n!!!info \"Transfer Assets Out of Polkadot\"\n\n    To transfer assets out of Polkadot, you can use the ParaSpell XCM SDK to build and execute a bridge transfer from Polkadot to Ethereum. Check out the [Polkadot to Ethereum](https://paraspell.github.io/docs/xcm-sdk/send-xcm.html#polkadot-ethereum-transfer) section of the ParaSpell XCM SDK documentation."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-into-polkadot", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-into-polkadot/#where-to-go-next", "page_title": "Transfer Assets from Ethereum into Polkadot", "index": 9, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 17611, "end_char": 17989, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf6df6c2ea464159ccd4eb65981f6d10813cb023b0a503c5c4ebec1c353b4c18", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n- **External Documentation** - Dive deeper into the [ParaSpell XCM SDK](https://paraspell.github.io/docs/xcm-sdk/getting-started.html) and [Snowbridge](https://docs.snowbridge.network/) documentation resources.\n- **Learn about XCM** - Understand the underlying protocol by visiting the [Get Started with XCM](/parachains/interoperability/get-started/) guide"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#introduction", "page_title": "Transfer Assets Between Parachains", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 39, "end_char": 872, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis guide walks you through transferring tokens between two parachains using the [ParaSpell XCM SDK](/reference/tools/paraspell/). This example utilizes [Asset Hub](/reference/polkadot-hub/#asset-management) and the [People Chain](/reference/polkadot-hub/#people-chain). However, the same approach can be applied to transfers between other parachains.\n\nFor development purposes, this guide will use the [Polkadot TestNet](/smart-contracts/connect/#networks-details), so the transferred token will be PAS.\n\nIn this guide, you will:\n\n- Build an XCM transfer transaction using ParaSpell XCM SDK.\n- Perform a dry run to validate the transfer.\n- Verify the Existential Deposit (ED) requirement on the destination chain.\n- Retrieve information regarding the transfer, along with fee estimates.\n- Submit the transaction."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#prerequisites", "page_title": "Transfer Assets Between Parachains", "index": 1, "depth": 3, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 872, "end_char": 1272, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Prerequisites\n\nBefore you begin, ensure you have the following:\n\n- Knowledge of the [fundamentals of Polkadot](/parachains/get-started/).\n- Basic understanding of [XCM](/parachains/interoperability/get-started/).\n- Basic familiarity with JavaScript or TypeScript.\n- Installed [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm), a JavaScript and TypeScript package manager."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#initialize-your-project", "page_title": "Transfer Assets Between Parachains", "index": 2, "depth": 2, "title": "Initialize Your Project", "anchor": "initialize-your-project", "start_char": 1272, "end_char": 3273, "estimated_token_count": 489, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize Your Project\n\nCreate the project folder:\n\n```bash\nmkdir paraspell-transfer && \\\ncd paraspell-transfer\n```\n\nInitialize the JavaScript project:\n\n```bash\nnpm init -y\n```\n\nInstall dev dependencies:\n\n```bash\nnpm install --save-dev @types/node@^22.12.0 tsx@^4.20.6 typescript@^5.7.3\n```\n\nInstall the required dependencies:\n\n```bash\nnpm install --save @paraspell/sdk@14.4.4 polkadot-api@3.3.0 @polkadot-labs/hdkd-helpers@0.0.34 @polkadot-labs/hdkd@0.0.32\n```\n\nNow add the following setup code to `index.ts`:\n\n```ts title=\"index.ts\"\nimport { Builder, hasDryRunSupport } from '@paraspell/sdk';\nimport {\n  entropyToMiniSecret,\n  mnemonicToEntropy,\n  ss58Address,\n} from '@polkadot-labs/hdkd-helpers';\nimport { createClient } from 'polkadot-api';\nimport { getWsProvider } from 'polkadot-api/ws';\nimport { getTxCreator } from 'polkadot-api/tx-creator';\nimport { sr25519CreateDerive } from '@polkadot-labs/hdkd';\nimport { inspect } from 'util';\n\n// Paseo Asset Hub RPC endpoint\nconst ASSET_HUB_PASEO_RPC = 'wss://asset-hub-paseo-rpc.n.dwellir.com';\n\n// PAS token has 10 decimals\nconst PAS_UNITS = 10_000_000_000n;\n\nconst SEED_PHRASE =\n  'INSERT_YOUR_SEED_PHRASE';\n\n// Create Sr25519 signer from mnemonic\nfunction getSigner() {\n  const entropy = mnemonicToEntropy(SEED_PHRASE);\n  const miniSecret = entropyToMiniSecret(entropy);\n  const derive = sr25519CreateDerive(miniSecret);\n  const keyPair = derive('');\n  return getTxCreator(keyPair.publicKey, 'Sr25519', keyPair.sign);\n}\n\nconst RECIPIENT_ADDRESS = ss58Address(getSigner().publicKey);\nconst SENDER_ADDRESS = ss58Address(getSigner().publicKey);\n```\n\nReplace the `INSERT_YOUR_SEED_PHRASE` with the seed phrase from your Polkadot development account.\n\nBe sure to fund this account with some PAS tokens on the Paseo Asset Hub using the [Polkadot Faucet](https://faucet.polkadot.io/?parachain=1000).\n\n!!!warning \"Security Warning\"\n    Never commit your mnemonic phrase to production code. Use environment variables or secure key management systems."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#build-a-token-transfer-transaction", "page_title": "Transfer Assets Between Parachains", "index": 3, "depth": 2, "title": "Build a Token Transfer Transaction", "anchor": "build-a-token-transfer-transaction", "start_char": 3273, "end_char": 4817, "estimated_token_count": 352, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Build a Token Transfer Transaction\n\nThe next step is to build the transaction that you intend to execute.\n\nIn this example, you will transfer 10 PAS tokens from Paseo's Asset Hub to Paseo's People Chain system parachain.\n\nAdd the ParaSpell transaction code to your `index.ts` file:\n\n```ts title=\"index.ts\"\nasync function transfer() {\n  const signer = getSigner();\n  // Use your own client so the connection stays open until finalization\n  const client = createClient(getWsProvider(ASSET_HUB_PASEO_RPC));\n\n  const tx = await Builder(client)\n    .from('AssetHubPaseo')\n    .to('PeoplePaseo')\n    .currency({\n      symbol: 'PAS',\n      amount: 10n * PAS_UNITS, // 10 PAS\n    })\n    .recipient(RECIPIENT_ADDRESS)\n    .sender(SENDER_ADDRESS)\n    .build();\n\n  console.log('Built transaction:', inspect(tx, { colors: true, depth: null }));\n\n  // Polkadot Hub TestNet requires a value for its RestrictOrigins extension\n  const result = await tx.createAndSubmit(signer, {\n    customSignedExtensions: { RestrictOrigins: { value: true } },\n  });\n  console.log(inspect(result, { colors: true, depth: null }));\n  client.destroy();\n  process.exit(0);\n}\n```\n\nThe function passes its own PAPI client to `Builder()`. ParaSpell manages connections it creates on its own and can close them about a minute after the transaction is built, before it's finalized. Passing your own client keeps the connection open until you call `client.destroy()`.\n\nDo not execute it just yet. You will perform a dry run of this transaction first to ensure it works as expected."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#perform-a-dry-run", "page_title": "Transfer Assets Between Parachains", "index": 4, "depth": 2, "title": "Perform a Dry Run", "anchor": "perform-a-dry-run", "start_char": 4817, "end_char": 8504, "estimated_token_count": 700, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Perform a Dry Run\n\nDry runs simulate the transaction without broadcasting it, allowing you to confirm success in advance.\n\nAdd the following dry run code to your `index.ts` script:\n\n```ts title=\"index.ts\"\nasync function dryRunTransfer() {\n  if (!hasDryRunSupport('AssetHubPaseo')) {\n    console.log('Dry run is not supported on AssetHubPaseo.');\n    return;\n  }\n\n  const tx = await Builder()\n    .from('AssetHubPaseo')\n    .to('PeoplePaseo')\n    .currency({\n      symbol: 'PAS',\n      amount: 10n * PAS_UNITS,\n    })\n    .recipient(RECIPIENT_ADDRESS)\n    .sender(SENDER_ADDRESS)\n    .dryRun();\n\n  console.log(inspect(tx, { colors: true, depth: null }));\n  process.exit(0);\n}\n\ndryRunTransfer();\n```\nRun the script using the following command:\n\n```bash\nnpx tsx index.ts\n```\n\nThe result of the dry run will look similar to the following example output:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx index.ts</span>\n  <span data-ty>{\n  success: true,\n  dryRunError: undefined,\n  origin: {\n    success: true,\n    fee: 315295638n,\n    asset: {\n      symbol: 'PAS',\n      isNative: true,\n      decimals: 10,\n      existentialDeposit: '100000000',\n      location: { parents: 1, interior: { Here: null } },\n      isFeeAsset: true\n    },\n    weight: undefined,\n    forwardedXcms: [\n      {\n        type: 'V5',\n        value: {\n          parents: 1,\n          interior: { type: 'X1', value: { type: 'Parachain', value: 1004 } }\n        }\n      },\n      [\n        {\n          type: 'V5',\n          value: [\n            {\n              type: 'ReceiveTeleportedAsset',\n              value: [\n                {\n                  id: {\n                    parents: 1,\n                    interior: { type: 'Here', value: undefined }\n                  },\n                  fun: { type: 'Fungible', value: 100000000000n }\n                }\n              ]\n            },\n            { type: 'ClearOrigin', value: undefined },\n            {\n              type: 'BuyExecution',\n              value: {\n                fees: {\n                  id: {\n                    parents: 1,\n                    interior: { type: 'Here', value: undefined }\n                  },\n                  fun: { type: 'Fungible', value: 100000000000n }\n                },\n                weight_limit: { type: 'Unlimited', value: undefined }\n              }\n            },\n            {\n              type: 'DepositAsset',\n              value: {\n                assets: {\n                  type: 'Wild',\n                  value: { type: 'AllCounted', value: 1 }\n                },\n                beneficiary: {\n                  parents: 0,\n                  interior: {\n                    type: 'X1',\n                    value: {\n                      type: 'AccountId32',\n                      value: {\n                        network: undefined,\n                        id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            {\n              type: 'SetTopic',\n              value: '0x3a3ca709763f26b075ad9a05591e089aa7e8893d48b98c4d3c838a90b8b8c369'\n            }\n          ]\n        }\n      ]\n    ],\n    destParaId: 1004\n  },\n  destination: {\n    success: true,\n    fee: 3168127n,\n    asset: {\n      symbol: 'PAS',\n      isNative: true,\n      decimals: 10,\n      existentialDeposit: '1000000000',\n      location: { parents: 1, interior: { Here: null } },\n      isFeeAsset: true\n    },\n    weight: { refTime: 297040000n, proofSize: 3593n },\n    forwardedXcms: [],\n    destParaId: undefined\n  },\n  hops: []\n}</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#verify-the-existential-deposit", "page_title": "Transfer Assets Between Parachains", "index": 5, "depth": 2, "title": "Verify the Existential Deposit", "anchor": "verify-the-existential-deposit", "start_char": 8504, "end_char": 9615, "estimated_token_count": 295, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify the Existential Deposit\n\nCheck if the recipient account meets the Existential Deposit (ED) requirement before sending by using [`verifyEdOnDestination`](https://paraspell.github.io/docs/xcm-api/xcm-sdk-functionality.html#verify-ed-on-destination):\n\n```ts title=\"index.ts\"\nasync function verifyED() {\n  const isValid = await Builder()\n    .from('AssetHubPaseo')\n    .to('PeoplePaseo')\n    .currency({\n      symbol: 'PAS',\n      amount: 10n * PAS_UNITS,\n    })\n    .recipient(RECIPIENT_ADDRESS)\n    .sender(SENDER_ADDRESS)\n    .verifyEdOnDestination();\n\n  console.log(`ED verification ${isValid ? 'successful' : 'failed'}.`);\n  process.exit(0);\n}\n\nverifyED();\n```\nComment out the `dryRunTransfer()` function so that it is not executed again. Then, execute the `verifyED()` by running the following command:\n\n```bash\nnpx tsx index.ts\n```\n\nAfter that, you will get output confirming the ED which will look similar to the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx index.ts</span>\n  <span data-ty>ED verification successful.</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#get-transfer-info-and-fee-estimates", "page_title": "Transfer Assets Between Parachains", "index": 6, "depth": 2, "title": "Get Transfer Info and Fee Estimates", "anchor": "get-transfer-info-and-fee-estimates", "start_char": 9615, "end_char": 33601, "estimated_token_count": 3993, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Transfer Info and Fee Estimates\n\nBefore sending an XCM transaction, it is helpful to estimate the fees associated with executing and delivering the cross-chain message.\n\nParaSpell has a helpful function for this: [`getTransferInfo()`](https://paraspell.github.io/docs/xcm-sdk/xcm-utils.html#xcm-transfer-info). This function returns an estimate of the associated XCM fees, along with the account's balance before and after the fees are paid.\n\n```ts title=\"index.ts\"\nasync function XcmTransferInfo() {\n  const info = await Builder()\n    .from('AssetHubPaseo')\n    .to('PeoplePaseo')\n    .currency({\n      symbol: 'PAS',\n      amount: 10n * PAS_UNITS,\n    })\n    .recipient(RECIPIENT_ADDRESS)\n    .sender(SENDER_ADDRESS)\n    .getTransferInfo();\n\n  console.log('Transfer Info:', info);\n  process.exit(0);\n}\n\nXcmTransferInfo();\n```\n\nComment out the `verifyED()` function so it doesn't execute again. Then, execute the `XcmTransferInfo()` function by running the following command:\n\n```bash\nnpx tsx index.ts\n```\n\nYou will see all the information for your transfer similar to the following example:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx index.ts</span>\n  <span data-ty>Transfer Info: {\n  chain: {\n    origin: 'AssetHubPaseo',\n    destination: 'PeoplePaseo',\n    ecosystem: 'PAS'\n  },\n  origin: {\n    selectedCurrency: {\n      sufficient: true,\n      balance: 49999900000000n,\n      balanceAfter: 49899900000000n,\n      asset: [Object]\n    },\n    xcmFee: {\n      sufficient: true,\n      fee: 315295638n,\n      balance: 49999900000000n,\n      balanceAfter: 49999584704362n,\n      asset: [Object]\n    }\n  },\n  hops: [],\n  destination: {\n    receivedCurrency: {\n      sufficient: true,\n      receivedAmount: 99996831873n,\n      balance: 0n,\n      balanceAfter: 99996831873n,\n      asset: [Object]\n    },\n    xcmFee: {\n      fee: 3168127n,\n      balance: 0n,\n      balanceAfter: 99996831873n,\n      asset: [Object]\n    }\n  }\n}</span>\n</div>\n\nNow that you have:\n\n- Completed a successful dry run of the transaction.\n- Verified the existential deposit on the recipient account.\n- Obtained an estimate of the associated XCM fees.\n\nYou can execute the transfer function by adding the following function call:\n\n```typescript title=\"index.ts\"\ntransfer();\n```\n\nComment out the `XcmTransferInfo()` function so it doesn't execute again. Then, execute the transfer by running the following command: \n\n```bash\nnpx tsx index.ts\n```\n\nYour `transfer` function will submit the transaction, and you will get the following output:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx index.ts</span>\n  <span data-ty>...</span>\n  <span data-ty>Built transaction: {\n  getPaymentInfo: [AsyncFunction: getPaymentInfo],\n  getEstimatedFees: [AsyncFunction: getEstimatedFees],\n  decodedCall: {\n    type: 'PolkadotXcm',\n    value: {\n      type: 'limited_teleport_assets',\n      value: {\n        dest: {\n          type: 'V5',\n          value: {\n            parents: 1,\n            interior: { type: 'X1', value: { type: 'Parachain', value: 1004 } }\n          }\n        },\n        beneficiary: {\n          type: 'V5',\n          value: {\n            parents: 0,\n            interior: {\n              type: 'X1',\n              value: {\n                type: 'AccountId32',\n                value: {\n                  network: undefined,\n                  id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                }\n              }\n            }\n          }\n        },\n        assets: {\n          type: 'V5',\n          value: [\n            {\n              id: { parents: 1, interior: { type: 'Here' } },\n              fun: { type: 'Fungible', value: 100000000000n }\n            }\n          ]\n        },\n        fee_asset_item: 0,\n        weight_limit: { type: 'Unlimited' }\n      }\n    }\n  },\n  getEncodedData: [Function: getEncodedData],\n  getBareTx: [Function: getBareTx],\n  create: [Function: create],\n  createSubmitAndWatch: [Function: createSubmitAndWatch],\n  createAndSubmit: [Function: createAndSubmit]\n}</span>\n</div>\n\nOnce the transaction is successfully included in a block, you will see the recipient's account balance updated, and you will receive output similar to the following.\n\n???- code \"Successful Transaction Submission\"\n    This output will be returned once the transaction has been successfully included in a block.\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty>...</span>\n      <span data-ty>{\n      txHash: '0xd3a3436a3266a514c2eee14f02eebc83dbe091499233bea44ec84c0b8d5a04f3',\n      block: {\n        index: 2,\n        number: 14399920,\n        hash: '0xa43911a433e9911c2d3c981125c56f952d4a2574364e23caa6591a2bf204fc30'\n      },\n      ok: true,\n      events: [\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: {\n              type: 'Withdraw',\n              value: {\n                who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n                amount: 10757248n\n              }\n            }\n          },\n          topics: [],\n          type: 'Balances',\n          value: {\n            type: 'Withdraw',\n            value: {\n              who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n              amount: 10757248n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: {\n              type: 'Minted',\n              value: {\n                who: '5EYCAe5ijiYgWYWi1fs8Xz1td1djEtJVVnNfzvDRP4VtLL7Y',\n                amount: 100000000000n\n              }\n            }\n          },\n          topics: [],\n          type: 'Balances',\n          value: {\n            type: 'Minted',\n            value: {\n              who: '5EYCAe5ijiYgWYWi1fs8Xz1td1djEtJVVnNfzvDRP4VtLL7Y',\n              amount: 100000000000n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: {\n              type: 'Withdraw',\n              value: {\n                who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n                amount: 100000000000n\n              }\n            }\n          },\n          topics: [],\n          type: 'Balances',\n          value: {\n            type: 'Withdraw',\n            value: {\n              who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n              amount: 100000000000n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: { type: 'BurnedDebt', value: { amount: 100000000000n } }\n          },\n          topics: [],\n          type: 'Balances',\n          value: { type: 'BurnedDebt', value: { amount: 100000000000n } }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'PolkadotXcm',\n            value: {\n              type: 'Attempted',\n              value: {\n                outcome: {\n                  type: 'Complete',\n                  value: { used: { ref_time: 456990000n, proof_size: 3675n } }\n                }\n              }\n            }\n          },\n          topics: [],\n          type: 'PolkadotXcm',\n          value: {\n            type: 'Attempted',\n            value: {\n              outcome: {\n                type: 'Complete',\n                value: { used: { ref_time: 456990000n, proof_size: 3675n } }\n              }\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: {\n              type: 'Withdraw',\n              value: {\n                who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n                amount: 304850000n\n              }\n            }\n          },\n          topics: [],\n          type: 'Balances',\n          value: {\n            type: 'Withdraw',\n            value: {\n              who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n              amount: 304850000n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: {\n              type: 'Deposit',\n              value: {\n                who: '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z',\n                amount: 304850000n\n              }\n            }\n          },\n          topics: [],\n          type: 'Balances',\n          value: {\n            type: 'Deposit',\n            value: {\n              who: '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z',\n              amount: 304850000n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'PolkadotXcm',\n            value: {\n              type: 'FeesPaid',\n              value: {\n                paying: {\n                  parents: 0,\n                  interior: {\n                    type: 'X1',\n                    value: {\n                      type: 'AccountId32',\n                      value: {\n                        network: { type: 'Polkadot', value: undefined },\n                        id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                      }\n                    }\n                  }\n                },\n                fees: [\n                  {\n                    id: {\n                      parents: 1,\n                      interior: { type: 'Here', value: undefined }\n                    },\n                    fun: { type: 'Fungible', value: 304850000n }\n                  }\n                ]\n              }\n            }\n          },\n          topics: [],\n          type: 'PolkadotXcm',\n          value: {\n            type: 'FeesPaid',\n            value: {\n              paying: {\n                parents: 0,\n                interior: {\n                  type: 'X1',\n                  value: {\n                    type: 'AccountId32',\n                    value: {\n                      network: { type: 'Polkadot', value: undefined },\n                      id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                    }\n                  }\n                }\n              },\n              fees: [\n                {\n                  id: {\n                    parents: 1,\n                    interior: { type: 'Here', value: undefined }\n                  },\n                  fun: { type: 'Fungible', value: 304850000n }\n                }\n              ]\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'XcmpQueue',\n            value: {\n              type: 'XcmpMessageSent',\n              value: {\n                message_hash: '0x29622b09f4b7d2f40568b592b56e09e3204db2866d7e1873cdcc8ecec4edd4e2'\n              }\n            }\n          },\n          topics: [],\n          type: 'XcmpQueue',\n          value: {\n            type: 'XcmpMessageSent',\n            value: {\n              message_hash: '0x29622b09f4b7d2f40568b592b56e09e3204db2866d7e1873cdcc8ecec4edd4e2'\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'PolkadotXcm',\n            value: {\n              type: 'Sent',\n              value: {\n                origin: {\n                  parents: 0,\n                  interior: {\n                    type: 'X1',\n                    value: {\n                      type: 'AccountId32',\n                      value: {\n                        network: { type: 'Polkadot', value: undefined },\n                        id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                      }\n                    }\n                  }\n                },\n                destination: {\n                  parents: 1,\n                  interior: { type: 'X1', value: { type: 'Parachain', value: 1004 } }\n                },\n                message: [\n                  {\n                    type: 'ReceiveTeleportedAsset',\n                    value: [\n                      {\n                        id: {\n                          parents: 1,\n                          interior: { type: 'Here', value: undefined }\n                        },\n                        fun: { type: 'Fungible', value: 100000000000n }\n                      }\n                    ]\n                  },\n                  { type: 'ClearOrigin', value: undefined },\n                  {\n                    type: 'BuyExecution',\n                    value: {\n                      fees: {\n                        id: {\n                          parents: 1,\n                          interior: { type: 'Here', value: undefined }\n                        },\n                        fun: { type: 'Fungible', value: 100000000000n }\n                      },\n                      weight_limit: { type: 'Unlimited', value: undefined }\n                    }\n                  },\n                  {\n                    type: 'DepositAsset',\n                    value: {\n                      assets: {\n                        type: 'Wild',\n                        value: { type: 'AllCounted', value: 1 }\n                      },\n                      beneficiary: {\n                        parents: 0,\n                        interior: {\n                          type: 'X1',\n                          value: {\n                            type: 'AccountId32',\n                            value: {\n                              network: undefined,\n                              id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                ],\n                message_id: '0x299bf4e0a399c33c1958158112c359a916391bb382838e2b1fade126396cc7dd'\n              }\n            }\n          },\n          topics: [],\n          type: 'PolkadotXcm',\n          value: {\n            type: 'Sent',\n            value: {\n              origin: {\n                parents: 0,\n                interior: {\n                  type: 'X1',\n                  value: {\n                    type: 'AccountId32',\n                    value: {\n                      network: { type: 'Polkadot', value: undefined },\n                      id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                    }\n                  }\n                }\n              },\n              destination: {\n                parents: 1,\n                interior: { type: 'X1', value: { type: 'Parachain', value: 1004 } }\n              },\n              message: [\n                {\n                  type: 'ReceiveTeleportedAsset',\n                  value: [\n                    {\n                      id: {\n                        parents: 1,\n                        interior: { type: 'Here', value: undefined }\n                      },\n                      fun: { type: 'Fungible', value: 100000000000n }\n                    }\n                  ]\n                },\n                { type: 'ClearOrigin', value: undefined },\n                {\n                  type: 'BuyExecution',\n                  value: {\n                    fees: {\n                      id: {\n                        parents: 1,\n                        interior: { type: 'Here', value: undefined }\n                      },\n                      fun: { type: 'Fungible', value: 100000000000n }\n                    },\n                    weight_limit: { type: 'Unlimited', value: undefined }\n                  }\n                },\n                {\n                  type: 'DepositAsset',\n                  value: {\n                    assets: {\n                      type: 'Wild',\n                      value: { type: 'AllCounted', value: 1 }\n                    },\n                    beneficiary: {\n                      parents: 0,\n                      interior: {\n                        type: 'X1',\n                        value: {\n                          type: 'AccountId32',\n                          value: {\n                            network: undefined,\n                            id: '0x947969a3f6ef591e0d5aaad926e2662c54d6cc3e5636e1615ee97fd75da6822b'\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              ],\n              message_id: '0x299bf4e0a399c33c1958158112c359a916391bb382838e2b1fade126396cc7dd'\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: {\n              type: 'Deposit',\n              value: {\n                who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n                amount: 311610n\n              }\n            }\n          },\n          topics: [],\n          type: 'Balances',\n          value: {\n            type: 'Deposit',\n            value: {\n              who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n              amount: 311610n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'Balances',\n            value: {\n              type: 'Deposit',\n              value: {\n                who: '5EYCAe5gKBMwLZyq5dw41Hw3V68nsCVTZQ2d4AYfbMb4kF29',\n                amount: 10445638n\n              }\n            }\n          },\n          topics: [],\n          type: 'Balances',\n          value: {\n            type: 'Deposit',\n            value: {\n              who: '5EYCAe5gKBMwLZyq5dw41Hw3V68nsCVTZQ2d4AYfbMb4kF29',\n              amount: 10445638n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'TransactionPayment',\n            value: {\n              type: 'TransactionFeePaid',\n              value: {\n                who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n                actual_fee: 10445638n,\n                tip: 0n\n              }\n            }\n          },\n          topics: [],\n          type: 'TransactionPayment',\n          value: {\n            type: 'TransactionFeePaid',\n            value: {\n              who: '5FRP1btumyfgwaZK7EcTDGu1KRXPHyh3jXDo7rKx9dDt736R',\n              actual_fee: 10445638n,\n              tip: 0n\n            }\n          }\n        },\n        {\n          phase: { type: 'ApplyExtrinsic', value: 2 },\n          event: {\n            type: 'System',\n            value: {\n              type: 'ExtrinsicSuccess',\n              value: {\n                dispatch_info: {\n                  weight: { ref_time: 1361426000n, proof_size: 7357n },\n                  class: { type: 'Normal', value: undefined },\n                  pays_fee: { type: 'Yes', value: undefined }\n                }\n              }\n            }\n          },\n          topics: [],\n          type: 'System',\n          value: {\n            type: 'ExtrinsicSuccess',\n            value: {\n              dispatch_info: {\n                weight: { ref_time: 1361426000n, proof_size: 7357n },\n                class: { type: 'Normal', value: undefined },\n                pays_fee: { type: 'Yes', value: undefined }\n              }\n            }\n          }\n        }\n      ]\n    }</span>\n    </div>\n\nAfter executing the transfer, check the account balance on [Polkadot.js Apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fsys.turboflakes.io%2Fasset-hub-paseo) for [Paseo's Asset Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fsys.turboflakes.io%2Fasset-hub-paseo#/accounts) and [Paseo's People Chain](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fsys.ibp.network%2Fpeople-paseo#/accounts).\n\nYou should see:\n\n- The recipient account now has 10 more PAS tokens.\n- The sender account has the transfer amount (10 PAS) + the fees amount debited from their account balance.\n\nYou have now successfully created and sent a cross-chain transfer using the ParaSpell XCM SDK!\n\n???- code \"Full Code\"\n\n    ```typescript title=\"index.ts\"\n    import { Builder, hasDryRunSupport } from '@paraspell/sdk';\n    import {\n      entropyToMiniSecret,\n      mnemonicToEntropy,\n      ss58Address,\n    } from '@polkadot-labs/hdkd-helpers';\n    import { createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { getTxCreator } from 'polkadot-api/tx-creator';\n    import { sr25519CreateDerive } from '@polkadot-labs/hdkd';\n    import { inspect } from 'util';\n    \n    // Paseo Asset Hub RPC endpoint\n    const ASSET_HUB_PASEO_RPC = 'wss://asset-hub-paseo-rpc.n.dwellir.com';\n    \n    // PAS token has 10 decimals\n    const PAS_UNITS = 10_000_000_000n;\n    \n    const SEED_PHRASE =\n      'INSERT_YOUR_SEED_PHRASE';\n    \n    // Create Sr25519 signer from mnemonic\n    function getSigner() {\n      const entropy = mnemonicToEntropy(SEED_PHRASE);\n      const miniSecret = entropyToMiniSecret(entropy);\n      const derive = sr25519CreateDerive(miniSecret);\n      const keyPair = derive('');\n      return getTxCreator(keyPair.publicKey, 'Sr25519', keyPair.sign);\n    }\n    \n    const RECIPIENT_ADDRESS = ss58Address(getSigner().publicKey);\n    const SENDER_ADDRESS = ss58Address(getSigner().publicKey);\n    \n    async function transfer() {\n      const signer = getSigner();\n      // Use your own client so the connection stays open until finalization\n      const client = createClient(getWsProvider(ASSET_HUB_PASEO_RPC));\n    \n      const tx = await Builder(client)\n        .from('AssetHubPaseo')\n        .to('PeoplePaseo')\n        .currency({\n          symbol: 'PAS',\n          amount: 10n * PAS_UNITS, // 10 PAS\n        })\n        .recipient(RECIPIENT_ADDRESS)\n        .sender(SENDER_ADDRESS)\n        .build();\n    \n      console.log('Built transaction:', inspect(tx, { colors: true, depth: null }));\n    \n      // Polkadot Hub TestNet requires a value for its RestrictOrigins extension\n      const result = await tx.createAndSubmit(signer, {\n        customSignedExtensions: { RestrictOrigins: { value: true } },\n      });\n      console.log(inspect(result, { colors: true, depth: null }));\n      client.destroy();\n      process.exit(0);\n    }\n    \n    async function dryRunTransfer() {\n      if (!hasDryRunSupport('AssetHubPaseo')) {\n        console.log('Dry run is not supported on AssetHubPaseo.');\n        return;\n      }\n    \n      const tx = await Builder()\n        .from('AssetHubPaseo')\n        .to('PeoplePaseo')\n        .currency({\n          symbol: 'PAS',\n          amount: 10n * PAS_UNITS,\n        })\n        .recipient(RECIPIENT_ADDRESS)\n        .sender(SENDER_ADDRESS)\n        .dryRun();\n    \n      console.log(inspect(tx, { colors: true, depth: null }));\n      process.exit(0);\n    }\n    \n    dryRunTransfer();\n    \n    async function verifyED() {\n      const isValid = await Builder()\n        .from('AssetHubPaseo')\n        .to('PeoplePaseo')\n        .currency({\n          symbol: 'PAS',\n          amount: 10n * PAS_UNITS,\n        })\n        .recipient(RECIPIENT_ADDRESS)\n        .sender(SENDER_ADDRESS)\n        .verifyEdOnDestination();\n    \n      console.log(`ED verification ${isValid ? 'successful' : 'failed'}.`);\n      process.exit(0);\n    }\n    \n    verifyED();\n    \n    async function XcmTransferInfo() {\n      const info = await Builder()\n        .from('AssetHubPaseo')\n        .to('PeoplePaseo')\n        .currency({\n          symbol: 'PAS',\n          amount: 10n * PAS_UNITS,\n        })\n        .recipient(RECIPIENT_ADDRESS)\n        .sender(SENDER_ADDRESS)\n        .getTransferInfo();\n    \n      console.log('Transfer Info:', info);\n      process.exit(0);\n    }\n    \n    XcmTransferInfo();\n    \n    transfer();\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-interoperability-transfer-assets-parachains", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/#next-steps", "page_title": "Transfer Assets Between Parachains", "index": 7, "depth": 2, "title": "Next Steps", "anchor": "next-steps", "start_char": 33601, "end_char": 33919, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:516e7fe8d9997f2e97764923f278190314392c5bb158e8587ccad9a91844a6c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Next Steps\n\n- **Read the docs**: Dive deeper into the features of the [ParaSpell XCM SDK](https://paraspell.github.io/docs/xcm-sdk/getting-started.html) documentation.\n\n- **Learn about XCM**: Understand the underlying protocol by visiting the [Get Started with XCM](/parachains/interoperability/get-started/) guide."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#introduction", "page_title": "Pay Transaction Fees with Different Tokens", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 67, "end_char": 777, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub allows users to pay transaction fees using alternative tokens instead of the native token. This tutorial demonstrates how to send a DOT transfer transaction while paying the fees using USDT on Polkadot Hub.\n\nYou can follow this tutorial using [Polkadot-API (PAPI)](/reference/tools/papi/), [Polkadot.js API](/reference/tools/polkadot-js-api/), or [Subxt](/reference/tools/subxt/). Select your preferred SDK in the code tabs below.\n\n!!! warning \"Polkadot.js API Maintenance Mode\"\n    The Polkadot.js API is no longer actively developed. New projects should use [Polkadot-API (PAPI)](/reference/tools/papi/) or [Dedot](/reference/tools/dedot/) as actively maintained alternatives."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#prerequisites", "page_title": "Pay Transaction Fees with Different Tokens", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 777, "end_char": 1136, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have the following installed:\n\n- [Chopsticks](/reference/tools/chopsticks/) — to fork Polkadot Hub locally\n- Your preferred SDK:\n    - [Polkadot-API (PAPI)](/reference/tools/papi/) (TypeScript)\n    - [Polkadot.js API](/reference/tools/polkadot-js-api/) (JavaScript)\n    - [Subxt](/reference/tools/subxt/) (Rust)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#local-polkadot-hub-setup", "page_title": "Pay Transaction Fees with Different Tokens", "index": 2, "depth": 2, "title": "Local Polkadot Hub Setup", "anchor": "local-polkadot-hub-setup", "start_char": 1136, "end_char": 1759, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Local Polkadot Hub Setup\n\nFork the Polkadot Hub locally using [Chopsticks](/reference/tools/chopsticks/):\n\n```bash\nchopsticks -c polkadot-asset-hub\n```\n\nThis command forks the Polkadot Hub chain, making it available at `ws://localhost:8000`. When running `polkadot-asset-hub`, you use the Polkadot Hub fork with the configuration specified in the [`polkadot-asset-hub.yml`](https://github.com/AcalaNetwork/chopsticks/blob/master/configs/polkadot-asset-hub.yml) file. This configuration defines Alice's account with USDT assets. If you want to use a different chain, ensure the account you use has the necessary assets."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#set-up-your-project", "page_title": "Pay Transaction Fees with Different Tokens", "index": 3, "depth": 2, "title": "Set Up Your Project", "anchor": "set-up-your-project", "start_char": 1759, "end_char": 4675, "estimated_token_count": 715, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up Your Project\n\n=== \"PAPI\"\n\n    1. Create a new directory and initialize the project:\n\n        ```bash\n        mkdir fee-payment-tutorial && cd fee-payment-tutorial\n        ```\n\n    2. Initialize the project:\n\n        ```bash\n        npm init -y\n        ```\n\n    3. Install dev dependencies:\n\n        ```bash\n        npm install --save-dev @types/node@^22.12.0 ts-node@^10.9.2 typescript@^5.7.3\n        ```\n\n    4. Install dependencies:\n\n        ```bash\n        npm install --save @polkadot-labs/hdkd@0.0.32 @polkadot-labs/hdkd-helpers@0.0.34 polkadot-api@3.3.0\n        ```\n\n    5. Create TypeScript configuration:\n\n        ```bash\n        npx tsc --init && npm pkg set type=module\n        ```\n\n    6. Generate Polkadot API types for Polkadot Hub:\n\n        ```bash\n        npx papi add assetHub -n polkadot_asset_hub\n        ```\n\n    7. Create a new file called `fee-payment-transaction.ts`:\n\n        ```bash\n        touch fee-payment-transaction.ts\n        ```\n\n=== \"Polkadot.js\"\n\n    1. Create a new directory and initialize the project:\n\n        ```bash\n        mkdir fee-payment-tutorial && cd fee-payment-tutorial\n        ```\n\n    2. Initialize the project:\n\n        ```bash\n        npm init -y && npm pkg set type=module\n        ```\n\n    3. Install dependencies:\n\n        ```bash\n        npm install @polkadot/api@17.0.2\n        ```\n\n    4. Create a new file called `fee-payment-transaction.js`:\n\n        ```bash\n        touch fee-payment-transaction.js\n        ```\n\n=== \"Subxt\"\n\n    1. Create a new Rust project:\n\n        ```bash\n        cargo new subxt-fee-payment-example && cd subxt-fee-payment-example\n        ```\n\n    2. Install the Subxt CLI to download chain metadata:\n\n        ```bash\n        cargo install subxt-cli@0.50.1\n        ```\n\n    3. Download Polkadot Hub metadata from the local Chopsticks fork:\n\n        ```bash\n        mkdir metadata && \\\n        subxt metadata --url ws://localhost:8000 -o metadata/asset_hub.scale\n        ```\n\n        !!! note\n            Ensure your Chopsticks fork is running at `ws://localhost:8000` before downloading the metadata.\n\n    4. Update `Cargo.toml` with the required dependencies:\n\n        ```toml title=\"Cargo.toml\"\n        [package]\n        name = \"subxt-fee-payment-example\"\n        version = \"0.1.0\"\n        edition = \"2021\"\n        \n        [[bin]]\n        name = \"fee_payment_transaction\"\n        path = \"src/bin/fee_payment_transaction.rs\"\n        \n        [dependencies]\n        codec = { package = \"parity-scale-codec\", version = \"3\", features = [\"derive\"] }\n        subxt = { version = \"0.50.0\", features = [\"jsonrpsee\", \"native\"] }\n        subxt-signer = { version = \"0.50.0\", features = [\"sr25519\"] }\n        tokio = { version = \"1.44.2\", features = [\"macros\", \"rt-multi-thread\"] }\n        \n        ```\n\n    5. Create the source file:\n\n        ```bash\n        mkdir -p src/bin && touch src/bin/fee_payment_transaction.rs\n        ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#implementation", "page_title": "Pay Transaction Fees with Different Tokens", "index": 4, "depth": 2, "title": "Implementation", "anchor": "implementation", "start_char": 4675, "end_char": 4878, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Implementation\n\nThe following sections cover how to set up imports and constants, create a transaction signer, connect to Polkadot Hub, and send a DOT transfer transaction while paying fees in USDT."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#import-dependencies-and-define-constants", "page_title": "Pay Transaction Fees with Different Tokens", "index": 5, "depth": 3, "title": "Import Dependencies and Define Constants", "anchor": "import-dependencies-and-define-constants", "start_char": 4878, "end_char": 8292, "estimated_token_count": 680, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Import Dependencies and Define Constants\n\nSet up the required imports and define the target address, transfer amount, and USDT asset ID for your transaction:\n\n=== \"PAPI\"\n\n    ```typescript title=\"fee-payment-transaction.ts\"\n    import { sr25519CreateDerive } from \"@polkadot-labs/hdkd\";\n    import {\n      DEV_PHRASE,\n      entropyToMiniSecret,\n      mnemonicToEntropy,\n    } from \"@polkadot-labs/hdkd-helpers\";\n    import { getTxCreator } from \"polkadot-api/tx-creator\";\n    import { createClient } from \"polkadot-api\";\n    import { assetHub } from \"@polkadot-api/descriptors\";\n    import { getWsProvider } from \"polkadot-api/ws\";\n    import { MultiAddress } from \"@polkadot-api/descriptors\";\n    \n    const TARGET_ADDRESS = \"14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3\"; // Bob's address\n    const TRANSFER_AMOUNT = 3_000_000_000n; // 3 DOT\n    const USDT_ASSET_ID = 1984;\n    ```\n\n=== \"Polkadot.js\"\n\n    ```javascript title=\"fee-payment-transaction.js\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    import { Keyring } from '@polkadot/keyring';\n    import { cryptoWaitReady } from '@polkadot/util-crypto';\n    \n    const TARGET_ADDRESS = '14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3'; // Bob's address\n    const TRANSFER_AMOUNT = 3_000_000_000n; // 3 DOT\n    const USDT_ASSET_ID = 1984;\n    ```\n\n=== \"Subxt\"\n\n    In Subxt, you first generate types from the chain metadata using the `#[subxt::subxt()]` macro. The `derive_for_type` attribute ensures the `Location` type implements the traits needed for encoding. You also define a custom `AssetHubConfig` where `type AssetId = Location`, which enables specifying an XCM location as the fee payment asset:\n\n    ```rust title=\"src/bin/fee_payment_transaction.rs\"\n    use std::str::FromStr;\n    use subxt::config::{Config, DefaultExtrinsicParamsBuilder, DefaultTransactionExtensions, PolkadotConfig};\n    use subxt::utils::AccountId32;\n    use subxt::{OnlineClient, SubstrateConfig};\n    \n    // Generate types from the Polkadot Hub metadata with Location trait derives\n    #[subxt::subxt(\n        runtime_metadata_path = \"metadata/asset_hub.scale\",\n        derive_for_type(\n            path = \"staging_xcm::v5::location::Location\",\n            derive = \"Clone, Eq, PartialEq, codec::Encode\",\n            recursive\n        )\n    )]\n    pub mod asset_hub {}\n    \n    // Import XCM location types from the generated metadata module\n    use asset_hub::runtime_types::staging_xcm::v5::{\n        junction::Junction,\n        junctions::Junctions,\n        location::Location,\n    };\n    \n    // Define a custom config where AssetId is an XCM Location\n    #[derive(Debug, Default, Clone)]\n    pub struct AssetHubConfig;\n    \n    impl Config for AssetHubConfig {\n        type AccountId = <PolkadotConfig as Config>::AccountId;\n        type Address = <PolkadotConfig as Config>::Address;\n        type Signature = <PolkadotConfig as Config>::Signature;\n        type Hasher = <PolkadotConfig as Config>::Hasher;\n        type Header = <SubstrateConfig as Config>::Header;\n        type TransactionExtensions = DefaultTransactionExtensions<AssetHubConfig>;\n        type AssetId = Location;\n    }\n    \n    const POLKADOT_HUB_RPC: &str = \"ws://localhost:8000\";\n    const TARGET_ADDRESS: &str = \"14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3\";\n    const TRANSFER_AMOUNT: u128 = 3_000_000_000; // 3 DOT\n    const USDT_ASSET_ID: u128 = 1984;\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#create-a-signer-and-connect", "page_title": "Pay Transaction Fees with Different Tokens", "index": 6, "depth": 3, "title": "Create a Signer and Connect", "anchor": "create-a-signer-and-connect", "start_char": 8292, "end_char": 10580, "estimated_token_count": 505, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create a Signer and Connect\n\nCreate a signer using Alice's development account and connect to the local Polkadot Hub:\n\n=== \"PAPI\"\n\n    ```typescript title=\"fee-payment-transaction.ts\"\n    const createSigner = async () => {\n      const entropy = mnemonicToEntropy(DEV_PHRASE);\n      const miniSecret = entropyToMiniSecret(entropy);\n      const derive = sr25519CreateDerive(miniSecret);\n      const hdkdKeyPair = derive(\"//Alice\");\n      const polkadotSigner = getTxCreator(\n        hdkdKeyPair.publicKey,\n        \"Sr25519\",\n        hdkdKeyPair.sign\n      );\n      return polkadotSigner;\n    };\n    \n    const client = createClient(\n      getWsProvider(\"ws://localhost:8000\") // Chopsticks Polkadot Hub\n    );\n    \n    const api = client.getTypedApi(assetHub);\n    ```\n\n=== \"Polkadot.js\"\n\n    The `cryptoWaitReady()` call ensures the underlying WASM cryptographic libraries are initialized before creating the keyring:\n\n    ```javascript title=\"fee-payment-transaction.js\"\n    async function main() {\n      // Wait for crypto libraries to be ready\n      await cryptoWaitReady();\n    \n      // Create a keyring instance and add Alice's account\n      const keyring = new Keyring({ type: 'sr25519' });\n      const alice = keyring.addFromUri('//Alice');\n    \n      // Connect to the local Chopsticks Polkadot Hub fork\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      console.log('Connected to Polkadot Hub (Chopsticks fork)');\n    ```\n\n=== \"Subxt\"\n\n    Notice that the `OnlineClient` is parameterized with `AssetHubConfig` instead of the default `PolkadotConfig`:\n\n    ```rust title=\"src/bin/fee_payment_transaction.rs\"\n    #[tokio::main]\n    async fn main() -> Result<(), Box<dyn std::error::Error>> {\n        // Connect to the local Chopsticks Polkadot Hub fork\n        let api = OnlineClient::<AssetHubConfig>::from_url(POLKADOT_HUB_RPC).await?;\n        println!(\"Connected to Polkadot Hub (Chopsticks fork)\");\n    \n        // Anchor to the current block\n        let at_block = api.at_current_block().await?;\n    \n        // Create Alice's dev keypair\n        let alice = subxt_signer::sr25519::dev::alice();\n        println!(\"Sender (Alice): {}\", AccountId32::from(alice.public_key()));\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#create-the-transaction", "page_title": "Pay Transaction Fees with Different Tokens", "index": 7, "depth": 3, "title": "Create the Transaction", "anchor": "create-the-transaction", "start_char": 10580, "end_char": 11442, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create the Transaction\n\nCreate a standard DOT transfer transaction that sends 3 DOT to Bob's address while keeping Alice's account alive:\n\n=== \"PAPI\"\n\n    ```typescript title=\"fee-payment-transaction.ts\"\n    const tx = api.tx.Balances.transfer_keep_alive({\n      dest: MultiAddress.Id(TARGET_ADDRESS),\n      value: BigInt(TRANSFER_AMOUNT),\n    });\n    ```\n\n=== \"Polkadot.js\"\n\n    ```javascript title=\"fee-payment-transaction.js\"\n    // Create the transfer transaction\n    const tx = api.tx.balances.transferKeepAlive(TARGET_ADDRESS, TRANSFER_AMOUNT);\n    ```\n\n=== \"Subxt\"\n\n    ```rust title=\"src/bin/fee_payment_transaction.rs\"\n    // Create the balance transfer transaction\n    let dest = AccountId32::from_str(TARGET_ADDRESS)?;\n    let tx = asset_hub::transactions()\n        .balances()\n        .transfer_keep_alive(dest.into(), TRANSFER_AMOUNT);\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#sign-and-submit-with-alternative-fee-payment", "page_title": "Pay Transaction Fees with Different Tokens", "index": 8, "depth": 3, "title": "Sign and Submit with Alternative Fee Payment", "anchor": "sign-and-submit-with-alternative-fee-payment", "start_char": 11442, "end_char": 16281, "estimated_token_count": 1053, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sign and Submit with Alternative Fee Payment\n\nThe key part of this tutorial is specifying an alternative asset for fee payment. The USDT asset is identified using the XCM location format, where `PalletInstance(50)` refers to the Assets pallet and `GeneralIndex(1984)` identifies the USDT asset on Polkadot Hub:\n\n=== \"PAPI\"\n\n    In PAPI, you specify the alternative asset through the `asset` parameter in the `createAndSubmit` options:\n\n    ```typescript title=\"fee-payment-transaction.ts\"\n    const signer = await createSigner();\n    \n    const result = await tx.createAndSubmit(signer, {\n      asset: {\n        parents: 0,\n        interior: {\n          type: \"X2\",\n          value: [\n            { type: \"PalletInstance\", value: 50 },\n            { type: \"GeneralIndex\", value: BigInt(USDT_ASSET_ID) },\n          ],\n        },\n      },\n    });\n    \n    const { txHash, ok, block, events } = result;\n    console.log(`Tx finalized: ${txHash} (ok=${ok})`);\n    console.log(`Block: #${block.number} ${block.hash} [tx index ${block.index}]`);\n    \n    console.log(\"Events:\");\n    for (const ev of events) {\n      const type = (ev as any).type ?? \"unknown\";\n      console.log(`- ${type}`);\n    }\n    \n    process.exit(0);\n    ```\n\n=== \"Polkadot.js\"\n\n    In Polkadot.js, you define the asset as an XCM multi-location object and pass it as the `assetId` option to `signAndSend`:\n\n    ```javascript title=\"fee-payment-transaction.js\"\n    // Define the USDT asset as an XCM multi-location for fee payment\n    const assetId = {\n      parents: 0,\n      interior: {\n        X2: [{ PalletInstance: 50 }, { GeneralIndex: USDT_ASSET_ID }],\n      },\n    };\n    \n    // Sign and send the transaction, paying fees with USDT\n    console.log('Signing and submitting transaction...');\n    await new Promise((resolve, reject) => {\n      let unsubscribe;\n      tx\n        .signAndSend(\n          alice,\n          { assetId },\n          ({ status, events, txHash, dispatchError }) => {\n            if (status.isFinalized) {\n              console.log(\n                `\\nTransaction finalized in block: ${status.asFinalized.toHex()}`\n              );\n              console.log(`Transaction hash: ${txHash.toHex()}`);\n    \n              // Display all events\n              console.log('\\nEvents:');\n              events.forEach(({ event }) => {\n                console.log(`  ${event.section}.${event.method}`);\n              });\n    \n              if (unsubscribe) {\n                unsubscribe();\n              }\n    \n              if (dispatchError) {\n                if (dispatchError.isModule) {\n                  const decoded = api.registry.findMetaError(\n                    dispatchError.asModule\n                  );\n                  const { docs, name, section } = decoded;\n                  reject(new Error(`${section}.${name}: ${docs.join(' ')}`));\n                } else {\n                  reject(new Error(dispatchError.toString()));\n                }\n              } else {\n                resolve();\n              }\n            }\n          }\n        )\n        .then((unsub) => {\n          unsubscribe = unsub;\n        })\n        .catch((error) => {\n          if (unsubscribe) {\n            unsubscribe();\n          }\n          reject(error);\n        });\n    });\n    ```\n\n=== \"Subxt\"\n\n    In Subxt, you use `DefaultExtrinsicParamsBuilder` with `tip_of(0, asset_location)` to specify the fee asset. The first argument is the tip amount (0), and the second is the XCM `Location`. Instead of calling `sign_and_submit_then_watch_default`, you pass the custom `tx_params` to `sign_and_submit_then_watch`:\n\n    ```rust title=\"src/bin/fee_payment_transaction.rs\"\n    // Define the USDT asset location in XCM format\n    let asset_location = Location {\n        parents: 0,\n        interior: Junctions::X2([\n            Junction::PalletInstance(50),\n            Junction::GeneralIndex(USDT_ASSET_ID),\n        ]),\n    };\n    \n    // Build transaction params to pay fees with the alternative asset\n    let tx_params = DefaultExtrinsicParamsBuilder::<AssetHubConfig>::new()\n        .tip_of(0, asset_location)\n        .build();\n    \n    // Sign, submit, and watch for finalization\n    println!(\"Signing and submitting transaction...\");\n    let progress = at_block\n        .transactions()\n        .sign_and_submit_then_watch(&tx, &alice, tx_params)\n        .await?;\n    \n    let in_block = progress.wait_for_finalized().await?;\n    let block_hash = in_block.block_hash();\n    let events = in_block.wait_for_success().await?;\n    \n    // Display transaction results\n    println!(\"\\nTransaction finalized in block: {:?}\", block_hash);\n    \n    println!(\"\\nEvents:\");\n    for event in events.iter() {\n        let event = event?;\n        println!(\n            \"  {}.{}\",\n            event.pallet_name(),\n            event.event_name()\n        );\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#full-code", "page_title": "Pay Transaction Fees with Different Tokens", "index": 9, "depth": 3, "title": "Full Code", "anchor": "full-code", "start_char": 16281, "end_char": 26720, "estimated_token_count": 1903, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Full Code\n\n=== \"PAPI\"\n\n    ??? code \"Complete Code\"\n\n        ```typescript title=\"fee-payment-transaction.ts\"\n        import { sr25519CreateDerive } from \"@polkadot-labs/hdkd\";\n        import {\n          DEV_PHRASE,\n          entropyToMiniSecret,\n          mnemonicToEntropy,\n        } from \"@polkadot-labs/hdkd-helpers\";\n        import { getTxCreator } from \"polkadot-api/tx-creator\";\n        import { createClient } from \"polkadot-api\";\n        import { assetHub } from \"@polkadot-api/descriptors\";\n        import { getWsProvider } from \"polkadot-api/ws\";\n        import { MultiAddress } from \"@polkadot-api/descriptors\";\n        \n        const TARGET_ADDRESS = \"14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3\"; // Bob's address\n        const TRANSFER_AMOUNT = 3_000_000_000n; // 3 DOT\n        const USDT_ASSET_ID = 1984;\n        \n        const createSigner = async () => {\n          const entropy = mnemonicToEntropy(DEV_PHRASE);\n          const miniSecret = entropyToMiniSecret(entropy);\n          const derive = sr25519CreateDerive(miniSecret);\n          const hdkdKeyPair = derive(\"//Alice\");\n          const polkadotSigner = getTxCreator(\n            hdkdKeyPair.publicKey,\n            \"Sr25519\",\n            hdkdKeyPair.sign\n          );\n          return polkadotSigner;\n        };\n        \n        const client = createClient(\n          getWsProvider(\"ws://localhost:8000\") // Chopsticks Polkadot Hub\n        );\n        \n        const api = client.getTypedApi(assetHub);\n        \n        const tx = api.tx.Balances.transfer_keep_alive({\n          dest: MultiAddress.Id(TARGET_ADDRESS),\n          value: BigInt(TRANSFER_AMOUNT),\n        });\n        \n        const signer = await createSigner();\n        \n        const result = await tx.createAndSubmit(signer, {\n          asset: {\n            parents: 0,\n            interior: {\n              type: \"X2\",\n              value: [\n                { type: \"PalletInstance\", value: 50 },\n                { type: \"GeneralIndex\", value: BigInt(USDT_ASSET_ID) },\n              ],\n            },\n          },\n        });\n        \n        const { txHash, ok, block, events } = result;\n        console.log(`Tx finalized: ${txHash} (ok=${ok})`);\n        console.log(`Block: #${block.number} ${block.hash} [tx index ${block.index}]`);\n        \n        console.log(\"Events:\");\n        for (const ev of events) {\n          const type = (ev as any).type ?? \"unknown\";\n          console.log(`- ${type}`);\n        }\n        \n        process.exit(0);\n        \n        ```\n\n=== \"Polkadot.js\"\n\n    ??? code \"Complete Code\"\n\n        ```javascript title=\"fee-payment-transaction.js\"\n        import { ApiPromise, WsProvider } from '@polkadot/api';\n        import { Keyring } from '@polkadot/keyring';\n        import { cryptoWaitReady } from '@polkadot/util-crypto';\n        \n        const TARGET_ADDRESS = '14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3'; // Bob's address\n        const TRANSFER_AMOUNT = 3_000_000_000n; // 3 DOT\n        const USDT_ASSET_ID = 1984;\n        \n        async function main() {\n          // Wait for crypto libraries to be ready\n          await cryptoWaitReady();\n        \n          // Create a keyring instance and add Alice's account\n          const keyring = new Keyring({ type: 'sr25519' });\n          const alice = keyring.addFromUri('//Alice');\n        \n          // Connect to the local Chopsticks Polkadot Hub fork\n          const wsProvider = new WsProvider('ws://localhost:8000');\n          const api = await ApiPromise.create({ provider: wsProvider });\n          console.log('Connected to Polkadot Hub (Chopsticks fork)');\n        \n          // Create the transfer transaction\n          const tx = api.tx.balances.transferKeepAlive(TARGET_ADDRESS, TRANSFER_AMOUNT);\n        \n          // Define the USDT asset as an XCM multi-location for fee payment\n          const assetId = {\n            parents: 0,\n            interior: {\n              X2: [{ PalletInstance: 50 }, { GeneralIndex: USDT_ASSET_ID }],\n            },\n          };\n        \n          // Sign and send the transaction, paying fees with USDT\n          console.log('Signing and submitting transaction...');\n          await new Promise((resolve, reject) => {\n            let unsubscribe;\n            tx\n              .signAndSend(\n                alice,\n                { assetId },\n                ({ status, events, txHash, dispatchError }) => {\n                  if (status.isFinalized) {\n                    console.log(\n                      `\\nTransaction finalized in block: ${status.asFinalized.toHex()}`\n                    );\n                    console.log(`Transaction hash: ${txHash.toHex()}`);\n        \n                    // Display all events\n                    console.log('\\nEvents:');\n                    events.forEach(({ event }) => {\n                      console.log(`  ${event.section}.${event.method}`);\n                    });\n        \n                    if (unsubscribe) {\n                      unsubscribe();\n                    }\n        \n                    if (dispatchError) {\n                      if (dispatchError.isModule) {\n                        const decoded = api.registry.findMetaError(\n                          dispatchError.asModule\n                        );\n                        const { docs, name, section } = decoded;\n                        reject(new Error(`${section}.${name}: ${docs.join(' ')}`));\n                      } else {\n                        reject(new Error(dispatchError.toString()));\n                      }\n                    } else {\n                      resolve();\n                    }\n                  }\n                }\n              )\n              .then((unsub) => {\n                unsubscribe = unsub;\n              })\n              .catch((error) => {\n                if (unsubscribe) {\n                  unsubscribe();\n                }\n                reject(error);\n              });\n          });\n        \n          // Disconnect from the node\n          await api.disconnect();\n        }\n        \n        main().catch(console.error);\n        \n        ```\n\n=== \"Subxt\"\n\n    ??? code \"Complete Code\"\n\n        ```rust title=\"src/bin/fee_payment_transaction.rs\"\n        use std::str::FromStr;\n        use subxt::config::{Config, DefaultExtrinsicParamsBuilder, DefaultTransactionExtensions, PolkadotConfig};\n        use subxt::utils::AccountId32;\n        use subxt::{OnlineClient, SubstrateConfig};\n        \n        // Generate types from the Polkadot Hub metadata with Location trait derives\n        #[subxt::subxt(\n            runtime_metadata_path = \"metadata/asset_hub.scale\",\n            derive_for_type(\n                path = \"staging_xcm::v5::location::Location\",\n                derive = \"Clone, Eq, PartialEq, codec::Encode\",\n                recursive\n            )\n        )]\n        pub mod asset_hub {}\n        \n        // Import XCM location types from the generated metadata module\n        use asset_hub::runtime_types::staging_xcm::v5::{\n            junction::Junction,\n            junctions::Junctions,\n            location::Location,\n        };\n        \n        // Define a custom config where AssetId is an XCM Location\n        #[derive(Debug, Default, Clone)]\n        pub struct AssetHubConfig;\n        \n        impl Config for AssetHubConfig {\n            type AccountId = <PolkadotConfig as Config>::AccountId;\n            type Address = <PolkadotConfig as Config>::Address;\n            type Signature = <PolkadotConfig as Config>::Signature;\n            type Hasher = <PolkadotConfig as Config>::Hasher;\n            type Header = <SubstrateConfig as Config>::Header;\n            type TransactionExtensions = DefaultTransactionExtensions<AssetHubConfig>;\n            type AssetId = Location;\n        }\n        \n        const POLKADOT_HUB_RPC: &str = \"ws://localhost:8000\";\n        const TARGET_ADDRESS: &str = \"14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3\";\n        const TRANSFER_AMOUNT: u128 = 3_000_000_000; // 3 DOT\n        const USDT_ASSET_ID: u128 = 1984;\n        \n        #[tokio::main]\n        async fn main() -> Result<(), Box<dyn std::error::Error>> {\n            // Connect to the local Chopsticks Polkadot Hub fork\n            let api = OnlineClient::<AssetHubConfig>::from_url(POLKADOT_HUB_RPC).await?;\n            println!(\"Connected to Polkadot Hub (Chopsticks fork)\");\n        \n            // Anchor to the current block\n            let at_block = api.at_current_block().await?;\n        \n            // Create Alice's dev keypair\n            let alice = subxt_signer::sr25519::dev::alice();\n            println!(\"Sender (Alice): {}\", AccountId32::from(alice.public_key()));\n        \n            // Create the balance transfer transaction\n            let dest = AccountId32::from_str(TARGET_ADDRESS)?;\n            let tx = asset_hub::transactions()\n                .balances()\n                .transfer_keep_alive(dest.into(), TRANSFER_AMOUNT);\n        \n            // Define the USDT asset location in XCM format\n            let asset_location = Location {\n                parents: 0,\n                interior: Junctions::X2([\n                    Junction::PalletInstance(50),\n                    Junction::GeneralIndex(USDT_ASSET_ID),\n                ]),\n            };\n        \n            // Build transaction params to pay fees with the alternative asset\n            let tx_params = DefaultExtrinsicParamsBuilder::<AssetHubConfig>::new()\n                .tip_of(0, asset_location)\n                .build();\n        \n            // Sign, submit, and watch for finalization\n            println!(\"Signing and submitting transaction...\");\n            let progress = at_block\n                .transactions()\n                .sign_and_submit_then_watch(&tx, &alice, tx_params)\n                .await?;\n        \n            let in_block = progress.wait_for_finalized().await?;\n            let block_hash = in_block.block_hash();\n            let events = in_block.wait_for_success().await?;\n        \n            // Display transaction results\n            println!(\"\\nTransaction finalized in block: {:?}\", block_hash);\n        \n            println!(\"\\nEvents:\");\n            for event in events.iter() {\n                let event = event?;\n                println!(\n                    \"  {}.{}\",\n                    event.pallet_name(),\n                    event.event_name()\n                );\n            }\n        \n            Ok(())\n        }\n        \n        ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#run-the-script", "page_title": "Pay Transaction Fees with Different Tokens", "index": 10, "depth": 3, "title": "Run the Script", "anchor": "run-the-script", "start_char": 26720, "end_char": 26970, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Run the Script\n\n=== \"PAPI\"\n\n    ```bash\n    npx ts-node fee-payment-transaction.ts\n    ```\n\n=== \"Polkadot.js\"\n\n    ```bash\n    node fee-payment-transaction.js\n    ```\n\n=== \"Subxt\"\n\n    ```bash\n    cargo run --bin fee_payment_transaction\n    ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#expected-output", "page_title": "Pay Transaction Fees with Different Tokens", "index": 11, "depth": 3, "title": "Expected Output", "anchor": "expected-output", "start_char": 26970, "end_char": 29551, "estimated_token_count": 460, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Expected Output\n\nWhen you run the script successfully, you should see output similar to:\n\n=== \"PAPI\"\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx ts-node fee-payment-transaction.ts</span>\n      <pre>\n    Tx finalized: 0xfe4e3fa64d374e256c72463c507743f16672caaf1b4e539fe913026de394009e (ok=true)\n    Block: #12255461 0xaf315c306304ad175e4e24c5c8cbf97518c1411183bbf81a6107209a49d84f4d [tx index 2]\n    Events:\n    - Assets\n    - Balances\n    - Assets\n    - AssetConversion\n    - Balances\n    - System\n    - Balances\n    - Balances\n    - Balances\n    - AssetTxPayment\n    - System\n    </pre>\n    </div>\n    \n\n=== \"Polkadot.js\"\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>node fee-payment-transaction.js</span>\n      <pre>\n    Connected to Polkadot Hub (Chopsticks fork)\n    Signing and submitting transaction...\n    \n    Transaction finalized in block: 0x1f4849218bb4c04564a6c6f69c9e40a3940dcdabdc089da01bb49fb471a2c049\n    Transaction hash: 0x9c967bb79fd09579f5e530a0446ce0171efe9241ba5957d6bcba80bccd5f66da\n    \n    Events:\n      assets.Withdrawn\n      balances.Withdraw\n      assets.Deposited\n      assetConversion.SwapCreditExecuted\n      balances.Upgraded\n      system.NewAccount\n      balances.Endowed\n      balances.Transfer\n      balances.Deposit\n      assetTxPayment.AssetTxFeePaid\n      system.ExtrinsicSuccess\n    </pre>\n    </div>\n    \n\n=== \"Subxt\"\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>cargo run --bin fee_payment_transaction</span>\n      <pre>\n    Connected to Polkadot Hub (Chopsticks fork)\n    Sender (Alice): 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY\n    Signing and submitting transaction...\n    \n    Transaction finalized in block: 0x90c92e4dca64631ab4ccaabb14273cebbb3d59205db437dfcf9ace91452b1434\n    \n    Events:\n      Assets.Withdrawn\n      Balances.Withdraw\n      Assets.Deposited\n      AssetConversion.SwapCreditExecuted\n      Balances.Upgraded\n      System.NewAccount\n      Balances.Endowed\n      Balances.Transfer\n      Balances.Deposit\n      AssetTxPayment.AssetTxFeePaid\n      System.ExtrinsicSuccess\n    </pre>\n    </div>\n    \n\nThe key events to look for are:\n\n- **`AssetTxPayment`**: Confirms the fees were paid using the alternative asset.\n- **`AssetConversion`**: The alternative asset was swapped to cover native fees.\n- **`Balances`**: The transfer was executed and deposit and withdrawal events were emitted.\n- **`System`**: The transaction completed successfully."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#conclusion", "page_title": "Pay Transaction Fees with Different Tokens", "index": 12, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 29551, "end_char": 29959, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nPaying transaction fees with alternative tokens on Polkadot Hub provides significant flexibility for users and applications.\n\nThe key takeaway is understanding how to specify alternative assets using the XCM location format, which opens up possibilities for building applications that can operate entirely using specific token ecosystems while still leveraging the full power of the network."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-pay-fees-with-different-tokens", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/pay-fees-with-different-tokens/#where-to-go-next", "page_title": "Pay Transaction Fees with Different Tokens", "index": 13, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 29959, "end_char": 30540, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc84b21854c48071ac957fc3ef6d3bd47d65335bb76a4af8c659249e6337f277", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Send Transactions with SDKs__\n\n    ---\n\n    Learn how to send various types of transactions using different SDKs.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/with-sdks/)\n\n-   <span class=\"badge guide\">Guide</span> __Calculate Transaction Fees__\n\n    ---\n\n    Understand how to estimate transaction fees before submitting.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/calculate-transaction-fees/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-with-sdks", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/with-sdks/#introduction", "page_title": "Send Transactions with SDKs", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 32, "end_char": 1030, "estimated_token_count": 223, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74c5f1d26c0a459f5d550af6344822c2a676ae900d6e5c8bbbca502dc7f28fa7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nSending transactions on Polkadot SDK-based blockchains involves constructing an extrinsic (transaction), signing it with your account's private key, and submitting it to the network. Each SDK provides different methods for transaction construction, signing, and submission.\n\nThis guide demonstrates how to send transactions using five popular SDKs:\n\n- **[Polkadot API (PAPI)](/reference/tools/papi/)**: Modern TypeScript library with type-safe APIs\n- **[Polkadot.js API](/reference/tools/polkadot-js-api/)**: Comprehensive JavaScript library (maintenance mode)\n- **[Dedot](/reference/tools/dedot/)**: Lightweight TypeScript library optimized for performance\n- **[Python Substrate Interface](/reference/tools/py-substrate-interface/)**: Python library for Substrate chains\n- **[Subxt](/reference/tools/subxt/)**: Rust library with compile-time type safety\n\nSelect your preferred SDK below to see complete, runnable examples that send balance transfer transactions on Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-with-sdks", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/with-sdks/#prerequisites", "page_title": "Send Transactions with SDKs", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1030, "end_char": 1299, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74c5f1d26c0a459f5d550af6344822c2a676ae900d6e5c8bbbca502dc7f28fa7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\n- Access to a Polkadot-SDK-compatible wallet, with its mnemonic phrase or private key.\n- A funded account on Polkadot Hub, with some testnet tokens. You can use the [Polkadot Faucet](https://faucet.polkadot.io/?parachain=1111) to obtain test tokens."}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-with-sdks", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/with-sdks/#send-transactions", "page_title": "Send Transactions with SDKs", "index": 2, "depth": 2, "title": "Send Transactions", "anchor": "send-transactions", "start_char": 1299, "end_char": 26801, "estimated_token_count": 5362, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74c5f1d26c0a459f5d550af6344822c2a676ae900d6e5c8bbbca502dc7f28fa7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Send Transactions\n\n!!! warning\n    Never share your mnemonic phrase or private keys. The examples below use mnemonics for demonstration purposes only. In production, use secure key management solutions.\n\n=== \"PAPI\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir papi-send-tx-example && cd papi-send-tx-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install polkadot-api@3.3.0 @polkadot/util-crypto @polkadot/keyring && \\\n        npm install --save-dev @types/node tsx typescript\n        ```\n\n    3. Generate types for Polkadot Hub TestNet:\n\n        ```bash\n        npx papi add polkadotTestNet -w wss://asset-hub-paseo.dotters.network\n        ```\n\n    **Send Balance Transfer**\n\n    The following example constructs, signs, and submits a balance transfer transaction.\n\n    Create a file named `send-transfer.ts` and add the following code to it:\n\n    ```typescript title=\"send-transfer.ts\"\n    import { createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { polkadotTestNet } from '@polkadot-api/descriptors';\n    import { cryptoWaitReady } from '@polkadot/util-crypto';\n    import { Keyring } from '@polkadot/keyring';\n    import { getTxCreator } from 'polkadot-api/tx-creator';\n    \n    const POLKADOT_TESTNET_RPC = 'INSERT_WS_ENDPOINT';\n    const SENDER_MNEMONIC = 'INSERT_MNEMONIC';\n    const DEST_ADDRESS = 'INSERT_DEST_ADDRESS';\n    const AMOUNT = 1_000_000_000n; // 1 PAS (adjust decimals as needed)\n    \n    async function main() {\n      try {\n        await cryptoWaitReady();\n    \n        const keyring = new Keyring({ type: 'sr25519' });\n        const sender = keyring.addFromMnemonic(SENDER_MNEMONIC);\n    \n        console.log(`Sender address: ${sender.address}`);\n    \n        // Create the client connection\n        const client = createClient(getWsProvider(POLKADOT_TESTNET_RPC));\n    \n        // Get the typed API\n        const api = client.getTypedApi(polkadotTestNet);\n        console.log('Connected to Polkadot Testnet');\n    \n        // Create signer using getTxCreator\n        const signer = getTxCreator(\n          sender.publicKey,\n          'Sr25519',\n          async (input) => sender.sign(input)\n        );\n    \n        // Construct and submit the transfer transaction\n        const tx = api.tx.Balances.transfer_keep_alive({\n          dest: { type: 'Id', value: DEST_ADDRESS },\n          value: AMOUNT,\n        });\n    \n        console.log('\\nSigning and submitting transaction...');\n        // Polkadot Hub TestNet requires a value for its RestrictOrigins extension\n        const { txHash } = await tx.createAndSubmit(signer, {\n          customSignedExtensions: { RestrictOrigins: { value: true } },\n        });\n        console.log(`Transaction submitted with hash: ${txHash}`);\n    \n        await client.destroy();\n        console.log('Disconnected');\n      } catch (error) {\n        console.error('Error:', error);\n        process.exit(1);\n      }\n    }\n    \n    main();\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with the proper WebSocket endpoint, `INSERT_SENDER_MNEMONIC` with your account's mnemonic phrase, and `INSERT_DEST_ADDRESS` with the recipient address. For this example, you can use Polkadot Hub (`wss://polkadot-asset-hub-rpc.polkadot.io`).\n\n    Run the script:\n\n    ```bash\n    npx tsx send-transfer.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx send-transfer.ts</span>\n        <span data-ty>Sender address: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty>Connected to Polkadot Testnet</span>\n        <span data-ty>Signing and submitting transaction...</span>\n        <span data-ty>Transaction submitted with hash: 0x45ce4b5223428d003ddeed5118182eede1224dd0b6e881d7ed40517d60aa1c57</span>\n        <span data-ty>Disconnected</span>\n    </div>\n\n=== \"Polkadot.js\"\n\n    !!! warning \"Maintenance Mode Only\"\n        The Polkadot.js API is no longer actively developed. New projects should use [PAPI](/reference/tools/papi/) or [Dedot](/reference/tools/dedot/) as actively maintained alternatives.\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir pjs-send-tx-example && cd pjs-send-tx-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install @polkadot/api @polkadot/keyring @polkadot/util-crypto\n        ```\n\n    **Send Balance Transfer**\n\n    The following example constructs, signs, and submits a balance transfer transaction.\n\n    Create a file named `send-transfer.js` and add the following code:\n\n    ```javascript title=\"send-transfer.js\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    import { Keyring } from '@polkadot/keyring';\n    import { cryptoWaitReady } from '@polkadot/util-crypto';\n    \n    const POLKADOT_TESTNET_RPC = 'INSERT_WS_ENDPOINT';\n    const SENDER_MNEMONIC = 'INSERT_MNEMONIC';\n    const DEST_ADDRESS = 'INSERT_DEST_ADDRESS';\n    const AMOUNT = 1_000_000_000n; // 1 PAS (adjust decimals as needed)\n    \n    async function main() {\n      // Wait for crypto to be ready\n      await cryptoWaitReady();\n    \n      // Create a WebSocket provider\n      const wsProvider = new WsProvider(POLKADOT_TESTNET_RPC);\n    \n      // Initialize the API\n      const api = await ApiPromise.create({ provider: wsProvider });\n      console.log('Connected to Polkadot Testnet');\n    \n      // Set up keyring and get sender account\n      const keyring = new Keyring({ type: 'sr25519' });\n      const sender = keyring.addFromMnemonic(SENDER_MNEMONIC);\n      const senderAddress = sender.address;\n    \n      console.log(`Sender address: ${senderAddress}`);\n      console.log(`Recipient address: ${DEST_ADDRESS}`);\n      console.log(`Amount: ${AMOUNT} (${Number(AMOUNT) / 1_000_000_000} PAS)\\n`);\n    \n      // Get sender's account info to check balance\n      const accountInfo = await api.query.system.account(senderAddress);\n      console.log(\n        `Sender balance: ${accountInfo.data.free.toString()} (${\n          Number(accountInfo.data.free.toBigInt()) / 1_000_000_000\n        } PAS)`\n      );\n    \n      // Construct and sign the transfer transaction\n      console.log('\\nSigning and submitting transaction...');\n    \n      await new Promise((resolve, reject) => {\n        api.tx.balances\n          .transferKeepAlive(DEST_ADDRESS, AMOUNT)\n          .signAndSend(sender, ({ status, txHash, dispatchError }) => {\n            if (status.isInBlock) {\n              console.log(\n                `Transaction included in block: ${status.asInBlock.toHex()}`\n              );\n            } else if (status.isFinalized) {\n              console.log(\n                `Transaction finalized in block: ${status.asFinalized.toHex()}`\n              );\n              console.log(`Transaction hash: ${txHash.toHex()}`);\n    \n              if (dispatchError) {\n                if (dispatchError.isModule) {\n                  const decoded = api.registry.findMetaError(\n                    dispatchError.asModule\n                  );\n                  const { docs, name, section } = decoded;\n                  reject(new Error(`${section}.${name}: ${docs.join(' ')}`));\n                } else {\n                  reject(new Error(dispatchError.toString()));\n                }\n              } else {\n                console.log('Transaction successful!');\n                resolve(txHash.toHex());\n              }\n            }\n          })\n          .catch(reject);\n      });\n    \n      // Disconnect from the node\n      await api.disconnect();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with the proper WebSocket endpoint, `INSERT_SENDER_MNEMONIC` with your account's mnemonic phrase, and `INSERT_DEST_ADDRESS` with the recipient address. For this example, you can use Polkadot Hub (`wss://polkadot-asset-hub-rpc.polkadot.io`).\n\n    Run the script:\n\n    ```bash\n    node send-transfer.js\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>node send-transfer.js</span>\n        <span data-ty></span>Connected to Polkadot Testnet</span>\n        <span data-ty></span>Sender address: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty></span>Recipient address: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty>Amount: 1000000000 (1 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Sender balance: 59912386816 (59.912386816 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Signing and submitting transaction...</span>\n        <span data-ty>Transaction included in block: 0x77b5d73d30412ec39ac6cfe6cf3ec2134fec8e3fcbcd821218863d01f9fac40f</span>\n        <span data-ty>Transaction finalized in block: 0x77b5d73d30412ec39ac6cfe6cf3ec2134fec8e3fcbcd821218863d01f9fac40f</span>\n        <span data-ty>Transaction hash: 0x6f2fbe51985c87a5534c919d76859b66138aaf874147a1e300e50d93cee1c429</span>\n        <span data-ty>Transaction successful!</span>\n    </div>\n    \n\n=== \"Dedot\"\n\n    **Prerequisites**\n\n    - [Node.js](https://nodejs.org/) v18 or higher\n    - npm, pnpm, or yarn package manager\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir dedot-send-tx-example && cd dedot-send-tx-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install dependencies:\n\n        ```bash\n        npm install dedot @polkadot/keyring @polkadot/util-crypto && \\\n        npm install --save-dev @dedot/chaintypes @types/node tsx typescript\n        ```\n\n    **Send Balance Transfer**\n\n    The following example constructs, signs, and submits a balance transfer transaction.\n\n    Create a file named `send-transfer.ts` and add the following code to it:\n\n    ```typescript title=\"send-transfer.ts\"\n    import { DedotClient, WsProvider } from 'dedot';\n    import type { PolkadotAssetHubApi } from '@dedot/chaintypes';\n    import { cryptoWaitReady } from '@polkadot/util-crypto';\n    import { Keyring } from '@polkadot/keyring';\n    \n    const POLKADOT_TESTNET_RPC = 'INSERT_WS_ENDPOINT';\n    const SENDER_MNEMONIC = 'INSERT_MNEMONIC';\n    const DEST_ADDRESS = 'INSERT_DEST_ADDRESS';\n    const AMOUNT = 1_000_000_000n; // 1 PAS (adjust decimals as needed)\n    \n    async function main() {\n      // Wait for crypto to be ready\n      await cryptoWaitReady();\n    \n      // Initialize provider and client with Asset Hub types\n      const provider = new WsProvider(POLKADOT_TESTNET_RPC);\n      const client = await DedotClient.new<PolkadotAssetHubApi>(provider);\n    \n      console.log('Connected to Polkadot Testnet');\n    \n      // Set up keyring and get sender account\n      const keyring = new Keyring({ type: 'sr25519' });\n      const sender = keyring.addFromMnemonic(SENDER_MNEMONIC);\n      const senderAddress = sender.address;\n    \n      console.log(`Sender address: ${senderAddress}`);\n      console.log(`Recipient address: ${DEST_ADDRESS}`);\n      console.log(`Amount: ${AMOUNT} (${AMOUNT / 1_000_000_000n} PAS)\\n`);\n    \n      // Get sender's account info to check balance\n      const accountInfo = await client.query.system.account(senderAddress);\n      console.log(`Sender balance: ${accountInfo.data.free}`);\n    \n      // Sign and submit the transfer transaction\n      console.log('\\nSigning and submitting transaction...');\n    \n      // Wait for transaction to complete using a Promise\n      await new Promise<void>((resolve, reject) => {\n        client.tx.balances\n          .transferKeepAlive(DEST_ADDRESS, AMOUNT)\n          .signAndSend(sender, async ({ status, txHash, dispatchError }) => {\n            console.log(`Transaction status: ${status.type}`);\n    \n            // Log transaction hash immediately\n            if (txHash) {\n              console.log(\n                `Transaction hash: ${\n                  typeof txHash === 'string' ? txHash : txHash.toHex()\n                }`\n              );\n            }\n    \n            if (status.type === 'BestChainBlockIncluded') {\n              console.log(\n                `Transaction included in block: ${status.value.blockHash}`\n              );\n            }\n    \n            if (status.type === 'Finalized') {\n              console.log(\n                `Transaction finalized in block: ${status.value.blockHash}`\n              );\n    \n              // Check for dispatch errors\n              if (dispatchError) {\n                if (dispatchError.type === 'Module') {\n                  const decoded = client.registry.findMetaError(\n                    dispatchError.value\n                  );\n                  console.error(\n                    `Dispatch error: ${decoded.section}.${decoded.name}: ${decoded.docs}`\n                  );\n                  reject(\n                    new Error(\n                      `Transaction failed: ${decoded.section}.${decoded.name}`\n                    )\n                  );\n                } else {\n                  console.error(`Dispatch error: ${dispatchError.type}`);\n                  reject(new Error(`Transaction failed: ${dispatchError.type}`));\n                }\n              } else {\n                console.log('Transaction successful!');\n                resolve();\n              }\n            }\n          })\n          .catch(reject);\n      });\n    \n      // Disconnect the client after transaction completes\n      await client.disconnect();\n      console.log('Disconnected from Polkadot Hub');\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with the proper WebSocket endpoint, `INSERT_SENDER_MNEMONIC` with your account's mnemonic phrase, and `INSERT_DEST_ADDRESS` with the recipient address. For this example, you can use Polkadot Hub (`wss://polkadot-asset-hub-rpc.polkadot.io`).\n\n    Run the script:\n\n    ```bash\n    npx tsx send-transfer.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx send-transfer.ts</span>\n        <span data-ty></span>Connected to Polkadot Testnet</span>\n        <span data-ty>Sender address: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty>Recipient address: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty>Amount: 1000000000 (1 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Sender balance: 59868680224</span>\n        <span data-ty></span>\n        <span data-ty>Signing and submitting transaction...</span>\n        <span data-ty>Transaction status: Validated</span>\n        <span data-ty>Transaction status: Broadcasting</span>\n        <span data-ty>Transaction status: BestChainBlockIncluded</span>\n        <span data-ty>Transaction included in block: 0x80b039e897d8cfe4ec0c641cd17cc7a47ed4b26797b31c7d3c93c3b0b96f7b9f</span>\n        <span data-ty>Transaction status: Finalized</span>\n        <span data-ty>Transaction hash: 0x325a1c1cff76fb6a004190cf5ee382f89433596b3c396f10fd25ce6945f2b1df</span>\n        <span data-ty>Transaction finalized in block: 0x80b039e897d8cfe4ec0c641cd17cc7a47ed4b26797b31c7d3c93c3b0b96f7b9f</span>\n        <span data-ty>Transaction successful!</span>\n        <span data-ty>Disconnected from Polkadot Testnet</span>\n    </div>\n    \n\n=== \"Python Substrate Interface\"\n\n    **Prerequisites**\n\n    - [Python](https://www.python.org/) 3.8 or higher\n    - pip package manager\n\n    **Environment Setup**\n\n    1. Create a new project directory and set up a virtual environment:\n\n        ```bash\n        mkdir psi-send-tx-example && cd psi-send-tx-example && \\\n        python3 -m venv venv && source venv/bin/activate\n        ```\n\n    2. Install the substrate-interface package:\n\n        ```bash\n        pip install substrate-interface\n        ```\n\n    **Send Balance Transfer**\n\n    The following example constructs, signs, and submits a balance transfer transaction.\n\n    Create a file named `send_transfer.py` and add the following code to it:\n\n    ```python title=\"send_transfer.py\"\n    from substrateinterface import SubstrateInterface, Keypair\n    \n    POLKADOT_TESTNET_RPC = \"INSERT_WS_ENDPOINT\"\n    SENDER_MNEMONIC = \"INSERT_MNEMONIC\"\n    DEST_ADDRESS = \"INSERT_DEST_ADDRESS\"\n    AMOUNT = 1_000_000_000  # 1 PAS (adjust decimals as needed)\n    \n    \n    def main():\n        # Connect to Polkadot Hub\n        substrate = SubstrateInterface(url=POLKADOT_TESTNET_RPC)\n    \n        print(\"Connected to Polkadot Testnet\")\n    \n        # Create keypair from mnemonic\n        keypair = Keypair.create_from_mnemonic(SENDER_MNEMONIC)\n        sender_address = keypair.ss58_address\n    \n        print(f\"Sender address: {sender_address}\")\n        print(f\"Recipient address: {DEST_ADDRESS}\")\n        print(f\"Amount: {AMOUNT} ({AMOUNT / 1_000_000_000} PAS)\\n\")\n    \n        # Get sender's account info to check balance\n        account_info = substrate.query(\n            module=\"System\", storage_function=\"Account\", params=[sender_address]\n        )\n        print(f\"Sender balance: {account_info.value['data']['free']}\")\n    \n        # Compose the transfer call\n        call = substrate.compose_call(\n            call_module=\"Balances\",\n            call_function=\"transfer_keep_alive\",\n            call_params={\"dest\": DEST_ADDRESS, \"value\": AMOUNT},\n        )\n    \n        # Create a signed extrinsic\n        print(\"\\nSigning and submitting transaction...\")\n        extrinsic = substrate.create_signed_extrinsic(call=call, keypair=keypair)\n    \n        # Submit and wait for inclusion\n        receipt = substrate.submit_extrinsic(extrinsic, wait_for_inclusion=True)\n    \n        if receipt.is_success:\n            print(\"\\nTransaction successful!\")\n            print(f\"Extrinsic Hash: {receipt.extrinsic_hash}\")\n            print(f\"Block Hash: {receipt.block_hash}\")\n        else:\n            print(f\"\\nTransaction failed: {receipt.error_message}\")\n    \n        # Close connection\n        substrate.close()\n    \n    \n    if __name__ == \"__main__\":\n        main()\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with the proper WebSocket endpoint, `INSERT_SENDER_MNEMONIC` with your account's mnemonic phrase, and `INSERT_DEST_ADDRESS` with the recipient address. For this example, you can use Polkadot Hub (`wss://polkadot-asset-hub-rpc.polkadot.io`).\n\n    Run the script:\n\n    ```bash\n    python send_transfer.py\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>python send_transfer.py</span>\n        <span data-ty>Connected to Polkadot Testnet</span>\n        <span data-ty>Sender address: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty>Recipient address: 5GgbDVeKZwCmMHzn58iFSgSZDTojRMM52arXnuNXto28R7mg</span>\n        <span data-ty>Amount: 1000000000 (1.0 PAS)</span>\n        <span data-ty></span>\n        <span data-ty>Sender balance: 59854111360</span>\n        <span data-ty></span>\n        <span data-ty>Signing and submitting transaction...</span>\n        <span data-ty>Transaction successful!</span>\n        <span data-ty>Extrinsic Hash: 0x5509e26874f5274747896349be68b0904058f4e2822385fdb7c8dc86f2dab879</span>\n        <span data-ty>Block Hash: 0xfd79ad0e21c5a91c358e2bd59540a98681e407e4231c9577221f97cc121449b8</span>\n    </div>\n    \n\n=== \"Subxt\"\n\n    [Subxt](/reference/tools/subxt/) is a Rust library that provides compile-time type safety through code generation from chain metadata.\n\n    **Prerequisites**\n\n    - [Rust](https://rustup.rs/) toolchain (latest stable)\n    - Cargo package manager\n\n    **Environment Setup**\n\n    1. Create a new Rust project:\n\n        ```bash\n        cargo new subxt-send-tx-example && cd subxt-send-tx-example\n        ```\n\n    2. Install the Subxt CLI:\n\n        ```bash\n        cargo install subxt-cli@0.50.1\n        ```\n\n    3. Download the Polkadot Hub metadata:\n\n        ```bash\n        subxt metadata --url INSERT_WS_ENDPOINT -o asset_hub_metadata.scale\n        ```\n\n    4. Update `Cargo.toml` with the required dependencies:\n\n        ```toml title=\"Cargo.toml\"\n        [package]\n        name = \"subxt-send-tx-example\"\n        version = \"0.1.0\"\n        edition = \"2021\"\n        \n        [[bin]]\n        name = \"send_transfer\"\n        path = \"src/bin/send_transfer.rs\"\n        \n        [dependencies]\n        subxt = { version = \"0.50.0\", features = [\"native\"] }\n        subxt-signer = \"0.50.0\"\n        tokio = { version = \"1\", features = [\"rt\", \"macros\"] }\n        \n        \n        \n        ```\n\n    **Send Balance Transfer**\n\n    The following example constructs, signs, and submits a balance transfer transaction.\n\n    Create a file at `src/bin/send_transfer.rs` and add the following code to it:\n\n    ```rust title=\"src/bin/send_transfer.rs\"\n    use std::str::FromStr;\n    use subxt::utils::AccountId32;\n    use subxt::{OnlineClient, PolkadotConfig};\n    use subxt_signer::{bip39::Mnemonic, sr25519::Keypair};\n    \n    // Generate an interface from the node's metadata\n    #[subxt::subxt(runtime_metadata_path = \"asset_hub_metadata.scale\")]\n    pub mod asset_hub {}\n    \n    const ASSET_HUB_RPC: &str = \"INSERT_WS_ENDPOINT\";\n    const SENDER_MNEMONIC: &str = \"INSERT_SENDER_MNEMONIC\";\n    const DEST_ADDRESS: &str = \"INSERT_DEST_ADDRESS\";\n    const AMOUNT: u128 = 1_000_000_000_000; // 1 DOT (12 decimals)\n    \n    #[tokio::main(flavor = \"current_thread\")]\n    async fn main() -> Result<(), Box<dyn std::error::Error>> {\n        // Initialize the Subxt client\n        let api = OnlineClient::<PolkadotConfig>::from_url(ASSET_HUB_RPC).await?;\n    \n        // Anchor to the current block\n        let at_block = api.at_current_block().await?;\n    \n        println!(\"Connected to Polkadot Hub\");\n    \n        // Load the sender's keypair from a mnemonic phrase\n        let mnemonic = Mnemonic::parse(SENDER_MNEMONIC)?;\n        let sender_keypair = Keypair::from_phrase(&mnemonic, None)?;\n        let sender_address = AccountId32::from(sender_keypair.public_key());\n    \n        println!(\"Sender address: {}\", sender_address);\n        println!(\"Recipient address: {}\", DEST_ADDRESS);\n        println!(\"Amount: {} ({} DOT)\\n\", AMOUNT, AMOUNT / 1_000_000_000_000);\n    \n        // Get sender's account info to check balance\n        let account_storage = at_block\n            .storage()\n            .entry(asset_hub::storage().system().account())?;\n        let account_info = account_storage\n            .fetch((sender_address,))\n            .await?\n            .decode()?;\n    \n        println!(\"Sender balance: {}\", account_info.data.free);\n    \n        // Convert the recipient address into an AccountId32\n        let dest = AccountId32::from_str(DEST_ADDRESS)?;\n    \n        // Build the balance transfer extrinsic\n        let balance_transfer_tx = asset_hub::transactions()\n            .balances()\n            .transfer_keep_alive(dest.into(), AMOUNT);\n    \n        // Sign and submit the extrinsic, then wait for it to be finalized\n        println!(\"\\nSigning and submitting transaction...\");\n        let events = at_block\n            .transactions()\n            .sign_and_submit_then_watch_default(&balance_transfer_tx, &sender_keypair)\n            .await?\n            .wait_for_finalized_success()\n            .await?;\n    \n        // Check for a successful transfer event\n        if let Some(event) = events.find_first::<asset_hub::balances::events::Transfer>() {\n            println!(\"\\nTransaction successful!\");\n            println!(\"Transfer event: {:?}\", event);\n        }\n    \n        Ok(())\n    }\n    \n    ```\n\n    !!! note\n        Ensure to replace `INSERT_WS_ENDPOINT` with the proper WebSocket endpoint, `INSERT_SENDER_MNEMONIC` with your account's mnemonic phrase, and `INSERT_DEST_ADDRESS` with the recipient address. For this example, you can use Polkadot Hub (`wss://polkadot-asset-hub-rpc.polkadot.io`).\n\n    Run the script:\n\n    ```bash\n    cargo run --bin send_transfer\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>cargo run --bin send_transfer</span>\n        <span data-ty>Connected to Polkadot Hub</span>\n        <span data-ty>Sender address: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3</span>\n        <span data-ty>Recipient address: 15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X</span>\n        <span data-ty>Amount: 1000000000000 (1 DOT)</span>\n        <span data-ty></span>\n        <span data-ty>Sender balance: 50000000000000</span>\n        <span data-ty></span>\n        <span data-ty>Signing and submitting transaction...</span>\n        <span data-ty></span>\n        <span data-ty>Transaction successful!</span>\n        <span data-ty>Transfer event: Transfer { from: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3, to: 15uPcYeUE2XaMiMJuR6W7QGW2LsLdKXX7F3PxKG8gcizPh3X, amount: 1000000000000 }</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-send-transactions-with-sdks", "url": "https://developer.polkadot.com/chain-interactions/send-transactions/with-sdks/#where-to-go-next", "page_title": "Send Transactions with SDKs", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 26801, "end_char": 27352, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74c5f1d26c0a459f5d550af6344822c2a676ae900d6e5c8bbbca502dc7f28fa7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Query On-Chain State**\n\n    ---\n\n    Learn how to query storage and runtime data with the SDKs used in this guide.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/query-data/query-sdks/)\n\n- <span class=\"badge guide\">Guide</span> **Calculate Transaction Fees**\n\n    ---\n\n    Estimate fees before sending transactions\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/calculate-transaction-fees/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-store-data-bulletin-chain", "url": "https://developer.polkadot.com/chain-interactions/store-data/bulletin-chain/#prerequisites", "page_title": "Store and Retrieve Data on the Bulletin Chain", "index": 0, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 751, "end_char": 1294, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d2b94e0a3c459123e6a88b5107b1588d0a71f0e2ffa35dce56e92c4022223ac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\n- A Polkadot account (SS58 format) — see [Create an Account](/chain-interactions/accounts/create-account/) if you need one\n- A browser wallet extension (Polkadot.js, Talisman, SubWallet, or Fearless)\n- An image or file to store (at most 2 MiB per transaction; for larger files, you can chunk your data — see [Size Limits](/reference/polkadot-hub/data-storage/#size-limits))\n- Authorization to store data on the Bulletin Chain (covered in the next section)\n- For the PAPI method: [Node.js](https://nodejs.org/) v18 or higher"}
{"source": "polkadot-docs", "page_id": "chain-interactions-store-data-bulletin-chain", "url": "https://developer.polkadot.com/chain-interactions/store-data/bulletin-chain/#get-authorization", "page_title": "Store and Retrieve Data on the Bulletin Chain", "index": 1, "depth": 2, "title": "Get Authorization", "anchor": "get-authorization", "start_char": 1294, "end_char": 3030, "estimated_token_count": 398, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d2b94e0a3c459123e6a88b5107b1588d0a71f0e2ffa35dce56e92c4022223ac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Authorization\n\nThe Bulletin Chain has no token balances — you need authorization before you can store data. Authorization grants your account a specific number of transactions and bytes that you can use for storage.\n\nFor this tutorial, we're going to use the testnet faucet for authorizations.\n\n=== \"Console UI\"\n\n    1. Navigate to the [Bulletin Chain Console](https://paritytech.github.io/polkadot-bulletin-chain/) and click **Connect** to connect your wallet.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-1.webp)\n\n    2. Go to the **Faucet** page and select the **Storage Faucet** tab.\n    3. Under **Authorize Account**, enter the desired number of **Transactions** and **Bytes** for your storage needs, then click **Authorize Account**.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-2.webp)\n\n    4. Approve the transaction in your wallet extension. You should see a success confirmation.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-3.webp)\n\n    5. To verify your authorization, switch to the **Accounts** tab to view your remaining transactions, bytes, and expiration block.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-4.webp)\n\n    !!! note\n        Authorization has an expiration block. Once expired, unused authorization is not refunded — you'll need to request new authorization.\n\n!!! note\n    The `authorize_account` extrinsic requires the authorizer origin: Root, or an account or parachain allowed to grant authorizations. You cannot self-authorize programmatically. On Polkadot TestNet, use the Console UI faucet to authorize your account before using PAPI to store data."}
{"source": "polkadot-docs", "page_id": "chain-interactions-store-data-bulletin-chain", "url": "https://developer.polkadot.com/chain-interactions/store-data/bulletin-chain/#store-your-image", "page_title": "Store and Retrieve Data on the Bulletin Chain", "index": 2, "depth": 2, "title": "Store Your Image", "anchor": "store-your-image", "start_char": 3030, "end_char": 9969, "estimated_token_count": 1640, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d2b94e0a3c459123e6a88b5107b1588d0a71f0e2ffa35dce56e92c4022223ac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Store Your Image\n\nNow that your account is authorized, you can store your image on-chain. Choose the method that best fits your workflow.\n\n!!! note\n    You can also interact with the Bulletin Chain directly through [Polkadot.js Apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpaseo-bulletin-next-rpc.polkadot.io) or [dev.papi.how](https://dev.papi.how/) by submitting extrinsics from the `TransactionStorage` pallet to store data and from the `DataRenewal` pallet to renew it.\n\n=== \"Console UI\"\n\n    1. Navigate to the **Upload** page in the [Bulletin Chain Console](https://paritytech.github.io/polkadot-bulletin-chain/). You can see your account's storage usage and authorization quota on the right side panel.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-5.webp)\n\n    2. Select the **File** tab, then drag and drop your image or click to browse. The UI shows the file name and size.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-6.webp)\n\n    3. Leave the **CID Configuration** at the defaults (Blake2b-256 hash, Raw codec) unless you have specific requirements.\n\n    4. Click **Upload to Bulletin Chain** and approve the transaction in your wallet extension.\n\n    5. On success, the UI displays your **CID**, **Block Number**, and **Transaction Index**.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-7.webp)\n\n    !!! warning\n        Save the **CID** — you'll need it to renew your data before it expires. The Console UI auto-saves your uploads to your browser history, but you should record the CID separately as well.\n\n=== \"PAPI\"\n\n    Use the [Polkadot API (PAPI)](https://papi.how/) to store an image programmatically — ideal for integrating into build scripts, CI pipelines, or dApp backends.\n\n    **Environment Setup**\n\n    1. Create and initialize a new project:\n\n        ```bash\n        mkdir bulletin-store-example && cd bulletin-store-example && \\\n        npm init -y && npm pkg set type=module\n        ```\n\n    2. Install the required dependencies:\n\n        ```bash\n        npm install polkadot-api@3.3.0 @polkadot-labs/hdkd@0.0.32 @polkadot-labs/hdkd-helpers@0.0.34 multiformats\n        ```\n\n    3. Fetch the Bulletin Chain metadata and generate typed descriptors:\n\n        ```bash\n        npx papi add bulletin -w wss://paseo-bulletin-next-rpc.polkadot.io\n        ```\n\n        This command connects to the Bulletin Chain RPC endpoint, downloads the chain metadata, and generates typed descriptors that provide full type safety for all pallet interactions.\n\n    **Store an Image**\n\n    Create a file named `store-data.ts` with the following content:\n\n    ```typescript title=\"store-data.ts\"\n    import { createClient } from 'polkadot-api';\n    import { getWsProvider } from 'polkadot-api/ws';\n    import { bulletin } from '@polkadot-api/descriptors';\n    import { sr25519CreateDerive } from '@polkadot-labs/hdkd';\n    import {\n      DEV_PHRASE,\n      entropyToMiniSecret,\n      mnemonicToEntropy,\n    } from '@polkadot-labs/hdkd-helpers';\n    import { getTxCreator } from 'polkadot-api/tx-creator';\n    import { CID } from 'multiformats/cid';\n    import { readFile } from 'fs/promises';\n    \n    // Bulletin Chain Polkadot TestNet RPC endpoint\n    const BULLETIN_RPC = 'wss://paseo-bulletin-next-rpc.polkadot.io';\n    \n    // Path to the image you want to store\n    const FILE_PATH = 'INSERT_IMAGE_PATH';\n    \n    async function main() {\n      // Create the client connection\n      const client = createClient(getWsProvider(BULLETIN_RPC));\n    \n      // Get the typed API for the Bulletin Chain\n      const api = client.getTypedApi(bulletin);\n    \n      console.log('Connected to Bulletin Chain (Polkadot TestNet)');\n    \n      // Derive a signer from a mnemonic\n      const miniSecret = entropyToMiniSecret(mnemonicToEntropy(DEV_PHRASE));\n      const derive = sr25519CreateDerive(miniSecret);\n      const hdkdKeyPair = derive('//Alice');\n      const signer = getTxCreator(\n        hdkdKeyPair.publicKey,\n        'Sr25519',\n        hdkdKeyPair.sign\n      );\n    \n      // Read the image to store\n      const fileData = await readFile(FILE_PATH);\n      console.log(`Read file: ${FILE_PATH} (${fileData.length} bytes)`);\n    \n      // Submit the store transaction\n      // Note: the signing account must have an active authorization (see Get Authorization section)\n      console.log('Submitting store transaction...');\n      const result = await api.tx.TransactionStorage.store({\n        data: new Uint8Array(fileData),\n      }).createAndSubmit(signer);\n    \n      console.log(\n        `Transaction included in block #${result.block.number} (${result.block.hash})`\n      );\n    \n      // Check events for the Stored event containing the CID\n      for (const event of result.events) {\n        if (event.type === 'TransactionStorage' && event.value.type === 'Stored') {\n          // Decode the raw CID bytes into a standard IPFS CID string\n          const cid = CID.decode(event.value.value.cid);\n    \n          console.log('\\nImage stored successfully!');\n          console.log(`Index: ${event.value.value.index}`);\n          console.log(`Content hash: ${event.value.value.content_hash}`);\n          console.log(`CID: ${cid.toString()}`);\n          console.log(`\\nRetrieve via IPFS gateway:`);\n          console.log(`https://paseo-bulletin-next-ipfs.polkadot.io/ipfs/${cid.toString()}`);\n        }\n      }\n    \n      // Disconnect the client\n      client.destroy();\n    }\n    \n    main().catch(console.error);\n    \n    ```\n\n    !!! note\n        Replace `INSERT_IMAGE_PATH` with the path to your image (e.g., `./logo.png`). Ensure the file is at most 2 MiB. For the signer, replace the dev phrase with your own mnemonic for a Polkadot TestNet-authorized account.\n\n    Run the script:\n\n    ```bash\n    npx tsx store-data.ts\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx store-data.ts</span>\n        <span data-ty>Connected to Bulletin Chain (Polkadot TestNet)</span>\n        <span data-ty>Read file: ./logo.png (27473 bytes)</span>\n        <span data-ty>Submitting store transaction...</span>\n        <span data-ty>Transaction included in block #2390908 (0x421554c87556b85c243a8edcbfe0223bfdff732175f2e4cfc5d6bc6c35563539)</span>\n        <span data-ty></span>\n        <span data-ty>Image stored successfully!</span>\n        <span data-ty>Index: 0</span>\n        <span data-ty>Content hash: 0x0ab299001ac2fb12ecade3821ea712406fca1812727df99fe7891ccdd21aed4e</span>\n        <span data-ty>CID: bafk2bzaceaflfgiadlbpwexmvxryehvhcjag7sqycjzh36m746erztosdlwu4</span>\n        <span data-ty></span>\n        <span data-ty>Retrieve via IPFS gateway:</span>\n        <span data-ty>https://paseo-bulletin-next-ipfs.polkadot.io/ipfs/bafk2bzaceaflfgiadlbpwexmvxryehvhcjag7sqycjzh36m746erztosdlwu4</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-store-data-bulletin-chain", "url": "https://developer.polkadot.com/chain-interactions/store-data/bulletin-chain/#verify-your-stored-image", "page_title": "Store and Retrieve Data on the Bulletin Chain", "index": 3, "depth": 2, "title": "Verify Your Stored Image", "anchor": "verify-your-stored-image", "start_char": 9969, "end_char": 10387, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d2b94e0a3c459123e6a88b5107b1588d0a71f0e2ffa35dce56e92c4022223ac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify Your Stored Image\n\nAfter storing your image, you can verify it was successfully recorded using the **Explorer** in the Console UI. Navigate to the block number where your image was stored, shown on the **Upload** page or printed by the store script, to see the `TransactionStorage.Stored` event with the content hash and CID.\n\n![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-8.webp)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-store-data-bulletin-chain", "url": "https://developer.polkadot.com/chain-interactions/store-data/bulletin-chain/#retrieve-your-data", "page_title": "Store and Retrieve Data on the Bulletin Chain", "index": 4, "depth": 2, "title": "Retrieve Your Data", "anchor": "retrieve-your-data", "start_char": 10387, "end_char": 13180, "estimated_token_count": 660, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d2b94e0a3c459123e6a88b5107b1588d0a71f0e2ffa35dce56e92c4022223ac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Retrieve Your Data\n\nThe Bulletin Chain follows a \"write-to-chain, read-from-network\" architecture — you retrieve data from collator nodes using the CID. For a full overview of retrieval methods, see the [reference page](/reference/polkadot-hub/data-storage/#retrieval-methods).\n\n=== \"Console UI\"\n\n    1. Navigate to the **Download** page in the [Bulletin Chain Console](https://paritytech.github.io/polkadot-bulletin-chain/).\n    2. Choose a retrieval method:\n\n        - **P2P Connection**: Connects directly to Bulletin Chain collator nodes (decentralized, recommended).\n        - **IPFS Gateway**: Uses the Bulletin Chain's IPFS gateway at `https://paseo-bulletin-next-ipfs.polkadot.io`.\n\n    3. Enter your **CID** in the \"Fetch by CID\" field — you can use either the `bafk2bzace...` format or the hex-encoded `0x0155a0e4...` format.\n    4. Click **Fetch Data** to retrieve your content. The UI also generates a direct **Gateway Link** you can open in your browser.\n\n        ![](/images/chain-interactions/store-data/bulletin-chain/bulletin-chain-9.webp)\n\n    !!! tip\n        You can also access your data directly in the browser via the Bulletin Chain IPFS gateway:\n\n        ```text\n        https://paseo-bulletin-next-ipfs.polkadot.io/ipfs/<CID>\n        ```\n\n        For fully decentralized retrieval, use P2P or the upcoming Smoldot light client.\n\n=== \"Programmatic (Gateway)\"\n\n    You can retrieve data programmatically using the Bulletin Chain's IPFS gateway:\n\n    ```typescript\n    const cid = 'INSERT_CID';\n    const response = await fetch(`https://paseo-bulletin-next-ipfs.polkadot.io/ipfs/${cid}`);\n    const data = await response.arrayBuffer();\n    console.log(`Retrieved ${data.byteLength} bytes`);\n    ```\n\n    !!! note\n        Replace `INSERT_CID` with the CID string you received when storing your data (e.g., `bafk2bzacea6wlxy...`).\n\n=== \"Direct P2P (Helia)\"\n\n    For production applications, the recommended decentralized approach is to connect directly to Bulletin Chain collator nodes using [Helia](https://helia.io/) (a lean IPFS implementation) and retrieve data via the CID over [libp2p](https://libp2p.io/).\n\n    This method requires knowing the public multiaddresses of Bulletin Chain collator nodes. See the [Bulletin Chain repository](https://github.com/paritytech/polkadot-bulletin-chain) for Helia configuration examples and available collator endpoints.\n\n!!! tip\n    Smoldot light client support for retrieval via the `bitswap_block` RPC is coming soon. This will enable fully trustless, decentralized data retrieval without connecting to a full node.\n\n!!! note\n    Stored data is only available within the retention period (~2 weeks on Polkadot TestNet). After that, the data is pruned from the chain and is no longer retrievable unless it has been renewed."}
{"source": "polkadot-docs", "page_id": "chain-interactions-store-data-bulletin-chain", "url": "https://developer.polkadot.com/chain-interactions/store-data/bulletin-chain/#renew-your-data", "page_title": "Store and Retrieve Data on the Bulletin Chain", "index": 5, "depth": 2, "title": "Renew Your Data", "anchor": "renew-your-data", "start_char": 13180, "end_char": 16808, "estimated_token_count": 812, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d2b94e0a3c459123e6a88b5107b1588d0a71f0e2ffa35dce56e92c4022223ac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Renew Your Data\n\nStored data is retained for a limited period (~2 weeks on Polkadot TestNet). If you need your image to remain available beyond the retention period, renew it before it expires.\n\n=== \"Console UI\"\n\n    1. Navigate to the **Renew** page in the [Bulletin Chain Console](https://paritytech.github.io/polkadot-bulletin-chain/) and connect your wallet.\n    2. Find your data in one of the following ways:\n        - On the **By CID** tab, enter your CID and click **Resolve CID**.\n        - On the **By Block + Index** tab, enter the **Block Number** and **Transaction Index** and click **Lookup Transaction**.\n    3. Check the expiration status, then choose an action and approve the transaction in your wallet extension:\n        - **Renew**: Schedules one renewal that takes effect when the current retention period ends. This is the `renew` call in the PAPI tab.\n        - **Renew immediately**: Renews the data now, and the full retention period restarts from the current block. This is the `force_renew` call.\n        - **Enable auto-renew**: Renews the data at the end of every retention period. The first renewal is prepaid, and later renewals use your authorization until it runs out. This is the `enable_auto_renew` call.\n\n=== \"PAPI\"\n\n    Register a renewal with the `DataRenewal` pallet. Identify your data by the content hash that the store script printed:\n\n    ```typescript\n    console.log('Registering renewal...');\n    const result = await api.tx.DataRenewal.renew({\n      entry: { type: 'ContentHash', value: 'INSERT_CONTENT_HASH' },\n    }).createAndSubmit(signer);\n    console.log(`Renewal registered in block: ${result.block.hash}`);\n    ```\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>npx tsx renew-data.ts</span>\n        <span data-ty>Registering renewal...</span>\n        <span data-ty>Renewal registered in block: 0xe6a65db5cea6f57705835fadb0f8e513f92dd9e6be4e12a264d1067c0bc58149</span>\n    </div>\n    \n\nThe `renew` call registers a one-time renewal. When the retention period of your data ends, the chain stores the data again, so it stays available for another full retention period. The renewal is paid from your authorization when you register it. Each content hash can have only one registered renewal at a time, so registering again before this one takes effect fails with `RenewalAlreadyEnabled`.\n\nThe `DataRenewal` pallet also provides the following alternatives:\n\n- **`force_renew`**: Renews the data immediately. It takes the same `entry` argument as `renew`.\n- **`enable_auto_renew`**: Renews the data at the end of every retention period. It takes the data's content hash. Each renewal after the first is charged to your authorization, and recurring renewal stops if your authorization cannot cover it.\n\n!!! warning\n    You can also identify the data by its position, using the block number and the `Index` value that the store script printed:\n\n    ```typescript\n    entry: {\n      type: 'Position',\n      value: { block: INSERT_BLOCK_NUMBER, index: INSERT_INDEX },\n    },\n    ```\n\n    A position identifies one stored copy of the data and stays valid until that copy's retention period ends. Each renewal stores a new copy at a new block number and index. When a `renew` takes effect, the original copy expires at the same time, and calls that use its position fail with `RenewedNotFound`. After `force_renew`, the original copy keeps its position until its own period ends, so renewing that position again stores another copy. The content hash always resolves to the latest copy."}
{"source": "polkadot-docs", "page_id": "chain-interactions-store-data-bulletin-chain", "url": "https://developer.polkadot.com/chain-interactions/store-data/bulletin-chain/#where-to-go-next", "page_title": "Store and Retrieve Data on the Bulletin Chain", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 16808, "end_char": 17159, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d2b94e0a3c459123e6a88b5107b1588d0a71f0e2ffa35dce56e92c4022223ac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge reference\">Reference</span> __Data Storage Reference__\n\n    ---\n\n    Explore the full technical reference for the Bulletin Chain, including all extrinsics, storage items, and events.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/data-storage/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#introduction", "page_title": "Convert Assets on Asset Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 32, "end_char": 580, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nAsset Conversion is an Automated Market Maker (AMM) utilizing [Uniswap V2](https://github.com/Uniswap/v2-core) logic and implemented as a pallet on Polkadot's Asset Hub.\n\nThis guide will provide detailed information about the key functionalities offered by the [Asset Conversion](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/substrate/frame/asset-conversion) pallet on Asset Hub, including:\n\n- Creating a liquidity pool.\n- Adding liquidity to a pool.\n- Swapping assets.\n- Withdrawing liquidity from a pool."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#prerequisites", "page_title": "Convert Assets on Asset Hub", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 580, "end_char": 1240, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore converting assets on Asset Hub, you must ensure you have:\n\n- Access to the [Polkadot.js Apps](https://polkadot.js.org/apps) interface and a connection with the intended blockchain.\n- A funded wallet containing the assets you wish to convert and enough available funds to cover the transaction fees.\n- An asset registered on Asset Hub that you want to convert. If you haven't created an asset on Asset Hub yet, refer to the [Register a Local Asset](/chain-interactions/token-operations/register-local-asset/) or [Register a Foreign Asset](/chain-interactions/token-operations/register-foreign-asset/) documentation to create an asset."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#create-a-liquidity-pool", "page_title": "Convert Assets on Asset Hub", "index": 2, "depth": 2, "title": "Create a Liquidity Pool", "anchor": "create-a-liquidity-pool", "start_char": 1240, "end_char": 4256, "estimated_token_count": 687, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create a Liquidity Pool\n\nIf an asset on Asset Hub does not have an existing liquidity pool, the first step is to create one.\n\nThe asset conversion pallet provides the `createPool` extrinsic to create a new liquidity pool, creating an empty liquidity pool and a new `LP token` asset.\n\n!!! tip\n    A testing token with the asset ID `1112` and the name `PPM` was created for this example.\n\nAs stated in the [Test Environment Setup](#test-environment-setup) section, this tutorial is based on the assumption that you have an instance of Polkadot Asset Hub running locally. Therefore, the demo liquidity pool will be created between DOT and PPM tokens. However, the same steps can be applied to any other asset on Asset Hub.\n\nFrom the Asset Hub perspective, the Multilocation that identifies the PPM token is the following:\n\n```javascript\n{\n  parents: 0,\n  interior: {\n    X2: [{ PalletInstance: 50 }, { GeneralIndex: 1112 }]\n  }\n}\n```\n\nThe `PalletInstance` value of `50` represents the Assets pallet on Asset Hub. The `GeneralIndex` value of `1112` is the PPM asset's asset ID.\n\nTo create the liquidity pool, you can follow these steps:\n\n1. Navigate to the **Extrinsics** section on the Polkadot.js Apps interface:\n\n    1. Select **Developer** from the top menu.\n    2. Click on **Extrinsics** from the dropdown menu.\n\n    ![Extrinsics Section](/images/chain-interactions/token-operations/convert-assets/convert-assets-01.webp)\n\n2. Select extrinsic to create the pool:\n\n    1. Select the **`AssetConversion`** pallet.\n    2. Choose the **`createPool`** extrinsic from the list of available extrinsics.\n\n    ![Create Pool Extrinsic](/images/chain-interactions/token-operations/convert-assets/convert-assets-02.webp)\n\n3. Fill in the required fields:\n\n    1. **`asset1`**: The Multilocation of the first asset in the pool. In this case, it is the DOT token, which the following Multilocation represents.\n\n        ```javascript\n        {\n          parents: 0,\n          interior: 'Here'\n        }\n        ```\n\n    2. **`asset2`**: The second asset's Multilocation within the pool. This refers to the PPM token, which the following Multilocation identifies.\n\n        ```javascript\n        {\n          parents: 0,\n          interior: {\n            X2: [{ PalletInstance: 50 }, { GeneralIndex: 1112 }]\n          }\n        }\n        ```\n\n    3. Click on **Submit Transaction** to create the liquidity pool.\n\n    ![Create Pool Fields](/images/chain-interactions/token-operations/convert-assets/convert-assets-03.webp)\n\nSigning and submitting the transaction triggers the creation of the liquidity pool. To verify the new pool's creation, check the **Explorer** section on the Polkadot.js Apps interface and ensure that the **`PoolCreated`** event was emitted.\n\n![Pool Created Event](/images/chain-interactions/token-operations/convert-assets/convert-assets-04.webp)\n\nAs the preceding image shows, the **`lpToken`** ID created for this pool is 19. This ID is essential to identify the liquidity pool and associated LP tokens."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#add-liquidity-to-a-pool", "page_title": "Convert Assets on Asset Hub", "index": 3, "depth": 2, "title": "Add Liquidity to a Pool", "anchor": "add-liquidity-to-a-pool", "start_char": 4256, "end_char": 7411, "estimated_token_count": 690, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Add Liquidity to a Pool\n\nThe `addLiquidity` extrinsic allows users to provide liquidity to a pool of two assets. Users specify their preferred amounts for both assets and minimum acceptable quantities. The function determines the best asset contribution, which may vary from the amounts desired but won't fall below the specified minimums. Providers receive liquidity tokens representing their pool portion in return for their contribution.\n\nTo add liquidity to a pool, follow these steps:\n\n1. Navigate to the **Extrinsics** section on the Polkadot.js Apps interface:\n\n    1. Select **Developer** from the top menu.\n    2. Click on **Extrinsics** from the dropdown menu.\n\n    ![Extrinsics Section](/images/chain-interactions/token-operations/convert-assets/convert-assets-01.webp)\n\n2. Select extrinsic to add liqudity:\n\n    1. Select the **`assetConversion`** pallet.\n    2. Choose the **`addLiquidity`** extrinsic from the list of available extrinsics.\n\n    ![Add Liquidity Extrinsic](/images/chain-interactions/token-operations/convert-assets/convert-assets-05.webp)\n\n3. Fill in the required fields:\n\n    1. **`asset1`**: The Multilocation of the first asset in the pool. In this case, it is the DOT token, which the following Multilocation represents.\n\n        ```javascript\n        {\n          parents: 0,\n          interior: 'Here'\n        }\n        ```\n\n    2. **`asset2`**: The second asset's Multilocation within the pool. This refers to the PPM token, which the following Multilocation identifies.\n\n        ```javascript\n        {\n          parents: 0,\n          interior: {\n            X2: [{ PalletInstance: 50 }, { GeneralIndex: 1112 }]\n          }\n        }\n        ```\n\n    3. **`amount1Desired`**: The amount of the first asset that will be contributed to the pool.\n    4. **`amount2Desired`**: The quantity of the second asset intended for pool contribution.\n    5. **`amount1Min`**: The minimum amount of the first asset that will be contributed.\n    6. **`amount2Min`**: The lowest acceptable quantity of the second asset for contribution.\n    7. **`mintTo`**: The account to which the liquidity tokens will be minted.\n    8. Click on **Submit Transaction** to add liquidity to the pool.\n\n    ![Add Liquidity Fields](/images/chain-interactions/token-operations/convert-assets/convert-assets-06.webp)\n\n    !!! warning\n        Ensure that the appropriate amount of tokens provided has been minted previously and is available in your account before adding liquidity to the pool.\n\n    In this case, the liquidity provided to the pool is between DOT tokens and PPM tokens with the asset ID 1112 on Polkadot Asset Hub. The intention is to provide liquidity for 1 DOT token (`u128` value of 1000000000000 as it has 10 decimals) and 1 PPM token (`u128` value of 1000000000000 as it also has 10 decimals).\n\nSigning and submitting the transaction adds liquidity to the pool. To verify the liquidity addition, check the **Explorer** section on the Polkadot.js Apps interface and ensure that the **`LiquidityAdded`** event was emitted.\n\n![Liquidity Added Event](/images/chain-interactions/token-operations/convert-assets/convert-assets-07.webp)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#swap-assets", "page_title": "Convert Assets on Asset Hub", "index": 4, "depth": 2, "title": "Swap Assets", "anchor": "swap-assets", "start_char": 7411, "end_char": 7427, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Swap Assets"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#swap-from-an-exact-amount-of-tokens", "page_title": "Convert Assets on Asset Hub", "index": 5, "depth": 3, "title": "Swap from an Exact Amount of Tokens", "anchor": "swap-from-an-exact-amount-of-tokens", "start_char": 7427, "end_char": 10798, "estimated_token_count": 722, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Swap from an Exact Amount of Tokens\n\nThe asset conversion pallet enables users to exchange a specific quantity of one asset for another in a designated liquidity pool by swapping them for an exact amount of tokens. It guarantees the user will receive at least a predetermined minimum amount of the second asset. This function increases trading predictability and allows users to conduct asset exchanges with confidence that they are assured a minimum return.\n\nTo swap assets for an exact amount of tokens, follow these steps:\n\n1. Navigate to the **Extrinsics** section on the Polkadot.js Apps interface:\n\n    1. Select **Developer** from the top menu.\n    2. Click on **Extrinsics** from the dropdown menu.\n\n    ![Extrinsics Section](/images/chain-interactions/token-operations/convert-assets/convert-assets-01.webp)\n\n2. Select extrinsic to swap assets:\n\n    1. Select the **`AssetConversion`** pallet.\n    2. Choose the **`swapExactTokensForTokens`** extrinsic from the list of available extrinsics.\n\n    ![Swap From Exact Tokens Extrinsic](/images/chain-interactions/token-operations/convert-assets/convert-assets-08.webp)\n\n3. Fill in the required fields:\n\n    1. **`path: Vec<StagingXcmV3MultiLocation>`**: An array of Multilocations representing the path of the swap. The first and last elements of the array are the input and output assets, respectively. In this case, the path consists of two elements:\n\n        - **`0: StagingXcmV3MultiLocation`**: The Multilocation of the first asset in the pool. In this case, it is the DOT token, which the following Multilocation represents.\n\n            ```javascript\n            {\n              parents: 0,\n              interior: 'Here'\n            }\n            ```\n\n        - **`1: StagingXcmV3MultiLocation`**: The second asset's Multilocation within the pool. This refers to the PPM token, which the following Multilocation identifies.\n\n            ```javascript\n            {\n              parents: 0,\n              interior: {\n                X2: [{ PalletInstance: 50 }, { GeneralIndex: 1112 }]\n              }\n            }\n            ```\n\n    2. **`amountOut`**: The exact amount of the second asset that the user wants to receive.\n    3. **`amountInMax`**: The maximum amount of the first asset that the user is willing to swap.\n    4. **`sendTo`**: The account to which the swapped assets will be sent.\n    5. **`keepAlive`**: A boolean value that determines whether the pool should be kept alive after the swap.\n    6. Click on **Submit Transaction** to swap assets for an exact amount of tokens.\n\n    ![Swap For Exact Tokens Fields](/images/chain-interactions/token-operations/convert-assets/convert-assets-09.webp)\n\n    !!! warning\n        Ensure that the appropriate amount of tokens provided has been minted previously and is available in your account before adding liquidity to the pool.\n\n    In this case, the intention is to swap 0.01 DOT token (u128 value of 100000000000 as it has 10 decimals) for 0.04 PPM token (u128 value of 400000000000 as it also has 10 decimals).\n\nSigning and submitting the transaction will execute the swap. To verify execution, check the **Explorer** section on the Polkadot.js Apps interface and make sure that the **`SwapExecuted`** event was emitted.\n\n![Swap From Exact Tokens Event](/images/chain-interactions/token-operations/convert-assets/convert-assets-10.webp)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#swap-to-an-exact-amount-of-tokens", "page_title": "Convert Assets on Asset Hub", "index": 6, "depth": 3, "title": "Swap to an Exact Amount of Tokens", "anchor": "swap-to-an-exact-amount-of-tokens", "start_char": 10798, "end_char": 14108, "estimated_token_count": 721, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Swap to an Exact Amount of Tokens\n\nConversely, the Asset Conversion pallet comes with a function that allows users to trade a variable amount of one asset to acquire a precise quantity of another. It ensures that users stay within a set maximum of the initial asset to obtain the desired amount of the second asset. This provides a method to control transaction costs while achieving the intended result.\n\nTo swap assets for an exact amount of tokens, follow these steps:\n\n1. Navigate to the **Extrinsics** section on the Polkadot.js Apps interface:\n\n    1. Select **Developer** from the top menu.\n    2. Click on **Extrinsics** from the dropdown menu.\n\n    ![Extrinsics Section](/images/chain-interactions/token-operations/convert-assets/convert-assets-01.webp)\n\n2. Select extrinsic to swap tokens:\n\n    1. Select the **`AssetConversion`** pallet.\n    2. Choose the **`swapTokensForExactTokens`** extrinsic from the list of available extrinsics.\n\n    ![Swap Tokens For Exact Tokens Extrinsic](/images/chain-interactions/token-operations/convert-assets/convert-assets-11.webp)\n\n3. Fill in the required fields:\n\n    1. **`path: Vec<StagingXcmV3MultiLocation\\>`**: An array of Multilocations representing the path of the swap. The first and last elements of the array are the input and output assets, respectively. In this case, the path consists of two elements:\n        - **`0: StagingXcmV3MultiLocation`**: The Multilocation of the first asset in the pool. In this case, it is the PPM token, which the following Multilocation represents.\n\n            ```javascript\n            {\n              parents: 0,\n              interior: {\n                X2: [{ PalletInstance: 50 }, { GeneralIndex: 1112 }]\n              }\n            }\n            ```\n\n        - **`1: StagingXcmV3MultiLocation`**: The second asset's Multilocation within the pool. This refers to the DOT token, which the following Multilocation identifies.\n\n            ```javascript\n            {\n              parents: 0,\n              interior: 'Here'\n            }\n            ```\n\n    2. **`amountOut`**: The exact amount of the second asset that the user wants to receive.\n    3. **`amountInMax`**: The maximum amount of the first asset that the user is willing to swap.\n    4. **`sendTo`**: The account to which the swapped assets will be sent.\n    5. **`keepAlive`**: A boolean value that determines whether the pool should be kept alive after the swap.\n    6. Click on **Submit Transaction** to swap assets for an exact amount of tokens.\n\n    ![Swap Tokens For Exact Tokens Fields](/images/chain-interactions/token-operations/convert-assets/convert-assets-12.webp)\n\n    !!! warning\n        Before swapping assets, ensure that the tokens provided have been minted previously and are available in your account.\n\n    In this case, the intention is to swap 0.01 DOT token (`u128` value of 100000000000 as it has ten decimals) for 0.04 PPM token (`u128` value of 400000000000 as it also has ten decimals).\n\nSigning and submitting the transaction will execute the swap. To verify execution, check the **Explorer** section on the Polkadot.js Apps interface and make sure that the **`SwapExecuted`** event was emitted.\n\n![Swap Tokens For Exact Tokens Event](/images/chain-interactions/token-operations/convert-assets/convert-assets-13.webp)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#withdraw-liquidity-from-a-pool", "page_title": "Convert Assets on Asset Hub", "index": 7, "depth": 2, "title": "Withdraw Liquidity from a Pool", "anchor": "withdraw-liquidity-from-a-pool", "start_char": 14108, "end_char": 17322, "estimated_token_count": 691, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Withdraw Liquidity from a Pool\n\nThe Asset Conversion pallet provides the `removeLiquidity` extrinsic to remove liquidity from a pool. This function allows users to withdraw the liquidity they offered from a pool, returning the original assets. When calling this function, users specify the number of liquidity tokens (representing their share in the pool) they wish to burn. They also set minimum acceptable amounts for the assets they expect to receive back. This mechanism ensures that users can control the minimum value they receive, protecting against unfavorable price movements during the withdrawal process.\n\nTo withdraw liquidity from a pool, follow these steps:\n\n1. Navigate to the **Extrinsics** section on the Polkadot.js Apps interface:\n\n    1. Select **Developer** from the top menu.\n    2. Click on **Extrinsics** from the dropdown menu.\n\n    ![Extrinsics Section](/images/chain-interactions/token-operations/convert-assets/convert-assets-01.webp)\n\n2. Select extrinsic to withdraw liqudity from a pool:\n\n    1. Select the **`AssetConversion`** pallet.\n    2. Choose the **`removeLiquidity`** extrinsic from the list of available extrinsics.\n\n    ![Remove Liquidity Extrinsic](/images/chain-interactions/token-operations/convert-assets/convert-assets-14.webp)\n\n3. Fill in the required fields:\n\n    1. **`asset1`**: The Multilocation of the first asset in the pool. In this case, it is the DOT token, which the following Multilocation represents.\n\n        ```javascript\n        {\n          parents: 0,\n          interior: 'Here'\n        }\n        ```\n\n    2. **`asset2`**: The second asset's Multilocation within the pool. This refers to the PPM token, which the following Multilocation identifies.\n\n        ```javascript\n        {\n          parents: 0,\n          interior: {\n            X2: [{ PalletInstance: 50 }, { GeneralIndex: 1112 }]\n          }\n        }\n        ```\n\n    3. **`lpTokenBurn`**: The number of liquidity tokens to burn.\n    4. **`amount1MinReceived`**: The minimum amount of the first asset that the user expects to receive.\n    5. **`amount2MinReceived`**: The minimum quantity of the second asset the user expects to receive.\n    6. **`withdrawTo`**: The account to which the withdrawn assets will be sent.\n    7. Click on **Submit Transaction** to withdraw liquidity from the pool.\n\n    ![Remove Liquidity Fields](/images/chain-interactions/token-operations/convert-assets/convert-assets-15.webp)\n\n    !!! warning\n        Ensure that the tokens provided have been minted previously and are available in your account before withdrawing liquidity from the pool.\n\n    In this case, the intention is to withdraw 0.05 liquidity tokens from the pool, expecting to receive 0.004 DOT token (`u128` value of 40000000000 as it has 10 decimals) and 0.04 PPM token (`u128` value of 400000000000 as it also has 10 decimals).\n\nSigning and submitting the transaction will initiate the withdrawal of liquidity from the pool. To verify the withdrawal, check the **Explorer** section on the Polkadot.js Apps interface and ensure that the **`LiquidityRemoved`** event was emitted.\n\n![Remove Liquidity Event](/images/chain-interactions/token-operations/convert-assets/convert-assets-16.webp)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-convert-assets", "url": "https://developer.polkadot.com/chain-interactions/token-operations/convert-assets/#test-environment-setup", "page_title": "Convert Assets on Asset Hub", "index": 8, "depth": 2, "title": "Test Environment Setup", "anchor": "test-environment-setup", "start_char": 17322, "end_char": 18384, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cfebb3758f79c1293f23a2ce1e812dd974214964ed64629f0e5b4dd55d830c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Environment Setup\n\nTo test the Asset Conversion pallet, you can set up a local test environment to simulate different scenarios. This guide uses Chopsticks to spin up an instance of Polkadot Asset Hub. For further details on using Chopsticks, please refer to the [Chopsticks documentation](/parachains/testing/fork-a-parachain/).\n\nTo set up a local test environment, execute the following command:\n\n```bash\nnpx @acala-network/chopsticks \\\n--config=https://raw.githubusercontent.com/AcalaNetwork/chopsticks/master/configs/polkadot-asset-hub.yml\n```\n\nThis command initiates a lazy fork of Polkadot Asset Hub, including the most recent block information from the network. For Kusama Asset Hub testing, simply switch out `polkadot-asset-hub.yml` with `kusama-asset-hub.yml` in the command.\n\nYou now have a local Asset Hub instance up and running, ready for you to test various asset conversion procedures. The process here mirrors what you'd do on MainNet. After completing a transaction on TestNet, you can apply the same steps to convert assets on MainNet."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-foreign-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-foreign-asset/#introduction", "page_title": "Register a Foreign Asset", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 45, "end_char": 1035, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:84068fc7b127fa5ab0042e0efe27c7fdb286d678f0c55fc6f24177ed2fd105f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nAs outlined in the [Assets on Polkadot Hub Overview](/reference/polkadot-hub/assets/), Polkadot Hub supports two categories of assets: local and foreign. Local assets are created on Polkadot Hub and are identified by integer IDs. On the other hand, foreign assets, which originate outside of Polkadot Hub, are recognized by [Multilocations](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#7-universal-consensus-location-identifiers).\n\nWhen registering a foreign asset on Polkadot Hub, it's essential to notice that the process involves communication between two parachains. The Polkadot Hub chain will be the destination of the foreign asset, while the source parachain will be the origin of the asset. The communication between the two parachains is facilitated by the [Cross-Chain Message Passing (XCMP)](/parachains/interoperability/get-started/) protocol.\n\nThis guide will take you through the process of registering a foreign asset on Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-foreign-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-foreign-asset/#prerequisites", "page_title": "Register a Foreign Asset", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1035, "end_char": 2578, "estimated_token_count": 420, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:84068fc7b127fa5ab0042e0efe27c7fdb286d678f0c55fc6f24177ed2fd105f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nPolkadot Hub is a system parachain on a relay chain, such as [Polkadot](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot.api.onfinality.io%2Fpublic-ws#/explorer) or [Kusama](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.api.onfinality.io%2Fpublic-ws#/explorer). To interact with these parachains, you can use the [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) interface for:\n\n- [Polkadot Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fasset-hub-polkadot-rpc.dwellir.com#/explorer)\n- [Kusama Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fsys.ibp.network%2Fstatemine#/explorer)\n\nFor testing purposes, you can also interact with the TestNet Polkadot Hub instance:\n\n- [TestNet Polkadot Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpas-rpc.stakeworld.io%2Fassethub#/explorer)\n\nBefore you start, ensure that you have: \n\n- Access to the Polkadot.js Apps interface, and you are connected to the desired chain.\n- A parachain that supports the XCMP protocol to interact with the Polkadot Hub parachain.\n- A funded wallet to pay for the transaction fees and subsequent registration of the foreign asset.\n\nThis guide will use Polkadot, its local Polkadot Hub instance, and the [Astar](https://astar.network/) parachain (`ID` 2006), as stated in the [Test Environment Setup](#test-environment-setup) section. However, the process is the same for other relay chains and their respective Polkadot Hub parachain, regardless of the network you are using and the parachain owner of the foreign asset."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-foreign-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-foreign-asset/#register-a-foreign-asset", "page_title": "Register a Foreign Asset", "index": 2, "depth": 2, "title": "Register a Foreign Asset", "anchor": "register-a-foreign-asset", "start_char": 2578, "end_char": 2607, "estimated_token_count": 6, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:84068fc7b127fa5ab0042e0efe27c7fdb286d678f0c55fc6f24177ed2fd105f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Register a Foreign Asset"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-foreign-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-foreign-asset/#polkadot-hub", "page_title": "Register a Foreign Asset", "index": 3, "depth": 3, "title": "Polkadot Hub", "anchor": "polkadot-hub", "start_char": 2607, "end_char": 5690, "estimated_token_count": 698, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:84068fc7b127fa5ab0042e0efe27c7fdb286d678f0c55fc6f24177ed2fd105f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Polkadot Hub\n\nTo register a foreign asset on Polkadot Hub, follow these steps:\n\n1. Open the [Polkadot.js Apps](https://polkadot.js.org/apps/) interface and connect to Polkadot Hub using the network selector in the top left corner.\n\n      - Testing foreign asset registration is recommended on TestNet before proceeding to MainNet. If you haven't set up a local testing environment yet, consult the [Environment setup](#test-environment-setup) guide. After setting up, connect to the Local Node (Chopsticks) at `ws://127.0.0.1:8000`.\n      - For live network operations, connect to Polkadot Hub. You can choose either Polkadot or Kusama Asset Hub from the dropdown menu, selecting your preferred RPC provider.\n\n2. Navigate to the **Extrinsics** page:\n\n      1. Click on the **Developer** tab from the top navigation bar.\n      2. Select **Extrinsics** from the dropdown.\n\n    ![Access to Developer Extrinsics section](/images/chain-interactions/token-operations/register-foreign-asset/register-a-foreign-asset-01.webp)\n\n3. Select the Foreign Assets pallet:\n\n      3. Select the **`foreignAssets`** pallet from the dropdown list.\n      4. Choose the **`create`** extrinsic.\n\n    ![Select the Foreign Asset pallet](/images/chain-interactions/token-operations/register-foreign-asset/register-a-foreign-asset-02.webp)\n\n3. Fill out the required fields and click on the copy icon to copy the **encoded call data** to your clipboard. The fields to be filled are:\n\n    - **id**: As this is a foreign asset, the ID will be represented by a Multilocation that reflects its origin. For this case, the Multilocation of the asset will be from the source parachain perspective.\n  \n        ```javascript\n        { parents: 1, interior: { X1: [{ Parachain: 2006 }] } }\n        ```\n\n    - **admin**: Refers to the account that will be the admin of this asset. This account will be able to manage the asset, including updating its metadata. As the registered asset corresponds to a native asset of the source parachain, the admin account should be the sovereign account of the source parachain.\n      \n        The sovereign account can be obtained through [Substrate Utilities](https://www.shawntabrizi.com/substrate-js-utilities/).\n\n        Ensure that **Sibling** is selected and that the **Para ID** corresponds to the source parachain. In this case, since the guide follows the test setup stated in the [Test Environment Setup](#test-environment-setup) section, the **Para ID** is `2006`.\n\n        ![Get parachain sovereign account](/images/chain-interactions/token-operations/register-foreign-asset/register-a-foreign-asset-03.webp)\n\n\n    - **`minBalance`**: The minimum balance required to hold this asset.\n\n    ![Fill out the required fields](/images/chain-interactions/token-operations/register-foreign-asset/register-a-foreign-asset-04.webp)\n\n    !!! tip \n        If you need an example of the encoded call data, you can copy the following:\n        ```\n        0x3500010100591f007369626cd6070000000000000000000000000000000000000000000000000000a0860100000000000000000000000000\n        ```"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-foreign-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-foreign-asset/#source-parachain", "page_title": "Register a Foreign Asset", "index": 4, "depth": 3, "title": "Source Parachain", "anchor": "source-parachain", "start_char": 5690, "end_char": 7481, "estimated_token_count": 322, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:84068fc7b127fa5ab0042e0efe27c7fdb286d678f0c55fc6f24177ed2fd105f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Source Parachain\n\nWith the encoded call data you generated in the previous section, you can take the following steps on the source parachain to complete the asset registration process:\n\n1. Navigate to the **Developer > Extrinsics** section.\n2. Create the extrinsic to register the foreign asset through XCM:\n\n      1. Paste the **encoded call data** copied in the previous step.\n      2. Click the **Submit Transaction** button.\n\n    ![Register foreign asset through XCM](/images/chain-interactions/token-operations/register-foreign-asset/register-a-foreign-asset-05.webp)\n\n    This XCM call involves withdrawing DOT from the sibling account of the parachain, using it to initiate an execution. The transaction will be carried out with XCM as the origin kind, and will be a hex-encoded call to create a foreign asset on Polkadot Hub for the specified parachain asset multilocation. Any surplus will be refunded, and the asset will be deposited into the sibling account.\n\n    !!! warning\n        Note that the sovereign account on Polkadot Hub must have a sufficient balance to cover the XCM `BuyExecution` instruction. If the account does not have enough balance, the transaction will fail.\n\n    If you want to have the whole XCM call ready to be copied, go to the **Developer > Extrinsics > Decode** section and paste the following hex-encoded call data:\n\n    ```text\n    0x6300330003010100a10f030c000400010000070010a5d4e81300010000070010a5d4e80006030700b4f13501419ce03500010100591f007369626cd607000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n    ```\n\n    Be sure to replace the encoded call data with the one you copied in the previous step.\n\nAfter the transaction is successfully executed, the foreign asset will be registered on Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-foreign-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-foreign-asset/#asset-registration-verification", "page_title": "Register a Foreign Asset", "index": 5, "depth": 2, "title": "Asset Registration Verification", "anchor": "asset-registration-verification", "start_char": 7481, "end_char": 8028, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:84068fc7b127fa5ab0042e0efe27c7fdb286d678f0c55fc6f24177ed2fd105f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Asset Registration Verification\n\nTo confirm that a foreign asset has been successfully accepted and registered on Polkadot Hub, you can navigate to the **Network > Explorer** section of the Polkadot.js Apps interface for Polkadot Asset Hub. You should be able to see an event that includes the following details:\n\n![Asset registration event](/images/chain-interactions/token-operations/register-foreign-asset/register-a-foreign-asset-06.webp)\n\nIn the image above, the **success** field indicates whether the asset registration was successful."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-foreign-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-foreign-asset/#test-environment-setup", "page_title": "Register a Foreign Asset", "index": 6, "depth": 2, "title": "Test Environment Setup", "anchor": "test-environment-setup", "start_char": 8028, "end_char": 9581, "estimated_token_count": 361, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:84068fc7b127fa5ab0042e0efe27c7fdb286d678f0c55fc6f24177ed2fd105f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Environment Setup\n\nTo test the foreign asset registration process before deploying it on a live network, you can set up a local parachain environment. This guide uses Chopsticks to simulate that process. For more information on using Chopsticks, please refer to the [Chopsticks documentation](/parachains/testing/fork-a-parachain/).\n\nTo set up a test environment, run the following command:\n\n```bash\nnpx @acala-network/chopsticks xcm \\\n--r polkadot \\\n--p polkadot-asset-hub \\\n--p astar\n```\n\nThe preceding command will create a lazy fork of Polkadot as the relay chain, its Polkadot Hub instance, and the Astar parachain. The `xcm` parameter enables communication through the XCMP protocol between the relay chain and the parachains, allowing the registration of foreign assets on Polkadot Hub. For further information on the chopsticks usage of the XCMP protocol, refer to the [Replay and Dry Run XCMs using Chopsticks](/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/) guide.\n\nAfter executing the command, the terminal will display output indicating the Polkadot relay chain, Polkadot Hub, and the Astar parachain are running locally and connected through XCM. You can access them individually via the Polkadot.js Apps interface.\n\n- [Polkadot Relay Chain](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Flocalhost%3A8002#/explorer)\n- [Polkadot Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Flocalhost%3A8000#/explorer)\n- [Astar Parachain](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Flocalhost%3A8001#/explorer)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-local-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-local-asset/#introduction", "page_title": "Register a Local Asset", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 43, "end_char": 513, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:27b6c4cc605d1ec92838c2bacc230c2cfde9b9c51272df482411092aa2d90d9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nAs detailed in the [Assets on Polkadot Hub Overview](/reference/polkadot-hub/assets/) page, Polkadot Hub accommodates two types of assets: local and foreign. Local assets are those that were created in Polkadot Hub and are identifiable by an integer ID. On the other hand, foreign assets originate from a sibling parachain and are identified by a Multilocation.\n\nThis guide will take you through the steps of registering a local asset on Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-local-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-local-asset/#prerequisites", "page_title": "Register a Local Asset", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 513, "end_char": 1044, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:27b6c4cc605d1ec92838c2bacc230c2cfde9b9c51272df482411092aa2d90d9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have access to the [Polkadot.js Apps](https://polkadot.js.org/apps/) interface and a funded wallet with DOT or KSM.\n\n- For Polkadot Hub, you would need a deposit of 10 DOT and around 0.201 DOT for the metadata.\n- For Kusama Hub, the deposit is 0.1 KSM and around 0.000669 KSM for the metadata.\n\nYou need to ensure that your Polkadot Hub account balance is a bit more than the sum of those two deposits, which should seamlessly account for the required deposits and transaction fees."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-local-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-local-asset/#register-a-local-asset", "page_title": "Register a Local Asset", "index": 2, "depth": 2, "title": "Register a Local Asset", "anchor": "register-a-local-asset", "start_char": 1044, "end_char": 4237, "estimated_token_count": 792, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:27b6c4cc605d1ec92838c2bacc230c2cfde9b9c51272df482411092aa2d90d9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Register a Local Asset\n\nTo register a local asset on Polkadot Hub, follow these steps:\n\n1. Open the [Polkadot.js Apps](https://polkadot.js.org/apps/) interface and connect to the Polkadot Asset Hub using the network selector in the top left corner.\n\n      - You may prefer to test local asset registration on TestNet before registering the asset on a MainNet hub. If you still need to set up a local testing environment, review the [Environment setup](#test-setup-environment) section for instructions. Once the local environment is set up, connect to the Local Node (Chopsticks) available on `ws://127.0.0.1:8000`.\n      - For the live network, connect to the **Asset Hub** parachain. Either Polkadot or Kusama Asset Hub can be selected from the dropdown list, choosing the desired RPC provider.\n\n2. Click on the **Network** tab on the top navigation bar and select **Assets** from the dropdown list.\n\n      ![Access to Polkadot Hub through Polkadot.JS](/images/chain-interactions/token-operations/register-local-asset/register-a-local-asset-01.webp)\n\n3. Now, you need to examine all the registered asset IDs. This step is crucial to ensure that the asset ID you are about to register is unique. Asset IDs are displayed in the **assets** column.\n\n      ![Asset IDs on Polkadot Hub](/images/chain-interactions/token-operations/register-local-asset/register-a-local-asset-02.webp)\n\n4. Once you have confirmed that the asset ID is unique, click on the **Create** button on the top right corner of the page.\n\n      ![Create a new asset](/images/chain-interactions/token-operations/register-local-asset/register-a-local-asset-03.webp)\n\n5. Fill in the required fields in the **Create Asset** form:\n\n    1. **creator account**: The account to be used for creating this asset and setting up the initial metadata.\n    2. **asset name**: The descriptive name of the asset you are registering.\n    3. **asset symbol**: The symbol that will be used to represent the asset.\n    4. **asset decimals**: The number of decimal places for this token, with a maximum of 20 allowed through the user interface.\n    5. **minimum balance**: The minimum balance for the asset. This is specified in the units and decimals as requested.\n    6. **asset ID**: The selected id for the asset. This should not match an already-existing asset id.\n    7. Click on the **Next** button.\n \n    ![Create Asset Form](/images/chain-interactions/token-operations/register-local-asset/register-a-local-asset-04.webp)\n\n6. Choose the accounts for the roles listed below:\n\n    1. **admin account**: The account designated for continuous administration of the token.\n    2. **issuer account**: The account that will be used for issuing this token.\n    3. **freezer account**: The account that will be used for performing token freezing operations.\n    4. Click on the **Create** button.\n\n    ![Admin, Issuer, Freezer accounts](/images/chain-interactions/token-operations/register-local-asset/register-a-local-asset-05.webp)\n\n7. Click on the **Sign and Submit** button to complete the asset registration process.\n\n    ![Sign and Submit](/images/chain-interactions/token-operations/register-local-asset/register-a-local-asset-06.webp)"}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-local-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-local-asset/#verify-asset-registration", "page_title": "Register a Local Asset", "index": 3, "depth": 2, "title": "Verify Asset Registration", "anchor": "verify-asset-registration", "start_char": 4237, "end_char": 5130, "estimated_token_count": 234, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:27b6c4cc605d1ec92838c2bacc230c2cfde9b9c51272df482411092aa2d90d9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify Asset Registration\n\nAfter completing these steps, the asset will be successfully registered. You can now view your asset listed on the [**Assets**](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fasset-hub-polkadot-rpc.dwellir.com#/assets) section of the Polkadot.js Apps interface.\n\n![Asset listed on Polkadot.js Apps](/images/chain-interactions/token-operations/register-local-asset/register-a-local-asset-07.webp)\n\n!!! tip\n    Take into consideration that the **Assets** section’s link may differ depending on the network you are using. For the local environment, enter `ws://127.0.0.1:8000` into the **Custom Endpoint** field.\n\nIn this way, you have successfully registered a local asset on the Polkadot Hub.\n\nFor an in-depth explanation about Polkadot Hub and its features, see the [Polkadot Hub](/chain-interactions/token-operations/convert-assets/) entry in the Polkadot Wiki."}
{"source": "polkadot-docs", "page_id": "chain-interactions-token-operations-register-local-asset", "url": "https://developer.polkadot.com/chain-interactions/token-operations/register-local-asset/#test-setup-environment", "page_title": "Register a Local Asset", "index": 4, "depth": 2, "title": "Test Setup Environment", "anchor": "test-setup-environment", "start_char": 5130, "end_char": 6186, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:27b6c4cc605d1ec92838c2bacc230c2cfde9b9c51272df482411092aa2d90d9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Setup Environment\n\nYou can set up a local parachain environment to test the asset registration process before deploying it on the live network. This guide uses Chopsticks to simulate that process. For further information on chopsticks usage, refer to the [Chopsticks](/parachains/testing/fork-a-parachain/) documentation.\n\nTo set up a test environment, execute the following command:\n\n```bash\nnpx @acala-network/chopsticks \\\n--config=https://raw.githubusercontent.com/AcalaNetwork/chopsticks/master/configs/polkadot-asset-hub.yml\n```\n\nThe above command will spawn a lazy fork of Polkadot Hub with the latest block data from the network. If you need to test Kusama Hub, replace `polkadot-asset-hub.yml` with `kusama-asset-hub.yml` in the command.\n\nA Polkadot Hub instance is now running locally, and you can proceed with the asset registration process. Note that the local registration process does not differ from the live network process. Once you have a successful TestNet transaction, you can use the same steps to register the asset on MainNet."}
{"source": "polkadot-docs", "page_id": "get-support", "url": "https://developer.polkadot.com/get-support/#choose-the-right-channel", "page_title": "Support", "index": 0, "depth": 2, "title": "Choose the Right Channel", "anchor": "choose-the-right-channel", "start_char": 405, "end_char": 1636, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2349f44946787ecdd3ca9194511397bf941581fec3f1ef1ea44941512cb1dde9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Choose the Right Channel\n\nDeveloper support is split by who operates the service you are using. Find your problem in this table before you ask, so it reaches the team that can resolve it.\n\n| Your problem involves | Where to ask |\n| :-------------------- | :----------- |\n| Polkadot SDK, runtime development, parachains, or core Polkadot infrastructure | [Polkadot Developer Support](#support-channels) |\n| Paseo Next v2, or Parity's tools for building Polkadot Products, such as the `playground` CLI | [Polkadot Developer Support](#support-channels), or the tool's own GitHub repository for bug reports |\n| Products Devnet, PCF's Polkadot App builds (including the Google Play app), deploying a Polkadot Product to Products Devnet, or `pad` | PCF Developer Support: [`products-devnet-issues`](https://github.com/Polkadot-Community-Foundation/products-devnet-issues), or `#devnet-discussion` on the [Polkadot Discord server](https://discord.com/invite/eD4jMYbC5U) |\n\nThe Polkadot Community Foundation (PCF) operates Products Devnet and its Polkadot App builds using open-source technology developed by Parity. Parity does not operate those services, so the Polkadot Developer Support channels cannot resolve problems with them."}
{"source": "polkadot-docs", "page_id": "get-support", "url": "https://developer.polkadot.com/get-support/#support-channels", "page_title": "Support", "index": 1, "depth": 2, "title": "Support Channels", "anchor": "support-channels", "start_char": 1636, "end_char": 3343, "estimated_token_count": 481, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2349f44946787ecdd3ca9194511397bf941581fec3f1ef1ea44941512cb1dde9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Support Channels\n\nUse one of the channels below to get live technical support or ask questions.\n\n<div class=\"grid cards support\" markdown>\n\n-   :simple-telegram: **Telegram: Polkadot Developer Support**\n\n    <ul class=\"card-list\">\n    <li> **Who’s there**: DevRel team and active developer community. </li>\n    <li> **Response time**: Within 2 business days, usually faster. </li>\n    <li> **Topics**: Polkadot SDK, runtime development, parachains, core Polkadot infrastructure, and Polkadot Products built with Parity's tools. For PCF-operated services, see [Choose the Right Channel](#choose-the-right-channel). </li>\n    </ul>\n\n    [Join Telegram](https://t.me/substratedevs)\n\n-   :simple-discord: **Discord: Polkadot Official Server**\n\n    <ul class=\"card-list\">\n    <li> **Smart contracts**: Ask in `#solidity-smart-contracts` and `#ink_smart-contracts`. </li>\n    <li> **General developer support**: Ask in `#dev-discussion`. </li>\n    <li> **Response time**: Within 1 business day, usually faster. </li>\n    </ul>\n\n    [Join Discord](https://polkadot-discord.w3f.tools/)\n\n-   :simple-matrix: **Matrix: Polkadot Developer Support**\n\n    <ul class=\"card-list\">\n    <li> **Who’s there**: Parity, W3F, DevRel, and community contributors. </li>\n    <li> **Response time**: Within 1 business day, usually faster. </li>\n    <li> **Topics**: Polkadot SDK, runtime development, parachains, core Polkadot infrastructure, and Polkadot Products built with Parity's tools. For PCF-operated services, see [Choose the Right Channel](#choose-the-right-channel). </li>\n    <li> Bridged with Telegram (all messages synced). </li>\n    </ul>\n\n    [Join Matrix](https://matrix.to/#/#substratedevs:matrix.org)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "get-support", "url": "https://developer.polkadot.com/get-support/#community-resources", "page_title": "Support", "index": 2, "depth": 2, "title": "Community Resources", "anchor": "community-resources", "start_char": 3343, "end_char": 5645, "estimated_token_count": 630, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2349f44946787ecdd3ca9194511397bf941581fec3f1ef1ea44941512cb1dde9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Community Resources\n\n<div class=\"grid cards support\" markdown>\n\n-   :fontawesome-brands-stack-exchange: **Stack Exchange**\n\n    <ul class=\"card-list\">\n    <li> Browse commonly asked technical questions. </li>\n    <li> Ask your own and get detailed responses from experienced devs. </li>\n    </ul>\n\n    [Visit Polkadot Stack Exchange](https://substrate.stackexchange.com/)\n\n-   :simple-reddit: **Reddit: r/Polkadot**\n\n    <ul class=\"card-list\">\n    <li> General discussions and community perspectives. </li>\n    <li> Developer questions are welcome when tagged appropriately. </li>\n    </ul>\n\n    [Visit r/Polkadot](https://www.reddit.com/r/Polkadot/)\n\n-   :simple-youtube: **YouTube: @PolkadotNetwork**\n\n    <ul class=\"card-list\">\n    <li> Developer tutorials. </li>\n    <li> Ecosystem interviews. </li>\n    <li> Event recordings and walkthroughs. </li>\n    </ul>\n\n    [Watch on YouTube](https://www.youtube.com/@PolkadotNetwork)\n\n-   :fontawesome-brands-x-twitter: **X (Twitter): Official Accounts**\n\n    - [@PolkadotDevs](https://x.com/PolkadotDevs): Updates for developers.\n    - [@Polkadot](https://x.com/Polkadot): Network-wide news.\n    - [@Kusamanetwork](https://x.com/kusamanetwork): Kusama-specific updates.\n    - [@Web3Foundation](https://x.com/web3foundation): Grants, research, and ecosystem programs.\n\n-   :fontawesome-brands-x-twitter: **X (Twitter): Community Accounts**\n\n    - [@PolkadotDeploy](https://x.com/PolkadotDeploy): News from the deployment portal and tooling updates.\n\n-   :material-forum: **Polkadot Forum**\n\n    <ul class=\"card-list\">\n    <li> Join community discussions around the direction of the ecosystem. </li>\n    </ul>\n\n    [Visit the Polkadot Forum](https://forum.polkadot.network/)\n\n-   :material-vote: **Polkassembly: OpenGov**\n\n    <ul class=\"card-list\">\n    <li> Explore and vote on governance proposals for Polkadot and Kusama. </li>\n    <li> Help shape the future of the network. </li>\n    </ul>\n\n    [Explore on Polkassembly](https://polkadot.polkassembly.io/)\n\n-   :material-vote: **Subsquare: OpenGov**\n\n    <ul class=\"card-list\">\n    <li> Track, discuss, and vote on Polkadot OpenGov proposals. </li>\n    <li> Stay informed on governance activity across the network. </li>\n    </ul>\n\n    [Explore on Subsquare](https://polkadot.subsquare.io/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "get-support", "url": "https://developer.polkadot.com/get-support/#ai-resources", "page_title": "Support", "index": 3, "depth": 2, "title": "AI Resources", "anchor": "ai-resources", "start_char": 5645, "end_char": 6029, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2349f44946787ecdd3ca9194511397bf941581fec3f1ef1ea44941512cb1dde9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## AI Resources\n\n<div class=\"grid cards support\" markdown>\n\n-   :fontawesome-solid-robot: **AI Resources**\n\n    Access documentation structured and optimized for use with large language models (LLMs) and AI tools. These resources help build AI assistants, power code search, or enable custom tooling trained on Polkadot’s documentation.\n\n    [Access LLM Files](/ai-resources/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "node-infrastructure", "url": "https://developer.polkadot.com/node-infrastructure/#introduction", "page_title": "Node Infrastructure", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 33, "end_char": 474, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:48172d0c9c772f166f3836a85ea2afb4f7e3d2ae079a0b5f912704b01f2b765f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nThe Polkadot network relies on various types of nodes to maintain security, provide data access, and produce blocks. This section covers everything you need to know about running infrastructure for the Polkadot ecosystem.\n\nWhether you want to provide RPC endpoints for applications, produce blocks for a parachain, or secure the relay chain as a validator, this guide will help you understand your options and get started."}
{"source": "polkadot-docs", "page_id": "node-infrastructure", "url": "https://developer.polkadot.com/node-infrastructure/#node-types", "page_title": "Node Infrastructure", "index": 1, "depth": 2, "title": "Node Types", "anchor": "node-types", "start_char": 474, "end_char": 489, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:48172d0c9c772f166f3836a85ea2afb4f7e3d2ae079a0b5f912704b01f2b765f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Node Types"}
{"source": "polkadot-docs", "page_id": "node-infrastructure", "url": "https://developer.polkadot.com/node-infrastructure/#rpc-nodes", "page_title": "Node Infrastructure", "index": 2, "depth": 3, "title": "RPC Nodes", "anchor": "rpc-nodes", "start_char": 489, "end_char": 1926, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:48172d0c9c772f166f3836a85ea2afb4f7e3d2ae079a0b5f912704b01f2b765f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### RPC Nodes\n\nRPC nodes provide API access to blockchain data without participating in consensus. They are essential infrastructure for:\n\n- **Applications and dApps**: Query blockchain state and submit transactions.\n- **Block explorers**: Index and display blockchain data.\n- **Wallets**: Check balances and broadcast transactions.\n- **Development**: Test and debug applications.\n\nRPC nodes can be run for both the relay chain and parachains, with varying levels of data retention:\n\n- **Pruned nodes**: Keep recent state and a limited number of finalized blocks. Suitable for most applications that only need the current state and recent history. More efficient in terms of storage and sync time.\n- **Archive nodes**: Maintain complete historical state and all blocks since genesis. Required for block explorers, analytics platforms, or applications that need to query historical data at any point in time.\n\n**Transaction Broadcasting**: RPC nodes play a crucial role in transaction submission and propagation. When a client submits a transaction via RPC methods like `author_submitExtrinsic`, the node validates the transaction format, adds it to its local transaction pool, and broadcasts it across the P2P network. Block producers (collators or validators) then pick up these transactions from their pools for inclusion in blocks. This makes RPC nodes the primary gateway for users and applications to interact with the blockchain."}
{"source": "polkadot-docs", "page_id": "node-infrastructure", "url": "https://developer.polkadot.com/node-infrastructure/#collators", "page_title": "Node Infrastructure", "index": 3, "depth": 3, "title": "Collators", "anchor": "collators", "start_char": 1926, "end_char": 2584, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:48172d0c9c772f166f3836a85ea2afb4f7e3d2ae079a0b5f912704b01f2b765f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Collators\n\nCollators are block producers for parachains. They perform critical functions:\n\n- **Collect transactions**: Aggregate user transactions into blocks.\n- **Produce blocks**: Create parachain block candidates.\n- **Generate and package PoV**: Generate the Proof-of-Validity containing the state transition proof and necessary witness data for validation.\n- **Submit to validators**: Send block candidates and PoVs to relay chain validators.\n\nUnlike validators, collators do not provide security guarantees—that responsibility lies with the relay chain validators. However, collators are essential for parachain liveness and censorship resistance."}
{"source": "polkadot-docs", "page_id": "node-infrastructure", "url": "https://developer.polkadot.com/node-infrastructure/#validators", "page_title": "Node Infrastructure", "index": 4, "depth": 3, "title": "Validators", "anchor": "validators", "start_char": 2584, "end_char": 3318, "estimated_token_count": 180, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:48172d0c9c772f166f3836a85ea2afb4f7e3d2ae079a0b5f912704b01f2b765f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Validators\n\nValidators secure the Polkadot relay chain through [Nominated Proof of Stake (NPoS)](../wiki/learn/learn-staking.md#nominated-proof-of-stake-npos). They:\n\n- **Validate blocks**: Verify parachain blocks and relay chain transactions.\n- **Participate in consensus**: Run [BABE](/reference/polkadot-hub/consensus-and-security/pos-consensus/#block-production-babe) and [GRANDPA](/reference/polkadot-hub/consensus-and-security/pos-consensus/#finality-gadget-grandpa) protocols.\n- **Earn rewards**: Receive staking rewards for honest behavior.\n- **Risk slashing**: Face penalties for misbehavior or downtime.\n\nRunning a validator requires significant technical expertise, reliable infrastructure, and a stake of DOT tokens."}
{"source": "polkadot-docs", "page_id": "node-infrastructure", "url": "https://developer.polkadot.com/node-infrastructure/#next-steps", "page_title": "Node Infrastructure", "index": 5, "depth": 2, "title": "Next Steps", "anchor": "next-steps", "start_char": 3318, "end_char": 3937, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:48172d0c9c772f166f3836a85ea2afb4f7e3d2ae079a0b5f912704b01f2b765f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Next Steps\n\n<div class=\"grid cards\" markdown>\n\n-   **Run RPC Nodes**\n\n    ---\n\n    Provide API access for applications, explorers, and wallets.\n\n    [:octicons-arrow-right-24: Run a Node](/node-infrastructure/run-a-node/parachain-rpc/)\n\n-   **Run a Collator**\n\n    ---\n\n    Produce blocks for system parachains or your own parachain.\n\n    [:octicons-arrow-right-24: Run a Collator](/node-infrastructure/run-a-collator/)\n\n-   **Run a Validator**\n\n    ---\n\n    Secure the relay chain and earn staking rewards.\n\n    [:octicons-arrow-right-24: Run a Validator](/node-infrastructure/run-a-validator/requirements/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#introduction", "page_title": "Run a Block-Producing Collator", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 35, "end_char": 1141, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nBlock-producing collators are the backbone of system parachain operations. Unlike RPC or archive nodes, which maintain state, collators actively produce blocks and submit them to relay chain validators for inclusion. They ensure network liveness, censorship resistance, and cross-chain message processing.\n\nCollators maintain fully synced relay chain and parachain nodes, aggregate transactions into blocks, create parachain block candidates, generate state transition proofs (Proof-of-Validity), and send block candidates to relay chain validators. They also enable cross-chain message handling via XCM. While critical for liveness, collators do not secure the network—security is provided by relay chain validators through the [ELVES protocol](../wiki/learn/learn-parachains-protocol.md).\n\nThis guide explains how to set up a collator for Polkadot system parachains, covering all key requirements, setting up and registering session keys, and meeting governance approval or invulnerables-list criteria (required for system parachains; non-system parachains may be more permissionless)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#prerequisites", "page_title": "Run a Block-Producing Collator", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1141, "end_char": 1159, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Prerequisites"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#hardware-requirements", "page_title": "Run a Block-Producing Collator", "index": 2, "depth": 3, "title": "Hardware Requirements", "anchor": "hardware-requirements", "start_char": 1159, "end_char": 1871, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Hardware Requirements\n\nBlock-producing collators require robust hardware for reliable operation, including the following:\n\n- **CPU**: 4+ cores (8+ cores recommended for optimal performance)\n- **Memory**: 32 GB RAM minimum (64 GB recommended)\n- **Storage**:\n    - 200+ GB NVMe SSD (with pruning enabled for both parachain and relay chain)\n    - Fast disk I/O is critical for block production performance\n- **Network**:\n    - Public IP address\n    - 100+ Mbps connection; a stable connection is critical\n    - Open ports:\n        - **30333**: Parachain P2P\n        - **30334**: Relay chain P2P\n\n!!! warning \"Uptime is critical\"\n    Consider redundancy and monitoring to maintain block production reliability."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#software-requirements", "page_title": "Run a Block-Producing Collator", "index": 3, "depth": 3, "title": "Software Requirements", "anchor": "software-requirements", "start_char": 1871, "end_char": 2112, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Software Requirements\n\nRequired software:\n\n- **Operating system**: Ubuntu 22.04 LTS (recommended) or similar Linux distribution\n- **[Docker](https://www.docker.com/get-started/)**: Required for obtaining binaries and running containers"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#account-requirements", "page_title": "Run a Block-Producing Collator", "index": 4, "depth": 3, "title": "Account Requirements", "anchor": "account-requirements", "start_char": 2112, "end_char": 4162, "estimated_token_count": 372, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account Requirements\n\n??? interface \"Need to create an account?\"\n\n    You can generate an account by taking the following steps:\n\n    1. Generate an account key with the `sr25519` scheme using the following command:\n\n        ```bash\n        docker run -it parity/subkey:latest generate --scheme sr25519\n        ```\n\n        The output will be similar to the following:\n\n        <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>docker run -it parity/subkey:latest generate --scheme sr25519</span>\n        <span data-ty><pre>Secret phrase:       embody rail hour peanut .... badge syrup luggage canvas\n            Network ID:        substrate\n            Secret seed:       0x6498dd3416c491406e2c8283c76760ce4ca018478888b42315e7718778f2c2e1\n            Public key (hex):  0x2202210357e49390d4f8d868da983940fe220a0a0e00bc6feaeda462aa031810\n            Account ID:        0x2202210357e49390d4f8d868da983940fe220a0a0e00bc6feaeda462aa031810\n            Public key (SS58): 5CqJ7n72GvvF5ZzUT2HMj83KyDje4n8sXR8kuiK8HWtfDktF\n            SS58 Address:      5CqJ7n72GvvF5ZzUT2HMj83KyDje4n8sXR8kuiK8HWtfDktF\n        </pre></span>\n        </div>\n\n    2. Save the following items displayed in the output:\n        - Secret phrase (seed) - Keep this secure!\n        - Public key (hex)\n        - Account ID\n        - SS58 Address\n\n        !!! warning\n        \n            Store the secret phrase securely. Never share it. Consider using a hardware wallet for production collators.\n\nYour account must meet the following requirements:\n\n- **Funded account**: Free balance on the target chain must cover transaction fees, the session key deposit (`session.keyDeposit`), and the [existential deposit (ED)](/reference/glossary/#existential-deposit), plus the `CandidacyBond` for on-chain selection.\n\nYou will also need the following, which are generated or configured later in this guide:\n\n- **Session keys**: For collator identification (generated after node setup)\n- **Node key**: For stable P2P peer ID (recommended)"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#install-dependencies", "page_title": "Run a Block-Producing Collator", "index": 5, "depth": 2, "title": "Install Dependencies", "anchor": "install-dependencies", "start_char": 4162, "end_char": 5435, "estimated_token_count": 284, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Install Dependencies\n\nThis guide provides two deployment options. Select the option that best fits your needs:\n\n- **Docker**: Best for simpler setup and maintenance\n- **systemd**: Best for production environments requiring more control\n\n=== \"Docker\"\n\n    1. Pull the Polkadot Parachain Docker image using the latest stable tag on [Docker Hub](https://hub.docker.com/r/parity/polkadot-parachain/tags):\n\n        ```bash\n        docker pull parity/polkadot-parachain:stable2609\n        ```\n\n    2. Verify the installation:\n\n        ```bash\n        docker run --rm parity/polkadot-parachain:stable2609 --version\n        ```\n\n=== \"systemd\"\n\n    1. Download the `polkadot-parachain` binary using the latest stable [Polkadot SDK release](https://github.com/paritytech/polkadot-sdk/releases):\n\n        ```bash\n        wget https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-parachain\n        ```\n\n    2. Make it executable and move it to your system path:\n        \n        ```bash\n        chmod +x polkadot-parachain\n        sudo mv polkadot-parachain /usr/local/bin/\n        sudo chown root:root /usr/local/bin/polkadot-parachain\n        ```\n\n    3. Verify installation:\n\n        ```bash\n        polkadot-parachain --version\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#generate-node-key", "page_title": "Run a Block-Producing Collator", "index": 6, "depth": 2, "title": "Generate Node Key", "anchor": "generate-node-key", "start_char": 5435, "end_char": 6318, "estimated_token_count": 180, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Generate Node Key\n\nValidators and collators on Polkadot need a static network key (also known as the node key) to maintain a stable node identity.\nThis key ensures that your node can maintain a consistent peer ID, even across restarts, which is crucial for maintaining reliable network connections.\n\nFollow these steps to generate a node key:\n\n1. Generate your node key using one of the following options:\n\n    === \"Docker\"\n\n        ```bash\n        docker run --rm parity/subkey:latest generate-node-key > node.key\n        ```\n    === \"polkadot-parachain binary\"\n    \n        ```bash\n        polkadot-parachain key generate-node-key --file node.key\n        ```\n\n2. Locate your peer ID in the displayed output. The peer ID is similar to this example:\n\n    ```text\n    12D3KooWExcVYu7Mvjd4kxPVLwN2ZPnZ5NyLZ5ft477wqzfP2q6E\n    ```\n\nBe sure to save the peer ID for future reference."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#obtain-chain-specification", "page_title": "Run a Block-Producing Collator", "index": 7, "depth": 2, "title": "Obtain Chain Specification", "anchor": "obtain-chain-specification", "start_char": 6318, "end_char": 6349, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Obtain Chain Specification"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#system-parachains", "page_title": "Run a Block-Producing Collator", "index": 8, "depth": 3, "title": "System Parachains", "anchor": "system-parachains", "start_char": 6349, "end_char": 7370, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### System Parachains\n\nObtain the chain specification for your target system parachain using one of the following options:\n\n=== \"Download from Chainspec Collection (Recommended)\"\n\n    Download the chain specification directly using `curl`. For example, to download the Asset Hub Polkadot chain spec:\n\n    ```bash\n    curl -sL -o chain-spec.json \\\n      https://paritytech.github.io/chainspecs/polkadot/parachain/asset-hub/chainspec.json\n    ```\n\n    For other system parachains, find the correct URL in the [Chainspec Collection](https://paritytech.github.io/chainspecs/) under the [**List of Chainspecs**](https://paritytech.github.io/chainspecs/#list-of-chainspecs).\n\n=== \"Download from the Polkadot SDK repository\"\n\n    Download the chain specification directly using `curl`. For example, to download the Asset Hub Polkadot chain spec:\n\n    ```bash\n    curl -sL -o chain-spec.json \\\n      https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/cumulus/parachains/chain-specs/asset-hub-polkadot.json\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#other-parachains", "page_title": "Run a Block-Producing Collator", "index": 9, "depth": 3, "title": "Other Parachains", "anchor": "other-parachains", "start_char": 7370, "end_char": 7497, "estimated_token_count": 23, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Other Parachains\n\nFor non-system parachains, check the parachain's documentation for official chain specification files."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#run-the-collator", "page_title": "Run a Block-Producing Collator", "index": 10, "depth": 2, "title": "Run the Collator", "anchor": "run-the-collator", "start_char": 7497, "end_char": 12726, "estimated_token_count": 1214, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Run the Collator\n\nUsing your preferred deployment method, take the following steps to set up and run your collator:\n\n=== \"Docker\"\n\n    1. Create a directory for collator data and copy the chain spec and node key:\n\n        ```bash\n        mkdir -p collator-data\n        cp chain-spec.json collator-data/\n        cp node.key collator-data/\n        ```\n\n    2. Launch the collator using Docker:\n\n        ```bash\n        docker run -d --name polkadot-collator --restart unless-stopped \\\n          -p 30333:30333 \\\n          -p 30334:30334 \\\n          -p 9944:9944 \\\n          -p 9615:9615 \\\n          -v $(pwd)/collator-data:/data \\\n          parity/polkadot-parachain:stable2609 \\\n          --collator \\\n          --chain=/data/chain-spec.json \\\n          --base-path=/data \\\n          --port=30333 \\\n          --rpc-port=9944 \\\n          --prometheus-port=9615 \\\n          --prometheus-external \\\n          --node-key-file=/data/node.key \\\n          --name=\"INSERT_YOUR_COLLATOR_NAME\" \\\n          --blocks-pruning=256 \\\n          --state-pruning=256 \\\n          --database=paritydb \\\n          -- \\\n          --chain=polkadot \\\n          --port=30334 \\\n          --sync=fast \\\n          --blocks-pruning=256 \\\n          --state-pruning=256 \\\n          --database=paritydb \\\n          --pool-limit=0 \\\n          --rpc-port=0\n        ```\n\n    3. View logs to monitor sync progress:\n\n        ```bash\n        docker logs -f polkadot-collator\n        ```\n\n=== \"systemd\"\n\n    1. Create a dedicated user:\n\n        ```bash\n        sudo useradd -r -s /bin/bash polkadot\n        ```\n\n    2. Create the data directory, then copy your chain spec and node key into it:\n\n        ```bash\n        sudo mkdir -p /var/lib/polkadot-collator\n        sudo cp chain-spec.json /var/lib/polkadot-collator/\n        sudo cp node.key /var/lib/polkadot-collator/\n        ```\n\n    3. Set permissions:\n\n        ```bash\n        sudo chown -R polkadot:polkadot /var/lib/polkadot-collator\n        ```\n\n    4. Create a systemd service file:\n\n        ```bash\n        sudo nano /etc/systemd/system/polkadot-collator.service\n        ```\n\n    5. Add the following configuration:\n\n        ```ini title=\"systemd/system/polkadot-collator.service\"\n        [Unit]\n        Description=Polkadot System Parachain Collator\n        After=network.target\n\n        [Service]\n        Type=simple\n        User=polkadot\n        Group=polkadot\n        WorkingDirectory=/var/lib/polkadot-collator\n\n        ExecStart=/usr/local/bin/polkadot-parachain \\\n          --collator \\\n          --chain=/var/lib/polkadot-collator/chain-spec.json \\\n          --base-path=/var/lib/polkadot-collator \\\n          --port=30333 \\\n          --rpc-port=9944 \\\n          --prometheus-port=9615 \\\n          --node-key-file=/var/lib/polkadot-collator/node.key \\\n          --name=\"INSERT_YOUR_COLLATOR_NAME\" \\\n          --blocks-pruning=256 \\\n          --state-pruning=256 \\\n          --database=paritydb \\\n          -- \\\n          --chain=polkadot \\\n          --port=30334 \\\n          --sync=fast \\\n          --blocks-pruning=256 \\\n          --state-pruning=256 \\\n          --database=paritydb \\\n          --pool-limit=0 \\\n          --rpc-port=0\n\n        Restart=always\n        RestartSec=10\n        LimitNOFILE=65536\n\n        [Install]\n        WantedBy=multi-user.target\n        ```\n\n    6. Start the service:\n\n        ```bash\n        sudo systemctl daemon-reload\n        sudo systemctl enable polkadot-collator\n        sudo systemctl start polkadot-collator\n        ```\n\n    7. Check the status:\n\n        ```bash\n        sudo systemctl status polkadot-collator\n        ```\n\n    8. View logs:\n\n        ```bash\n        sudo journalctl -u polkadot-collator -f\n        ```\n\n??? interface \"Configuration Arguments\"\n\n    - **`--collator`**: Enables block production mode.\n    - **`--node-key-file`**: Uses the generated node key for stable peer ID.\n    - **`--name`**: Your collator name (visible in [telemetry](https://telemetry.polkadot.io/)).\n    - **`--blocks-pruning=256`**: Keeps the last 256 blocks.\n    - **`--state-pruning=256`**: Keeps the state history of the last 256 blocks.\n    - **`--database=paritydb`**: Uses ParityDB for better performance.\n    - **`--sync=fast`**: Fast sync mode for the relay chain.\n    - **`--pool-limit=0`**: Disables transaction pool on relay chain (not needed for collators).\n    - **`--rpc-port=0` (relay chain)**: Disables RPC on the embedded relay chain node (not needed for collators).\n\nYour collator must sync both the relay chain and parachain before producing blocks. The relay chain uses fast sync to speed up synchronization. Overall sync time depends on:\n\n- Network bandwidth\n- Disk I/O speed\n- Current chain size\n\n!!! note\n    If you also operate relay chain nodes, such as validator or RPC nodes, you can point the collator to their RPC endpoints using the **`--relay-chain-rpc-urls`** argument. This allows the collator to retrieve relay chain data from these nodes, reducing the resources required to sync and maintain the embedded relay chain node.\n\n!!! warning\n\n    Do not proceed with registration until both chains are fully synced. Monitor sync progress using the log viewing commands in the [Log Management](#commands-for-log-management) section."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#generate-session-keys", "page_title": "Run a Block-Producing Collator", "index": 11, "depth": 2, "title": "Generate Session Keys", "anchor": "generate-session-keys", "start_char": 12726, "end_char": 18949, "estimated_token_count": 1279, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Generate Session Keys\n\nSession keys are cryptographic keys used by your collator node to sign authorship information when producing blocks. They uniquely identify your collator on the network and must be registered on-chain before your collator can participate in block production.\n\n!!! warning \"Breaking change introduced in runtime 2.2.0\"\n    Runtime 2.2.0 introduced a new session key generation flow using the `author_rotateKeysWithOwner` RPC, which requires your stash account as a parameter and returns both the session keys and a cryptographic proof of ownership. This proof must be included later when submitting `setKeys`. The previous `author_rotateKeys` RPC and the Subkey approach are no longer supported for new key generation. If your node already has session keys set on-chain and you are not rotating them, no action is required.\n\n    Polkadot and Kusama are beyond runtime 2.2.0, so the new flow is the only supported path on both networks. The **Pre-2.2.0 (Legacy)** tab below is kept for reference and applies only to chains still running a pre-2.2.0 runtime.\n\n=== \"Runtime 2.2.0+ (`rotateKeysWithOwner`)\"\n\n    Generate session keys by running the following command on your node, replacing `INSERT_STASH_ACCOUNT_ID` with your stash account ID:\n\n    ``` bash\n    curl -H \"Content-Type: application/json\" \\\n    -d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"author_rotateKeysWithOwner\", \"params\":[\"INSERT_STASH_ACCOUNT_ID\"]}' \\\n    http://localhost:9944\n    ```\n\n    This command returns a JSON object with two fields in the `result`: `keys` (the hex-encoded session keys) and `proof` (the ownership proof). Save both values for later use.\n\n    ```json\n    {\n      \"jsonrpc\": \"2.0\",\n      \"result\": {\n        \"keys\": \"0xda3861a45e0197f3ca145c2c209f9126e5053fas503e459af4255cf8011d51010\",\n        \"proof\": \"0x1a2b3c4d5e6f...\"\n      },\n      \"id\": 1\n    }\n    ```\n\n    !!! note \"Subkey is no longer supported for session key generation\"\n        Previously, nodes could generate session keys externally using `subkey` and manually insert them into the node's keystore. This approach is no longer viable because `set_keys` now requires a cryptographic proof of ownership — each private session key must sign the stash account ID. The only way to obtain this proof is through `author_rotateKeysWithOwner`, which handles key generation, keystore insertion, and proof generation in a single step. Operators who previously relied on `subkey` for session key generation should migrate to using `author_rotateKeysWithOwner` as described above.\n\n=== \"Pre-2.2.0 (Legacy)\"\n\n    Polkadot and Kusama are beyond runtime 2.2.0, so this legacy flow is no longer applicable on those networks. Use it only if you are operating on a chain still running a pre-2.2.0 runtime. On such a chain, there are multiple ways to create the session keys:\n\n    === \"Polkadot.js Apps UI\"\n\n        1. In Polkadot.js Apps, connect to your local node, navigate to the **Developer** dropdown, and select the **RPC Calls** option.\n\n        2. Construct an `author_rotateKeys` RPC call and execute it:\n\n            1. Select the **author** endpoint.\n            2. Choose the **rotateKeys()** call.\n            3. Click the **Submit RPC Call** button.\n            4. Copy the hex-encoded public key from the response.\n\n            ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/key-management-01.webp)\n\n    === \"Curl\"\n\n        Generate session keys by running the following command on your node:\n\n        ``` bash\n        curl -H \"Content-Type: application/json\" \\\n        -d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"author_rotateKeys\", \"params\":[]}' \\\n        http://localhost:9944\n        ```\n\n        This command will return a JSON object. The `result` key is the hex-encoded public part of the newly created session key. Save this for later use.\n\n        ```json\n        {\"jsonrpc\":\"2.0\",\"result\":\"0xda3861a45e0197f3ca145c2c209f9126e5053fas503e459af4255cf8011d51010\",\"id\":1}\n        ```\n\n    === \"Subkey\"\n\n        To create a keypair for your node's session keys, use the `subkey generate` command. This generates a set of cryptographic keys that must be stored in your node's keystore directory.\n\n        When you run the command, it produces output similar to this example:\n\n        <div id=\"termynal\" data-termynal>\n          <span data-ty=\"input\"><span class=\"file-path\"></span>subkey generate</span>\n          <pre>\n        Secret phrase:       twist buffalo mixture excess device drastic vague mammal fitness punch match hammer\n          Network ID:        substrate\n          Secret seed:       0x5faa9e5defe42b201388d5c2b8202d6625a344abc9aa52943a71f12cb90b88a9\n          Public key (hex):  0x28cc2fdb6e28835e2bbac9a16feb65c23d448c9314ef12fe083b61bab8fc2755\n          Account ID:        0x28cc2fdb6e28835e2bbac9a16feb65c23d448c9314ef12fe083b61bab8fc2755\n          Public key (SS58): 5CzCRpXzHYhuo6G3gYFR3cgV6X3qCNwVt51m8q14ZcChsSXQ\n          SS58 Address:      5CzCRpXzHYhuo6G3gYFR3cgV6X3qCNwVt51m8q14ZcChsSXQ\n          </pre>\n        </div>\n        \n\n        To properly store these keys, create a file in your keystore directory with a specific naming convention. The filename must consist of the hex string `61757261` (which represents \"aura\" in hex) followed by the public key without its `0x` prefix.\n\n        Using the example above, you would create a file named:\n\n        ```\n        ./keystores/6175726128cc2fdb6e28835e2bbac9a16feb65c23d448c9314ef12fe083b61bab8fc2755\n        ```\n\n        And store only the secret phrase in the file:\n\n        ```\n        \"twist buffalo mixture excess device drastic vague mammal fitness punch match hammer\"\n        ```\n\n    When submitting `setKeys`, use `0x00` as the proof parameter.\n\n!!! warning \"Save your session key output immediately\"\n    You must save these session keys as you'll need them for on-chain registration.\n    Calling `author_rotateKeys` or `author_rotateKeysWithOwner` generates **new keys every time** — it does not return previously generated keys. If you lose the output, there is no way to retrieve it. You will need to call the RPC again, which generates a fresh set of keys, and then re-submit `setKeys` with the new result."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#register-collator-for-selection", "page_title": "Run a Block-Producing Collator", "index": 12, "depth": 2, "title": "Register Collator for Selection", "anchor": "register-collator-for-selection", "start_char": 18949, "end_char": 20590, "estimated_token_count": 445, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Register Collator for Selection\n\nSystem parachains use different mechanisms for selecting collators. A quick breakdown of each mechanism is as follows:\n\n| Method                   | How it Works                                                                                                                                                                                              | Requirements                                                     |\n|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------|\n| **Invulnerables list**   | Fixed list defined through governance. Most common for system parachains.                                                                                                                                 | Permissioned via governance                                      |\n| **On-chain selection**   | Runtime automatically selects eligible collators. Some parachains use [pallet-collator-selection](https://paritytech.github.io/polkadot-sdk/master/pallet_collator_selection/index.html). | Semi-permissionless (criteria-based; may require bonding tokens) |\n| **Fellowship decisions** | Technical fellowship may manage some system parachain collators.                                                                                                                                          | Permissioned via Fellowship                                      |"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#registration-process", "page_title": "Run a Block-Producing Collator", "index": 13, "depth": 3, "title": "Registration Process", "anchor": "registration-process", "start_char": 20590, "end_char": 23944, "estimated_token_count": 724, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Registration Process\n\nCollator registration authorizes your node to produce blocks on the network. The parachain's collator selection mechanism uses this on-chain registration to determine which nodes are eligible to author blocks.\n\nThe registration process varies by system parachain. General steps include the following:\n\n1. Check the existing collators for your target parachain:\n    1. Navigate to Polkadot.js Apps and connect to your system parachain.\n    2. Locate **Developer > Chain State**.\n    3. Query **`collatorSelection.invulnerables()`**.\n\n    ![](/images/node-infrastructure/run-a-collator/run-a-collator-01.webp)\n\n2. Prepare a governance proposal for invulnerables-based selection, including the following information:\n\n    - **Draft proposal**: Explain why you should be added as a collator.\n    - **Technical details**: Provide your session keys and account ID.\n    - **Infrastructure**: Describe your hardware and monitoring setup.\n    - **Experience**: Detail your relevant experience.\n\n    Submit the proposal to the relevant governance channels.\n\n3. Once approved (or if using on-chain selection), follow these steps to register session keys using Polkadot.js Apps:\n\n    1. Locate **Developer > Extrinsics**.\n    2. Select your account.\n    3. Choose the **`session.setKeys`** extrinsic.\n    4. Enter the values returned by [Generate Session Keys](#generate-session-keys):\n        - **`keys`**\n        - **`proof`**\n    5. Click **Submit Transaction** and sign the transaction.\n    \n    ![](/images/node-infrastructure/run-a-collator/run-a-collator-02.webp)\n\n    !!! note\n        The first `session.setKeys` call holds a deposit equal to `session.keyDeposit`. The call fails if your free balance is below the ED plus this deposit. Rotating keys that are already registered is not charged again. Calling `session.purgeKeys` releases the deposit. Keys registered before the deposit was introduced stay deposit-free.\n\n        Query the current deposit in Polkadot.js Apps under **Developer > Chain State > Constants > `session.keyDeposit`**, since runtime upgrades can change it. If the constant is zero or isn't listed, no deposit applies.\n\n4. (Optional - primarily for non-system parachains) If the parachain uses on-chain bonding for collator selection, register as a candidate using Polkadot.js Apps:\n\n    !!! note\n        Most system parachains use invulnerables lists exclusively and do not require this step. Skip to step 5 if you're running a collator for a system parachain.\n\n    1. Locate **Developer > Extrinsics**.\n    2. Select your account.\n    3. Select `collatorSelection.registerAsCandidate`.\n    4. Click **Submit Transaction** and sign the transaction. The required bond amount will be automatically reserved from your account based on the pallet's configured `CandidacyBond`.\n\n    ![](/images/node-infrastructure/run-a-collator/run-a-collator-03.webp)\n\n5. For system parachains using invulnerables lists, await governance approval for your proposal. Once approved, your collator is added to the invulnerables list and will begin producing blocks in the next session or era. \n\n6. Verify your collator is active by monitoring logs for block production messages like \"Prepared block for proposing\" and \"Imported #123\". See the [Log Management](#commands-for-log-management) section for commands for log viewing."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#commands-for-node-management", "page_title": "Run a Block-Producing Collator", "index": 14, "depth": 2, "title": "Commands for Node Management", "anchor": "commands-for-node-management", "start_char": 23944, "end_char": 24747, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Commands for Node Management\n\nUse the following commands to manage your node:\n\n=== \"Docker\"\n\n    - **Stop container**:\n\n        ```bash\n        docker stop polkadot-collator\n        ```\n\n    - **Start container**:\n\n        ```bash\n        docker start polkadot-collator\n        ```\n\n    - **Remove container**:\n\n        ```bash\n        docker rm polkadot-collator\n        ```\n\n=== \"systemd\"\n\n    - **Check status**:\n\n        ```bash\n        sudo systemctl status polkadot-collator\n        ```\n\n    - **Stop service**:\n\n        ```bash\n        sudo systemctl stop polkadot-collator\n        ```\n\n    - **Enable service**:\n\n        ```bash\n        sudo systemctl enable polkadot-collator\n        ```\n\n    - **Start service**:\n\n        ```bash\n        sudo systemctl start polkadot-collator\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#commands-for-log-management", "page_title": "Run a Block-Producing Collator", "index": 15, "depth": 2, "title": "Commands for Log Management", "anchor": "commands-for-log-management", "start_char": 24747, "end_char": 25926, "estimated_token_count": 274, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Commands for Log Management\n\nEfficient log management is essential to ensure collator performance and uptime. Use the following commands to help you manage logs to monitor and maintain your collator:\n\n=== \"Docker\"\n\n    - **View logs**:\n\n        ```bash\n        docker logs -f polkadot-collator\n        ```\n\n    - **View recent logs (last 100 lines)**:\n\n        ```bash\n        docker logs --tail 100 polkadot-collator\n        ```\n\n    - **Filter for errors**:\n\n        ```bash\n        docker logs polkadot-collator 2>&1 | grep -i error\n        ```\n\n    - **Filter for block production**:\n\n        ```bash\n        docker logs polkadot-collator 2>&1 | grep -i \"imported\"\n        ```\n\n=== \"systemd\"\n\n    - **View recent logs**:\n\n        ```bash\n        sudo journalctl -u polkadot-collator -n 100\n        ```\n\n    - **Follow logs in real-time**:\n\n        ```bash\n        sudo journalctl -u polkadot-collator -f\n        ```\n\n    - **Filter for errors**:\n\n        ```bash\n        sudo journalctl -u polkadot-collator | grep -i error\n        ```\n\n    - **Filter for block production**:\n\n        ```bash\n        sudo journalctl -u polkadot-collator | grep -i \"imported\"\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#database-maintenance", "page_title": "Run a Block-Producing Collator", "index": 16, "depth": 2, "title": "Database Maintenance", "anchor": "database-maintenance", "start_char": 25926, "end_char": 26281, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Database Maintenance\n\nCheck database size periodically using the commands for your selected setup:\n\n=== \"Docker\"\n\n    ```bash\n    # Replace with your mounted data directory path\n    du -sh ./collator-data\n    ```\n\n=== \"systemd\"\n\n    ```bash\n    du -sh /var/lib/polkadot-collator\n    ```\n\nThe collator node automatically prunes based on configuration."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#updates-and-upgrades", "page_title": "Run a Block-Producing Collator", "index": 17, "depth": 2, "title": "Updates and Upgrades", "anchor": "updates-and-upgrades", "start_char": 26281, "end_char": 28357, "estimated_token_count": 430, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Updates and Upgrades\n\nUpdates or upgrades can happen on either the runtime or client. Runtime upgrades are automatically applied via on-chain governance and do not require any manual action on your part. Client upgrades do require a manual binary update process performed via terminal commands as follows:\n\n=== \"Docker\"\n\n    1. Stop the service:\n\n        ```bash\n        sudo systemctl stop polkadot-collator\n        ```\n\n    2. Backup data (recommended):\n\n        ```bash\n        sudo cp -r /var/lib/polkadot-collator /var/lib/polkadot-collator.backup\n        ```\n\n    3. Pull the new Docker image:\n\n        ```bash\n        docker pull parity/polkadot-parachain:<NEW_TAG>\n        ```\n\n    4. Update the image tag in your systemd service file:\n\n        ```bash\n        sudo nano /etc/systemd/system/polkadot-collator.service\n        ```\n\n    5. Reload systemd and restart the service:\n\n        ```bash\n        sudo systemctl daemon-reload\n        sudo systemctl start polkadot-collator\n        ```\n\n    6. Verify the service is running:\n\n        ```bash\n        sudo systemctl status polkadot-collator\n        ```\n\n=== \"systemd\"\n\n    1. Stop the service:\n\n        ```bash\n        sudo systemctl stop polkadot-collator\n        ```\n\n    2. Backup data (recommended):\n\n        ```bash\n        sudo cp -r /var/lib/polkadot-collator /var/lib/polkadot-collator.backup\n        ```\n\n    3. Download the new binary from [GitHub releases](https://github.com/paritytech/polkadot-sdk/releases):\n\n        ```bash\n        wget https://github.com/paritytech/polkadot-sdk/releases/download/INSERT_NEW_VERSION/polkadot-parachain\n        chmod +x polkadot-parachain\n        sudo mv polkadot-parachain /usr/local/bin/\n        ```\n\n    4. Verify `polkadot-parachain` version to confirm successful update:\n\n        ```bash\n        polkadot-parachain --version\n        ```\n\n    5. Restart the service:\n\n        ```bash\n        sudo systemctl start polkadot-collator\n        ```\n\n    6. Verify the service is running:\n\n        ```bash\n        sudo systemctl status polkadot-collator\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-collator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-collator/#conclusion", "page_title": "Run a Block-Producing Collator", "index": 18, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 28357, "end_char": 29119, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a50a2b86d5422bc49c1ef02e72526559a972ed70629e76b230ef98225d0159bd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Conclusion\n\nRunning a collator node is essential for parachain operation and network security. By following this guide, you have set up a production-ready collator that:\n\n- Produces blocks for your parachain and maintains network consensus.\n- Implements comprehensive security measures to protect keys and operations.\n- Supports robust monitoring and alerting for reliable performance.\n- Follows best practices for both Docker and systemd deployments.\n\nAs a collator operator, you play a vital role in your parachain's infrastructure. Regular maintenance, security updates, and monitoring will ensure your collator continues to perform reliably. Stay engaged with your parachain community and keep up with updates to maintain optimal performance and security."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#introduction", "page_title": "Run a Parachain RPC Node", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 661, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA parachain RPC node provides direct access to a specific parachain on the Polkadot network, enabling developers and applications to interact with its assets, governance, cross-chain messages, and more. Running your own node also supports essential infrastructure tasks, such as block indexing and compatibility with Polkadot SDK tools.\n\nThrough the parachain RPC (port 9944, serving both WebSocket and HTTP), your node acts as the bridge between the parachain and applications. This page walks through setting up a node from scratch, covering hardware requirements and deployment options using Docker or systemd."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#prerequisites", "page_title": "Run a Parachain RPC Node", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 661, "end_char": 679, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#hardware-requirements", "page_title": "Run a Parachain RPC Node", "index": 2, "depth": 3, "title": "Hardware Requirements", "anchor": "hardware-requirements", "start_char": 679, "end_char": 2466, "estimated_token_count": 419, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Hardware Requirements\n\nRPC nodes serving production traffic require robust hardware:\n\n- **CPU**: 8+ cores; 16+ cores for high traffic\n- **Memory**: 64 GB RAM minimum; 128 GB recommended for high traffic\n- **Storage**: Total required storage is the size of the pruned relay chain state plus the size of the parachain state. [Snapshots](https://snapshots.polkadot.io/) _may_ be available. Fast NVMe I/O is critical for RPC query performance\n    - **Pruned Polkadot Relay Chain**: ~40 GB using warp sync\n    - **System parachains**:\n        - **Archive node (complete history)**: Using snapshots, expected storage requirements are:\n            - **Asset Hub**: ~1.2 TB\n            - **People Chain**: ~400 GB\n            - **Bridge Hub**: ~400 GB\n            - **Coretime**: ~200 GB\n        - **Pruned node (recent state)**: Snapshots are not available. A pruned node uses warp sync instead and requires far less disk space than an archive node.\n    - **Non-system parachains**: Consult the parachain team or documentation\n- **Network**:\n    - Public IP address\n    - Stable internet connection with sufficient bandwidth\n    - 1 Gbps connection for high traffic scenarios\n    - Consider DDoS protection and rate limiting for production deployments\n    - Open ports:\n        - **30333**: Parachain P2P over TCP, plus UDP for Web Real-Time Communication (WebRTC)\n        - **30334**: Relay chain P2P over TCP, plus UDP for WebRTC\n        - **9944**: Polkadot SDK RPC (WebSocket and HTTP)\n        - **8545**: Ethereum JSON-RPC (if running `eth-rpc` adapter)\n\n!!! note\n    For development or low-traffic scenarios, you can reduce these requirements proportionally. Consider using a reverse proxy ([nginx](https://nginx.org/), [Caddy](https://caddyserver.com/)) for production deployments."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#software-requirements", "page_title": "Run a Parachain RPC Node", "index": 3, "depth": 3, "title": "Software Requirements", "anchor": "software-requirements", "start_char": 2466, "end_char": 2838, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Software Requirements\n\nRequired software:\n\n- **Operating system**: Ubuntu 22.04 LTS (recommended) or similar Linux distribution\n- **[Docker](https://www.docker.com/get-started/)**: Required for obtaining binaries and running containers\n- **[rclone](https://rclone.org/downloads/)**: (Optional but recommended) Command-line program for managing files on cloud storage"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#obtain-the-chain-specification", "page_title": "Run a Parachain RPC Node", "index": 4, "depth": 2, "title": "Obtain the Chain Specification", "anchor": "obtain-the-chain-specification", "start_char": 2838, "end_char": 3157, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Obtain the Chain Specification\n\nTo run an RPC node for a parachain, you need its chain specification file. This JSON file defines the network parameters, genesis state, and bootnodes. The process for obtaining the chain spec may differ depending on whether you’re running a system parachain or a regular parachain."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#system-parachains", "page_title": "Run a Parachain RPC Node", "index": 5, "depth": 3, "title": "System Parachains", "anchor": "system-parachains", "start_char": 3157, "end_char": 4178, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### System Parachains\n\nObtain the chain specification for your target system parachain using one of the following options:\n\n=== \"Download from Chainspec Collection (Recommended)\"\n\n    Download the chain specification directly using `curl`. For example, to download the Asset Hub Polkadot chain spec:\n\n    ```bash\n    curl -sL -o chain-spec.json \\\n      https://paritytech.github.io/chainspecs/polkadot/parachain/asset-hub/chainspec.json\n    ```\n\n    For other system parachains, find the correct URL in the [Chainspec Collection](https://paritytech.github.io/chainspecs/) under the [**List of Chainspecs**](https://paritytech.github.io/chainspecs/#list-of-chainspecs).\n\n=== \"Download from the Polkadot SDK repository\"\n\n    Download the chain specification directly using `curl`. For example, to download the Asset Hub Polkadot chain spec:\n\n    ```bash\n    curl -sL -o chain-spec.json \\\n      https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/cumulus/parachains/chain-specs/asset-hub-polkadot.json\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#other-parachains", "page_title": "Run a Parachain RPC Node", "index": 6, "depth": 3, "title": "Other Parachains", "anchor": "other-parachains", "start_char": 4178, "end_char": 4305, "estimated_token_count": 23, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Other Parachains\n\nFor non-system parachains, check the parachain's documentation for official chain specification files."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#spin-up-a-node", "page_title": "Run a Parachain RPC Node", "index": 7, "depth": 2, "title": "Spin Up a Node", "anchor": "spin-up-a-node", "start_char": 4305, "end_char": 14828, "estimated_token_count": 2338, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Spin Up a Node\n\nChoose the deployment option that fits your project, and follow the steps in the appropriate tab to complete setup:\n\n- **Docker**: Best for simpler set up and maintenance\n- **systemd**: Best for production environments requiring more control\n\nThis guide uses **Polkadot Asset Hub** as an example. To set up a different parachain, replace the chain spec file, snapshot path, and chain name with the corresponding values for your target parachain.\n\nSystem parachain details:\n\n| System Parachain   | Para ID | Chain Spec File            | Snapshot Path                          |\n|--------------------|---------|----------------------------|----------------------------------------|\n| **Asset Hub**      | 1000    | `asset-hub-polkadot.json`  | `polkadot-asset-hub-rocksdb-archive`   |\n| **People Chain**   | 1004    | `people-polkadot.json`     | `polkadot-people-rocksdb-archive`      |\n| **Bridge Hub**     | 1002    | `bridge-hub-polkadot.json` | `polkadot-bridge-hub-paritydb-archive` |\n| **Coretime Chain** | 1005    | `coretime-polkadot.json`   | `polkadot-coretime-rocksdb-archive`    |\n\n=== \"Docker\"\n\n    1. Download your parachain's chain specification as described in [Obtain the Chain Specification](#obtain-the-chain-specification).\n\n    2. (Archive nodes only, optional but recommended) Download a pre-synced parachain [snapshot](https://snapshots.polkadot.io/) to cut initial sync time from days to hours:\n\n        !!! note\n            Archive snapshots are available for system parachains. For other parachains, check with the parachain team for snapshot availability or sync from genesis. Skip this step for a pruned node, which uses warp sync instead. The relay chain does not need a snapshot because it always uses warp sync in this guide.\n\n        1. Create a new directory:\n\n            ```bash\n            mkdir -p my-node-data/chains/asset-hub-polkadot/db\n            ```\n\n        2. Download and save the archive parachain snapshot:\n\n            ```bash\n            # Check https://snapshots.polkadot.io/ for the latest snapshot URL\n            export SNAPSHOT_URL_PARACHAIN=\"https://snapshots.polkadot.io/polkadot-asset-hub-rocksdb-archive/INSERT_LATEST\"\n\n            rclone copyurl $SNAPSHOT_URL_PARACHAIN/files.txt files.txt\n            rclone copy --progress --transfers 20 \\\n              --http-url $SNAPSHOT_URL_PARACHAIN \\\n              --no-traverse --http-no-head --disable-http2 \\\n              --inplace --no-gzip-encoding --size-only \\\n              --retries 6 --retries-sleep 10s \\\n              --files-from files.txt :http: my-node-data/chains/asset-hub-polkadot/db/\n\n            rm files.txt\n            ```\n\n            ??? interface \"rclone parameters\"\n\n                - **`--transfers 20`**: Uses 20 parallel transfers for faster download\n                - **`--retries 6`**: Automatically retries failed transfers up to 6 times\n                - **`--retries-sleep 10s`**: Waits 10 seconds between retry attempts\n                - **`--size-only`**: Only transfers if sizes differ (prevents unnecessary re-downloads)\n\n    3. Launch the parachain node using the official [Parity Docker image](https://hub.docker.com/r/parity/polkadot-parachain):\n\n        === \"Archive\"\n\n            ```bash\n            docker run -d --name polkadot-hub-rpc --restart unless-stopped \\\n              -p 9944:9944 \\\n              -p 9615:9615 \\\n              -p 30334:30334 \\\n              -p 30334:30334/udp \\\n              -p 30333:30333 \\\n              -p 30333:30333/udp \\\n              -v $(pwd)/chain-spec.json:/chain-spec.json \\\n              -v $(pwd)/my-node-data:/data \\\n              parity/polkadot-parachain:stable2609 \\\n              --name=PolkadotHubRPC \\\n              --base-path=/data \\\n              --chain=/chain-spec.json \\\n              --prometheus-external \\\n              --prometheus-port 9615 \\\n              --rpc-external \\\n              --rpc-port=9944 \\\n              --rpc-cors=all \\\n              --rpc-methods=safe \\\n              --rpc-max-connections=1000 \\\n              --state-pruning=archive \\\n              --blocks-pruning=archive \\\n              -- \\\n              --base-path=/data \\\n              --chain=polkadot \\\n              --sync=warp \\\n              --state-pruning=256 \\\n              --blocks-pruning=256 \\\n              --rpc-port=0\n            ```\n\n        === \"Pruned\"\n\n            ```bash\n            docker run -d --name polkadot-hub-rpc --restart unless-stopped \\\n              -p 9944:9944 \\\n              -p 9615:9615 \\\n              -p 30334:30334 \\\n              -p 30334:30334/udp \\\n              -p 30333:30333 \\\n              -p 30333:30333/udp \\\n              -v $(pwd)/chain-spec.json:/chain-spec.json \\\n              -v $(pwd)/my-node-data:/data \\\n              parity/polkadot-parachain:stable2609 \\\n              --name=PolkadotHubRPC \\\n              --base-path=/data \\\n              --chain=/chain-spec.json \\\n              --prometheus-external \\\n              --prometheus-port 9615 \\\n              --rpc-external \\\n              --rpc-port=9944 \\\n              --rpc-cors=all \\\n              --rpc-methods=safe \\\n              --rpc-max-connections=1000 \\\n              --sync=warp \\\n              --state-pruning=1000 \\\n              --blocks-pruning=1000 \\\n              -- \\\n              --base-path=/data \\\n              --chain=polkadot \\\n              --sync=warp \\\n              --state-pruning=256 \\\n              --blocks-pruning=256 \\\n              --rpc-port=0\n            ```\n\n        !!! note\n            The `parity/polkadot-parachain` image works for system parachains and parachains built with standard Cumulus templates. For parachains with custom runtimes, check the parachain's documentation for their specific Docker image or binary.\n\n        Refer to the [Port Mappings](#port-mappings) and [Node Configuration Parameters](#node-configuration-parameters) sections for details on the command's configurations.\n\n=== \"systemd\"\n\n    1. Download the `polkadot-parachain` binary from the latest stable [Polkadot SDK release](https://github.com/paritytech/polkadot-sdk/releases):\n\n        ```bash\n        # Download the latest stable release (check releases page for current version)\n        wget https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-parachain\n\n        # Make it executable and move to system path\n        chmod +x polkadot-parachain\n        sudo mv polkadot-parachain /usr/local/bin/\n\n        # Verify installation\n        polkadot-parachain --version\n        ```\n\n    2. Download your parachain's chain specification as described in [Obtain the Chain Specification](#obtain-the-chain-specification).\n\n    3. Create user and directory structures:\n\n        ```bash\n        # Create a dedicated user\n        sudo useradd -r -s /bin/bash polkadot\n        \n        # Create data directory\n        sudo mkdir -p /var/lib/polkadot-hub-rpc\n\n        # Copy the chain spec to the directory\n        sudo cp chain-spec.json /var/lib/polkadot-hub-rpc/\n\n        # Set permissions\n        sudo chown -R polkadot:polkadot /var/lib/polkadot-hub-rpc\n        ```\n\n    4. Create a systemd service file for the Polkadot SDK RPC node:\n\n        ```bash\n        sudo nano /etc/systemd/system/polkadot-hub-rpc.service\n        ```\n\n    5. Open the new service file and add the configuration for either an archive (complete history) or pruned (recent state) node:\n\n        === \"Archive\"\n\n            ```ini\n            [Unit]\n            Description=Polkadot Hub RPC Node\n            After=network.target\n\n            [Service]\n            Type=simple\n            User=polkadot\n            Group=polkadot\n            WorkingDirectory=/var/lib/polkadot-hub-rpc\n\n            ExecStart=/usr/local/bin/polkadot-parachain \\\n              --name=PolkadotHubRPC \\\n              --chain=/var/lib/polkadot-hub-rpc/chain-spec.json \\\n              --base-path=/var/lib/polkadot-hub-rpc \\\n              --port=30333 \\\n              --rpc-port=9944 \\\n              --rpc-external \\\n              --rpc-cors=all \\\n              --rpc-methods=safe \\\n              --rpc-max-connections=1000 \\\n              --prometheus-port=9615 \\\n              --prometheus-external \\\n              --state-pruning=archive \\\n              --blocks-pruning=archive \\\n              -- \\\n              --chain=polkadot \\\n              --base-path=/var/lib/polkadot-hub-rpc \\\n              --port=30334 \\\n              --sync=warp \\\n              --state-pruning=256 \\\n              --blocks-pruning=256 \\\n              --rpc-port=0\n\n            Restart=always\n            RestartSec=10\n            LimitNOFILE=65536\n\n            [Install]\n            WantedBy=multi-user.target\n            ```\n\n        === \"Pruned\"\n\n            ```ini\n            [Unit]\n            Description=Polkadot Hub RPC Node\n            After=network.target\n\n            [Service]\n            Type=simple\n            User=polkadot\n            Group=polkadot\n            WorkingDirectory=/var/lib/polkadot-hub-rpc\n\n            ExecStart=/usr/local/bin/polkadot-parachain \\\n              --name=PolkadotHubRPC \\\n              --chain=/var/lib/polkadot-hub-rpc/chain-spec.json \\\n              --base-path=/var/lib/polkadot-hub-rpc \\\n              --port=30333 \\\n              --rpc-port=9944 \\\n              --rpc-external \\\n              --rpc-cors=all \\\n              --rpc-methods=safe \\\n              --rpc-max-connections=1000 \\\n              --prometheus-port=9615 \\\n              --prometheus-external \\\n              --sync=warp \\\n              --state-pruning=1000 \\\n              --blocks-pruning=1000 \\\n              -- \\\n              --chain=polkadot \\\n              --base-path=/var/lib/polkadot-hub-rpc \\\n              --port=30334 \\\n              --sync=warp \\\n              --state-pruning=256 \\\n              --blocks-pruning=256 \\\n              --rpc-port=0\n\n            Restart=always\n            RestartSec=10\n            LimitNOFILE=65536\n\n            [Install]\n            WantedBy=multi-user.target\n            ```\n\n        Refer to the [Port Mappings](#port-mappings) and [Node Configuration Parameters](#node-configuration-parameters) sections for details on the command's configurations.\n\n    6. Start the service:\n\n        ```bash\n        # Reload systemd\n        sudo systemctl daemon-reload\n\n        # Enable service to start on boot\n        sudo systemctl enable polkadot-hub-rpc\n        \n        # Start the Polkadot SDK node:\n        sudo systemctl start polkadot-hub-rpc\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#port-mappings", "page_title": "Run a Parachain RPC Node", "index": 8, "depth": 3, "title": "Port Mappings", "anchor": "port-mappings", "start_char": 14828, "end_char": 15152, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Port Mappings\n\n- **`9944`**: Polkadot SDK RPC endpoint (WebSocket/HTTP)\n- **`9615`**: Prometheus metrics endpoint\n- **`30333/30334`**: P2P networking ports. TCP carries regular peer connections. UDP on the same port numbers carries WebRTC connections, which full nodes accept by default on the litep2p network backend."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#node-configuration-parameters", "page_title": "Run a Parachain RPC Node", "index": 9, "depth": 3, "title": "Node Configuration Parameters", "anchor": "node-configuration-parameters", "start_char": 15152, "end_char": 17076, "estimated_token_count": 488, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Node Configuration Parameters\n\n- **`--rpc-external`**: Listens for RPC connections on all network interfaces instead of only on `localhost`. Combine it with `--rpc-methods=safe` and, for production, a reverse proxy with rate limiting.\n- **`--unsafe-rpc-external`**: Behaves like `--rpc-external` but skips the check that rejects external RPC access on validator nodes. An RPC node does not need it.\n- **`--rpc-cors=all`**: Allows all origins for CORS.\n- **`--rpc-methods=safe`**: Only allows safe RPC methods.\n- **`--sync=warp`**: Downloads the latest finalized state with a finality proof instead of executing every block since genesis. When `--blocks-pruning` is set to a number, the node then backfills only the headers and justifications of older blocks. Warp sync only applies when the database is empty and cannot be combined with `--state-pruning=archive` or `--state-pruning=archive-canonical`.\n- **`--state-pruning`**: `archive` keeps the state of all blocks, `archive-canonical` keeps the state of finalized blocks only, and `[NUMBER]` keeps the state of the last specified number of finalized blocks. Defaults to `256`.\n- **`--blocks-pruning`**: `archive` keeps all block bodies, `archive-canonical` keeps the bodies of finalized blocks only, and `[NUMBER]` keeps the bodies of the last specified number of finalized blocks. Defaults to `archive-canonical`, so set a number explicitly on pruned nodes. Block headers are always kept.\n- **`--prometheus-external`**: Exposes metrics externally.\n- **`--`**: Separates parachain flags from relay chain flags. Flags after `--` configure the embedded Polkadot relay chain node.\n\n!!! warning\n    The state pruning mode is stored in the database when the node first starts. Later runs fail if `--state-pruning` does not match the stored mode, except that `[NUMBER]` can change. To switch between a pruned node and an archive node, delete the database and sync again."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#monitor-node-synchronization", "page_title": "Run a Parachain RPC Node", "index": 10, "depth": 2, "title": "Monitor Node Synchronization", "anchor": "monitor-node-synchronization", "start_char": 17076, "end_char": 18070, "estimated_token_count": 333, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Monitor Node Synchronization\n\nMonitor the node synchronization status:\n\n```bash\ncurl -H \"Content-Type: application/json\" \\\n-d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"system_syncState\", \"params\":[]}' \\\nhttp://localhost:9944\n```\n\nWhen synchronization is complete, `currentBlock` will be equal to `highestBlock`:\n\n<div class=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>curl -H \"Content-Type: application/json\" \\\n  -d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"system_syncState\", \"params\":[]}' \\\n  http://localhost:9944</span>\n  <span data-ty><pre>{\n  \"jsonrpc\":\"2.0\",\n  \"id\":1,\n  \"result\":{\n    \"startingBlock\":0,\n    \"currentBlock\":3394816,\n    \"highestBlock\":3394816\n  }\n}\n  </pre></span>\n</div>\n\n!!! tip\n    You can use the `system_health` command to verify your node is running properly.\n\n    ```bash\n    curl -H \"Content-Type: application/json\" \\\n    -d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"system_health\", \"params\":[]}' \\\n    http://localhost:9944\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#commands-for-managing-your-node", "page_title": "Run a Parachain RPC Node", "index": 11, "depth": 2, "title": "Commands for Managing Your Node", "anchor": "commands-for-managing-your-node", "start_char": 18070, "end_char": 19068, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Commands for Managing Your Node\n\nUse the following commands to manage your node:\n\n=== \"Docker\"\n\n    - **View node logs**:\n\n        ```bash\n        docker logs -f polkadot-hub-rpc\n        ```\n\n    - **Stop container**:\n\n        ```bash\n        docker stop polkadot-hub-rpc\n        ```\n\n    - **Start container**:\n\n        ```bash\n        docker start polkadot-hub-rpc\n        ```\n\n    - **Remove container**:\n\n        ```bash\n        docker rm polkadot-hub-rpc\n        ```\n\n=== \"systemd\"\n\n    - **Check status**:\n\n        ```bash\n        sudo systemctl status polkadot-hub-rpc\n        ```\n\n    - **View node logs**:\n\n        ```bash\n        sudo journalctl -u polkadot-hub-rpc -f\n        ```\n\n    - **Stop service**:\n\n        ```bash\n        sudo systemctl stop polkadot-hub-rpc\n        ```\n\n    - **Enable service**:\n\n        ```bash\n        sudo systemctl enable polkadot-hub-rpc\n        ```\n\n    - **Start service**:\n\n        ```bash\n        sudo systemctl start polkadot-hub-rpc\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#ethereum-rpc-compatibility", "page_title": "Run a Parachain RPC Node", "index": 12, "depth": 2, "title": "Ethereum RPC Compatibility", "anchor": "ethereum-rpc-compatibility", "start_char": 19068, "end_char": 19630, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ethereum RPC Compatibility\n\n!!! note\n    Ethereum RPC compatibility is supported only on some chains, such as Polkadot Hub.\n\nEthereum RPC compatibility is provided through the `eth-rpc` adapter, which is part of [pallet-revive](https://paritytech.github.io/polkadot-sdk/master/pallet_revive_eth_rpc/index.html). This adapter translates Ethereum JSON-RPC calls into Polkadot SDK-compatible requests, enabling integration with Ethereum tools like [MetaMask](https://metamask.io/), [Hardhat](https://hardhat.org/), and [Ethers.js](https://docs.ethers.org/v6/)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#prerequisites_1", "page_title": "Run a Parachain RPC Node", "index": 13, "depth": 3, "title": "Prerequisites", "anchor": "prerequisites_1", "start_char": 19630, "end_char": 20297, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Prerequisites\n\nBefore starting the Ethereum RPC adapter:\n\n- **Node synchronization**: Let your Polkadot Hub node finish syncing before you start the adapter. On startup, the `eth-rpc` adapter reads `pallet-revive` configuration from the node's latest block and fails to start if that block predates `pallet-revive`, for example, early in the initial sync.\n- **Archive node recommended**: For full Ethereum RPC compatibility, run an archive node (`--state-pruning=archive`). The `eth-rpc` adapter may fail to query historical state on pruned nodes.\n- **RPC accessibility**: The Polkadot SDK-based RPC endpoint must be accessible (default: `ws://127.0.0.1:9944`)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#run-the-ethereum-rpc-adapter", "page_title": "Run a Parachain RPC Node", "index": 14, "depth": 3, "title": "Run the Ethereum RPC Adapter", "anchor": "run-the-ethereum-rpc-adapter", "start_char": 20297, "end_char": 22907, "estimated_token_count": 642, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Run the Ethereum RPC Adapter\n\nYou can run the Ethereum RPC adapter using Docker or as a systemd service.\n\n=== \"Docker\"\n\n    Start the adapter using the official [Parity eth-rpc Docker image](https://hub.docker.com/r/parity/eth-rpc/tags):\n\n    ```bash\n    docker run -d --name eth-rpc --restart unless-stopped \\\n      --network=host \\\n      -v /var/lib/eth-rpc:/data \\\n      parity/eth-rpc:stable2609 \\\n      --node-rpc-url=ws://127.0.0.1:9944 \\\n      --rpc-port=8545 \\\n      --base-path=/data \\\n      --rpc-external \\\n      --rpc-cors=all\n    ```\n\n    !!! note\n        The `-v` flag maps the host directory `/var/lib/eth-rpc` to `/data` inside the container. The `--base-path` flag references this container path to persist the `eth-rpc.db` database across restarts.\n\n    !!! note\n        Check the [Docker Hub tags page](https://hub.docker.com/r/parity/eth-rpc/tags) for newer releases. Tags follow the Polkadot SDK release naming, such as `stable2609`.\n\n=== \"systemd\"\n\n    1. Build the `eth-rpc` binary from the Polkadot SDK source:\n\n        ```bash\n        git clone --branch polkadot-stable2609 --depth 1 https://github.com/paritytech/polkadot-sdk.git\n        cd polkadot-sdk\n        cargo build -p pallet-revive-eth-rpc --bin eth-rpc --release\n\n        # Move to system path\n        sudo mv target/release/eth-rpc /usr/local/bin/\n        ```\n\n        !!! note\n            Pre-built binaries may not be available for all platforms. Building from source ensures compatibility with your system.\n\n    2. Create a systemd service file:\n\n        ```bash\n        sudo nano /etc/systemd/system/eth-rpc.service\n        ```\n\n    3. Add the following configuration:\n\n        ```ini\n        [Unit]\n        Description=Ethereum RPC Adapter for Polkadot Hub\n        After=network.target polkadot-hub-rpc.service\n\n        [Service]\n        Type=simple\n        User=polkadot\n        Group=polkadot\n\n        ExecStart=/usr/local/bin/eth-rpc \\\n          --node-rpc-url=ws://127.0.0.1:9944 \\\n          --rpc-port=8545 \\\n          --base-path=/var/lib/eth-rpc \\\n          --rpc-external \\\n          --rpc-cors=all\n\n        Restart=always\n        RestartSec=10\n\n        [Install]\n        WantedBy=multi-user.target\n        ```\n\n        !!! warning\n            The `--rpc-external` flag exposes your RPC endpoint publicly. For production deployments, consider using a reverse proxy with authentication and rate limiting, or bind to a specific interface.\n\n    4. Start the service:\n\n        ```bash\n        sudo systemctl daemon-reload\n        sudo systemctl enable eth-rpc\n        sudo systemctl start eth-rpc\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#ethereum-rpc-configuration", "page_title": "Run a Parachain RPC Node", "index": 15, "depth": 3, "title": "Ethereum RPC Configuration", "anchor": "ethereum-rpc-configuration", "start_char": 22907, "end_char": 24511, "estimated_token_count": 499, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Ethereum RPC Configuration\n\nThe adapter accepts the following key parameters:\n\n| Parameter | Description | Default |\n|:---------:|:-----------:|:-------:|\n| `--node-rpc-url` | Polkadot SDK-based node WebSocket URL | `ws://127.0.0.1:9944` |\n| `--rpc-port` | Ethereum RPC server port | `8545` |\n| `--rpc-external` | Listen for RPC connections on all network interfaces instead of only on `localhost` | Disabled |\n| `--rpc-cors` | CORS allowed origins | None |\n| `--eth-pruning` | Block storage strategy: `archive` for persistent on-disk DB with full historical sync, or `<N>` for in-memory DB keeping latest N blocks | `archive` |\n| `--base-path` | Directory for persistent database storage (`eth-rpc.db` is created inside this directory) | OS default data directory |\n| `--dev` | Use temporary on-disk directory, deleted on exit | Disabled |\n\n!!! warning\n    The `--rpc-external` flag exposes your RPC endpoint publicly. For production deployments, use a reverse proxy with proper authentication and rate limiting.\n\n??? note \"Migrating from previous CLI flags\"\n    As of [PR #11153](https://github.com/paritytech/polkadot-sdk/pull/11153), the following flags have been removed and replaced:\n\n    | Previous Flag | Replacement |\n    |:-------------:|:-----------:|\n    | `--cache-size N` | `--eth-pruning=<N>` |\n    | `--database-url sqlite::memory:` | `--eth-pruning=<N>` |\n    | `--database-url /path/to/db` | `--base-path=/path/to/dir` |\n    | `--index-last-n-blocks N` | `--eth-pruning=archive` |\n    | `--earliest-receipt-block N` | Removed — the adapter now auto-discovers the first EVM block |"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#api-endpoints", "page_title": "Run a Parachain RPC Node", "index": 16, "depth": 3, "title": "API Endpoints", "anchor": "api-endpoints", "start_char": 24511, "end_char": 24890, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### API Endpoints\n\nYour node setup provides two distinct API interfaces:\n\n| Interface | Port | Protocol | Use Cases |\n|:---------:|:----:|:--------:|:---------:|\n| **Polkadot SDK RPC** | 9944 | WebSocket/HTTP | Polkadot SDK-native applications, parachain-specific operations, governance |\n| **Ethereum RPC** | 8545 | HTTP | EVM libraries, Ethereum tools, EVM-compatible dApps |"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#verify-the-ethereum-rpc-adapter", "page_title": "Run a Parachain RPC Node", "index": 17, "depth": 3, "title": "Verify the Ethereum RPC Adapter", "anchor": "verify-the-ethereum-rpc-adapter", "start_char": 24890, "end_char": 25243, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify the Ethereum RPC Adapter\n\nTo verify the Ethereum RPC adapter is working correctly, you can test standard Ethereum JSON-RPC methods like `eth_chainId`, `eth_blockNumber`, and `eth_getBlockByNumber`. For a complete list of supported methods and example queries, see the [JSON-RPC APIs](/smart-contracts/for-eth-devs/json-rpc-apis/) reference."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#manage-the-ethereum-rpc-adapter", "page_title": "Run a Parachain RPC Node", "index": 18, "depth": 3, "title": "Manage the Ethereum RPC Adapter", "anchor": "manage-the-ethereum-rpc-adapter", "start_char": 25243, "end_char": 25832, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Manage the Ethereum RPC Adapter\n\n=== \"Docker\"\n\n    - **View logs**:\n\n        ```bash\n        docker logs -f eth-rpc\n        ```\n\n    - **Stop container**:\n\n        ```bash\n        docker stop eth-rpc\n        ```\n\n    - **Start container**:\n\n        ```bash\n        docker start eth-rpc\n        ```\n\n=== \"systemd\"\n\n    - **Check status**:\n\n        ```bash\n        sudo systemctl status eth-rpc\n        ```\n\n    - **View logs**:\n\n        ```bash\n        sudo journalctl -u eth-rpc -f\n        ```\n\n    - **Stop service**:\n\n        ```bash\n        sudo systemctl stop eth-rpc\n        ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-parachain-rpc", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/parachain-rpc/#conclusion", "page_title": "Run a Parachain RPC Node", "index": 19, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 25832, "end_char": 26785, "estimated_token_count": 158, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8105c0b45f5b0091a0b47fed319cab5acad1d0fd2dc01e9ee0428a743a226ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nRunning a parachain RPC node provides critical infrastructure for accessing Polkadot network services. By following this guide, you have set up a production-ready RPC node that:\n\n- Provides reliable access to parachain functionality for applications and users.\n- Supports flexible deployment with both Docker and systemd options.\n- Implements comprehensive monitoring, security, and maintenance practices.\n- Can be adapted for any parachain by substituting the appropriate chain specification.\n- Optionally enables Ethereum RPC compatibility for integration with EVM tools and wallets.\n\nWhether you're running a node for system parachains (Asset Hub, People Chain, Bridge Hub, Coretime Chain) or other parachains in the ecosystem, regular maintenance and monitoring will ensure your RPC node continues to provide reliable service. Stay updated with the latest releases and best practices to keep your infrastructure secure and performant."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#introduction", "page_title": "Set Up a Bootnode", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 614, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nBootnodes are essential for helping blockchain nodes discover peers and join the network. When a node starts, it needs to find other nodes, and bootnodes provide an initial point of contact. Once connected, a node can expand its peer connections and play its role in the network, like participating as a validator.\n\nThis guide will walk you through setting up a Polkadot bootnode, configuring P2P, WebSocket (WS), secure WSS connections, and managing network keys. You'll also learn how to test your bootnode to ensure it is running correctly and accessible to other nodes."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#prerequisites", "page_title": "Set Up a Bootnode", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 614, "end_char": 971, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you start, you need to have the following prerequisites:\n\n- Verify a working Polkadot (`polkadot`) binary is available on your machine.\n- Ensure you have nginx installed. Please refer to the [Installation Guide](https://nginx.org/en/docs/install.html) for help with installation if needed.\n- A VPS or other dedicated server setup."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#accessing-the-bootnode", "page_title": "Set Up a Bootnode", "index": 2, "depth": 2, "title": "Accessing the Bootnode", "anchor": "accessing-the-bootnode", "start_char": 971, "end_char": 1558, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Accessing the Bootnode\n\nBootnodes must be accessible through three key channels to connect with other nodes in the network:\n\n- **P2P**: A direct peer-to-peer connection, set by.\n\n    ```bash\n\n    --listen-addr /ip4/0.0.0.0/tcp/INSERT_PORT\n\n    ```\n    \n    This is not enabled by default on non-validator nodes like archive RPC nodes.\n\n- **P2P/WS**: A WebSocket (WS) connection, also configured via `--listen-addr`.\n- **P2P/WSS**: A secure WebSocket (WSS) connection using SSL, often required for light clients. An SSL proxy is needed, as the node itself cannot handle certificates."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#node-key", "page_title": "Set Up a Bootnode", "index": 3, "depth": 2, "title": "Node Key", "anchor": "node-key", "start_char": 1558, "end_char": 2225, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Node Key\n\nA node key is the ED25519 key used by `libp2p` to assign your node an identity or peer ID. Generating a known node key for a bootnode is crucial, as it gives you a consistent key that can be placed in chain specifications as a known, reliable bootnode.\n\nStarting a node creates its node key in the `chains/INSERT_CHAIN/network/secret_ed25519` file.\n\nYou can create a node key using:\n\n ``` bash\n polkadot key generate-node-key\n ``` \n \nThis key can be used in the startup command line.\n\nIt is imperative that you backup the node key. If it is included in the `polkadot` binary, it is hardcoded into the binary, which must be recompiled to change the key."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#running-the-bootnode", "page_title": "Set Up a Bootnode", "index": 4, "depth": 2, "title": "Running the Bootnode", "anchor": "running-the-bootnode", "start_char": 2225, "end_char": 3318, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Running the Bootnode\n\nA bootnode can be run as follows:\n\n ``` bash\n polkadot --chain polkadot \\\n --name dot-bootnode \\\n --listen-addr /ip4/0.0.0.0/tcp/30310 \\\n --listen-addr /ip4/0.0.0.0/tcp/30311/ws\n ```\n\nThis assigns the p2p to port 30310 and p2p/ws to port 30311. For the p2p/wss port, a proxy must be set up with a DNS name and a corresponding certificate. The following example is for the popular nginx server and enables p2p/wss on port 30312 by adding a proxy to the p2p/ws port 30311:\n\n``` conf title=\"/etc/nginx/sites-enabled/dot-bootnode\"\nserver {\n       listen       30312 ssl http2 default_server;\n       server_name  dot-bootnode.stakeworld.io;\n       root         /var/www/html;\n\n       ssl_certificate \"INSERT_YOUR_CERT\";\n       ssl_certificate_key \"INSERT_YOUR_KEY\";\n\n       location / {\n         proxy_buffers 16 4k;\n         proxy_buffer_size 2k;\n         proxy_pass http://localhost:30311;\n         proxy_http_version 1.1;\n         proxy_set_header Upgrade $http_upgrade;\n         proxy_set_header Connection \"Upgrade\";\n         proxy_set_header Host $host;\n   }\n\n}\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#testing-bootnode-connection", "page_title": "Set Up a Bootnode", "index": 5, "depth": 2, "title": "Testing Bootnode Connection", "anchor": "testing-bootnode-connection", "start_char": 3318, "end_char": 3712, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Testing Bootnode Connection\n\nIf the preceding node is running with DNS name `dot-bootnode.stakeworld.io`, which contains a proxy with a valid certificate and node-id `12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg` then the following commands should output `syncing 1 peers`.\n\n!!!tip\n    You can add `-lsub-libp2p=trace` on the end to get libp2p trace logging for debugging purposes."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#p2p", "page_title": "Set Up a Bootnode", "index": 6, "depth": 3, "title": "P2P", "anchor": "p2p", "start_char": 3712, "end_char": 3978, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### P2P\n\n```bash\npolkadot --chain polkadot \\\n--base-path /tmp/node \\\n--name \"Bootnode testnode\" \\\n--reserved-only \\\n--reserved-nodes \"/dns/dot-bootnode.stakeworld.io/tcp/30310/p2p/12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg\" \\\n--no-hardware-benchmarks\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#p2pws", "page_title": "Set Up a Bootnode", "index": 7, "depth": 3, "title": "P2P/WS", "anchor": "p2pws", "start_char": 3978, "end_char": 4250, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### P2P/WS\n\n```bash\npolkadot --chain polkadot \\\n--base-path /tmp/node \\\n--name \"Bootnode testnode\" \\\n--reserved-only \\\n--reserved-nodes \"/dns/dot-bootnode.stakeworld.io/tcp/30311/ws/p2p/12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg\" \\\n--no-hardware-benchmarks\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-bootnode", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/bootnode/#p2pwss", "page_title": "Set Up a Bootnode", "index": 8, "depth": 3, "title": "P2P/WSS", "anchor": "p2pwss", "start_char": 4250, "end_char": 4522, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5517e152057c8689f4a6b8d9e88b11f9975e67d33d0a9062925edc9086b645d9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### P2P/WSS\n\n```bash\npolkadot --chain polkadot \\\n--base-path /tmp/node \\\n--name \"Bootnode testnode\" \\\n--reserved-only \\\n--reserved-nodes \"/dns/dot-bootnode.stakeworld.io/tcp/30312/wss/p2p/12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg\" \\\n--no-hardware-benchmarks\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#introduction", "page_title": "Set Up a Node", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 946, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nRunning a node on Polkadot provides direct interaction with the network, enhanced privacy, and full control over RPC requests, transactions, and data queries. As the backbone of the network, nodes ensure decentralized data propagation, transaction validation, and seamless communication across the ecosystem.\n\nPolkadot supports multiple node types, including pruned, archive, and light nodes, each suited to specific use cases. During setup, you can use configuration flags to choose the node type you wish to run.\n\nThis guide walks you through configuring, securing, and maintaining a node on Polkadot or any Polkadot SDK-based chain. It covers instructions for the different node types and how to safely expose your node's RPC server for external access. Whether you're building a local development environment, powering dApps, or supporting network decentralization, this guide provides all the essentials."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#set-up-a-node", "page_title": "Set Up a Node", "index": 1, "depth": 2, "title": "Set Up a Node", "anchor": "set-up-a-node", "start_char": 946, "end_char": 1151, "estimated_token_count": 43, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up a Node\n\nNow that you're familiar with the different types of nodes, this section will walk you through configuring, securing, and maintaining a node on Polkadot or any Polkadot SDK-based chain."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#prerequisites", "page_title": "Set Up a Node", "index": 2, "depth": 3, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1151, "end_char": 1673, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Prerequisites\n\nBefore getting started, ensure the following prerequisites are met:\n\n- Ensure [Rust](https://rust-lang.org/tools/install/) is installed on your operating system.\n- [Install the necessary dependencies for the Polkadot SDK](/parachains/install-polkadot-sdk/).\n\n!!! warning\n    This setup is not recommended for validators. If you plan to run a validator, refer to the [Running a Validator](/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/) guide for proper instructions."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#install-and-build-the-polkadot-binary", "page_title": "Set Up a Node", "index": 3, "depth": 3, "title": "Install and Build the Polkadot Binary", "anchor": "install-and-build-the-polkadot-binary", "start_char": 1673, "end_char": 8119, "estimated_token_count": 1560, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install and Build the Polkadot Binary\n\nThis section will walk you through installing and building the Polkadot binary for different operating systems and methods.\n\n??? interface \"macOS\"\n\n    To get started, update and configure the Rust toolchain by running the following commands:\n\n    ```bash\n    source ~/.cargo/env\n\n    rustup default stable\n    rustup update\n\n    rustup update nightly\n    rustup target add wasm32-unknown-unknown --toolchain nightly\n    rustup component add rust-src --toolchain stable-aarch64-apple-darwin\n    ```\n\n    You can verify your installation by running:\n\n    ```bash\n    rustup show\n    rustup +nightly show\n    ```\n\n    You should see output similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>rustup show</span>\n      <span data-ty>rustup +nightly show</span>\n      <span data-ty></span>\n      <span data-ty>active toolchain</span>\n      <span data-ty>----------------</span>\n      <span data-ty></span>\n      <span data-ty>stable-aarch64-apple-darwin (default)</span>\n      <span data-ty>rustc 1.82.0 (f6e511eec 2024-10-15)</span>\n      <span data-ty></span>\n      <span data-ty>active toolchain</span>\n      <span data-ty>----------------</span>\n      <span data-ty></span>\n      <span data-ty>nightly-aarch64-apple-darwin (overridden by +toolchain on the command line) </span>\n      <span data-ty>rustc 1.84.0-nightly (03ee48451 2024-11-18)</span>\n      <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n    </div>\n    \n\n    Then, run the following commands to clone and build the Polkadot binary:\n  \n    ```bash\n    git clone https://github.com/paritytech/polkadot-sdk polkadot-sdk\n    cd polkadot-sdk\n    cargo build --release\n    ```\n\n    Depending upon the specs of your machine, compiling the binary may take an hour or more. After building the Polkadot node from source, the executable binary will be located in the `./target/release/polkadot` directory.\n\n??? interface \"Windows\"\n\n    To get started, make sure that you have [WSL and Ubuntu](https://learn.microsoft.com/en-us/windows/wsl/install) installed on your Windows machine.\n\n    Once installed, you have a couple options for installing the Polkadot binary:\n\n    - If Rust is installed, then `cargo` can be used similar to the macOS instructions.\n    - Or, the instructions in the Linux section can be used.\n\n??? interface \"Linux (pre-built binary)\"\n\n    To grab the [latest release of the Polkadot binary](https://github.com/paritytech/polkadot-sdk/releases), you can use `wget`:\n\n    ```bash\n    wget https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-INSERT_VERSION/polkadot\n    ```\n    \n    Ensure you note the executable binary's location, as you'll need to use it when running the start-up command. If you prefer, you can specify the output location of the executable binary with the `-O` flag, for example:\n\n    ```bash\n    wget https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-INSERT_VERSION/polkadot \\\n    - O /var/lib/polkadot-data/polkadot\n    ```\n\n    !!!tip\n        The nature of pre-built binaries means that they may not work on your particular architecture or Linux distribution. If you see an error like `cannot execute binary file: Exec format error` it likely means the binary is incompatible with your system. You will either need to compile the binary or use [Docker](#use-docker).\n\n    Ensure that you properly configure the permissions to make the Polkadot release binary executable:\n\n    ```bash\n    sudo chmod +x polkadot\n    ```\n\n??? interface \"Linux (compile binary)\"\n\n    The most reliable (although perhaps not the fastest) way of launching a full node is to compile the binary yourself. Depending on your machine's specs, this may take an hour or more.\n\n    To get started, run the following commands to configure the Rust toolchain:\n\n    ```bash\n    rustup default stable\n    rustup update\n    rustup update nightly\n    rustup target add wasm32-unknown-unknown --toolchain nightly\n    rustup target add wasm32-unknown-unknown --toolchain stable-x86_64-unknown-linux-gnu\n    rustup component add rust-src --toolchain stable-x86_64-unknown-linux-gnu\n    ```\n\n    You can verify your installation by running:\n\n    ```bash\n    rustup show\n    ```\n\n    You should see output similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>rustup show</span>\n      <span data-ty></span>\n      <span data-ty>active toolchain</span>\n      <span data-ty>----------------</span>\n      <span data-ty></span>\n      <span data-ty>stable-x86_64-unknown-linux-gnu (default)</span>\n      <span data-ty>rustc 1.82.0 (f6e511eec 2024-10-15)</span>\n    </div>\n    \n\n    Once Rust is configured, run the following commands to clone and build Polkadot:\n  \n    ```bash\n    git clone https://github.com/paritytech/polkadot-sdk polkadot-sdk\n    cd polkadot-sdk\n    cargo build --release\n    ```\n\n    Compiling the binary may take an hour or more, depending on your machine's specs. After building the Polkadot node from the source, the executable binary will be located in the `./target/release/polkadot` directory.\n\n??? interface \"Linux (snap package)\"\n\n    Polkadot can be installed as a [snap package](https://snapcraft.io/polkadot). If you don't already have Snap installed, take the following steps to install it:\n\n    ```bash\n    sudo apt update\n    sudo apt install snapd\n    ```\n\n    Install the Polkadot snap package:\n\n    ```bash\n    sudo snap install polkadot\n    ```\n    \n    Before continuing on with the following instructions, check out the [Configure and Run Your Node](#configure-and-run-your-node) section to learn more about the configuration options.\n\n    To configure your Polkadot node with your desired options, you'll run a command similar to the following:\n\n    ```bash\n    sudo snap set polkadot service-args=\"--name=MyName --chain=polkadot\"\n    ```\n\n    Then to start the node service, run:\n\n    ```bash\n    sudo snap start polkadot\n    ```\n\n    You can review the logs to check on the status of the node: \n\n    ```bash\n    snap logs polkadot -f\n    ```\n\n    And at any time, you can stop the node service:\n\n    ```bash\n    sudo snap stop polkadot\n    ```\n\n    You can optionally prevent the service from stopping when snap is updated with the following command:\n\n    ```bash\n    sudo snap set polkadot endure=true\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#use-docker", "page_title": "Set Up a Node", "index": 4, "depth": 3, "title": "Use Docker", "anchor": "use-docker", "start_char": 8119, "end_char": 9170, "estimated_token_count": 287, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use Docker\n\nAs an additional option, you can use Docker to run your node in a container. Doing this is more advanced, so it's best left up to those already familiar with Docker or who have completed the other set-up instructions in this guide. You can review the latest versions on [DockerHub](https://hub.docker.com/r/parity/polkadot/tags).\n\nBe aware that when you run Polkadot in Docker, the process only listens on `localhost` by default. If you would like to connect to your node's services (RPC and Prometheus) you need to ensure that you run the node with the `--rpc-external`, and `--prometheus-external` commands.\n\n```bash\ndocker run -p 9944:9944 -p 9615:9615 parity/polkadot:v1.16.2 --name \"my-polkadot-node-calling-home\" --rpc-external --prometheus-external\n```\n\nIf you're running Docker on an Apple Silicon machine (e.g. M4), you'll need to adapt the command slightly:\n\n```bash\ndocker run --platform linux/amd64 -p 9944:9944 -p 9615:9615 parity/polkadot:v1.16.2 --name \"kearsarge-calling-home\" --rpc-external --prometheus-external\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#configure-and-run-your-node", "page_title": "Set Up a Node", "index": 5, "depth": 2, "title": "Configure and Run Your Node", "anchor": "configure-and-run-your-node", "start_char": 9170, "end_char": 10962, "estimated_token_count": 418, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure and Run Your Node\n\nNow that you've installed and built the Polkadot binary, the next step is to configure the start-up command depending on the type of node that you want to run. You'll need to modify the start-up command accordingly based on the location of the binary. In some cases, it may be located within the `./target/release/` folder, so you'll need to replace polkadot with `./target/release/polkadot` in the following commands.\n\nAlso, note that you can use the same binary for Polkadot as you would for Kusama or any other relay chain. You'll need to use the `--chain` flag to differentiate between chains.\n\nThe base commands for running a Polkadot node are as follows:\n\n=== \"Default pruned node\"\n\n    This uses the default pruning value of the last 256 blocks:\n\n    ```bash\n    polkadot --chain polkadot \\\n    --name \"INSERT_NODE_NAME\"\n    ```\n\n=== \"Custom pruned node\"\n\n    You can customize the pruning value, for example, to the last 1000 finalized blocks:\n\n    ```bash\n    polkadot --chain polkadot \\\n    --name INSERT_YOUR_NODE_NAME \\\n    --state-pruning 1000 \\\n    --blocks-pruning archive \\\n    --rpc-cors all \\\n    --rpc-methods safe\n    ```\n\n=== \"Archive node\"\n\n    To support the full state, use the `archive` option:\n\n    ```bash\n    polkadot --chain polkadot \\\n    --name INSERT_YOUR_NODE_NAME \\\n    --state-pruning archive \\\n    --blocks-pruning archive \\\n    ```\n\nIf you want to run an RPC node, please refer to the following [RPC Configurations](#rpc-configurations) section.\n\nTo review a complete list of the available commands, flags, and options, you can use the `--help` flag:\n\n```bash\npolkadot --help\n```\n\nOnce you've fully configured your start-up command, you can execute it in your terminal and your node will start [syncing](#sync-your-node)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#rpc-configurations", "page_title": "Set Up a Node", "index": 6, "depth": 3, "title": "RPC Configurations", "anchor": "rpc-configurations", "start_char": 10962, "end_char": 11805, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### RPC Configurations\n\nThe node startup settings allow you to choose what to expose, how many connections to expose, and which systems should be granted access through the RPC server.\n\n- You can limit the methods to use with `--rpc-methods`; an easy way to set this to a safe mode is `--rpc-methods safe`.\n- You can set your maximum connections through `--rpc-max-connections`, for example, `--rpc-max-connections 200`.\n- By default, localhost and Polkadot.js can access the RPC server. You can change this by setting `--rpc-cors`. To allow access from everywhere, you can use `--rpc-cors all`.\n\nFor a list of important flags when running RPC nodes, refer to the Parity DevOps documentation: [Important Flags for Running an RPC Node](https://paritytech.github.io/devops-guide/guides/rpc_index.html?#important-flags-for-running-an-rpc-node)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#sync-your-node", "page_title": "Set Up a Node", "index": 7, "depth": 2, "title": "Sync Your Node", "anchor": "sync-your-node", "start_char": 11805, "end_char": 15459, "estimated_token_count": 1230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Sync Your Node\n\nThe syncing process will take a while, depending on your capacity, processing power, disk speed, and RAM. The process may be completed on a $10 DigitalOcean droplet in about ~36 hours. While syncing, your node name should be visible in gray on Polkadot Telemetry, and once it is fully synced, your node name will appear in white on [Polkadot Telemetry](https://telemetry.polkadot.io/#list/Polkadot).\n\nA healthy node syncing blocks will output logs like the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty>2024-11-19 23:49:57 Parity Polkadot</span>\n  <span data-ty>2024-11-19 23:49:57 ✌️ version 1.14.1-7c4cd60da6d</span>\n  <span data-ty>2024-11-19 23:49:57 ❤️ by Parity Technologies &lt;admin@parity.io&gt;, 2017-2024</span>\n  <span data-ty>2024-11-19 23:49:57 📋 Chain specification: Polkadot</span>\n  <span data-ty>2024-11-19 23:49:57 🏷 Node name: myPolkadotNode</span>\n  <span data-ty>2024-11-19 23:49:57 👤 Role: FULL</span>\n  <span data-ty>2024-11-19 23:49:57 💾 Database: RocksDb at /home/ubuntu/.local/share/polkadot/chains/polkadot/db/full</span>\n  <span data-ty>2024-11-19 23:50:00 🏷 Local node identity is: 12D3KooWDmhHEgPRJUJnUpJ4TFWn28EENqvKWH4dZGCN9TS51y9h</span>\n  <span data-ty>2024-11-19 23:50:00 Running libp2p network backend</span>\n  <span data-ty>2024-11-19 23:50:00 💻 Operating system: linux</span>\n  <span data-ty>2024-11-19 23:50:00 💻 CPU architecture: x86_64</span>\n  <span data-ty>2024-11-19 23:50:00 💻 Target environment: gnu</span>\n  <span data-ty>2024-11-19 23:50:00 💻 CPU: Intel(R) Xeon(R) CPU E3-1245 V2 @ 3.40GHz</span>\n  <span data-ty>2024-11-19 23:50:00 💻 CPU cores: 4</span>\n  <span data-ty>2024-11-19 23:50:00 💻 Memory: 32001MB</span>\n  <span data-ty>2024-11-19 23:50:00 💻 Kernel: 5.15.0-113-generic</span>\n  <span data-ty>2024-11-19 23:50:00 💻 Linux distribution: Ubuntu 22.04.5 LTS</span>\n  <span data-ty>2024-11-19 23:50:00 💻 Virtual machine: no</span>\n  <span data-ty>2024-11-19 23:50:00 📦 Highest known block at #9319</span>\n  <span data-ty>2024-11-19 23:50:00 〽️ Prometheus exporter started at 127.0.0.1:9615</span>\n  <span data-ty>2024-11-19 23:50:00 Running JSON-RPC server: addr=127.0.0.1:9944, allowed origins=[\"http://localhost:*\", \"http://127.0.0.1:*\", \"https://localhost:*\", \"https://127.0.0.1:*\", \"https://polkadot.js.org\"]</span>\n  <span data-ty>2024-11-19 23:50:00 🏁 CPU score: 671.67 MiBs</span>\n  <span data-ty>2024-11-19 23:50:00 🏁 Memory score: 7.96 GiBs</span>\n  <span data-ty>2024-11-19 23:50:00 🏁 Disk score (seq. writes): 377.87 MiBs</span>\n  <span data-ty>2024-11-19 23:50:00 🏁 Disk score (rand. writes): 147.92 MiBs</span>\n  <span data-ty>2024-11-19 23:50:00 🥩 BEEFY gadget waiting for BEEFY pallet to become available...</span>\n  <span data-ty>2024-11-19 23:50:00 🔍 Discovered new external address for our node: /ip4/37.187.93.17/tcp/30333/ws/p2p/12D3KooWDmhHEgPRJUJnUpJ4TFWn28EENqvKWH4dZGCN9TS51y9h</span>\n  <span data-ty>2024-11-19 23:50:01 🔍 Discovered new external address for our node: /ip6/2001:41d0:a:3511::1/tcp/30333/ws/p2p/12D3KooWDmhHEgPRJUJnUpJ4TFWn28EENqvKWH4dZGCN9TS51y9h</span>\n  <span data-ty>2024-11-19 23:50:05 ⚙️ Syncing, target=#23486325 (5 peers), best: #12262 (0x8fb5…f310), finalized #11776 (0x9de1…32fb), ⬇ 430.5kiB/s ⬆ 17.8kiB/s</span>\n  <span data-ty>2024-11-19 23:50:10 ⚙️ Syncing 628.8 bps, target=#23486326 (6 peers), best: #15406 (0x9ce1…2d76), finalized #15360 (0x0e41…a064), ⬇ 255.0kiB/s ⬆ 1.8kiB/s</span>\n</div>\n\n\nCongratulations, you're now syncing a Polkadot full node! Remember that the process is identical when using any other Polkadot SDK-based chain, although individual chains may have chain-specific flag requirements."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-full-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/full-node/#connect-to-your-node", "page_title": "Set Up a Node", "index": 8, "depth": 3, "title": "Connect to Your Node", "anchor": "connect-to-your-node", "start_char": 15459, "end_char": 15795, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8f0c6ede27f74634d0d407aa0f9aa593119d7c350efe6c4d4493abd5e250ead9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Connect to Your Node\n\nOpen [Polkadot.js Apps](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/explorer) and click the logo in the top left to switch the node. Activate the **Development** toggle and input your node's domain or IP address. The default WSS endpoint for a local node is:\n\n```bash\nws://127.0.0.1:9944\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-secure-wss", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/secure-wss/#introduction", "page_title": "Set Up Secure WebSocket", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 28, "end_char": 601, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:56c9a0daca0691c186ac7e6bf9395128184a76701997abc3660ca36b74d32ea8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nEnsuring secure WebSocket communication is crucial for maintaining the integrity and security of a Polkadot or Kusama node when interacting with remote clients. This guide walks you through setting up a secure WebSocket (WSS) connection for your node by leveraging SSL encryption with popular web server proxies like nginx or Apache.\n\nBy the end of this guide, you'll be able to secure your node's WebSocket port, enabling safe remote connections without exposing your node to unnecessary risks. The instructions in this guide are for UNIX-based systems."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-secure-wss", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/secure-wss/#secure-a-websocket-port", "page_title": "Set Up Secure WebSocket", "index": 1, "depth": 2, "title": "Secure a WebSocket Port", "anchor": "secure-a-websocket-port", "start_char": 601, "end_char": 1038, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:56c9a0daca0691c186ac7e6bf9395128184a76701997abc3660ca36b74d32ea8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Secure a WebSocket Port\n\nYou can convert a non-secured WebSocket port to a secure WSS port by placing it behind an SSL-enabled proxy. This approach can be used to secure a bootnode or RPC server. The SSL-enabled apache2/nginx/other proxy server redirects requests to the internal WebSocket and converts it to a secure (WSS) connection. You can use a service like [LetsEncrypt](https://letsencrypt.org/) to obtain an SSL certificate."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-secure-wss", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/secure-wss/#obtain-an-ssl-certificate", "page_title": "Set Up Secure WebSocket", "index": 2, "depth": 3, "title": "Obtain an SSL Certificate", "anchor": "obtain-an-ssl-certificate", "start_char": 1038, "end_char": 2018, "estimated_token_count": 239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:56c9a0daca0691c186ac7e6bf9395128184a76701997abc3660ca36b74d32ea8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Obtain an SSL Certificate\n\nLetsEncrypt suggests using the [Certbot ACME client](https://letsencrypt.org/getting-started/#with-shell-access/) for your respective web server implementation to get a free SSL certificate:\n\n- [nginx](https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal)\n- [apache2](https://certbot.eff.org/instructions?ws=apache&os=ubuntufocal)\n \nLetsEncrypt will auto-generate an SSL certificate and include it in your configuration.\n\nWhen connecting, you can generate a self-signed certificate and rely on your node's raw IP address. However, self-signed certificates aren't optimal because you must include the certificate in an allowlist to access it from a browser.\n\nUse the following command to generate a self-signed certificate using OpenSSL:\n\n```bash\nsudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/selfsigned.key -out /etc/ssl/certs/selfsigned.crt\nsudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-secure-wss", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/secure-wss/#install-a-proxy-server", "page_title": "Set Up Secure WebSocket", "index": 3, "depth": 2, "title": "Install a Proxy Server", "anchor": "install-a-proxy-server", "start_char": 2018, "end_char": 2383, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:56c9a0daca0691c186ac7e6bf9395128184a76701997abc3660ca36b74d32ea8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install a Proxy Server\n\nThere are a lot of different implementations of a WebSocket proxy; some of the more widely used are [nginx](https://www.f5.com/go/product/welcome-to-nginx) and [apache2](https://httpd.apache.org/), both of which are commonly used web server implementations. See the following section for configuration examples for both implementations."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-secure-wss", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/secure-wss/#use-nginx", "page_title": "Set Up Secure WebSocket", "index": 4, "depth": 3, "title": "Use nginx", "anchor": "use-nginx", "start_char": 2383, "end_char": 3127, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:56c9a0daca0691c186ac7e6bf9395128184a76701997abc3660ca36b74d32ea8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use nginx\n\n1. Install the `nginx` web server: \n    ```bash\n    apt install nginx\n    ```\n\n2. In an SSL-enabled virtual host, add:\n    ```conf\n    server {\n        (...)\n        location / {\n        proxy_buffers 16 4k;\n        proxy_buffer_size 2k;\n        proxy_pass http://localhost:9944;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"Upgrade\";\n        proxy_set_header Host $host;\n        }\n    }\n    ```\n\n3. Optionally, you can introduce some form of rate limiting:\n    ```conf\n    http {\n        limit_req_zone  \"$http_x_forwarded_for\" zone=zone:10m rate=2r/s;\n        (...)\n    }\n    location / {\n        limit_req zone=zone burst=5;\n        (...)\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-secure-wss", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/secure-wss/#use-apache2", "page_title": "Set Up Secure WebSocket", "index": 5, "depth": 3, "title": "Use Apache2", "anchor": "use-apache2", "start_char": 3127, "end_char": 4925, "estimated_token_count": 394, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:56c9a0daca0691c186ac7e6bf9395128184a76701997abc3660ca36b74d32ea8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use Apache2\n\nApache2 can run in various modes, including `prefork`, `worker`, and `event`. In this example, the [`event`](https://httpd.apache.org/docs/2.4/mod/event.html) mode is recommended for handling higher traffic loads, as it is optimized for performance in such environments. However, depending on the specific requirements of your setup, other modes like `prefork` or `worker` may also be appropriate.\n\n1. Install the `apache2` web server:\n    ```bash\n    apt install apache2\n    a2dismod mpm_prefork\n    a2enmod mpm_event proxy proxy_html proxy_http proxy_wstunnel rewrite ssl\n    ```\n\n2. The [`mod_proxy_wstunnel`](https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html) provides support for the tunneling of WebSocket connections to a backend WebSocket server. The connection is automatically upgraded to a WebSocket connection. In an SSL-enabled virtual host add:\n\n    ```apacheconf\n    # (...)\n    SSLProxyEngine on\n    ProxyRequests off\n    ProxyPass / ws://localhost:9944\n    ProxyPassReverse / ws://localhost:9944\n    ```\n\n    !!!warning \n        Older versions of `mod_proxy_wstunnel` don't upgrade the connection automatically and will need the following config added:\n        ```apacheconf\n        RewriteEngine on\n        RewriteCond %{HTTP:Upgrade} websocket [NC]\n        RewriteRule /(.*) ws://localhost:9944/$1 [P,L]\n        RewriteRule /(.*) http://localhost:9944/$1 [P,L]\n        ```\n\n3. Optionally, some form of rate limiting can be introduced by first running the following command:\n\n    ```bash\n    apt install libapache2-mod-qos\n    a2enmod qos\n    ```\n\n    Then edit `/etc/apache2/mods-available/qos.conf` as follows:\n\n    ```conf\n    # allows max 50 connections from a single IP address:\n    QS_SrvMaxConnPerIP                                 50\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-node-relay-chain-secure-wss", "url": "https://developer.polkadot.com/node-infrastructure/run-a-node/relay-chain/secure-wss/#connect-to-the-node", "page_title": "Set Up Secure WebSocket", "index": 6, "depth": 2, "title": "Connect to the Node", "anchor": "connect-to-the-node", "start_char": 4925, "end_char": 5428, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:56c9a0daca0691c186ac7e6bf9395128184a76701997abc3660ca36b74d32ea8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Connect to the Node\n\n1. Open [Polkadot.js Apps interface](https://polkadot.js.org/apps) and click the logo in the top left to switch the node.\n2. Activate the **Development** toggle and input either your node's domain or IP address. Remember to prefix with `wss://` and, if you're using the 443 port, append `:443` as follows:\n\n    ```bash\n    wss://example.com:443\n    ```\n\n![A sync-in-progress chain connected to Polkadot.js UI](/images/node-infrastructure/run-a-node/secure-wss/secure-wss-01.webp)"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#introduction", "page_title": "Validator Key Management", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 561, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nAfter setting up your node environment as shown in the [Setup](/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/) section, you'll need to configure multiple keys for your validator to operate properly. This includes setting up session keys, which are essential for participating in the consensus process, and configuring a node key that maintains a stable network identity. This guide walks you through the key management process, showing you how to generate, store, and register these keys."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#set-session-keys", "page_title": "Validator Key Management", "index": 1, "depth": 2, "title": "Set Session Keys", "anchor": "set-session-keys", "start_char": 561, "end_char": 1091, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Session Keys\n\nSetting up your validator's session keys is essential to associate your node with your stash account on the Polkadot network. Validators use session keys to participate in the consensus process. Your validator can only perform its role in the network by properly setting session keys which consist of several key pairs for different parts of the protocol (e.g., GRANDPA, BABE). These keys must be registered on-chain and associated with your validator node to ensure it can participate in validating blocks."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#generate-session-keys", "page_title": "Validator Key Management", "index": 2, "depth": 3, "title": "Generate Session Keys", "anchor": "generate-session-keys", "start_char": 1091, "end_char": 7055, "estimated_token_count": 1238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Generate Session Keys\n\n!!! warning \"Breaking change introduced in runtime 2.2.0\"\n    Runtime 2.2.0 introduced a new session key generation flow using the `author_rotateKeysWithOwner` RPC, which requires your stash account as a parameter and returns both the session keys and a cryptographic proof of ownership. This proof must be included later when submitting `setKeys`. The previous `author_rotateKeys` RPC and the Subkey approach are no longer supported for new key generation. If your node already has session keys set on-chain and you are not rotating them, no action is required.\n\n    Polkadot and Kusama are beyond runtime 2.2.0, so the new flow is the only supported path on both networks. The **Pre-2.2.0 (Legacy)** tab below is kept for reference and applies only to chains still running a pre-2.2.0 runtime.\n\n=== \"Runtime 2.2.0+ (`rotateKeysWithOwner`)\"\n\n    Generate session keys by running the following command on your node, replacing `INSERT_STASH_ACCOUNT_ID` with your stash account ID:\n\n    ``` bash\n    curl -H \"Content-Type: application/json\" \\\n    -d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"author_rotateKeysWithOwner\", \"params\":[\"INSERT_STASH_ACCOUNT_ID\"]}' \\\n    http://localhost:9944\n    ```\n\n    This command returns a JSON object with two fields in the `result`: `keys` (the hex-encoded session keys) and `proof` (the ownership proof). Save both values for later use.\n\n    ```json\n    {\n      \"jsonrpc\": \"2.0\",\n      \"result\": {\n        \"keys\": \"0xda3861a45e0197f3ca145c2c209f9126e5053fas503e459af4255cf8011d51010\",\n        \"proof\": \"0x1a2b3c4d5e6f...\"\n      },\n      \"id\": 1\n    }\n    ```\n\n    !!! note \"Subkey is no longer supported for session key generation\"\n        Previously, nodes could generate session keys externally using `subkey` and manually insert them into the node's keystore. This approach is no longer viable because `set_keys` now requires a cryptographic proof of ownership — each private session key must sign the stash account ID. The only way to obtain this proof is through `author_rotateKeysWithOwner`, which handles key generation, keystore insertion, and proof generation in a single step. Operators who previously relied on `subkey` for session key generation should migrate to using `author_rotateKeysWithOwner` as described above.\n\n=== \"Pre-2.2.0 (Legacy)\"\n\n    Polkadot and Kusama are beyond runtime 2.2.0, so this legacy flow is no longer applicable on those networks. Use it only if you are operating on a chain still running a pre-2.2.0 runtime. On such a chain, there are multiple ways to create the session keys:\n\n    === \"Polkadot.js Apps UI\"\n\n        1. In Polkadot.js Apps, connect to your local node, navigate to the **Developer** dropdown, and select the **RPC Calls** option.\n\n        2. Construct an `author_rotateKeys` RPC call and execute it:\n\n            1. Select the **author** endpoint.\n            2. Choose the **rotateKeys()** call.\n            3. Click the **Submit RPC Call** button.\n            4. Copy the hex-encoded public key from the response.\n\n            ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/key-management-01.webp)\n\n    === \"Curl\"\n\n        Generate session keys by running the following command on your node:\n\n        ``` bash\n        curl -H \"Content-Type: application/json\" \\\n        -d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"author_rotateKeys\", \"params\":[]}' \\\n        http://localhost:9944\n        ```\n\n        This command will return a JSON object. The `result` key is the hex-encoded public part of the newly created session key. Save this for later use.\n\n        ```json\n        {\"jsonrpc\":\"2.0\",\"result\":\"0xda3861a45e0197f3ca145c2c209f9126e5053fas503e459af4255cf8011d51010\",\"id\":1}\n        ```\n\n    === \"Subkey\"\n\n        To create a keypair for your node's session keys, use the `subkey generate` command. This generates a set of cryptographic keys that must be stored in your node's keystore directory.\n\n        When you run the command, it produces output similar to this example:\n\n        <div id=\"termynal\" data-termynal>\n          <span data-ty=\"input\"><span class=\"file-path\"></span>subkey generate</span>\n          <pre>\n        Secret phrase:       twist buffalo mixture excess device drastic vague mammal fitness punch match hammer\n          Network ID:        substrate\n          Secret seed:       0x5faa9e5defe42b201388d5c2b8202d6625a344abc9aa52943a71f12cb90b88a9\n          Public key (hex):  0x28cc2fdb6e28835e2bbac9a16feb65c23d448c9314ef12fe083b61bab8fc2755\n          Account ID:        0x28cc2fdb6e28835e2bbac9a16feb65c23d448c9314ef12fe083b61bab8fc2755\n          Public key (SS58): 5CzCRpXzHYhuo6G3gYFR3cgV6X3qCNwVt51m8q14ZcChsSXQ\n          SS58 Address:      5CzCRpXzHYhuo6G3gYFR3cgV6X3qCNwVt51m8q14ZcChsSXQ\n          </pre>\n        </div>\n        \n\n        To properly store these keys, create a file in your keystore directory with a specific naming convention. The filename must consist of the hex string `61757261` (which represents \"aura\" in hex) followed by the public key without its `0x` prefix.\n\n        Using the example above, you would create a file named:\n\n        ```\n        ./keystores/6175726128cc2fdb6e28835e2bbac9a16feb65c23d448c9314ef12fe083b61bab8fc2755\n        ```\n\n        And store only the secret phrase in the file:\n\n        ```\n        \"twist buffalo mixture excess device drastic vague mammal fitness punch match hammer\"\n        ```\n\n    When submitting `setKeys`, use `0x00` as the proof parameter.\n\n!!! warning \"Save your session key output immediately\"\n    You must save these session keys as you'll need them for on-chain registration.\n    Calling `author_rotateKeys` or `author_rotateKeysWithOwner` generates **new keys every time** — it does not return previously generated keys. If you lose the output, there is no way to retrieve it. You will need to call the RPC again, which generates a fresh set of keys, and then re-submit `setKeys` with the new result."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#submit-transaction-to-set-keys", "page_title": "Validator Key Management", "index": 3, "depth": 3, "title": "Submit Transaction to Set Keys", "anchor": "submit-transaction-to-set-keys", "start_char": 7055, "end_char": 11077, "estimated_token_count": 956, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Submit Transaction to Set Keys\n\nAfter generating your session keys (and proof, if using runtime 2.2.0+), you must submit them on-chain. There are two paths for submitting session keys:\n\n=== \"Polkadot Hub (Recommended)\"\n\n    The recommended approach is to use the `stakingRcClient.set_keys` extrinsic on Polkadot Hub. This path is required for validators using pure proxy stash accounts or [Staking Operator proxies](/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/).\n\n    === \"Runtime 2.2.0+\"\n\n        1. In Polkadot.js Apps, connect to **Polkadot Hub** (Asset Hub).\n        2. Navigate to **Developer > Extrinsics**.\n        3. Select your stash account (or submit via proxy).\n        4. Choose the **stakingRcClient** pallet and the **setKeys** extrinsic.\n        5. Enter the following parameters:\n            - **`keys`**: The session keys hex string returned by `author_rotateKeysWithOwner`.\n            - **`proof`**: The proof hex string returned by `author_rotateKeysWithOwner`.\n            - **`maxDeliveryAndRemoteExecutionFee`**: Optional maximum fee for the XCM message to the relay chain. Can be left as `None`.\n        6. Submit and sign the transaction.\n\n        ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/key-management-03.webp)\n\n        Polkadot Hub validates the proof locally and forwards the keys to the relay chain via XCM.\n\n    === \"Pre-2.2.0\"\n\n        1. Go to [Polkadot.js Apps](https://polkadot.js.org/apps/) and connect to Polkadot Hub.\n        2. Navigate to **Developer > Extrinsics**.\n        3. Select the account that controls your validator (your stash or proxy account).\n        4. Choose the **stakingRcClient** pallet and the **setKeys** extrinsic.\n        5. Paste the hex-encoded session key string returned by `author_rotateKeys` into the **keys** field.\n        6. Set the **proof** field to `0x` (empty proof).\n        7. Submit the transaction.\n\n    !!! note\n        Setting session keys on Polkadot Hub requires a deposit of approximately 60 DOT (or ~2 KSM on Kusama). This deposit is only released when you call `stakingRcClient.purgeKeys` on Polkadot Hub — purging keys via the relay chain (`session.purgeKeys`) does not release this deposit.\n\n=== \"Relay Chain (Legacy)\"\n\n    You can also submit session keys directly on the relay chain using `session.setKeys`. **This path will be removed in a future runtime upgrade** (see [polkadot-fellows/runtimes#1212](https://github.com/polkadot-fellows/runtimes/pull/1212)). Migrate to the Polkadot Hub path above.\n\n    === \"Runtime 2.2.0+\"\n\n        1. In Polkadot.js Apps, connect to the **relay chain**.\n        2. Navigate to **Developer > Extrinsics**.\n        3. Select your stash account.\n        4. Choose the **session** pallet and the **setKeys** extrinsic.\n        5. Enter the following parameters:\n            - **`keys`**: The session keys hex string returned by `author_rotateKeysWithOwner`.\n            - **`proof`**: The proof hex string returned by `author_rotateKeysWithOwner`.\n        6. Submit and sign the transaction.\n\n    === \"Pre-2.2.0\"\n\n        1. Go to the **Network > Staking > Accounts** section on [Polkadot.js Apps](https://polkadot.js.org/apps/#/staking/actions) connected to the relay chain.\n        2. Select **Set Session Key** on the bonding account you generated earlier.\n        3. Paste the hex-encoded session key string returned by `author_rotateKeys` (from the Polkadot.js Apps UI, curl, or Subkey) into the input field and submit the transaction.\n\n    !!! warning \"Removal planned\"\n        Both `session.setKeys` and `session.purgeKeys` on the relay chain will be **removed** in a future runtime upgrade ([polkadot-fellows/runtimes#1212](https://github.com/polkadot-fellows/runtimes/pull/1212)). Migrate to the Polkadot Hub path: use `stakingRcClient.setKeys` to set keys and `stakingRcClient.purgeKeys` to purge them.\n\nOnce the transaction is signed and submitted, your session keys will be registered on-chain."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#verify-session-key-setup", "page_title": "Validator Key Management", "index": 4, "depth": 3, "title": "Verify Session Key Setup", "anchor": "verify-session-key-setup", "start_char": 11077, "end_char": 11606, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify Session Key Setup\n\nTo verify that your session keys are properly set, you can use one of two RPC calls:\n\n- **`hasKey`**: Checks if the node has a specific key by public key and key type.\n- **`hasSessionKeys`**: Verifies if your node has the full session key string associated with the validator.\n\nFor example, you can [check session keys on the Polkadot.js Apps](https://polkadot.js.org/apps/#/rpc) interface or by running an RPC query against your node. Once this is done, your validator node is ready for its role."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#set-the-node-key", "page_title": "Validator Key Management", "index": 5, "depth": 2, "title": "Set the Node Key", "anchor": "set-the-node-key", "start_char": 11606, "end_char": 13258, "estimated_token_count": 410, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set the Node Key\n\nValidators and collators on Polkadot need a static network key (also known as the node key) to maintain a stable node identity.\nThis key ensures that your node can maintain a consistent peer ID, even across restarts, which is crucial for maintaining reliable network connections.\n\nStarting with Polkadot version 1.11, validators without a stable network key may encounter the following error on startup:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>polkadot --validator --name \"INSERT_NAME_FROM_TELEMETRY\"</span>\n  <span data-ty>Error:</span>\n  <span data-ty>0: Starting an authority without network key</span>\n  <span data-ty>This is not a safe operation because other authorities in the network may depend on your node having a stable identity.</span>\n  <span data-ty>Otherwise these other authorities may not being able to reach you.</span>\n  <span data-ty>If it is the first time running your node you could use one of the following methods:</span>\n  <span data-ty>1. [Preferred] Separately generate the key with: INSERT_NODE_BINARY key generate-node-key --base-path INSERT_YOUR_BASE_PATH</span>\n  <span data-ty>2. [Preferred] Separately generate the key with: INSERT_NODE_BINARY key generate-node-key --file INSERT_YOUR_PATH_TO_NODE_KEY</span>\n  <span data-ty>3. [Preferred] Separately generate the key with: INSERT_NODE_BINARY key generate-node-key --default-base-path</span>\n  <span data-ty>4. [Unsafe] Pass --unsafe-force-node-key-generation and make sure you remove it for subsequent node restarts</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#generate-the-node-key", "page_title": "Validator Key Management", "index": 6, "depth": 3, "title": "Generate the Node Key", "anchor": "generate-the-node-key", "start_char": 13258, "end_char": 13845, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Generate the Node Key\n\nFollow these steps to generate a node key:\n\n1. Generate your node key using one of the following options:\n\n    === \"Docker\"\n\n        ```bash\n        docker run --rm parity/subkey:latest generate-node-key > node.key\n        ```\n    === \"polkadot binary\"\n    \n        ```bash\n        polkadot key generate-node-key --file node.key\n        ```\n\n2. Locate your peer ID in the displayed output. The peer ID is similar to this example:\n\n    ```text\n    12D3KooWExcVYu7Mvjd4kxPVLwN2ZPnZ5NyLZ5ft477wqzfP2q6E\n    ```\n\nBe sure to save the peer ID for future reference."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-key-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#set-node-key", "page_title": "Validator Key Management", "index": 7, "depth": 3, "title": "Set Node Key", "anchor": "set-node-key", "start_char": 13845, "end_char": 14450, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6b741dac151d8655db7e3519b4c5b3250a241bf6972c99a478270534f404da0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Set Node Key\n\nAfter generating the node key, configure your node to use it by specifying the path to the key file when launching your node. Add the following flag to your validator node's startup command:\n\n``` bash\npolkadot --node-key-file INSERT_PATH_TO_NODE_KEY\n```\n\nFollowing these steps ensures that your node retains its identity, making it discoverable by peers without the risk of conflicting identities across sessions. For further technical background, see Polkadot SDK [Pull Request #3852](https://github.com/paritytech/polkadot-sdk/pull/3852) for the rationale behind requiring static keys."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#introduction", "page_title": "Set Up a Validator", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 643, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nSetting up a Polkadot validator node is essential for securing the network and earning staking rewards. This guide walks you through the technical steps to set up a validator, from installing the necessary software to managing keys and synchronizing your node with the chain.\n\nRunning a validator requires a commitment to maintaining a stable, secure infrastructure. Validators are responsible for their own stakes and those of nominators who trust them with their tokens. Proper setup and ongoing management are critical to ensuring smooth operation and avoiding potential penalties such as slashing."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#prerequisites", "page_title": "Set Up a Validator", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 643, "end_char": 1643, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nTo get the most from this guide, ensure you've done the following before going forward:\n\n- Read [Validator Requirements](/node-infrastructure/run-a-validator/requirements/) and understand the recommended minimum skill level and hardware needs.\n- Read [General Management](/node-infrastructure/run-a-validator/operational-tasks/general-management/), [Upgrade Your Node](/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/), and [Pause Validating](/node-infrastructure/run-a-validator/operational-tasks/pause-validating/) and understand the tasks required to keep your validator operational.\n- Read [Rewards Payout](/node-infrastructure/run-a-validator/staking-mechanics/rewards/) and understand how validator rewards are determined and paid out.\n- Read [Offenses and Slashes](/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/) and understand how validator performance and security can affect tokens staked by you or your nominators."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#initial-setup", "page_title": "Set Up a Validator", "index": 2, "depth": 2, "title": "Initial Setup", "anchor": "initial-setup", "start_char": 1643, "end_char": 2199, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initial Setup\n\nBefore running your validator, you must configure your server environment to meet the operational and security standards required for validating.\n\nYou must use a Linux-based operating system with Kernel 5.16 or later. Configuration includes setting up time synchronization, ensuring critical security features are active, and installing the necessary binaries. Proper setup at this stage is essential to prevent issues like block production errors or being penalized for downtime. Below are the essential steps to get your system ready."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#install-network-time-protocol-client", "page_title": "Set Up a Validator", "index": 3, "depth": 3, "title": "Install Network Time Protocol Client", "anchor": "install-network-time-protocol-client", "start_char": 2199, "end_char": 3295, "estimated_token_count": 230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install Network Time Protocol Client\n\nAccurate timekeeping is critical to ensure your validator is synchronized with the network. Validators need local clocks in sync with the blockchain to avoid missing block authorship opportunities. Using [Network Time Protocol (NTP)](https://en.wikipedia.org/wiki/Network_Time_Protocol) is the standard solution to keep your system's clock accurate.\n\nIf you are using Ubuntu version 18.04 or newer, the NTP Client should be installed by default. You can check whether you have the NTP client by running:\n\n```sh\ntimedatectl\n```\n\nIf NTP is running, you should see a message like the following:\n\n``` sh\nSystem clock synchronized: yes\n```\n\nIf NTP is not installed or running, you can install it using:\n\n```sh\nsudo apt-get install ntp\n```\n\nAfter installation, NTP will automatically start. To check its status:\n\n```sh\nsudo ntpq -p\n```\n\nThis command will return a message with the status of the NTP synchronization. Skipping this step could result in your validator node missing blocks due to minor clock drift, potentially affecting its network performance."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#verify-landlock-is-activated", "page_title": "Set Up a Validator", "index": 4, "depth": 3, "title": "Verify Landlock is Activated", "anchor": "verify-landlock-is-activated", "start_char": 3295, "end_char": 4860, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify Landlock is Activated\n\n[Landlock](https://docs.kernel.org/userspace-api/landlock.html) is an important security feature integrated into Linux kernels starting with version 5.13. It allows processes, even those without special privileges, to limit their access to the system to reduce the machine's attack surface. This feature is crucial for validators, as it helps ensure the security and stability of the node by preventing unauthorized access or malicious behavior.\n\nTo use Landlock, ensure you use the reference kernel or newer versions. Most Linux distributions should already have Landlock activated. You can check if Landlock is activated on your machine by running the following command as root:\n\n```sh\ndmesg | grep landlock || journalctl -kg landlock\n```\n\nIf Landlock is not activated, your system logs won't show any related output. In this case, you will need to activate it manually or ensure that your Linux distribution supports it. Most modern distributions with the required kernel version should have Landlock activated by default. However, if your system lacks support, you may need to build the kernel with Landlock activated. For more information on doing so, refer to the [official kernel documentation](https://docs.kernel.org/userspace-api/landlock.html#kernel-support).\n\nImplementing Landlock ensures your node operates in a restricted, self-imposed sandbox, limiting potential damage from security breaches or bugs. While not a mandatory requirement, enabling this feature greatly improves the security of your validator setup."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#install-the-polkadot-binaries", "page_title": "Set Up a Validator", "index": 5, "depth": 2, "title": "Install the Polkadot Binaries", "anchor": "install-the-polkadot-binaries", "start_char": 4860, "end_char": 5286, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install the Polkadot Binaries\n\nYou must install the Polkadot binaries required to run your validator node. These binaries include the main `polkadot`, `polkadot-prepare-worker`, and `polkadot-execute-worker` binaries. All three are needed to run a fully functioning validator node.\n\nDepending on your preference and operating system setup, there are multiple methods to install these binaries. Below are the main options:"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#install-from-official-releases", "page_title": "Set Up a Validator", "index": 6, "depth": 3, "title": "Install from Official Releases", "anchor": "install-from-official-releases", "start_char": 5286, "end_char": 8016, "estimated_token_count": 592, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install from Official Releases\n\nThe preferred, most straightforward method to install the required binaries is downloading the latest versions from the official releases. You can visit the [Github Releases](https://github.com/paritytech/polkadot-sdk/releases) page for the most current versions of the `polkadot`, `polkadot-prepare-worker`, and `polkadot-execute-worker` binaries.\n\nYou can also download the binaries by using the following direct links:\n\n=== \"`polkadot`\"\n\n    ``` bash\n    # Download the binary\n    curl -LO https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot\n\n    # Verify signature\n    curl -LO https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot.asc\n    \n    gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 90BD75EBBB8E95CB3DA6078F94A4029AB4B35DAE\n\n    gpg --verify polkadot.asc\n    ```\n\n=== \"`polkadot-prepare-worker`\"\n\n    ``` bash\n    # Download the binary\n    curl -LO https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-prepare-worker\n\n    # Verify signature\n    curl -LO https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-prepare-worker.asc\n\n    gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 90BD75EBBB8E95CB3DA6078F94A4029AB4B35DAE\n\n    gpg --verify polkadot-prepare-worker.asc\n    ```\n\n=== \"`polkadot-execute-worker`\"\n\n    ``` bash\n    # Download the binary\n    curl -LO https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-execute-worker\n\n    # Verify signature\n    curl -LO https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-execute-worker.asc\n\n    gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 90BD75EBBB8E95CB3DA6078F94A4029AB4B35DAE\n\n    gpg --verify polkadot-execute-worker.asc\n    ```\n\n\nSignature verification cryptographically ensures the downloaded binaries are authentic and have not been tampered with by using GPG signing keys. Polkadot releases use two different signing keys:\n\n- ParityReleases (release-team@parity.io) with key [`90BD75EBBB8E95CB3DA6078F94A4029AB4B35DAE`](https://keyserver.ubuntu.com/pks/lookup?search=90BD75EBBB8E95CB3DA6078F94A4029AB4B35DAE&fingerprint=on&op=index) for current and new releases.\n- Parity Security Team (security@parity.io) with key [`9D4B2B6EB8F97156D19669A9FF0812D491B96798`](https://keyserver.ubuntu.com/pks/lookup?search=9D4B2B6EB8F97156D19669A9FF0812D491B96798&fingerprint=on&op=index) for old releases.\n\n    !!!warning\n        When verifying a signature, a \"Good signature\" message indicates successful verification, while any other output signals a potential security risk."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#install-with-package-managers", "page_title": "Set Up a Validator", "index": 7, "depth": 3, "title": "Install with Package Managers", "anchor": "install-with-package-managers", "start_char": 8016, "end_char": 9067, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install with Package Managers\n\nUsers running Debian-based distributions like Ubuntu can install the binaries using the [APT](https://wiki.debian.org/Apt) package manager.\n\nExecute the following commands as root to add the official repository and install the binaries:\n\n```bash\n# Import the release-team@parity.io GPG key\ngpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 90BD75EBBB8E95CB3DA6078F94A4029AB4B35DAE\ngpg --export 90BD75EBBB8E95CB3DA6078F94A4029AB4B35DAE > /usr/share/keyrings/parity.gpg\n\n# Add the Parity repository and update the package index\necho 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list\napt update\n\n# Install the `parity-keyring` package - This will ensure the GPG key\n# used by APT remains up-to-date\napt install parity-keyring\n\n# Install polkadot\napt install polkadot\n```\n\nOnce installation completes, verify the binaries are correctly installed by following the steps in the [verify installation](#verify-installation) section."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#install-with-ansible", "page_title": "Set Up a Validator", "index": 8, "depth": 3, "title": "Install with Ansible", "anchor": "install-with-ansible", "start_char": 9067, "end_char": 9408, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install with Ansible\n\nYou can also manage Polkadot installations using Ansible. This approach can be beneficial for users managing multiple validator nodes or requiring automated deployment. The [Parity chain operations Ansible collection](https://github.com/paritytech/ansible-galaxy/) provides a Substrate node role for this purpose."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#install-with-docker", "page_title": "Set Up a Validator", "index": 9, "depth": 3, "title": "Install with Docker", "anchor": "install-with-docker", "start_char": 9408, "end_char": 9689, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install with Docker\n\nIf you prefer using Docker or an OCI-compatible container runtime, the official Polkadot Docker image can be pulled directly from Docker Hub.\n\nTo pull the latest stable image, run the following command:\n\n```bash\ndocker pull parity/polkadot:stable2609\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#build-from-sources", "page_title": "Set Up a Validator", "index": 10, "depth": 3, "title": "Build from Sources", "anchor": "build-from-sources", "start_char": 9689, "end_char": 9904, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Build from Sources\n\nYou may build the binaries from source by following the instructions on the [Polkadot SDK repository](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/polkadot#building)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-set-up-validator", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#verify-installation", "page_title": "Set Up a Validator", "index": 11, "depth": 2, "title": "Verify Installation", "anchor": "verify-installation", "start_char": 9904, "end_char": 11664, "estimated_token_count": 430, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eecae699624ae91fb8b4c84349043246b41c23506443226c5ee170804ac6901", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify Installation\n\nOnce the Polkadot binaries are installed, it's essential to verify that everything is set up correctly and that all the necessary components are in place. Follow these steps to ensure the binaries are installed and functioning as expected.\n\n1. **Check the versions**: Run the following commands to verify the versions of the installed binaries.\n\n    ```bash\n    polkadot --version\n    polkadot-execute-worker --version\n    polkadot-prepare-worker --version\n    ```\n\n    The output should show the version numbers for each of the binaries. Ensure that the versions match and are consistent, similar to the following example (the specific version may vary):\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>polkadot --version polkadot-execute-worker --version polkadot-prepare-worker --version</span>\n      <span data-ty>1.16.1-36264cb36db</span>\n      <span data-ty>1.16.1-36264cb36db</span>\n      <span data-ty>1.16.1-36264cb36db</span>\n      <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n    </div>\n    \n\n    If the versions do not match or if there is an error, double-check that all the binaries were correctly installed and are accessible within your `$PATH`.\n\n2. **Ensure all binaries are in the same directory**: All the binaries must be in the same directory for the Polkadot validator node to function properly. If the binaries are not in the same location, move them to a unified directory and ensure this directory is added to your system's `$PATH`.\n\n    To verify the `$PATH`, run the following command:\n\n    ```bash\n    echo $PATH\n    ```\n\n    If necessary, you can move the binaries to a shared location, such as `/usr/local/bin/`, and add it to your `$PATH`."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#introduction", "page_title": "Start Validating", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 433, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nAfter configuring your node keys as shown in the [Key Management](/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/) section and ensuring your system is set up, you're ready to begin the validator setup process. This guide will walk you through choosing a network, synchronizing your node with the blockchain, bonding your DOT tokens, and starting your validator."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#choose-a-network", "page_title": "Start Validating", "index": 1, "depth": 2, "title": "Choose a Network", "anchor": "choose-a-network", "start_char": 433, "end_char": 1422, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Choose a Network\n\nRunning your validator on a test network like Westend or Kusama is a smart way to familiarize yourself with the process and identify any setup issues in a lower-stakes environment before joining the Polkadot MainNet.\n\n- **Westend**: Polkadot's primary TestNet is open to anyone for testing purposes. Validator slots are intentionally limited to keep the network stable for the Polkadot release process, so it may not support as many validators at any given time.\n- **Kusama**: Often called Polkadot's \"canary network,\" Kusama has real economic value but operates with a faster and more experimental approach. Running a validator here provides an experience closer to MainNet with the benefit of more frequent validation opportunities with an era time of 6 hours vs 24 hours for Polkadot.\n- **Polkadot**: The main network, where validators secure the Polkadot relay chain. It has a slower era time of 24 hours and requires a higher minimum bond amount to participate."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#synchronize-chain-data", "page_title": "Start Validating", "index": 2, "depth": 2, "title": "Synchronize Chain Data", "anchor": "synchronize-chain-data", "start_char": 1422, "end_char": 5919, "estimated_token_count": 1283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Synchronize Chain Data\n\nThe next step is to sync your node with the chosen blockchain network. Synchronization is necessary to download and validate the blockchain data, ensuring your node is ready to participate as a validator. Follow these steps to sync your node:\n\n1. **Start syncing**: You can run a full or warp sync.\n\n    === \"Full sync\"\n\n        Polkadot defaults to using a full sync, which downloads and validates the entire blockchain history from the genesis block. Start the syncing process by running the following command:\n\n        ```sh\n        polkadot\n        ```\n\n        This command starts your Polkadot node in non-validator mode, allowing you to synchronize the chain data.\n\n    === \"Warp sync\"\n\n        You can opt to use warp sync which initially downloads only GRANDPA finality proofs and the latest finalized block's state. Use the following command to start a warp sync:\n\n        ``` bash\n        polkadot --sync warp\n        ```\n\n        Warp sync ensures that your node quickly updates to the latest finalized state. The historical blocks are downloaded in the background as the node continues to operate.\n\n    If you're planning to run a validator on a TestNet, you can specify the chain using the `--chain` flag. For example, the following will run a validator on Kusama:\n\n    ```sh\n    polkadot --chain=kusama\n    ```\n\n2. **Monitor sync progress**: Once the sync starts, you will see a stream of logs providing information about the node's status and progress. Here's an example of what the output might look like:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>polkadot</span>\n      <span data-ty>2021-06-17 03:07:07 Parity Polkadot</span>\n      <span data-ty>2021-06-17 03:07:07 ✌️ version 0.9.5-95f6aa201-x86_64-linux-gnu</span>\n      <span data-ty>2021-06-17 03:07:07 ❤️ by Parity Technologies &lt;admin@parity.io&gt;, 2017-2021</span>\n      <span data-ty>2021-06-17 03:07:07 📋 Chain specification: Polkadot</span>\n      <span data-ty>2021-06-17 03:07:07 🏷 Node name: boiling-pet-7554</span>\n      <span data-ty>2021-06-17 03:07:07 👤 Role: FULL</span>\n      <span data-ty>2021-06-17 03:07:07 💾 Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db</span>\n      <span data-ty>2021-06-17 03:07:07 ⛓ Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)</span>\n      <span data-ty>2021-06-17 03:07:10 🏷 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u</span>\n      <span data-ty>2021-06-17 03:07:10 📦 Highest known block at #17914</span>\n      <span data-ty>2021-06-17 03:07:10 〽️ Prometheus server started at 127.0.0.1:9615</span>\n      <span data-ty>2021-06-17 03:07:10 Listening for new connections on 127.0.0.1:9944</span>\n      <span data-ty>...</span>\n    </div>\n    \n\n    The output logs provide information such as the current block number, node name, and network connections. Monitor the sync progress and any errors that might occur during the process. Look for information about the latest processed block and compare it with the current highest block using tools like [Telemetry](https://telemetry.polkadot.io/#list/Polkadot%20CC1) or [Polkadot.js Apps Explorer](https://polkadot.js.org/apps/#/explorer).\n\n    !!! note\n        If your node reports zero peers and cannot synchronize the chain, as in the following output, make sure you have libp2p port `30333` activated. It will take some time to discover other peers over the network.\n\n        <div id=\"termynal\" data-termynal>\n          <span data-ty=\"input\"><span class=\"file-path\"></span>polkadot</span>\n          <span data-ty>2021-06-17 03:07:07 Idle (0 peers), best: #0 (0x3fd7...5baf), finalized #0 (0x3fd7...5baf), ⬇ 2.9kiB/s ⬆ 3.7kiB/s</span>\n          <span data-ty>2021-06-17 03:07:12 Idle (0 peers), best: #0 (0x3fd7...5baf), finalized #0 (0x3fd7...5baf), ⬇ 1.7kiB/s ⬆ 2.0kiB/s</span>\n          <span data-ty>2021-06-17 03:07:17 Idle (0 peers), best: #0 (0x3fd7...5baf), finalized #0 (0x3fd7...5baf), ⬇ 0.9kiB/s ⬆ 1.2kiB/s</span>\n          <span data-ty>2021-06-17 03:07:19 Libp2p => Random Kademlia query has yielded empty results</span>\n          <span data-ty>2021-06-17 03:08:00 Idle (0 peers), best: #0 (0x3fd7...5baf), finalized #0 (0x3fd7...5baf), ⬇ 1.6kiB/s ⬆ 1.9kiB/s</span>\n          <span data-ty>2021-06-17 03:08:05 Idle (0 peers), best: #0 (0x3fd7...5baf), finalized #0 (0x3fd7...5baf), ⬇ 0.6kiB/s ⬆ 0.9kiB/s</span>\n          <span data-ty>...</span>\n        </div>"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#database-snapshot-services", "page_title": "Start Validating", "index": 3, "depth": 3, "title": "Database Snapshot Services", "anchor": "database-snapshot-services", "start_char": 5919, "end_char": 6554, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Database Snapshot Services\n\nIf you'd like to speed up the process further, you can use a database snapshot. Snapshots are compressed backups of the blockchain's database directory and can significantly reduce the time required to sync a new node. Parity provides official database snapshots for Polkadot, Kusama, Westend, and other chains at [snapshots.polkadot.io](https://snapshots.polkadot.io/).\n\n!!!warning\n    Although snapshots are convenient, syncing from scratch is recommended for security purposes. If snapshots become corrupted and most nodes rely on them, the network could inadvertently run on a non-canonical chain."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#bond-dot", "page_title": "Start Validating", "index": 4, "depth": 2, "title": "Bond DOT", "anchor": "bond-dot", "start_char": 6554, "end_char": 7121, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bond DOT\n\nOnce your validator node is synced, the next step is bonding DOT. A bonded account, or stash, holds your staked tokens (DOT) that back your validator node. Bonding your DOT means locking it for a period, during which it cannot be transferred or spent but is used to secure your validator's role in the network. Visit the [Minimum Bond Requirement](/node-infrastructure/run-a-validator/requirements/#minimum-bond-requirement) section for details on how much DOT is required.\n\nThe following sections will guide you through bonding DOT for your validator."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#bonding-dot-on-polkadotjs-apps", "page_title": "Start Validating", "index": 5, "depth": 3, "title": "Bonding DOT on Polkadot.js Apps", "anchor": "bonding-dot-on-polkadotjs-apps", "start_char": 7121, "end_char": 9051, "estimated_token_count": 446, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Bonding DOT on Polkadot.js Apps\n\nOnce you're ready to bond your DOT, head over to the [Polkadot.js Apps](https://polkadot.js.org/apps/) staking page by clicking the **Network** dropdown at the top of the page and selecting [**Staking**](https://polkadot.js.org/apps/#/staking/actions).\n\nTo get started with the bond submission, click on the **Accounts** tab, then the **+ Stash** button, and then enter the following information:\n\n1. **Stash account**: Select your stash account (which is the account with the DOT/KSM balance).\n2. **Value bonded**: Enter how much DOT from the stash account you want to bond/stake. You are not required to bond all of the DOT in that account and you may bond more DOT at a later time. Be aware, withdrawing any bonded amount requires waiting for the unbonding period. The unbonding period is seven days for Kusama and 28 days for Polkadot.\n\n    !!! note\n        Starting in April 2026, the unbonding period for Polkadot nominators is expected to be reduced from 28 days to approximately 2 days, with dynamic scaling based on unbonding queue size. Validator unbonding periods may differ. See [RFC-0097](https://polkadot-fellows.github.io/RFCs/approved/0097-unbonding_queue.html) for technical details.\n3. **Payment destination**: Add the recipient account for validator rewards. If you'd like to redirect payments to an account that is not the stash account, you can do it by entering the address here. Note that it is extremely unsafe to set an exchange address as the recipient of the staking rewards.\n\nOnce everything is filled in properly, select **Bond** and sign the transaction with your stash account. If successful, you should see an `ExtrinsicSuccess` message.\n\nYour bonded account will be available under **Stashes**. After refreshing the screen, you should now see a card with all your accounts. The bonded amount on the right corresponds to the funds bonded by the stash account."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#validate", "page_title": "Start Validating", "index": 6, "depth": 2, "title": "Validate", "anchor": "validate", "start_char": 9051, "end_char": 9279, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Validate\n\nOnce your validator node is fully synced and ready, the next step is to ensure it's visible on the network and performing as expected. Below are steps for monitoring and managing your node on the Polkadot network."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#verify-sync-via-telemetry", "page_title": "Start Validating", "index": 7, "depth": 3, "title": "Verify Sync via Telemetry", "anchor": "verify-sync-via-telemetry", "start_char": 9279, "end_char": 9990, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Verify Sync via Telemetry\n\nTo confirm that your validator is live and synchronized with the Polkadot network, visit the [Telemetry](https://telemetry.polkadot.io/#list/Polkadot%20CC1) page. Telemetry provides real-time information on node performance and can help you check if your validator is connected properly. Search for your node by name. You can search all nodes currently active on the network, which is why you should use a unique name for easy recognition. Now, confirm that your node is fully synced by comparing the block height of your node with the network's latest block. Nodes that are fully synced will appear white in the list, while nodes that are not yet fully synced will appear gray."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#activate-using-polkadotjs-apps", "page_title": "Start Validating", "index": 8, "depth": 3, "title": "Activate using Polkadot.js Apps", "anchor": "activate-using-polkadotjs-apps", "start_char": 9990, "end_char": 11894, "estimated_token_count": 490, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Activate using Polkadot.js Apps\n\nFollow these steps to use Polkadot.js Apps to activate your validator:\n\n1. In Polkadot.js Apps, navigate to **Network** and select **Staking**:\n\n    ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/start-validating-01.webp)\n\n2. Open the **Accounts** tab and click on **+ Validator**:\n\n    ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/start-validating-02.webp)\n\n3. Set a bond amount in the **value bonded** field and then click **next**:\n\n    ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/start-validating-03.webp)\n\n4. Paste the session keys and proof from `author_rotateKeysWithOwner` (or use the keys from `author_rotateKeys` with `0x00` as the proof if runtime 2.2.0 is not yet live on your network), set the commission to 0%, the only value the chain accepts, allow or block new nominations, then click **Bond & Validate** to link your validator with its session keys.\n\n    ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/start-validating-04.webp)\n\n    You can also set the **blocked** nominations option via `staking.validate` extrinsic; the **commission** parameter must be left at 0%. By default, the blocked option is set to FALSE (i.e., the validator accepts nominations).\n\n    !!! warning\n        Following [Referendum 1909](https://polkadot.subsquare.io/referenda/1909), the commission rate is fixed on-chain at **0%** for all validators and cannot be set to anything else. Validators are rewarded through the self-stake incentive described in [Validator Compensation](/node-infrastructure/run-a-validator/requirements/#validator-compensation) instead.\n\n    ![](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/start-validating-05.webp)"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#monitor-validation-status-and-slots", "page_title": "Start Validating", "index": 9, "depth": 3, "title": "Monitor Validation Status and Slots", "anchor": "monitor-validation-status-and-slots", "start_char": 11894, "end_char": 12831, "estimated_token_count": 213, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Monitor Validation Status and Slots\n\nOn the [**Staking**](https://polkadot.js.org/apps/#/staking) tab in Polkadot.js Apps, you can see your validator's status, the number of available validator slots, and the nodes that have signaled their intent to validate. Your node may initially appear in the waiting queue, especially if the validator slots are full. The following is an example view of the **Staking** tab:\n\n![staking queue](/images/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/start-validating-06.webp)\n\nThe validator set refreshes each era. If there's an available slot in the next era, your node may be selected to move from the waiting queue to the active validator set, allowing it to start validating blocks. If your validator is not selected, it remains in the waiting queue. Increasing your stake or gaining more nominators may improve your chance of being selected in future eras."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#run-a-validator-using-systemd", "page_title": "Start Validating", "index": 10, "depth": 2, "title": "Run a Validator Using Systemd", "anchor": "run-a-validator-using-systemd", "start_char": 12831, "end_char": 13879, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Run a Validator Using Systemd\n\nRunning your Polkadot validator as a [systemd](https://en.wikipedia.org/wiki/Systemd) service is an effective way to ensure its high uptime and reliability. Using systemd allows your validator to automatically restart after server reboots or unexpected crashes, significantly reducing the risk of slashing due to downtime.\n\nThis following sections will walk you through creating and managing a systemd service for your validator, allowing you to seamlessly monitor and control it as part of your Linux system. \n\nEnsure the following requirements are met before proceeding with the systemd setup:\n\n- Confirm your system meets the [requirements](/node-infrastructure/run-a-validator/requirements/) for running a validator.\n- Ensure you meet the [minimum bond requirements](../../../wiki/general/chain-state-values.md#minimum-validator-bond) for validating.\n- Verify the Polkadot binary is [installed](/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#install-the-polkadot-binaries)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#create-the-systemd-service-file", "page_title": "Start Validating", "index": 11, "depth": 3, "title": "Create the Systemd Service File", "anchor": "create-the-systemd-service-file", "start_char": 13879, "end_char": 15619, "estimated_token_count": 338, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Create the Systemd Service File\n\nFirst create a new unit file called `polkadot-validator.service` in `/etc/systemd/system/`:\n\n```bash\ntouch /etc/systemd/system/polkadot-validator.service\n```\n\nIn this unit file, you will write the commands that you want to run on server boot/restart:\n\n```systemd title=\"/etc/systemd/system/polkadot-validator.service\"\n[Unit]\nDescription=Polkadot Node\nAfter=network.target\nDocumentation=https://github.com/paritytech/polkadot-sdk\n\n[Service]\nEnvironmentFile=-/etc/default/polkadot\nExecStart=/usr/bin/polkadot $POLKADOT_CLI_ARGS\nUser=polkadot\nGroup=polkadot\nRestart=always\nRestartSec=120\nCapabilityBoundingSet=\nLockPersonality=true\nNoNewPrivileges=true\nPrivateDevices=true\nPrivateMounts=true\nPrivateTmp=true\nPrivateUsers=true\nProtectClock=true\nProtectControlGroups=true\nProtectHostname=true\nProtectKernelModules=true\nProtectKernelTunables=true\nProtectSystem=strict\nRemoveIPC=true\nRestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX\nRestrictNamespaces=false\nRestrictSUIDSGID=true\nSystemCallArchitectures=native\nSystemCallFilter=@system-service\nSystemCallFilter=landlock_add_rule landlock_create_ruleset landlock_restrict_self seccomp mount umount2\nSystemCallFilter=~@clock @module @reboot @swap @privileged\nSystemCallFilter=pivot_root\nUMask=0027\n\n[Install]\nWantedBy=multi-user.target\n\n```\n\n!!! warning \"Restart delay and equivocation risk\"\n    It is recommended that a node's restart be delayed with `RestartSec` in the case of a crash. It's possible that when a node crashes, consensus votes in GRANDPA aren't persisted to disk. In this case, there is potential to equivocate when immediately restarting. Delaying the restart will allow the network to progress past potentially conflicting votes."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-start-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/#run-the-service", "page_title": "Start Validating", "index": 12, "depth": 3, "title": "Run the Service", "anchor": "run-the-service", "start_char": 15619, "end_char": 16561, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5af42ad0c0c6d796749167778e1dd97dad0841a13e92d12a723ca6252cc5fa43", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Run the Service\n\nActivate the systemd service to start on system boot by running:\n\n```bash\nsystemctl enable polkadot-validator.service\n```\n\nTo start the service manually, use:\n\n```bash\nsystemctl start polkadot-validator.service\n```\n\nCheck the service's status to confirm it is running:\n\n```bash\nsystemctl status polkadot-validator.service\n```\n\nTo view the logs in real-time, use [journalctl](https://www.freedesktop.org/software/systemd/man/latest/journalctl.html) like so:\n\n```bash\njournalctl -f -u polkadot-validator\n```\n\nWith these steps, you can effectively manage and monitor your validator as a systemd service.\n\nOnce your validator is active, it's officially part of Polkadot's security infrastructure. For questions or further support, you can reach out to the [Polkadot Validator chat](https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation) for tips and troubleshooting."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-stop-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/stop-validating/#introduction", "page_title": "Stop Validating", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 499, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7092c055b1fbae90f17fe85406f2cc1d587a561e0118155f46bcacccfa324f4b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nIf you're ready to stop validating on Polkadot, there are essential steps to ensure a smooth transition while protecting your funds and account integrity. Whether you're taking a break for maintenance or unbonding entirely, you'll need to chill your validator, purge session keys, and unbond your tokens. This guide explains how to use Polkadot's tools and extrinsics to safely withdraw from validation activities, safeguarding your account's future usability."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-stop-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/stop-validating/#pause-versus-stop", "page_title": "Stop Validating", "index": 1, "depth": 2, "title": "Pause Versus Stop", "anchor": "pause-versus-stop", "start_char": 499, "end_char": 921, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7092c055b1fbae90f17fe85406f2cc1d587a561e0118155f46bcacccfa324f4b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Pause Versus Stop\n\nIf you wish to remain a validator or nominator (for example, stopping for planned downtime or server maintenance), submitting the `chill` extrinsic in the `staking` pallet should suffice. Additional steps are only needed to unbond funds or reap an account.\n\nThe following are steps to ensure a smooth stop to validation:\n\n- Chill the validator.\n- Purge validator session keys.\n- Unbond your tokens."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-stop-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/stop-validating/#chill-validator", "page_title": "Stop Validating", "index": 2, "depth": 2, "title": "Chill Validator", "anchor": "chill-validator", "start_char": 921, "end_char": 1485, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7092c055b1fbae90f17fe85406f2cc1d587a561e0118155f46bcacccfa324f4b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Chill Validator\n\nWhen stepping back from validating, the first step is to chill your validator status. This action stops your validator from being considered for the next era without fully unbonding your tokens, which can be useful for temporary pauses like maintenance or planned downtime.\n\nUse the `staking.chill` extrinsic to initiate this. For more guidance on chilling your node, refer to the [Pause Validating](/node-infrastructure/run-a-validator/operational-tasks/pause-validating/) guide. You may also claim any pending staking rewards at this point."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-stop-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/stop-validating/#purge-validator-session-keys", "page_title": "Stop Validating", "index": 3, "depth": 2, "title": "Purge Validator Session Keys", "anchor": "purge-validator-session-keys", "start_char": 1485, "end_char": 3249, "estimated_token_count": 372, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7092c055b1fbae90f17fe85406f2cc1d587a561e0118155f46bcacccfa324f4b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Purge Validator Session Keys\n\nPurging validator session keys is a critical step in removing the association between your validator account and its session keys, which ensures that your account is fully disassociated from validator activities. The `session.purgeKeys` extrinsic removes the reference to your session keys from the stash or staking proxy account that originally set them.\n\n!!! warning \"Removal planned\"\n    Purging session keys via the relay chain (`session.purgeKeys`) will be **removed** in a future runtime upgrade ([polkadot-fellows/runtimes#1212](https://github.com/polkadot-fellows/runtimes/pull/1212)). Use `stakingRcClient.purgeKeys` on Polkadot Hub instead. If your session keys were originally set via Polkadot Hub, purging there is also the only way to release the ~60 DOT deposit that was locked at set time — keys set via the relay chain never locked a deposit, so no deposit will be released in that case. See the [Set Session Keys section](/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#submit-transaction-to-set-keys) for details on the Polkadot Hub path.\n\nHere are a couple of important things to know about purging keys:\n\n- **Account used to purge keys**: Always use the same account to purge keys you originally used to set them, usually your stash or staking proxy account. Using a different account may leave an unremovable reference to the session keys on the original account, preventing its reaping.\n- **Account reaping issue**: Failing to purge keys will prevent you from reaping (fully deleting) your stash account. If you attempt to transfer tokens without purging, you'll need to rebond, purge the session keys, unbond again, and wait through the unbonding period before any transfer."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-onboarding-and-offboarding-stop-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/onboarding-and-offboarding/stop-validating/#unbond-your-tokens", "page_title": "Stop Validating", "index": 4, "depth": 2, "title": "Unbond Your Tokens", "anchor": "unbond-your-tokens", "start_char": 3249, "end_char": 3946, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7092c055b1fbae90f17fe85406f2cc1d587a561e0118155f46bcacccfa324f4b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Unbond Your Tokens\n\nAfter chilling your node and purging session keys, the final step is to unbond your staked tokens. This action removes them from staking and begins the unbonding period (usually 28 days for Polkadot and seven days for Kusama), after which the tokens will be transferable.\n\nTo unbond tokens, go to **Network > Staking > Account Actions** on Polkadot.js Apps. Select your stash account, click on the dropdown menu, and choose **Unbond Funds**. Alternatively, you can use the `staking.unbond` extrinsic if you handle this via a staking proxy account.\n\nOnce the unbonding period is complete, your tokens will be available for use in transactions or transfers outside of staking."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#introduction", "page_title": "General Management", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 760, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nValidator performance is pivotal in maintaining the security and stability of the Polkadot network. As a validator, optimizing your setup ensures efficient transaction processing, minimizes latency, and maintains system reliability during high-demand periods. Proper configuration and proactive monitoring also help mitigate risks like slashing and service interruptions.\n\nThis guide covers essential practices for managing a validator, including performance tuning techniques, security hardening, and tools for real-time monitoring. Whether you're fine-tuning CPU settings, configuring NUMA balancing, or setting up a robust alert system, these steps will help you build a resilient and efficient validator operation."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#configuration-optimization", "page_title": "General Management", "index": 1, "depth": 2, "title": "Configuration Optimization", "anchor": "configuration-optimization", "start_char": 760, "end_char": 988, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configuration Optimization\n\nFor those seeking to optimize their validator's performance, the following configurations can improve responsiveness, reduce latency, and ensure consistent performance during high-demand periods."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#deactivate-simultaneous-multithreading", "page_title": "General Management", "index": 2, "depth": 3, "title": "Deactivate Simultaneous Multithreading", "anchor": "deactivate-simultaneous-multithreading", "start_char": 988, "end_char": 2479, "estimated_token_count": 333, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Deactivate Simultaneous Multithreading\n\nPolkadot validators operate primarily in single-threaded mode for critical tasks, so optimizing single-core CPU performance can reduce latency and improve stability. Deactivating simultaneous multithreading (SMT) can prevent virtual cores from affecting performance. SMT is called Hyper-Threading on Intel and 2-way SMT on AMD Zen.\n\nTake the following steps to deactivate every other (vCPU) core:\n\n1. Loop though all the CPU cores and deactivate the virtual cores associated with them:\n\n    ```bash\n    for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | \\\n    cut -s -d, -f2- | tr ',' '\\n' | sort -un)\n    do\n    echo 0 > /sys/devices/system/cpu/cpu$cpunum/online\n    done\n    ```\n\n2. To permanently save the changes, add `nosmt=force` to the `GRUB_CMDLINE_LINUX_DEFAULT` variable in `/etc/default/grub`:\n\n    ```bash\n    sudo nano /etc/default/grub\n    # Add to GRUB_CMDLINE_LINUX_DEFAULT\n    ```\n\n    ```config title=\"/etc/default/grub\"\n    GRUB_DEFAULT = 0;\n    GRUB_HIDDEN_TIMEOUT = 0;\n    GRUB_HIDDEN_TIMEOUT_QUIET = true;\n    GRUB_TIMEOUT = 10;\n    GRUB_DISTRIBUTOR = `lsb_release -i -s 2> /dev/null || echo Debian`;\n    GRUB_CMDLINE_LINUX_DEFAULT = 'nosmt=force';\n    GRUB_CMDLINE_LINUX = '';\n    ```\n\n3. Update GRUB to apply changes:\n\n    ```bash\n    sudo update-grub\n    ```\n\n4. After the reboot, you should see that half of the cores are offline. To confirm, run:\n\n    ```bash\n    lscpu --extended\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#deactivate-automatic-numa-balancing", "page_title": "General Management", "index": 3, "depth": 3, "title": "Deactivate Automatic NUMA Balancing", "anchor": "deactivate-automatic-numa-balancing", "start_char": 2479, "end_char": 3555, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Deactivate Automatic NUMA Balancing\n\nDeactivating NUMA (Non-Uniform Memory Access) balancing for multi-CPU setups helps keep processes on the same CPU node, minimizing latency.\n\nFollow these stpes:\n\n1. Deactivate NUMA balancing in runtime:\n\n    ```bash\n    sysctl kernel.numa_balancing=0\n    ```\n\n2. Deactivate NUMA balancing permanently by adding `numa_balancing=disable` to the GRUB settings:\n\n    ```bash\n    sudo nano /etc/default/grub\n    # Add to GRUB_CMDLINE_LINUX_DEFAULT\n    ```\n\n    ```config title=\"/etc/default/grub\"\n    GRUB_DEFAULT = 0;\n    GRUB_HIDDEN_TIMEOUT = 0;\n    GRUB_HIDDEN_TIMEOUT_QUIET = true;\n    GRUB_TIMEOUT = 10;\n    GRUB_DISTRIBUTOR = `lsb_release -i -s 2> /dev/null || echo Debian`;\n    GRUB_CMDLINE_LINUX_DEFAULT = 'numa_balancing=disable';\n    GRUB_CMDLINE_LINUX = '';\n    ```\n\n3. Update GRUB to apply changes:\n\n    ```bash\n    sudo update-grub\n    ```\n\n4. Confirm the deactivation:\n\n    ```bash\n    sysctl -a | grep 'kernel.numa_balancing'\n    ```\n\nIf you successfully deactivated NUMA balancing, the preceding command should return `0`."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#spectre-and-meltdown-mitigations", "page_title": "General Management", "index": 4, "depth": 3, "title": "Spectre and Meltdown Mitigations", "anchor": "spectre-and-meltdown-mitigations", "start_char": 3555, "end_char": 5179, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Spectre and Meltdown Mitigations\n\n[Spectre](https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)) and [Meltdown](https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)) are well-known CPU vulnerabilities that exploit speculative execution to access sensitive data. These vulnerabilities have been patched in recent Linux kernels, but the mitigations can slightly impact performance, especially in high-throughput or containerized environments.\n\nIf your security requirements allow it, you can deactivate specific mitigations, such as Spectre V2 and Speculative Store Bypass Disable (SSBD), to improve performance.\n\nTo selectively deactivate the Spectre mitigations, take these steps:\n\n1. Update the `GRUB_CMDLINE_LINUX_DEFAULT` variable in your `/etc/default/grub` configuration:\n\n    ```bash\n    sudo nano /etc/default/grub\n    # Add to GRUB_CMDLINE_LINUX_DEFAULT\n    ```\n\n    ```config title=\"/etc/default/grub\"\n    GRUB_DEFAULT = 0;\n    GRUB_HIDDEN_TIMEOUT = 0;\n    GRUB_HIDDEN_TIMEOUT_QUIET = true;\n    GRUB_TIMEOUT = 10;\n    GRUB_DISTRIBUTOR = `lsb_release -i -s 2> /dev/null || echo Debian`;\n    GRUB_CMDLINE_LINUX_DEFAULT =\n      'spec_store_bypass_disable=prctl spectre_v2_user=prctl';\n    ```\n\n2. Update GRUB to apply changes and then reboot:\n\n    ```bash\n    sudo update-grub\n    sudo reboot\n    ```\n\nThis approach selectively deactivates the Spectre V2 and Spectre V4 mitigations, leaving other protections intact. For full security, keep mitigations activated unless there's a significant performance need, as disabling them could expose the system to potential attacks on affected CPUs."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#monitor-your-node", "page_title": "General Management", "index": 5, "depth": 2, "title": "Monitor Your Node", "anchor": "monitor-your-node", "start_char": 5179, "end_char": 5828, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Monitor Your Node\n\nMonitoring your node's performance is critical for network reliability and security. Tools like the following provide valuable insights:\n\n- **[Prometheus](https://prometheus.io/)**: An open-source monitoring toolkit for collecting and querying time-series data.\n- **[Grafana](https://grafana.com/)**: A visualization tool for real-time metrics, providing interactive dashboards.\n- **[Alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/)**: A tool for managing and routing alerts based on Prometheus data.\n\nThis section covers setting up these tools and configuring alerts to notify you of potential issues."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#environment-setup", "page_title": "General Management", "index": 6, "depth": 3, "title": "Environment Setup", "anchor": "environment-setup", "start_char": 5828, "end_char": 6522, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Environment Setup\n\nBefore installing Prometheus, ensure the environment is set up securely by running Prometheus with restricted user privileges.\n\nFollow these steps:\n\n1. Create a Prometheus user to ensure Prometheus runs with minimal permissions:\n\n    ```bash\n    sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus\n    ```\n\n2. Create directories for configuration and data storage:\n\n    ```bash\n    sudo mkdir /etc/prometheus\n    sudo mkdir /var/lib/prometheus\n    ```\n  \n3. Change directory ownership to ensure Prometheus has access:\n\n    ```bash\n    sudo chown -R prometheus:prometheus /etc/prometheus\n    sudo chown -R prometheus:prometheus /var/lib/prometheus\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#install-and-configure-prometheus", "page_title": "General Management", "index": 7, "depth": 3, "title": "Install and Configure Prometheus", "anchor": "install-and-configure-prometheus", "start_char": 6522, "end_char": 8967, "estimated_token_count": 529, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install and Configure Prometheus\n\nAfter setting up the environment, install and configure the latest version of Prometheus as follows:\n\n1. Download Prometheus for your system architecture from the [releases page](https://github.com/prometheus/prometheus/releases/). Replace `INSERT_RELEASE_DOWNLOAD` with the release binary URL (e.g., `https://github.com/prometheus/prometheus/releases/download/v3.0.0/prometheus-3.0.0.linux-amd64.tar.gz`):\n\n    ```bash\n    sudo apt-get update && sudo apt-get upgrade\n    wget INSERT_RELEASE_DOWNLOAD_LINK\n    tar xfz prometheus-*.tar.gz\n    cd prometheus-3.0.0.linux-amd64\n    ```\n\n2. Set up Prometheus:\n\n    1. Copy binaries:\n\n        ```bash\n        sudo cp ./prometheus /usr/local/bin/\n        sudo cp ./promtool /usr/local/bin/\n        sudo cp ./prometheus /usr/local/bin/\n        ```\n\n    2. Copy directories and assign ownership of these files to the `prometheus` user:\n\n        ```bash\n        sudo cp -r ./consoles /etc/prometheus\n        sudo cp -r ./console_libraries /etc/prometheus\n        sudo chown -R prometheus:prometheus /etc/prometheus/consoles\n        sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries\n        ```\n\n    3. Clean up the download directory:\n\n        ```bash\n        cd .. && rm -r prometheus*\n        ```\n\n3. Create `prometheus.yml` to define global settings, rule files, and scrape targets:\n\n    ```bash\n    sudo nano /etc/prometheus/prometheus.yml\n    ```\n\n    ```yaml title=\"prometheus-config.yml\"\n    global:\n      scrape_interval: 15s\n      evaluation_interval: 15s\n    \n    rule_files:\n      # - \"first.rules\"\n      # - \"second.rules\"\n    \n    scrape_configs:\n      - job_name: 'prometheus'\n        scrape_interval: 5s\n        static_configs:\n          - targets: ['localhost:9090']\n      - job_name: 'substrate_node'\n        scrape_interval: 5s\n        static_configs:\n          - targets: ['localhost:9615']\n    ```\n\n    Prometheus is scraped every 5 seconds in this example configuration file, ensuring detailed internal metrics. Node metrics with customizable intervals are scraped from port `9615` by default.\n\n4. Verify the configuration with `promtool`, an open source monitoring tool:\n\n    ```bash\n    promtool check config /etc/prometheus/prometheus.yml\n    ```\n\n5. Save the configuration and change the ownership of the file to `prometheus` user:\n\n    ```bash\n    sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#start-prometheus", "page_title": "General Management", "index": 8, "depth": 3, "title": "Start Prometheus", "anchor": "start-prometheus", "start_char": 8967, "end_char": 13582, "estimated_token_count": 1344, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Start Prometheus\n\n1. Launch Prometheus with the appropriate configuration file, storage location, and necessary web resources, running it with restricted privileges for security:\n\n    ```bash\n    sudo -u prometheus /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml \\\n    --storage.tsdb.path /var/lib/prometheus/ \\\n    --web.console.templates=/etc/prometheus/consoles \\\n    --web.console.libraries=/etc/prometheus/console_libraries\n    ```\n\n    If you set the server up properly, you should see terminal output similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>...</span>\n      <span data-ty>ts=2024-11-10T17:59:23.056Z caller=main.go:627 level=info msg=\"No time or size retention was set so using the default time retention\" duration=15d</span>\n      <span data-ty>ts=2024-11-10T17:59:23.056Z caller=main.go:671 level=info msg=\"Starting Prometheus Server\" mode=server version=\"(version=2.55.1, branch=HEAD, revision=6d7569113f1ca814f1e149f74176656540043b8d)\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.056Z caller=main.go:676 level=info build_context=\"(go=go1.23.2, platform=linux/amd64, user=root@194e0f5dd5e8, date=20241106-10:08:33, tags=netgo,builtinassets,stringlabels)\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.056Z caller=main.go:677 level=info host_details=\"(Linux 6.8.0-36-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Mon Jun 10 10:49:14 UTC 2024 x86_64 ubuntu-s-2vcpu-4gb-amd-nyc3-01 (none))\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.056Z caller=main.go:678 level=info fd_limits=\"(soft=1048576, hard=1048576)\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.056Z caller=main.go:679 level=info vm_limits=\"(soft=unlimited, hard=unlimited)\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.064Z caller=web.go:585 level=info component=web msg=\"Start listening for connections\" address=0.0.0.0:9090</span>\n      <span data-ty>ts=2024-11-10T17:59:23.065Z caller=main.go:1197 level=info msg=\"Starting TSDB ...\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.067Z caller=tls_config.go:348 level=info component=web msg=\"Listening on\" address=[::]:9090</span>\n      <span data-ty>...</span>\n      <span data-ty>ts=2024-11-10T17:59:23.106Z caller=main.go:1221 level=info msg=\"TSDB started\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.106Z caller=main.go:1404 level=info msg=\"Loading configuration file\" filename=/etc/prometheus/prometheus.yml</span>\n      <span data-ty>ts=2024-11-10T17:59:23.107Z caller=main.go:1441 level=info msg=\"updated GOGC\" old=100 new=75</span>\n      <span data-ty>ts=2024-11-10T17:59:23.108Z caller=main.go:1452 level=info msg=\"Completed loading of configuration file\" filename=/etc/prometheus/prometheus.yml totalDuration=1.878152ms db_storage=2.184µs remote_storage=2.966µs web_handler=822ns query_engine=1.823µs scrape=628.272µs scrape_sd=93.581µs notify=1.774µs notify_sd=1.413µs rules=2.735µs tracing=10.48µs</span>\n      <span data-ty>ts=2024-11-10T17:59:23.108Z caller=main.go:1182 level=info msg=\"Server is ready to receive web requests.\"</span>\n      <span data-ty>ts=2024-11-10T17:59:23.108Z caller=manager.go:164 level=info component=\"rule manager\" msg=\"Starting rule manager...\"</span>\n      <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n    </div>\n    \n\n2. Verify you can access the Prometheus interface by navigating to:\n\n    ```text\n    http://SERVER_IP_ADDRESS:9090/graph\n    ```\n\n    If the interface appears to work as expected, exit the process using `Control + C`.\n\n3. Create a systemd service file to ensure Prometheus starts on boot:\n\n    ```bash\n    sudo nano /etc/systemd/system/prometheus.service\n    ```\n\n    ```bash title=\"prometheus.service\"\n    [Unit]\n    Description=Prometheus Monitoring\n    Wants=network-online.target\n    After=network-online.target\n    \n    [Service]\n    User=prometheus\n    Group=prometheus\n    Type=simple\n    ExecStart=/usr/local/bin/prometheus \\\n     --config.file /etc/prometheus/prometheus.yml \\\n     --storage.tsdb.path /var/lib/prometheus/ \\\n     --web.console.templates=/etc/prometheus/consoles \\\n     --web.console.libraries=/etc/prometheus/console_libraries\n    ExecReload=/bin/kill -HUP $MAINPID\n    \n    [Install]\n    WantedBy=multi-user.target\n    \n    ```\n\n4. Reload systemd and enable the service to start on boot:\n\n    ```bash\n    sudo systemctl daemon-reload && sudo systemctl enable prometheus && sudo systemctl start prometheus\n    ```\n\n5. Verify the service is running by visiting the Prometheus interface again at:\n\n    ```text\n    http://SERVER_IP_ADDRESS:9090/\n    ```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#install-and-configure-grafana", "page_title": "General Management", "index": 9, "depth": 3, "title": "Install and Configure Grafana", "anchor": "install-and-configure-grafana", "start_char": 13582, "end_char": 17186, "estimated_token_count": 897, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install and Configure Grafana\n\nThis guide follows [Grafana's canonical installation instructions](https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/#install-from-apt-repository).\n\nTo install and configure Grafana, follow these steps:\n\n1. Install Grafana prerequisites:\n\n    ```bash\n    sudo apt-get install -y apt-transport-https software-properties-common wget    \n    ```\n\n2. Import the [GPG key](https://gnupg.org/):\n\n    ```bash\n    sudo mkdir -p /etc/apt/keyrings/\n    wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null\n    ```\n\n3. Configure the stable release repo and update packages:\n\n    ```bash\n    echo \"deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main\" | sudo tee -a /etc/apt/sources.list.d/grafana.list\n    sudo apt-get update\n    ```\n\n4. Install the latest stable version of Grafana:\n\n    ```bash\n    sudo apt-get install grafana\n    ```\n\nTo configure Grafana, take these steps:\n\n1. Configure Grafana to start automatically on boot and start the service:\n\n    ```bash\n    sudo systemctl daemon-reload\n    sudo systemctl enable grafana-server.service\n    sudo systemctl start grafana-server\n    ```\n\n2. Check if Grafana is running:\n\n    ```bash\n    sudo systemctl status grafana-server\n    ```\n\n    If necessary, you can stop or restart the service with the following commands:\n\n    ```bash\n    sudo systemctl stop grafana-server\n    sudo systemctl restart grafana-server\n    ```\n\n3. Access Grafana by navigating to the following URL and logging in with the default username and password (`admin`):\n\n    ```text\n    http://SERVER_IP_ADDRESS:3000/login\n    ```\n\n    !!! tip \"Change default port\"\n        To change Grafana's port, edit `/usr/share/grafana/conf/defaults.ini`:\n\n        ```bash\n        sudo vim /usr/share/grafana/conf/defaults.ini\n        ```\n\n        Modify the `http_port` value, then restart Grafana:\n\n        ```bash\n        sudo systemctl restart grafana-server\n        ```\n\n![Grafana login screen](/images/node-infrastructure/run-a-validator/operational-tasks/general-management/general-management-01.webp)\n\nTo visualize node metrics, follow these steps:\n\n1. Select the gear icon to access **Data Sources** settings.\n2. Select **Add data source** to define the data source.\n\n    ![Select Prometheus](/images/node-infrastructure/run-a-validator/operational-tasks/general-management/general-management-02.webp)\n\n3. Select **Prometheus**.\n\n    ![Save and test](/images/node-infrastructure/run-a-validator/operational-tasks/general-management/general-management-03.webp)\n\n4. Enter `http://localhost:9090` in the **URL** field and click **Save & Test**. If **\"Data source is working\"** appears, your connection is configured correctly.\n\n    ![Import dashboard](/images/node-infrastructure/run-a-validator/operational-tasks/general-management/general-management-04.webp)\n\n5. Select **Import** from the left menu, choose **Prometheus** from the dropdown, and click **Import**.\n\n6. Start your Polkadot node by running `./polkadot`. You should now be able to monitor node performance, block height, network traffic, and tasks tasks on the Grafana dashboard.\n\n    ![Live dashboard](/images/node-infrastructure/run-a-validator/operational-tasks/general-management/general-management-05.webp)\n\nThe [Grafana dashboards](https://grafana.com/grafana/dashboards) page features user created dashboards made available for public use. For an example, see the [Substrate Node Metrics](https://grafana.com/grafana/dashboards/21715-substrate-node-metrics/) dashboard."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#install-and-configure-alertmanager", "page_title": "General Management", "index": 10, "depth": 3, "title": "Install and Configure Alertmanager", "anchor": "install-and-configure-alertmanager", "start_char": 17186, "end_char": 24532, "estimated_token_count": 1584, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install and Configure Alertmanager\n\n[Alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/) is an optional component that complements Prometheus by managing alerts and notifying users about potential issues.\n\nFollow these steps to install and configure Alertmanager:\n\n1. Download Alertmanager for your system architecture from the [releases page](https://github.com/prometheus/alertmanager/releases). Replace `INSERT_RELEASE_DOWNLOAD` with the release binary URL (e.g., `https://github.com/prometheus/alertmanager/releases/download/v0.28.0-rc.0/alertmanager-0.28.0-rc.0.linux-amd64.tar.gz`):\n\n    ```bash\n    wget INSERT_RELEASE_DOWNLOAD_LINK\n    tar -xvzf alertmanager*\n    ```\n\n2. Copy the binaries to the system directory and set permissions:\n\n    ```bash\n    cd alertmanager-0.28.0-rc.0.linux-amd64\n    sudo cp ./alertmanager /usr/local/bin/\n    sudo cp ./amtool /usr/local/bin/\n    sudo chown prometheus:prometheus /usr/local/bin/alertmanager\n    sudo chown prometheus:prometheus /usr/local/bin/amtool\n    ```\n\n3. Create the `alertmanager.yml` configuration file under `/etc/alertmanager`:\n\n    ```bash\n    sudo mkdir /etc/alertmanager\n    sudo nano /etc/alertmanager/alertmanager.yml\n    ```\n\n    Generate an [app password in your Google account](https://support.google.com/accounts/answer/185833?hl=en) to enable email notifications from Alertmanager. Then, add the following code to the configuration file to define email notifications using your  email and app password: \n\n    ```yml title=\"alertmanager.yml\"\n    global:\n      resolve_timeout: 1m\n    \n    route:\n      receiver: 'gmail-notifications'\n    \n    receivers:\n      - name: 'gmail-notifications'\n        email_configs:\n          - to: INSERT_YOUR_EMAIL\n            from: INSERT_YOUR_EMAIL\n            smarthost: smtp.gmail.com:587\n            auth_username: INSERT_YOUR_EMAIL\n            auth_identity: INSERT_YOUR_EMAIL\n            auth_password: INSERT_YOUR_APP_PASSWORD\n            send_resolved: true\n    \n    ```\n\n\n    ```bash\n    sudo chown -R prometheus:prometheus /etc/alertmanager\n    ```\n\n4. Configure Alertmanager as a service by creating a systemd service file:\n\n    ```bash\n    sudo nano /etc/systemd/system/alertmanager.service\n    ```\n\n    ```yml title=\"alertmanager.service\"\n    [Unit]\n    Description=AlertManager Server Service\n    Wants=network-online.target\n    After=network-online.target\n    \n    [Service]\n    User=root\n    Group=root\n    Type=simple\n    ExecStart=/usr/local/bin/alertmanager --config.file /etc/alertmanager/alertmanager.yml --web.external-url=http://SERVER_IP:9093 --cluster.advertise-address='0.0.0.0:9093'\n    \n    [Install]\n    WantedBy=multi-user.target\n    \n    ```\n\n5. Reload and enable the service:\n\n    ```bash\n    sudo systemctl daemon-reload\n    sudo systemctl enable alertmanager\n    sudo systemctl start alertmanager\n    ```\n\n6. Verify the service status:\n\n    ```bash\n    sudo systemctl status alertmanager\n    ```\n\n    If you have configured Alertmanager properly, the **Active** field should display **active (running)** similar to below:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>sudo systemctl status alertmanager</span>\n      <span data-ty>alertmanager.service - AlertManager Server Service</span>\n      <span data-ty>Loaded: loaded (/etc/systemd/system/alertmanager.service; enabled; vendor preset: enabled)</span>\n      <span data-ty>Active: active (running) since Thu 2020-08-20 22:01:21 CEST; 3 days ago</span>\n      <span data-ty>Main PID: 20592 (alertmanager)</span>\n      <span data-ty>Tasks: 70 (limit: 9830)</span>\n      <span data-ty>CGroup: /system.slice/alertmanager.service</span>\n      <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n    </div>\n    \n\n#### Grafana Plugin\n\nThere is an [Alertmanager plugin in Grafana](https://grafana.com/grafana/plugins/alertmanager/) that can help you monitor alert information.\n\nFollow these steps to use the plugin:\n\n1. Install the plugin:\n\n    ```bash\n    sudo grafana-cli plugins install camptocamp-prometheus-alertmanager-datasource\n    ```\n\n2. Restart Grafana:\n\n    ```bash\n    sudo systemctl restart grafana-server\n    ```\n\n3. Configure Alertmanager as a data source in your Grafana dashboard (`SERVER_IP:3000`):\n\n    1. Go to **Configuration** > **Data Sources** and search for **Prometheus Alertmanager**.\n    2. Enter the server URL and port for the Alertmanager service, and select **Save & Test** to verify the connection.\n\n4. Import the [8010](https://grafana.com/grafana/dashboards/8010-prometheus-alertmanager/) dashboard for Alertmanager, selecting **Prometheus Alertmanager** in the last column, then select **Import**.\n\n#### Integrate Alertmanager\n\nComplete the integration by following these steps to enable communication between Prometheus and Alertmanager and configure detection and alert rules:\n\n1. Update the `etc/prometheus/prometheus.yml` configuration file to include the following code:\n\n    ```yml title=\"prometheus.yml\"\n    rule_files:\n      - 'rules.yml'\n    \n    alerting:\n      alertmanagers:\n        - static_configs:\n            - targets:\n                - localhost:9093\n    ```\n\n    Expand the following item to view the complete `prometheus.yml` file.\n\n    ??? code \"prometheus.yml\"\n\n        ```yml title=\"prometheus.yml\"\n        global:\n          scrape_interval: 15s\n          evaluation_interval: 15s\n        \n        rule_files:\n          - 'rules.yml'\n        \n        alerting:\n          alertmanagers:\n            - static_configs:\n                - targets:\n                    - localhost:9093\n        \n        scrape_configs:\n          - job_name: 'prometheus'\n            scrape_interval: 5s\n            static_configs:\n              - targets: ['localhost:9090']\n          - job_name: 'substrate_node'\n            scrape_interval: 5s\n            static_configs:\n              - targets: ['localhost:9615']\n        \n        ```\n\n2. Create the rules file for detection and alerts:\n\n    ```bash\n    sudo nano /etc/prometheus/rules.yml\n    ```\n\n    Add a sample rule to trigger email notifications for node downtime over five minutes:\n\n    ```yml title=\"rules.yml\"\n    groups:\n      - name: alert_rules\n        rules:\n          - alert: InstanceDown\n            expr: up == 0\n            for: 5m\n            labels:\n              severity: critical\n            annotations:\n              summary: 'Instance [{{ $labels.instance }}] down'\n              description: '[{{ $labels.instance }}] of job [{{ $labels.job }}] has been down for more than 5 minutes.'\n    \n    ```\n\n    If any of the conditions defined in the rules file are met, an alert will be triggered. For more on alert rules, refer to [Alerting Rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) and [additional alerts](https://samber.github.io/awesome-prometheus-alerts/rules/).\n\n3. Update the file ownership to `prometheus`:\n\n    ```bash\n    sudo chown prometheus:prometheus rules.yml\n    ```\n\n4. Validate the rules syntax:\n\n    ```bash\n    sudo -u prometheus promtool check rules rules.yml\n    ```\n\n5. Restart Prometheus and Alertmanager:\n\n    ```bash\n    sudo systemctl restart prometheus && sudo systemctl restart alertmanager\n    ```\n\nNow you will receive an email alert if one of your rule triggering conditions is met."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#secure-your-validator", "page_title": "General Management", "index": 11, "depth": 2, "title": "Secure Your Validator", "anchor": "secure-your-validator", "start_char": 24532, "end_char": 24884, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Secure Your Validator\n\nValidators in Polkadot's Proof of Stake (PoS) network play a critical role in maintaining network integrity and security by keeping the network in consensus and verifying state transitions. To ensure optimal performance and minimize risks, validators must adhere to strict guidelines around security and reliable operations."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#key-management", "page_title": "General Management", "index": 12, "depth": 3, "title": "Key Management", "anchor": "key-management", "start_char": 24884, "end_char": 27431, "estimated_token_count": 531, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key Management\n\nThough they don't transfer funds, session keys are essential for validators as they sign messages related to consensus and parachains. Securing session keys is crucial as allowing them to be exploited or used across multiple nodes can lead to a loss of staked funds via [slashing](/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/).\n\nGiven the current limitations in high-availability setups and the risks associated with double-signing, it’s recommended to run only a single validator instance. Keys should be securely managed, and processes automated to minimize human error.\n\nThere are three approaches for managing session keys:\n\n- **Set session keys via Polkadot Hub (Recommended)**: Use the `stakingRcClient.set_keys` extrinsic on Polkadot Hub to send session keys and the ownership proof to the relay chain via XCM. This is the recommended approach for all validator setups and is required for validators using pure proxy stash accounts or [Staking Operator proxies](/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/). Setting session keys on Polkadot Hub requires a deposit of approximately 60 DOT (or ~2 KSM on Kusama). This deposit is **only** released when `stakingRcClient.purge_keys` is called on Polkadot Hub — purging keys via the relay chain does not release the deposit.\n\n- **Generate and store in node**: Using the `author.rotateKeysWithOwner` RPC call (available from runtime 2.2.0), which takes your stash account ID as a parameter and returns both the session keys and a cryptographic proof of ownership. For most users, generating keys directly within the client is recommended. Both the keys and proof must be provided when registering new keys on-chain. Until runtime 2.2.0 is live on your network, use the legacy `author.rotateKeys` RPC and pass `0x00` as the proof when submitting `setKeys`.\n\n- **Generate outside node and insert**: Using the `author.setKeys` RPC call. This flexibility accommodates advanced security setups and should only be used by experienced validator operators. A valid ownership proof is still required when submitting keys on-chain.\n\nSee the [Key Management](/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/) guide for more details.\n\n!!! warning \"Relay Chain Deprecation\"\n    The legacy `session.setKeys` extrinsic on the relay chain is still supported, but will be deprecated in a future runtime upgrade. Validators should transition to using `stakingRcClient.set_keys` on Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#signing-outside-the-client", "page_title": "General Management", "index": 13, "depth": 3, "title": "Signing Outside the Client", "anchor": "signing-outside-the-client", "start_char": 27431, "end_char": 27723, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signing Outside the Client\n\nPolkadot plans to support external signing, allowing session keys to reside in secure environments like Hardware Security Modules (HSMs). However, these modules can sign any payload they receive, potentially enabling an attacker to perform slashable actions."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#secure-validator-mode", "page_title": "General Management", "index": 14, "depth": 3, "title": "Secure-Validator Mode", "anchor": "secure-validator-mode", "start_char": 27723, "end_char": 28484, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Secure-Validator Mode\n\nPolkadot's Secure-Validator mode offers an extra layer of protection through strict filesystem, networking, and process sandboxing. This secure mode is activated by default if the machine meets the following requirements:\n\n- **Linux (x86-64 architecture)**: Usually Intel or AMD.\n- **Enabled `seccomp`**: This kernel feature facilitates a more secure approach for process management on Linux. Verify by running.\n\n    ```bash\n    cat /boot/config-`uname -r` | grep CONFIG_SECCOMP=\n    ```\n\n    If `seccomp` is enabled, you should see output similar to the following:\n\n    ```bash\n    CONFIG_SECCOMP=y\n    ```\n\n!!! tip \n    Optionally, **Linux 5.13** may also be used, as it provides access to even more strict filesystem protections."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#linux-best-practices", "page_title": "General Management", "index": 15, "depth": 3, "title": "Linux Best Practices", "anchor": "linux-best-practices", "start_char": 28484, "end_char": 28926, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Linux Best Practices\n\nFollow these best practices to keep your validator secure:\n\n- Use a non-root user for all operations.\n- Regularly apply OS security patches.\n- Enable and configure a firewall.\n- Use key-based SSH authentication; deactivate password-based login.\n- Regularly back up data and harden your SSH configuration. Visit this [SSH guide](https://blog.stribik.technology/2015/01/04/secure-secure-shell.html) for more details."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#validator-best-practices", "page_title": "General Management", "index": 16, "depth": 3, "title": "Validator Best Practices", "anchor": "validator-best-practices", "start_char": 28926, "end_char": 29684, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Validator Best Practices\n\nAdditional best practices can add an additional layer of security and operational reliability:\n\n- Only run the Polkadot binary, and only listen on the configured p2p port.\n- Run on bare-metal machines, as opposed to virtual machines.\n- Provisioning of the validator machine should be automated and defined in code which is kept in private version control, reviewed, audited, and tested.\n- Generate and provide session keys in a secure way.\n- Start Polkadot at boot and restart if stopped for any reason.\n- Run Polkadot as a non-root user.\n- Establish and maintain an on-call rotation for managing alerts.\n- Establish and maintain a clear protocol with actions to perform for each level of each alert with an escalation policy."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-general-management", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/general-management/#additional-resources", "page_title": "General Management", "index": 17, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 29684, "end_char": 30164, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:85c9c727731078ae3b35223dadc61b0e9756dd03d823ad878e5f19d0c8ca5b34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Additional Resources\n\n- [EOS Block Producer Security List](https://github.com/slowmist/eos-bp-nodes-security-checklist)\n- [HSM Policies and the Importance of Validator Security](https://medium.com/loom-network/hsm-policies-and-the-importance-of-validator-security-ec8a4cc1b6f)\n\nFor additional guidance, connect with other validators and the Polkadot engineering team in the [Polkadot Validator Lounge](https://matrix.to/#/#polkadotvalidatorlounge:web3.foundation) on Element."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-pause-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/pause-validating/#introduction", "page_title": "Pause Validating", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 555, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7f980c059f5d9f43187979ccb4f0c6ee585c2fdb01a4abfa6f8eeb5e021a8501", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nIf you need to temporarily stop participating in Polkadot staking activities without fully unbonding your funds, chilling your account allows you to do so efficiently. Chilling removes your node from active validation or nomination in the next era while keeping your funds bonded, making it ideal for planned downtimes or temporary pauses.\n\nThis guide covers the steps for chilling as a validator or nominator, using the `chill` and `chillOther` extrinsics, and how these affect your staking status and nominations."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-pause-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/pause-validating/#chilling-your-node", "page_title": "Pause Validating", "index": 1, "depth": 2, "title": "Chilling Your Node", "anchor": "chilling-your-node", "start_char": 555, "end_char": 1145, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7f980c059f5d9f43187979ccb4f0c6ee585c2fdb01a4abfa6f8eeb5e021a8501", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Chilling Your Node\n\nIf you need to temporarily step back from staking without unbonding your funds, you can \"chill\" your account. Chilling pauses your active staking participation, setting your account to inactive in the next era while keeping your funds bonded.\n\nTo chill your account, go to the **Network > Staking > Account Actions** page on [Polkadot.js Apps](https://polkadot.js.org/apps), and select **Stop**. Alternatively, you can call the [`chill`](https://paritytech.github.io/polkadot-sdk/master/pallet_staking/enum.Call.html#variant.chill) extrinsic in the Staking pallet."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-pause-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/pause-validating/#staking-election-timing-considerations", "page_title": "Pause Validating", "index": 2, "depth": 2, "title": "Staking Election Timing Considerations", "anchor": "staking-election-timing-considerations", "start_char": 1145, "end_char": 1746, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7f980c059f5d9f43187979ccb4f0c6ee585c2fdb01a4abfa6f8eeb5e021a8501", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Staking Election Timing Considerations\n\nWhen a node actively participates in staking but then chills, it will continue contributing for the remainder of the current era. However, its eligibility for the next election depends on the chill status at the start of the new era:\n\n- **Chilled during previous era**: Will not participate in the current era election and will remain inactive until reactivated.\n- **Chilled during current era**: Will not be selected for the next era's election.\n- **Chilled after current era**: May be selected if it was active during the previous era and is now chilled."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-pause-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/pause-validating/#chilling-as-a-nominator", "page_title": "Pause Validating", "index": 3, "depth": 2, "title": "Chilling as a Nominator", "anchor": "chilling-as-a-nominator", "start_char": 1746, "end_char": 2523, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7f980c059f5d9f43187979ccb4f0c6ee585c2fdb01a4abfa6f8eeb5e021a8501", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Chilling as a Nominator\n\nWhen you choose to chill as a nominator, your active nominations are reset. Upon re-entering the nominating process, you must reselect validators to support manually. Depending on preferences, these can be the same validators as before or a new set. Remember that your previous nominations won’t be saved or automatically reactivated after chilling.\n\nWhile chilled, your nominator account remains bonded, preserving your staked funds without requiring a full unbonding process. When you’re ready to start nominating again, you can issue a new nomination call to activate your bond with a fresh set of validators. This process bypasses the need for re-bonding, allowing you to maintain your stake while adjusting your involvement in active staking."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-pause-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/pause-validating/#chilling-as-a-validator", "page_title": "Pause Validating", "index": 4, "depth": 2, "title": "Chilling as a Validator", "anchor": "chilling-as-a-validator", "start_char": 2523, "end_char": 3526, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7f980c059f5d9f43187979ccb4f0c6ee585c2fdb01a4abfa6f8eeb5e021a8501", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Chilling as a Validator\n\nWhen you chill as a validator, your active validator status is paused. Although your nominators remain bonded to you, the validator bond will no longer appear as an active choice for new or revised nominations until reactivated. Any existing nominators who take no action will still have their stake linked to the validator, meaning they don’t need to reselect the validator upon reactivation. However, if nominators adjust their stakes while the validator is chilled, they will not be able to nominate the chilled validator until it resumes activity.\n\nUpon reactivating as a validator, you can reconfigure your validator preferences, such as the blocked nominations option. See [Validator Compensation](/node-infrastructure/run-a-validator/requirements/#validator-compensation) for details on validator commission, which is fixed on-chain at 0% and cannot be changed. This step is essential for rejoining the active validator set and regaining eligibility for nominations."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-pause-validating", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/pause-validating/#chill-other", "page_title": "Pause Validating", "index": 5, "depth": 2, "title": "Chill Other", "anchor": "chill-other", "start_char": 3526, "end_char": 4496, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7f980c059f5d9f43187979ccb4f0c6ee585c2fdb01a4abfa6f8eeb5e021a8501", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Chill Other\n\nHistorical constraints in the runtime prevented unlimited nominators and validators from being supported. These constraints created a need for checks to keep the size of the staking system manageable. One of these checks is the `chillOther` extrinsic, allowing users to chill accounts that no longer met standards such as minimum staking requirements set through on-chain governance.\n\nThis control mechanism included a `ChillThreshold`, which was structured to define how close to the maximum number of nominators or validators the staking system would be allowed to get before users could start chilling one another. With the passage of [Referendum #90](https://polkadot-old.polkassembly.io/referendum/90), the value for `maxNominatorCount` on Polkadot was set to `None`, effectively removing the limit on how many nominators and validators can participate. This means the `ChillThreshold` will never be met; thus, `chillOther` no longer has any effect."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-staking-operator-proxy", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/#introduction", "page_title": "Staking Operator Proxy on Polkadot", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 27, "end_char": 1246, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8dd9dc1000a3f8831b97b18ac4c01bf6d3e194b482f0904396d150c09d82f74d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Staking Operator proxy is an on-chain proxy type that enables non-custodial validator operations on Polkadot. It creates a clear separation between fund management and node operations. This separation allows capital providers (stakers) to delegate day-to-day validator operations to node runners (operators) without granting access to bonded funds.\n\nIn traditional validator setups, the entity running the node typically requires broad access to the staking account, including the ability to bond, unbond, and transfer funds. The Staking Operator proxy eliminates this requirement by granting the operator only the permissions needed to manage validator operations, such as setting session keys and managing validator status.\n\nThis design is particularly valuable for institutional staking arrangements, where a capital provider wants to delegate operations to a professional node operator while maintaining full control over their bonded DOT. The operator can perform all necessary day-to-day tasks without ever having the ability to move or unbond funds.\n\n``` mermaid\nflowchart LR\n    A[\"Validator\"]\n    B[\"Staking Operator Proxy\"]\n    A --\"Sets\"--> B\n    B --\"Issues validation calls\"--> A\n```"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-staking-operator-proxy", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/#staking-operator-vs-staking-proxy", "page_title": "Staking Operator Proxy on Polkadot", "index": 1, "depth": 2, "title": "Staking Operator vs Staking Proxy", "anchor": "staking-operator-vs-staking-proxy", "start_char": 1246, "end_char": 3120, "estimated_token_count": 368, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8dd9dc1000a3f8831b97b18ac4c01bf6d3e194b482f0904396d150c09d82f74d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Staking Operator vs Staking Proxy\n\nThe Staking Operator proxy is a strict subset of the `Staking` proxy. While the `Staking` proxy grants full access to all staking-related extrinsics, the Staking Operator proxy is limited to operations-only permissions. The following table highlights the differences:\n\n|                        Capability                         | `Staking` Proxy | Staking Operator Proxy |\n| :-------------------------------------------------------: | :-------------: | :--------------------: |\n|      `staking.validate` (register/update validator)       |       Yes       |          Yes           |\n|          `staking.chill` (deactivate validator)           |       Yes       |          Yes           |\n|            `staking.kick` (remove nominators)             |       Yes       |          Yes           |\n|          `session.setKeys` / `session.purgeKeys`          |       Yes       |          Yes           |\n| `stakingRcClient.setKeys` / `stakingRcClient.purgeKeys` |       Yes       |          Yes           |\n|           `staking.bond` / `staking.bondExtra`            |       Yes       |           No           |\n|       `staking.unbond` / `staking.withdrawUnbonded`       |       Yes       |           No           |\n|                    `staking.nominate`                     |       Yes       |           No           |\n|                    `staking.setPayee`                     |       Yes       |           No           |\n|                     `staking.rebond`                      |       Yes       |           No           |\n|          `proxy.addProxy` / `proxy.removeProxy`           |       Yes       |           No           |\n\nThe key distinction is that the Staking Operator proxy cannot perform any action that moves, bonds, or unbonds funds. It also cannot create or remove other proxies, preventing delegation chain attacks."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-staking-operator-proxy", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/#set-up-a-staking-operator-proxy", "page_title": "Staking Operator Proxy on Polkadot", "index": 2, "depth": 2, "title": "Set Up a Staking Operator Proxy", "anchor": "set-up-a-staking-operator-proxy", "start_char": 3120, "end_char": 5549, "estimated_token_count": 538, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8dd9dc1000a3f8831b97b18ac4c01bf6d3e194b482f0904396d150c09d82f74d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up a Staking Operator Proxy\n\nSetting up a Staking Operator proxy is the responsibility of the staker (capital provider). Before creating the proxy, the staker must prepare the validator account by bonding funds.\n\n!!! note\n    All setup operations are performed on Polkadot Hub (Asset Hub), not on the relay chain.\n\nFollow these steps to set up a Staking Operator proxy:\n\n1. **Bond DOT**: The staker bonds the desired amount of DOT to the stash account. Refer to the [Start Validating](/node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating/) guide for detailed instructions on bonding.\n\n2. **Create the proxy**: Call `proxy.addProxy` with the following parameters:\n\n    - **`delegate`**: The operator's account address\n    - **`proxy_type`**: Set to `Staking Operator`\n    - **`delay`**: The number of blocks the proxy call is delayed (set to `0` for immediate execution, or a higher value for added security)\n\n    The proxy can be created by the stash account directly, an `Any` proxy, or a `Staking` proxy.\n\n3. **Register intent to validate**: The operator calls `staking.validate` wrapped in a `proxy.proxy` call (with the staker's account as the `real` parameter) to register as a validator. This step must be completed before setting session keys.\n\n4. **Set session keys**: The operator calls `stakingRcClient.setKeys` wrapped in a `proxy.proxy` call to set the validator's session keys. This requires a deposit of approximately 60 DOT on the validator account, which is released when `stakingRcClient.purgeKeys` is called.\n\n!!! note\n    The order of operations matters. On Polkadot Hub, `bond` must be called by the stash account before the proxy can be created, and `validate` must be called by the staking operator (via proxy) before session keys can be set. Ensure the steps above are completed in order.\n\n!!! warning\n    It is strongly recommended that the Validator-`StakingOperator` relationship is 1:1. Assigning the same `StakingOperator` to multiple validators may result in complications and session keys not being properly set. Using a fresh, dedicated, non-validator account as the `StakingOperator` is operationally safer and strongly recommended.\n\n!!! tip\n    Consider using a non-zero `delay` value when creating the proxy. A time-delay proxy gives the staker a window to review and potentially cancel any proxy calls before they execute, adding an extra layer of security."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-staking-operator-proxy", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/#operate-a-validator-with-a-staking-operator-proxy", "page_title": "Staking Operator Proxy on Polkadot", "index": 3, "depth": 2, "title": "Operate a Validator with a Staking Operator Proxy", "anchor": "operate-a-validator-with-a-staking-operator-proxy", "start_char": 5549, "end_char": 7329, "estimated_token_count": 385, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8dd9dc1000a3f8831b97b18ac4c01bf6d3e194b482f0904396d150c09d82f74d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Operate a Validator with a Staking Operator Proxy\n\nOnce the staker has created the Staking Operator proxy, the operator can begin managing the validator. All operator actions are submitted as proxy calls through the `proxy.proxy` extrinsic, using the staker's account as the `real` parameter.\n\n!!! warning \"Correct `force_proxy_type` Required\"\n    When submitting proxy calls, ensure the `force_proxy_type` parameter is set to `Some(StakingOperator)` or `None`. Using `Some(Staking)` will fail with a `NotProxy` error because the proxy pallet requires an exact match on the proxy type. Since the stored proxy type is `StakingOperator`, passing `Staking` does not match.\n\nThe operator can perform the following actions:\n\n- **Set session keys**: Rotate or update session keys using `stakingRcClient.setKeys` on Polkadot Hub or `session.setKeys` on the relay chain. See [Key Management](/node-infrastructure/run-a-validator/operational-tasks/general-management/#key-management) for best practices on managing session keys.\n- **Deactivate the validator**: Temporarily pause validation by calling `staking.chill`. See [Pause Validating](/node-infrastructure/run-a-validator/operational-tasks/pause-validating/) for more details on the chilling process.\n- **Remove nominators**: Kick specific nominators from the validator's nomination pool using `staking.kick`.\n- **Purge session keys**: Remove session keys using `stakingRcClient.purgeKeys` on Polkadot Hub or `session.purgeKeys` on the relay chain.\n\n!!! warning\n    The worst-case scenario with a compromised operator is that they could chill the validator or change session keys. While these actions are disruptive, they cannot result in loss of bonded funds. The staker can revoke the proxy at any time to regain full control."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-staking-operator-proxy", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/#manage-session-keys-on-polkadot-hub", "page_title": "Staking Operator Proxy on Polkadot", "index": 4, "depth": 2, "title": "Manage Session Keys on Polkadot Hub", "anchor": "manage-session-keys-on-polkadot-hub", "start_char": 7329, "end_char": 9098, "estimated_token_count": 366, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8dd9dc1000a3f8831b97b18ac4c01bf6d3e194b482f0904396d150c09d82f74d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Manage Session Keys on Polkadot Hub\n\nPolkadot Hub introduces a new path for session key management through the `stakingRcClient` pallet. This approach is required for validators using pure proxy stash accounts, as pure proxies cannot sign extrinsics directly on the relay chain.\n\nThe `stakingRcClient` pallet provides two extrinsics for session key management:\n\n- **`stakingRcClient.setKeys`**: Set or rotate session keys for the validator. The operator submits this call as a proxy transaction through the staker's account. The `keys` and `proof` parameters must be the values returned by the `author_rotateKeysWithOwner(stash)` RPC call on the validator node. If runtime 2.2.0 is not yet live on your network, use the legacy `author_rotateKeys` RPC and pass `0x00` as the proof.\n- **`stakingRcClient.purgeKeys`**: Remove session keys from the validator. This is useful when decommissioning a validator node or rotating to a new server.\n\n!!! info \"Key Deposit Required\"\n    Setting session keys via `stakingRcClient.setKeys` requires a deposit of approximately 60 DOT (or ~2 KSM on Kusama) to cover the on-chain storage cost of key registration. This deposit is only released when `stakingRcClient.purgeKeys` is called on Polkadot Hub. Purging keys via the relay chain (`session.purgeKeys`) does not release this deposit.\n\n!!! note\n    The legacy `session.setKeys` and `session.purgeKeys` extrinsics on the relay chain remain functional for validators that do not use pure proxy stash accounts. However, the Polkadot Hub path through `stakingRcClient` is the recommended approach for new setups.\n\nFor guidance on rotating session keys during node upgrades, see [Upgrade a Validator Node](/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-staking-operator-proxy", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/#security-considerations", "page_title": "Staking Operator Proxy on Polkadot", "index": 5, "depth": 2, "title": "Security Considerations", "anchor": "security-considerations", "start_char": 9098, "end_char": 10809, "estimated_token_count": 349, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8dd9dc1000a3f8831b97b18ac4c01bf6d3e194b482f0904396d150c09d82f74d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Security Considerations\n\nThe Staking Operator proxy is designed with a minimal-permission model that limits the blast radius of a compromised operator account. Consider the following security properties and best practices:\n\n- **Non-custodial by design**: The operator never has access to bonded funds. The proxy type explicitly excludes all balance-related and fund management extrinsics.\n- **No delegation chains**: A `Staking Operator` proxy cannot create or remove other proxies. This prevents an operator from escalating their permissions or delegating access to additional accounts.\n- **Time-delay proxies**: The `delay` parameter in `proxy.addProxy` allows the staker to configure a block delay on all proxy calls. During this delay window, the staker can cancel any pending call, providing an additional layer of oversight.\n- **Pure proxy compatibility**: Pure proxy stash accounts can use the `Staking Operator` proxy in combination with Polkadot Hub's `stakingRcClient` pallet for session key management. This enables fully non-custodial setups where no single key controls the stash.\n- **Revocable at any time**: The staker retains the ability to remove the `Staking Operator` proxy by calling `proxy.removeProxy`, immediately revoking all operator permissions.\n- **Slashing risk remains**: While the operator cannot steal funds, improper session key management (such as running duplicate keys across nodes) can still lead to [equivocation slashing](/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/). Stakers should verify that operators follow proper [key management practices](/node-infrastructure/run-a-validator/operational-tasks/general-management/#key-management)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-upgrade-your-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/#introduction", "page_title": "Upgrade a Validator Node", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 822, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3a0c9cf878cdb8752513ca18aac3af94c0b30afe43d8f6de5a3d3fccf5c29b52", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nUpgrading a Polkadot validator node is essential for staying current with network updates and maintaining optimal performance. This guide covers routine and extended maintenance scenarios, including software upgrades and major server changes. Following these steps, you can manage session keys and transition smoothly between servers without risking downtime, slashing, or network disruptions. The process requires strategic planning, especially if you need to perform long-lead maintenance, ensuring your validator remains active and compliant.\n\nThis guide will allow validators to seamlessly substitute an active validator server to allow for maintenance operations. The process can take several hours, so ensure you understand the instructions first and plan accordingly."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-upgrade-your-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/#prerequisites", "page_title": "Upgrade a Validator Node", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 822, "end_char": 1345, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3a0c9cf878cdb8752513ca18aac3af94c0b30afe43d8f6de5a3d3fccf5c29b52", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Prerequisites\n\nBefore beginning the upgrade process for your validator node, ensure the following:\n\n- You have a fully functional validator setup with all required binaries installed. See [Set Up a Validator](/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/) and [Validator Requirements](/node-infrastructure/run-a-validator/requirements/) for additional guidance.\n- Your VPS infrastructure has enough capacity to run a secondary validator instance temporarily for the upgrade process."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-upgrade-your-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/#session-keys", "page_title": "Upgrade a Validator Node", "index": 2, "depth": 2, "title": "Session Keys", "anchor": "session-keys", "start_char": 1345, "end_char": 2032, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3a0c9cf878cdb8752513ca18aac3af94c0b30afe43d8f6de5a3d3fccf5c29b52", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Session Keys\n\nSession keys are used to sign validator operations and establish a connection between your validator node and your staking proxy account. These keys are stored in the client, and any change to them requires a waiting period. Specifically, if you modify your session keys, the change will take effect only after the current session is completed and two additional sessions have passed.\n\nRemembering this delayed effect when planning upgrades is crucial to ensure that your validator continues to function correctly and avoids interruptions. To learn more about session keys and their importance, visit the [Keys section](../../../wiki/learn/learn-cryptography.md#keys)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-upgrade-your-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/#keystore", "page_title": "Upgrade a Validator Node", "index": 3, "depth": 2, "title": "Keystore", "anchor": "keystore", "start_char": 2032, "end_char": 2809, "estimated_token_count": 160, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3a0c9cf878cdb8752513ca18aac3af94c0b30afe43d8f6de5a3d3fccf5c29b52", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Keystore\n\nYour validator server's `keystore` folder holds the private keys needed for signing network-level transactions. It is important not to duplicate or transfer this folder between validator instances. Doing so could result in multiple validators signing with the duplicate keys, leading to severe consequences such as [equivocation slashing](/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#equivocation-slash). Instead, always generate new session keys for each validator instance.\n\nThe default path to the `keystore` is as follows:\n\n```bash\n/home/polkadot/.local/share/polkadot/chains/<chain>/keystore\n```\n\nTaking care to manage your keys securely ensures that your validator operates safely and without the risk of slashing penalties."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-upgrade-your-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/#upgrade-using-backup-validator", "page_title": "Upgrade a Validator Node", "index": 4, "depth": 2, "title": "Upgrade Using Backup Validator", "anchor": "upgrade-using-backup-validator", "start_char": 2809, "end_char": 3061, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3a0c9cf878cdb8752513ca18aac3af94c0b30afe43d8f6de5a3d3fccf5c29b52", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Upgrade Using Backup Validator\n\nThe following instructions outline how to temporarily switch between two validator nodes. The original active validator is referred to as Validator A and the backup node used for maintenance purposes as Validator B."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-upgrade-your-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/#session-n", "page_title": "Upgrade a Validator Node", "index": 5, "depth": 3, "title": "Session `N`", "anchor": "session-n", "start_char": 3061, "end_char": 4241, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3a0c9cf878cdb8752513ca18aac3af94c0b30afe43d8f6de5a3d3fccf5c29b52", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Session `N`\n\n1. **Start Validator B**: Launch a secondary node and wait until it is fully synced with the network. Once synced, start it with the `--validator` flag. This node will now act as Validator B.\n2. **Generate session keys**: Create new session keys for Validator B. See the [Key Management](/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/) guide for the current procedure.\n3. **Submit session keys**: Use your staking proxy account to submit the session keys on-chain. See the [Key Management](/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#submit-transaction-to-set-keys) guide for submission paths.\n4. **Record the session**: Make a note of the session in which you executed this extrinsic.\n5. **Wait for session changes**: Allow the current session to end and then wait for two additional full sessions for the new keys to take effect.\n\n!!! warning \"Keep Validator A running\"\n\n      It is crucial to keep Validator A operational during this entire waiting period. Since session key changes do not take effect immediately, turning off Validator A too early may result in chilling or even slashing."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-operational-tasks-upgrade-your-node", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node/#session-n3", "page_title": "Upgrade a Validator Node", "index": 6, "depth": 3, "title": "Session `N+3`", "anchor": "session-n3", "start_char": 4241, "end_char": 6060, "estimated_token_count": 448, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3a0c9cf878cdb8752513ca18aac3af94c0b30afe43d8f6de5a3d3fccf5c29b52", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Session `N+3`\n\nAt this stage, Validator B becomes your active validator. You can now safely perform any maintenance tasks on Validator A.\n\nComplete the following steps when you are ready to bring Validator A back online:\n\n1. **Start Validator A**: Launch Validator A, sync the blockchain database, and ensure it is running with the `--validator` flag.\n2. **Generate new session keys for Validator A**: Create fresh session keys for Validator A. See the [Key Management](/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/) guide for the current procedure.\n3. **Submit session keys**: Using your staking proxy account, submit the session keys on-chain. See the [Key Management](/node-infrastructure/run-a-validator/onboarding-and-offboarding/key-management/#submit-transaction-to-set-keys) guide for submission paths.\n4. **Record the session**: Again, make a note of the session in which you executed this extrinsic.\n\nKeep Validator B active until the session during which you executed the `set-key` extrinsic completes plus two additional full sessions have passed. Once Validator A has successfully taken over, you can safely stop Validator B. This process helps ensure a smooth handoff between nodes and minimizes the risk of downtime or penalties. Verify the transition by checking for finalized blocks in the new session. The logs should indicate the successful change, similar to the example below:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>INSERT_COMMAND</span>\n  <span data-ty>2019-10-28 21:44:13 Applying authority set change scheduled at block #450092</span>\n  <span data-ty>2019-10-28 21:44:13 Applying GRANDPA set change to new set with 20 authorities</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-requirements", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/requirements/#introduction", "page_title": "Validator Requirements", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 27, "end_char": 982, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5053628e19a4a0c3e59a348ae89dc6e46b46675595dfedc656e20acc1b9a1f9b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nRunning a validator in the Polkadot ecosystem is essential for maintaining network security and decentralization. Validators are responsible for validating transactions and adding new blocks to the chain, ensuring the system operates smoothly. In return for their services, validators earn rewards. However, the role comes with inherent risks, such as slashing penalties for misbehavior or technical failures. If you’re new to validation, starting on Kusama provides a lower-stakes environment to gain valuable experience before progressing to the Polkadot network.\n\nThis guide covers everything you need to know about becoming a validator, including system requirements, staking prerequisites, and infrastructure setup. Whether you’re deploying on a VPS or running your node on custom hardware, you’ll learn how to optimize your validator for performance and security, ensuring compliance with network standards while minimizing risks."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-requirements", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/requirements/#prerequisites", "page_title": "Validator Requirements", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 982, "end_char": 2361, "estimated_token_count": 288, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5053628e19a4a0c3e59a348ae89dc6e46b46675595dfedc656e20acc1b9a1f9b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Prerequisites\n\nRunning a validator requires solid system administration skills and a secure, well-maintained infrastructure. Below are the primary requirements you need to be aware of before getting started:\n\n- **System administration expertise**: Handling technical anomalies and maintaining node infrastructure is critical. Validators must be able to troubleshoot and optimize their setup.\n- **Security**: Ensure your setup follows best practices for securing your node. Refer to the [Secure Your Validator](/node-infrastructure/run-a-validator/operational-tasks/general-management/#secure-your-validator) section to learn about important security measures.\n- **Network choice**: Start with [Kusama](/node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator/#run-a-kusama-validator) to gain experience. Look for \"Adjustments for Kusama\" throughout these guides for tips on adapting the provided instructions for the Kusama network.\n- **Staking requirements**: A minimum amount of native token (KSM or DOT) is required to be elected into the validator set. The required stake can come from your own holdings or from nominators.\n- **Risk of slashing**: Any DOT you stake is at risk if your setup fails or your validator misbehaves. If you’re unsure of your ability to maintain a reliable validator, consider nominating your DOT to a trusted validator."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-requirements", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/requirements/#minimum-hardware-requirements", "page_title": "Validator Requirements", "index": 2, "depth": 2, "title": "Minimum Hardware Requirements", "anchor": "minimum-hardware-requirements", "start_char": 2361, "end_char": 3401, "estimated_token_count": 214, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5053628e19a4a0c3e59a348ae89dc6e46b46675595dfedc656e20acc1b9a1f9b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Minimum Hardware Requirements\n\nPolkadot validators rely on high-performance hardware to process blocks efficiently. The recommended minimum hardware requirements to ensure a fully functional and performant validator are as follows:\n\n- CPU:\n\n    - x86-64 compatible.\n    - Eight physical cores @ 3.4 GHz.\n    - Processor:\n        - **Intel**: Ice Lake or newer (Xeon or Core series)\n        - **AMD**: Zen3 or newer (EPYC or Ryzen)\n    - Simultaneous multithreading disabled:\n        - **Intel**: Hyper-Threading\n        - **AMD**: SMT\n    - [Single-threaded performance](https://www.cpubenchmark.net/singleThread.html) is prioritized over higher cores count.\n\n- Storage:\n\n    - **NVMe SSD**: At least 2 TB for blockchain data recommended (prioritize latency rather than throughput).\n    - Storage requirements will increase as the chain grows.\n\n- Memory:\n\n    - 32 GB DDR4 ECC\n\n- Network:\n\n    - Symmetric networking speed of 500 Mbit/s is required to handle large numbers of parachains and ensure congestion control during peak times."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-requirements", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/requirements/#vps-provider-list", "page_title": "Validator Requirements", "index": 3, "depth": 2, "title": "VPS Provider List", "anchor": "vps-provider-list", "start_char": 3401, "end_char": 5785, "estimated_token_count": 521, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5053628e19a4a0c3e59a348ae89dc6e46b46675595dfedc656e20acc1b9a1f9b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## VPS Provider List\n\nWhen selecting a VPS provider for your validator node, prioritize reliability, consistent performance, and adherence to the specific hardware requirements set for Polkadot validators. The following server types have been tested and showed acceptable performance in benchmark tests. However, this is not an endorsement and actual performance may vary depending on your workload and VPS provider.\n\nBe aware that some providers may overprovision the underlying host and use shared storage such as NVMe over TCP, which appears as local storage. These setups might result in poor or inconsistent performance. Benchmark your infrastructure before deploying.\n\n- **[Google Cloud Platform (GCP)](https://cloud.google.com/)**: `c2` and `c2d` machine families offer high-performance configurations suitable for validators.\n- **[Amazon Web Services (AWS)](https://aws.amazon.com/)**: `c6id` machine family provides strong performance, particularly for I/O-intensive workloads.\n- **[OVH](https://www.ovhcloud.com/)**: Can be a budget-friendly solution if it meets your minimum hardware specifications.\n- **[Digital Ocean](https://www.digitalocean.com/)**: Popular among developers, Digital Ocean's premium droplets offer configurations suitable for medium to high-intensity workloads.\n- **[Vultr](https://www.vultr.com/)**: Offers flexibility with plans that may meet validator requirements, especially for high-bandwidth needs.\n- **[Akamai Cloud (Linode)](https://www.linode.com/)**: Provides detailed documentation, which can be helpful for setup.\n- **[Scaleway](https://www.scaleway.com/en/)**: Offers high-performance cloud instances that can be suitable for validator nodes.\n- **[OnFinality](https://onfinality.io/en)**: Specialized in blockchain infrastructure, OnFinality provides validator-specific support and configurations.\n\n!!! warning \"Acceptable use policies\"\n    Different VPS providers have varying acceptable use policies, and not all allow cryptocurrency-related activities. \n\n    For example, Digital Ocean, requires explicit permission to use servers for cryptocurrency mining and defines unauthorized mining as [network abuse](https://www.digitalocean.com/legal/acceptable-use-policy#network-abuse) in their acceptable use policy. \n    \n    Review the terms for your VPS provider to avoid account suspension or server shutdown due to policy violations."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-requirements", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/requirements/#minimum-bond-requirement", "page_title": "Validator Requirements", "index": 4, "depth": 2, "title": "Minimum Bond Requirement", "anchor": "minimum-bond-requirement", "start_char": 5785, "end_char": 6575, "estimated_token_count": 203, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5053628e19a4a0c3e59a348ae89dc6e46b46675595dfedc656e20acc1b9a1f9b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Minimum Bond Requirement\n\nBefore bonding DOT, ensure you meet the minimum bond requirement to start a validator instance. The minimum bond is the least DOT you need to stake to enter the validator set. To become eligible for rewards, your validator node must be nominated by enough staked tokens.\n\nFor example, on September 17, 2026, the minimum stake backing a validator in Polkadot's era 2296 was 1,300,113.792 DOT. You can check the current minimum stake required using these tools:\n\n- [**Chain State Values**](../../wiki/general/chain-state-values.md)\n- [**Staking Optimizer**](https://staking.usepapi.app/polkadot/validators)\n- [**Subscan**](https://assethub-polkadot.subscan.io/validator_list?status=validator)\n- [**Staking Dashboard**](https://staking.polkadot.cloud/#/overview)"}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-requirements", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/requirements/#minimum-validator-self-stake", "page_title": "Validator Requirements", "index": 5, "depth": 2, "title": "Minimum Validator Self-Stake", "anchor": "minimum-validator-self-stake", "start_char": 6575, "end_char": 7459, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5053628e19a4a0c3e59a348ae89dc6e46b46675595dfedc656e20acc1b9a1f9b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Minimum Validator Self-Stake\n\nAs of the March 2026 runtime upgrade, all Polkadot validators must maintain a minimum self-stake of **10,000 DOT** that is slashable. This self-stake must come from the validator's own stash account and is separate from any stake delegated by nominators.\n\nThe self-stake requirement ensures that validators have meaningful skin in the game, aligning their incentives with the security of the network. Validators who do not meet this threshold become permissionlessly chill-able — any account can submit a `staking.chillOther` extrinsic to remove the non-compliant validator from the active set.\n\n!!! warning\n    If your self-stake drops below 10,000 DOT (for example, due to a slash), your validator becomes immediately eligible for chilling by any network participant. Monitor your self-stake balance and rebond additional funds promptly if needed."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-requirements", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/requirements/#validator-compensation", "page_title": "Validator Requirements", "index": 6, "depth": 2, "title": "Validator Compensation", "anchor": "validator-compensation", "start_char": 7459, "end_char": 8542, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5053628e19a4a0c3e59a348ae89dc6e46b46675595dfedc656e20acc1b9a1f9b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Validator Compensation\n\nFollowing [Referendum 1909](https://polkadot.subsquare.io/referenda/1909), which builds on [Referendum 1890](https://polkadot.subsquare.io/referenda/1890), validators no longer take a rate-based cut of nominator rewards. Any such rate is fixed on-chain at **0%**, and the maximum allowed value was updated to match, so it cannot be set to anything else.\n\nInstead, validators are rewarded for their own self-stake through a self-stake incentive drawn from the [Dynamic Allocation Pool (DAP)](https://forum.polkadot.network/t/proposal-dynamic-allocation-pool-dap/15878) budget. This incentive is weighted by each validator's self-stake, so validators are compensated for skin in the game rather than for a share of nominator rewards.\n\nFor more details on how the self-stake incentive and era-point rewards are calculated, see [Rewards Payout](/node-infrastructure/run-a-validator/staking-mechanics/rewards/). For non-custodial validator operations, see [Staking Operator Proxy](/node-infrastructure/run-a-validator/operational-tasks/staking-operator-proxy/)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#introduction", "page_title": "Offenses and Slashes", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 675, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nIn Polkadot's Nominated Proof of Stake (NPoS) system, validator misconduct is deterred through a combination of slashing, disabling, and reputation penalties. Validators and nominators who stake tokens face consequences for validator misbehavior, which range from token slashes to restrictions on network participation.\n\nThis page outlines the types of offenses recognized by Polkadot, including block equivocations and invalid votes, as well as the corresponding penalties. While some parachains may implement additional custom slashing mechanisms, this guide focuses on the offenses tied to staking within the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#offenses", "page_title": "Offenses and Slashes", "index": 1, "depth": 2, "title": "Offenses", "anchor": "offenses", "start_char": 675, "end_char": 1081, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Offenses\n\nPolkadot is a public permissionless network. As such, it has a mechanism to disincentivize offenses and incentivize good behavior. You can review the [parachain protocol](../../../wiki/learn/learn-parachains-protocol.md#parachain-protocol) to understand better the terminology used to describe offenses. Polkadot validator offenses fall into two categories: invalid votes and equivocations."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#invalid-votes", "page_title": "Offenses and Slashes", "index": 2, "depth": 3, "title": "Invalid Votes", "anchor": "invalid-votes", "start_char": 1081, "end_char": 1708, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Invalid Votes\n\nA validator will be penalized for inappropriate voting activity during the block inclusion and approval processes. The invalid voting related offenses are as follows:\n\n- **Backing an invalid block**: A para-validator backs an invalid block for inclusion in a fork of the relay chain.\n- **`ForInvalid` vote**: When acting as a secondary checker, the validator votes in favor of an invalid block.\n- **`AgainstValid` vote**: When acting as a secondary checker, the validator votes against a valid block. This type of vote wastes network resources required to resolve the disparate votes and resulting dispute."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#equivocations", "page_title": "Offenses and Slashes", "index": 3, "depth": 3, "title": "Equivocations", "anchor": "equivocations", "start_char": 1708, "end_char": 2721, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Equivocations\n\nEquivocation occurs when a validator produces statements that conflict with each other when producing blocks or voting. Unintentional equivocations usually occur when duplicate signing keys reside on the validator host. If keys are never duplicated, the probability of an honest equivocation slash decreases to near zero. The equivocation related offenses are as follows:\n\n- **Equivocation**: The validator produces two or more of the same block or vote.\n    - **GRANDPA and BEEFY equivocation**: The validator signs two or more votes in the same round on different chains.\n    - **BABE equivocation**: The validator produces two or more blocks on the relay chain in the same time slot.\n- **Double seconded equivocation**: The validator attempts to second, or back, more than one block in the same round.\n- **Seconded and valid equivocation**: The validator seconds, or backs, a block and then attempts to hide their role as the responsible backer by later placing a standard validation vote."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#penalties", "page_title": "Offenses and Slashes", "index": 4, "depth": 2, "title": "Penalties", "anchor": "penalties", "start_char": 2721, "end_char": 2899, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Penalties\n\nOn Polkadot, offenses to the network incur different penalties depending on severity. There are three main penalties: slashing, disabling, and reputation changes."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#slashing", "page_title": "Offenses and Slashes", "index": 5, "depth": 3, "title": "Slashing", "anchor": "slashing", "start_char": 2899, "end_char": 13675, "estimated_token_count": 2529, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Slashing\n\nValidators engaging in bad actor behavior in the network may be subject to slashing if they commit a qualifying offense. When a validator is slashed, they and their nominators lose a percentage of their staked DOT or KSM, from as little as 0.01% up to 100% based on the severity of the offense. Nominators are evaluated for slashing against their active validations at any given time. Validator nodes are evaluated as discrete entities, meaning an operator can't attempt to mitigate the offense on another node they operate in order to avoid a slash. \n\nAny slashed DOT is directed to the [Dynamic Allocation Pool (DAP)](https://forum.polkadot.network/t/proposal-dynamic-allocation-pool-dap/15878), a permanent on-chain account introduced in the March 2026 runtime upgrade (v2.1.0).\n\n!!! note\n    After the implementation of the staking reforms in 2026, nominators are expected to become unslashable on Polkadot. Once this change takes effect, only the validator's self-stake will be subject to slashing.\n\nUntil nominators become unslashable (see note above), a nominator with a very large bond may nominate several validators in a single era. In this case, a slash is proportionate to the amount staked to the offending validator. Stake allocation and validator activation is controlled by the [Phragmén algorithm](../../../wiki/learn/learn-phragmen.md#algorithm).\n\nA validator slash creates an `unapplied` state transition. You can view pending slashes on [Polkadot.js Apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/staking/slashes). The UI will display the slash per validator, the affected nominators, and the slash amounts. The unapplied state includes a 27-day grace period during which a governance proposal can be made to reverse the slash. Once this grace period expires, the slash is applied.\n\n#### Equivocation Slash\n\nThe Web3 Foundation's [Slashing mechanisms](../../../wiki/learn/learn-offenses.md#slashing) page provides guidelines for evaluating the security threat level of different offenses and determining penalties proportionate to the threat level of the offense. Offenses requiring coordination between validators or extensive computational costs to the system will typically call for harsher penalties than those more likely to be unintentional than malicious. A description of potential offenses for each threat level and the corresponding penalties is as follows:\n\n- **Level 1**: Honest misconduct such as isolated cases of unresponsiveness.\n    - **Penalty**: Validator can be kicked out or slashed up to 0.1% of stake in the validator slot.\n- **Level 2**: Misconduct that can occur honestly but is a sign of bad practices. Examples include repeated cases of unresponsiveness and isolated cases of equivocation.\n    - **Penalty**: Slash of up to 1% of stake in the validator slot.\n- **Level 3**: Misconduct that is likely intentional but of limited effect on the performance or security of the network. This level will typically include signs of coordination between validators. Examples include repeated cases of equivocation or isolated cases of unjustified voting on GRANDPA.\n    - **Penalty**: Reduction in networking reputation metrics, slash of up to 10% of stake in the validator slot.\n- **Level 4**: Misconduct that poses severe security or monetary risk to the system or mass collusion. Examples include signs of extensive coordination, creating a serious security risk to the system, or forcing the system to use extensive resources to counter the misconduct.\n    - **Penalty**: Slash of up to 100% of stake in the validator slot.\n\nSee the next section to understand how slash amounts for equivocations are calculated. If you want to know more details about slashing, please look at the research page on [Slashing mechanisms](../../../wiki/learn/learn-offenses.md).\n\n#### Slash Calculation for Equivocation\n\nThe slashing penalty for GRANDPA, BABE, and BEEFY equivocations is calculated using the formula below, where `x` represents the number of offenders and `n` is the total number of validators in the active set:\n\n```text\nmin((3 * x / n )^2, 1)\n```\n\nThe following scenarios demonstrate how this formula means slash percentages can increase exponentially based on the number of offenders involved compared to the size of the validator pool:\n\n- **Minor offense**: Assume 1 validator out of a 100 validator active set equivocates in a slot. A single validator committing an isolated offense is most likely a mistake rather than malicious attack on the network. This offense results in a 0.09% slash to the stake in the validator slot.\n\n    ``` mermaid\n    flowchart LR\n    N[\"Total Validators = 100\"]\n    X[\"Offenders = 1\"]\n    F[\"min((3 * 1 / 100)^2, 1) = 0.0009\"]\n    G[\"0.09% slash of stake\"]\n\n    N --> F\n    X --> F\n    F --> G\n    ```\n\n- **Moderate offense**: Assume 5 validators out a 100 validator active set equivocate in a slot. This is a slightly more serious event as there may be some element of coordination involved. This offense results in a 2.25% slash to the stake in the validator slot.\n\n    ``` mermaid\n    flowchart LR\n    N[\"Total Validators = 100\"]\n    X[\"Offenders = 5\"]\n    F[\"min((3 * 5 / 100)^2, 1) = 0.0225\"]\n    G[\"2.25% slash of stake\"]\n\n    N --> F\n    X --> F\n    F --> G\n    ```\n\n- **Major offense**: Assume 20 validators out a 100 validator active set equivocate in a slot. This is a major security threat as it possible represents a coordinated attack on the network. This offense results in a 36% slash and all slashed validators will also be chilled.\n    ``` mermaid\n    flowchart LR\n    N[\"Total Validators = 100\"]\n    X[\"Offenders = 20\"]\n    F[\"min((3 * 20 / 100)^2, 1) = 0.36\"]\n    G[\"36% slash of stake\"]\n\n    N --> F\n    X --> F\n    F --> G\n    ```\n\nThe examples above show the risk of nominating or running many validators in the active set. While rewards grow linearly (two validators will get you approximately twice as many staking rewards as one), slashing grows exponentially. Going from a single validator equivocating to two validators equivocating causes a slash four time as much as the single validator.\n\nValidators may run their nodes on multiple machines to ensure they can still perform validation work if one of their nodes goes down. Still, validator operators should be cautious when setting these up. Equivocation is possible if they don't coordinate well in managing signing machines.\n\n#### Best Practices to Avoid Slashing\n\nThe following are advised to node operators to ensure that they obtain pristine binaries or source code and to ensure the security of their node:\n\n- Always download either source files or binaries from the official Parity repository.\n- Verify the hash of downloaded files.\n- Use the W3F secure validator setup or adhere to its principles.\n- Ensure essential security items are checked, use a firewall, manage user access, use SSH certificates.\n- Avoid using your server as a general-purpose system. Hosting a validator on your workstation or one that hosts other services increases the risk of maleficence.\n- Avoid cloning servers (copying all contents) when migrating to new hardware. If an image is needed, create it before generating keys.\n- High Availability (HA) systems are generally not recommended as equivocation may occur if concurrent operations happen—such as when a failed server restarts or two servers are falsely online simultaneously.\n- Copying the keystore folder when moving a database between instances can cause equivocation. Even brief use of duplicated keystores can result in slashing.\n\nBelow are some examples of small equivocations that happened in the past:\n\n| Network  | Era  | Event Type         | Details                                                                                                                                                                                                                                                                                                                                                             | Action Taken                                                                                                                      |\n|----------|------|--------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|\n| Polkadot | 774  | Small Equivocation | [The validator](https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io/$165562246360408hKCfC:matrix.org?via=matrix.parity.io&via=corepaper.org&via=matrix.org) migrated servers and cloned the keystore folder. The on-chain event can be viewed on [Subscan](https://polkadot.subscan.io/extrinsic/11190109-0?event=11190109-5). | The validator didn't submit a request for the slash to be canceled.                                                               |\n| Kusama   | 3329 | Small Equivocation | The validator operated a test machine with cloned keys. The test machine was online simultaneously as the primary, which resulted in a slash.                                                                                                                                                                                                                       | The validator requested a slash cancellation, but the council declined.                                                           |\n| Kusama   | 3995 | Small Equivocation | The validator noticed several errors, after which the client crashed, and a slash was applied. The validator recorded all events and opened GitHub issues to allow for technical opinions to be shared.                                                                                                                                                             | The validator requested to cancel the slash. The council approved the request as they believed the error wasn't operator-related. |\n\n#### Slashing Across Eras\n\nThere are three main difficulties to account for with slashing in NPoS:\n\n- A nominator can nominate multiple validators and be slashed as a result of actions taken by any of them.\n- Until slashed, the stake is reused from era to era.\n- Slashable offenses can be found after the fact and out of order.\n\nTo balance this, the system applies only the maximum slash a participant can receive in a given time period rather than the sum. This ensures protection from excessive slashing."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#disabling", "page_title": "Offenses and Slashes", "index": 6, "depth": 3, "title": "Disabling", "anchor": "disabling", "start_char": 13675, "end_char": 14571, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Disabling\n\nThe disabling mechanism is triggered when validators commit serious infractions, such as backing invalid blocks or engaging in equivocations. Disabling stops validators from performing specific actions after they have committed an offense. Disabling is further divided into:\n\n- **On-chain disabling**: Lasts for a whole era and stops validators from authoring blocks, backing, and initiating a dispute.\n- **Off-chain disabling**: Lasts for a session, is caused by losing a dispute, and stops validators from initiating a dispute.\n\nOff-chain disabling is always a lower priority than on-chain disabling. Off-chain disabling prioritizes disabling first backers and then approval checkers.\n\nThe material in this guide reflects the changes introduced in Stage 4. For more details, see the [State of Disabling issue](https://github.com/paritytech/polkadot-sdk/issues/4359) on GitHub."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#reputation-changes", "page_title": "Offenses and Slashes", "index": 7, "depth": 3, "title": "Reputation Changes", "anchor": "reputation-changes", "start_char": 14571, "end_char": 15195, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Reputation Changes\n\nSome minor offenses, such as spamming, are only punished by networking reputation changes. Validators use a reputation metric when choosing which peers to connect with. The system adds reputation if a peer provides valuable data and behaves appropriately. If they provide faulty or spam data, the system reduces their reputation. If a validator loses enough reputation, their peers will temporarily close their channels to them. This helps in fighting against Denial of Service (DoS) attacks. Performing validator tasks under reduced reputation will be harder, resulting in lower validator rewards."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-offenses-and-slashes", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/offenses-and-slashes/#penalties-by-offense", "page_title": "Offenses and Slashes", "index": 8, "depth": 3, "title": "Penalties by Offense", "anchor": "penalties-by-offense", "start_char": 15195, "end_char": 15354, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d905940dfe48c723990f44c714046ab7f1b2fa671c77e97d705767f825d40a7a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Penalties by Offense\n\nRefer to the Polkadot Wiki's [offenses page](../../../wiki/learn/learn-offenses.md) for a summary of penalties for specific offenses."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#introduction", "page_title": "Rewards Payout", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 622, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nUnderstanding how rewards are distributed to validators and nominators is essential for network participants. In Polkadot and Kusama, validators earn rewards based on their era points, which are accrued through actions like block production and parachain validation.\n\nThis guide explains the payout scheme, factors influencing rewards, and how multiple validators affect returns. Validators can also share rewards with nominators, who contribute by staking behind them. By following the payout mechanics, validators can optimize their earnings and better engage with their nominators."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#era-points", "page_title": "Rewards Payout", "index": 1, "depth": 2, "title": "Era Points", "anchor": "era-points", "start_char": 622, "end_char": 1551, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Era Points\n\nThe Polkadot ecosystem measures its reward cycles in a unit called an era. Kusama eras are approximately 6 hours long, and Polkadot eras are 24 hours long. At the end of each era, validators are paid proportionally to the amount of era points they have collected. Era points are reward points earned for payable actions like:\n\n- Issuing validity statements for [parachain blocks](/reference/parachains/blocks-transactions-fees/blocks/).\n- Producing a non-uncle block in the relay chain.\n- Producing a reference to a previously unreferenced uncle block.\n- Producing a referenced uncle block.\n\nAn uncle block is a relay chain block that is valid in every regard but has failed to become canonical. This can happen when two or more validators are block producers in a single slot, and the block produced by one validator reaches the next block producer before the others. The lagging blocks are called uncle blocks."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#reward-variance", "page_title": "Rewards Payout", "index": 2, "depth": 2, "title": "Reward Variance", "anchor": "reward-variance", "start_char": 1551, "end_char": 4005, "estimated_token_count": 537, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Reward Variance\n\nRewards in Polkadot and Kusama staking systems can fluctuate due to differences in era points earned by para-validators and non-para-validators. Para-validators generally contribute more to the overall reward distribution due to their role in validating parachain blocks, thus influencing the variance in staking rewards.\n\nTo illustrate this relationship:\n\n- Para-validator era points tend to have a higher impact on the expected value of staking rewards compared to non-para-validator points.\n- The variance in staking rewards increases as the total number of validators grows relative to the number of para-validators.\n- In simpler terms, when more validators are added to the active set without increasing the para-validator pool, the disparity in rewards between validators becomes more pronounced.\n\nHowever, despite this increased variance, rewards tend to even out over time due to the continuous rotation of para-validators across eras. The network's design ensures that over multiple eras, each validator has an equal opportunity to participate in para-validation, eventually leading to a balanced distribution of rewards.\n\n??? interface \"Probability in Staking Rewards\"\n\n    This should only serve as a high-level overview of the probabilistic nature for staking rewards.\n\n    Let:\n\n    - `pe` = para-validator era points\n    - `ne` = non-para-validator era points\n    - `EV` = expected value of staking rewards\n\n    Then, `EV(pe)` has more influence on the `EV` than `EV(ne)`.\n\n    Since `EV(pe)` has a more weighted probability on the `EV`, the increase in variance against the `EV` becomes apparent between the different validator pools (aka. validators in the active set and the ones chosen to para-validate).\n\n    Also, let:\n\n    - `v` = the variance of staking rewards\n    - `p` = number of para-validators\n    - `w` = number validators in the active set\n    - `e` = era\n\n    Then, `v` &#8593; if `w` &#8593;, as this reduces `p` : `w`, with respect to `e`.\n\n    Increased `v` is expected, and initially keeping `p` &#8595; using the same para-validator set for all parachains ensures availability and [voting](../../../wiki/learn/learn-polkadot-opengov.md). In addition, despite `v` &#8593; on an `e` to `e` basis, over time, the amount of rewards each validator receives will equal out based on the continuous selection of para-validators.\n\n    There are plans to scale the active para-validation set in the future."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#payout-scheme", "page_title": "Rewards Payout", "index": 3, "depth": 2, "title": "Payout Scheme", "anchor": "payout-scheme", "start_char": 4005, "end_char": 6574, "estimated_token_count": 584, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Payout Scheme\n\nValidator rewards are distributed equally among all validators in the active set, regardless of the total stake behind each validator. However, individual payouts may differ based on the number of era points a validator has earned. Although factors like network connectivity can affect era points, well-performing validators should accumulate similar totals over time.\n\nA validator that is elected but earns no era points, for example because it is offline and produces no blocks, receives nothing from the era-point reward pool for that era, and neither do its nominators. The validator is still exposed for the era, so a `staking.payoutStakers` call for it succeeds but transfers nothing. A validator has a payout left to claim for an era only when both of the following are true:\n\n- It has a non-zero entry in `staking.erasRewardPoints(era)`, which lists only validators that earned points. The entry stays after the payout is claimed, so it shows that rewards were earned, not that they are still pending.\n- It has unclaimed pages: `staking.claimedRewards(era, validator)` lists fewer pages than the `pageCount` in `staking.erasStakersOverview(era, validator)`.\n\nValidators can also receive tips from users, which incentivize them to include certain transactions in their blocks. Validators retain 100% of these tips.\n\nRewards are paid out in the network's native token (DOT for Polkadot and KSM for Kusama). \n\nThe following example illustrates a four member validator set with their names, amount they have staked, and how payout of rewards is divided. This scenario assumes all validators earned the same amount of era points and no one received tips: \n\n``` mermaid\nflowchart TD\n    A[\"Alice (18 DOT)\"]\n    B[\"Bob (9 DOT)\"]\n    C[\"Carol (8 DOT)\"]\n    D[\"Dave (7 DOT)\"]\n    E[\"Payout (8 DOT total)\"]\n    E --\"2 DOT\"--> A\n    E --\"2 DOT\"--> B\n    E --\"2 DOT\"--> C\n    E --\"2 DOT\"--> D\n```\n\nNote that this is different than most other Proof of Stake (PoS) systems. As long as a validator is in the validator set, it will receive the same block reward as every other validator. Validator Alice, who had 18 DOT staked, received the same 2 DOT reward in this era as Dave, who had only 7 DOT staked.\n\nThis equal split applies to the era-point reward pool described in [Payout Scheme](#payout-scheme). Since [Referendum 1909](https://polkadot.subsquare.io/referenda/1909), validators also receive a separate payout based on self-stake and era points that is not split equally. See [Types of Validator Payouts](#types-of-validator-payouts) for details."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#types-of-validator-payouts", "page_title": "Rewards Payout", "index": 4, "depth": 2, "title": "Types of Validator Payouts", "anchor": "types-of-validator-payouts", "start_char": 6574, "end_char": 7760, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Types of Validator Payouts\n\nSince [Referendum 1909](https://polkadot.subsquare.io/referenda/1909), a validator's total reward for an era is made up of two separate payouts, each recorded as a distinct on-chain event:\n\n- **`staking.Rewarded`**: The validator's share of the era-point reward pool described in [Payout Scheme](#payout-scheme). This pool is still split equally across all active validators, regardless of stake. Because validators no longer take a rate-based cut of this pool (see [Nominators and Validator Payments](#nominators-and-validator-payments)), a validator's own cut of this event depends only on the proportion of self-stake to total stake (self-stake plus nominator stake) backing their validator, the same as any nominator.\n- **`staking.ValidatorIncentivePaid`**: A separate payout from the self-stake incentive portion of the [Dynamic Allocation Pool (DAP)](https://forum.polkadot.network/t/proposal-dynamic-allocation-pool-dap/15878) budget. This payout is not part of the era-point reward pool but scales with both self-stake weight and era points earned. See [Validator Self-Stake Incentive](#validator-self-stake-incentive) for the share calculation."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#validator-self-stake-incentive", "page_title": "Rewards Payout", "index": 5, "depth": 2, "title": "Validator Self-Stake Incentive", "anchor": "validator-self-stake-incentive", "start_char": 7760, "end_char": 10346, "estimated_token_count": 579, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Validator Self-Stake Incentive\n\nUntil [Referendum 1890](https://polkadot.subsquare.io/referenda/1890), validators had no self-stake requirement, so the protocol did not require a minimum level of skin in the game from every validator. Referendum 1890 addressed this by introducing a 10,000 DOT minimum self-stake requirement for validators, described in [Minimum Validator Self-Stake](/node-infrastructure/run-a-validator/requirements/#minimum-validator-self-stake).\n\n[Referendum 1909](https://polkadot.subsquare.io/referenda/1909) builds on that foundation by allocating part of the [Dynamic Allocation Pool (DAP)](https://forum.polkadot.network/t/proposal-dynamic-allocation-pool-dap/15878) budget specifically to reward validators for self-stake. The DAP budget is split as follows:\n\n- **Staker rewards**: 45.2% of the budget.\n- **Validator self-stake incentive**: 22.6% of the budget.\n- **Buffer**: 32.2% of the budget, held in reserve.\n\nAll active validators compete for the fixed self-stake incentive allocation (22.6% of the DAP budget). Each validator's share is determined by both self-stake weight and era points earned, computed as:\n\n```text\nshare_i = (weight_i × era_points_i) / Σ(weight_j × era_points_j)\n```\n\nThe weight function is concave, meaning each additional DOT of self-stake adds a smaller amount of weight than the DOT before it. This prevents the incentive budget from being captured by a small number of validators with very large self-stakes, and keeps the incentive meaningful for validators closer to the 10,000 DOT minimum. Validators with zero era points receive no self-stake incentive payout for that era.\n\nThe self-stake weight is subject to three parameters that govern how it grows:\n\n- **`staking.optimumSelfStake`**: Below this threshold, weight grows proportionally to the square root of self-stake.\n- **`staking.selfStakeSlopeFactor`**: Between the optimum and the hard cap, this dampens the growth rate.\n- **`staking.hardCapSelfStake`**: Above this threshold, additional self-stake earns zero extra weight. A validator has no incentive to self-stake beyond this cap.\n\nTo find the current values, query the chain state for these three storage items, or watch for the `staking.ValidatorIncentiveConfigSet` event, which carries all three whenever governance updates them through `staking.setValidatorSelfStakeIncentiveConfig`.\n\nThis incentive payout appears on-chain as the `staking.ValidatorIncentivePaid` event, separate from the era-point-based `staking.Rewarded` payout described in [Types of Validator Payouts](#types-of-validator-payouts)."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#running-multiple-validators", "page_title": "Rewards Payout", "index": 6, "depth": 2, "title": "Running Multiple Validators", "anchor": "running-multiple-validators", "start_char": 10346, "end_char": 12453, "estimated_token_count": 524, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Running Multiple Validators\n\nRunning multiple validators can offer a more favorable risk/reward ratio compared to running a single one. If you have sufficient DOT or nominators staking on your validators, maintaining multiple validators within the active set can yield higher rewards.\n\nIn the preceding section, with 18 DOT staked and no nominators, Alice earned 2 DOT in one era. This example uses DOT, but the same principles apply for KSM on the Kusama network. By managing stake across multiple validators, you can potentially increase overall returns. Recall the set of validators from the preceding section:\n\n``` mermaid\nflowchart TD\n    A[\"Alice (18 DOT)\"]\n    B[\"Bob (9 DOT)\"]\n    C[\"Carol (8 DOT)\"]\n    D[\"Dave (7 DOT)\"]\n    E[\"Payout (8 DOT total)\"]\n    E --\"2 DOT\"--> A\n    E --\"2 DOT\"--> B\n    E --\"2 DOT\"--> C\n    E --\"2 DOT\"--> D \n```\n\nNow, assume Alice decides to split their stake and run two validators, each with a nine DOT stake. This validator set only has four spots and priority is given to validators with a larger stake. In this example, Dave has the smallest stake and loses his spot in the validator set. Now, Alice will earn two shares of the total payout each era as illustrated below:\n\n``` mermaid\nflowchart TD\n    A[\"Alice (9 DOT)\"]\n    F[\"Alice (9 DOT)\"]\n    B[\"Bob (9 DOT)\"]\n    C[\"Carol (8 DOT)\"]\n    E[\"Payout (8 DOT total)\"]\n    E --\"2 DOT\"--> A\n    E --\"2 DOT\"--> B\n    E --\"2 DOT\"--> C\n    E --\"2 DOT\"--> F \n```\n\nWith enough stake, you could run more than two validators. However, each validator must have enough stake behind it to maintain a spot in the validator set.\n\nSplitting stake across multiple validators also affects the self-stake incentive payout described in [Validator Self-Stake Incentive](#validator-self-stake-incentive). Because the incentive weight function is concave, the combined weight of two validators with, for example, 10,000 DOT self-stake each is not simply equal to the weight of one validator with 20,000 DOT self-stake. Factor this into your decision when choosing how many validators to run and how to split self-stake between them."}
{"source": "polkadot-docs", "page_id": "node-infrastructure-run-a-validator-staking-mechanics-rewards", "url": "https://developer.polkadot.com/node-infrastructure/run-a-validator/staking-mechanics/rewards/#nominators-and-validator-payments", "page_title": "Rewards Payout", "index": 7, "depth": 2, "title": "Nominators and Validator Payments", "anchor": "nominators-and-validator-payments", "start_char": 12453, "end_char": 16080, "estimated_token_count": 897, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c8f0672f9a5b70a6d7dbb0216903025890922c0cd58af2c56a8c7a25da1a8a76", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominators and Validator Payments\n\nA nominator's stake allows them to vote for validators and earn a share of the rewards without managing a validator node. Although staking rewards depend on validator activity during an era, validators themselves never control or own nominator rewards. To trigger payouts, anyone can call the `staking.payoutStakers` or `staking.payoutStakersByPage` methods, which mint and distribute rewards directly to the recipients. This trustless process ensures nominators receive their earned rewards.\n\n!!! note\n    Following [Referendum 1909](https://polkadot.subsquare.io/referenda/1909), validators no longer take a rate-based cut of nominator rewards. Any such rate is fixed on-chain at **0%**, and the maximum allowed value was updated to match. See [Validator Compensation](/node-infrastructure/run-a-validator/requirements/#validator-compensation) for details.\n\nBecause validators no longer take a rate-based cut, the era-point reward pool is split with nominators purely by stake proportion. The following examples model how validator payments split between nominator and validator based only on stake proportion. For simplicity, these examples assume a Polkadot-SDK based relay chain that uses DOT as a native token and a single nominator per validator, and cover the `staking.Rewarded` payout only, not the separate self-stake incentive payout described in [Validator Self-Stake Incentive](#validator-self-stake-incentive). Calculations of KSM reward payouts for Kusama follow the same formula.\n\nStart with the original validator set from the previous section: \n\n``` mermaid\nflowchart TD\n    A[\"Alice (18 DOT)\"]\n    B[\"Bob (9 DOT)\"]\n    C[\"Carol (8 DOT)\"]\n    D[\"Dave (7 DOT)\"]\n    E[\"Payout (8 DOT total)\"]\n    E --\"2 DOT\"--> A\n    E --\"2 DOT\"--> B\n    E --\"2 DOT\"--> C\n    E --\"2 DOT\"--> D \n```\n\nThe preceding diagram shows each validator receiving a 2 DOT payout, but doesn't account for sharing rewards with nominators. The following diagram shows what nominator payout might look like for validator Alice. Alice holds 50% of the stake for their validator:\n\n``` mermaid\n\nflowchart TD\n    A[\"Gross Rewards = 2 DOT\"]\n    B[\"Alice Validator Stake = 18 DOT\"]\n    C[\"9 DOT Alice (50%)\"]\n    D[\"9 DOT Nominator (50%)\"]\n    H[\"Alice Stake Reward = 1 DOT\"]\n    J[\"Total Nominator Reward = 1 DOT\"]\n\n    A --> B\n    B --> C\n    B --> D\n    C --(2 x 1/2)--> H\n    D --(2 x 1/2)--> J\n```\n\nNotice the gross reward for the era is split directly among stake owners according to their percentage of the total stake, since no rate-based cut is taken out first. Alice's total reward for the era is this 1 DOT stake reward plus any separate self-stake incentive payout they earn, which is not shared with their nominator.\n\nNow, consider a different scenario for validator Bob, who holds only 33% of the stake for their validator:\n\n``` mermaid\n\nflowchart TD\n    A[\"Gross Rewards = 2 DOT\"]\n    B[\"Bob Validator Stake = 9 DOT\"]\n    C[\"3 DOT Bob (33%)\"]\n    D[\"6 DOT Nominator (67%)\"]\n    H[\"Bob Stake Reward = 0.67 DOT\"]\n    J[\"Total Nominator Reward = 1.33 DOT\"]\n\n    A --> B\n    B --> C\n    B --> D\n    C --(2 x 1/3)--> H\n    D --(2 x 2/3)--> J\n```\n\nBob holds a smaller percentage of their node's total stake, so their stake reward is smaller than Alice's. Since there is no rate-based cut left to adjust, Bob cannot make up the difference that way. The only way for Bob to earn a larger total reward is to increase self-stake, which raises both the stake reward share shown here and the separate self-stake incentive payout described in [Validator Self-Stake Incentive](#validator-self-stake-incentive)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#introduction", "page_title": "Add an Existing Pallet to the Runtime", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 42, "end_char": 1335, "estimated_token_count": 252, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [Polkadot SDK Parachain Template](https://github.com/paritytech/polkadot-sdk-parachain-template) provides a functional runtime that includes default [FRAME](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/frame_runtime/index.html) development modules ([pallets](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/frame_runtime/pallet/index.html)) to help you get started building a custom parachain. However, you'll often need to extend your runtime by adding additional pallets to enable new functionality.\n\nEach pallet has specific configuration requirements, including the necessary parameters and types that enable its functionality. This guide walks you through the complete process of adding an existing pallet to your runtime and configuring it properly using `pallet-utility` as a practical example.\n\nThe Utility pallet offers batch transaction capabilities, enabling multiple calls to be dispatched together, as well as origin manipulation functionality for advanced use cases.\n\nIn this guide, you'll learn how to:\n\n- Update runtime dependencies to integrate a new pallet\n- Configure pallet-specific Rust traits to enable the pallet's functionality\n- Run your parachain locally to test the new pallet"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#check-prerequisites", "page_title": "Add an Existing Pallet to the Runtime", "index": 1, "depth": 2, "title": "Check Prerequisites", "anchor": "check-prerequisites", "start_char": 1335, "end_char": 1585, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Check Prerequisites\n\nBefore you begin, ensure you have:\n\n- [Polkadot SDK dependencies installed](/parachains/install-polkadot-sdk/)\n- A working [Polkadot SDK development environment](/parachains/launch-a-parachain/set-up-the-parachain-template/)"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#add-an-existing-polkadot-sdk-pallet-to-your-runtime", "page_title": "Add an Existing Pallet to the Runtime", "index": 2, "depth": 2, "title": "Add an Existing Polkadot SDK Pallet to Your Runtime", "anchor": "add-an-existing-polkadot-sdk-pallet-to-your-runtime", "start_char": 1585, "end_char": 1819, "estimated_token_count": 39, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Add an Existing Polkadot SDK Pallet to Your Runtime\n\nAdding a pallet to your parachain runtime involves configuring dependencies, implementing the pallet's configuration trait, and registering the pallet in the runtime construct."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#add-an-existing-pallet-as-a-dependency", "page_title": "Add an Existing Pallet to the Runtime", "index": 3, "depth": 3, "title": "Add an Existing Pallet as a Dependency", "anchor": "add-an-existing-pallet-as-a-dependency", "start_char": 1819, "end_char": 3116, "estimated_token_count": 334, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add an Existing Pallet as a Dependency\n\nThe Polkadot SDK utilizes a monorepo structure, where multiple pallets are available as features of the `polkadot-sdk` dependency. A list of pallets can be found in the [`substrate/frame` directory](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame) of the Polkadot SDK repository.\n\nFor [`pallet-utility`](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/utility), you need to add it as a dependency in the features array:\n\n1. Open the `runtime/Cargo.toml` file.\n2. Locate the `[dependencies]` section.\n3. Find the `polkadot-sdk` dependency.\n4. Add `pallet-utility` to the features array:\n\n    ```toml title=\"runtime/Cargo.toml\"\n    polkadot-sdk = { workspace = true, features = [\n        \"pallet-utility\",\n        \"cumulus-pallet-aura-ext\",\n        \"cumulus-pallet-session-benchmarking\",\n        # ... other features\n    ], default-features = false }\n    ```\n\n!!! note\n    If you're adding a custom pallet that isn't part of the Polkadot SDK, you would add it as a separate dependency:\n\n    ```toml title=\"runtime/Cargo.toml\"\n    custom-pallet = { path = \"../pallets/custom-pallet\", default-features = false }\n    ```\n\n    Ensure it's included in the workspace members section of the root `Cargo.toml` file."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#enable-standard-library-features", "page_title": "Add an Existing Pallet to the Runtime", "index": 4, "depth": 3, "title": "Enable Standard Library Features", "anchor": "enable-standard-library-features", "start_char": 3116, "end_char": 4224, "estimated_token_count": 276, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Enable Standard Library Features\n\nThe Polkadot SDK runtime compiles to both a native binary (for running unit tests), which includes standard Rust library functions, and a WebAssembly (Wasm) binary (a more compact size for production use), which does not include the standard library. Since `pallet-utility` is part of the `polkadot-sdk` dependency, its `std` feature is already included when you enable `polkadot-sdk/std`.\n\nTo verify that the standard library features are enabled:\n\n1. In the `runtime/Cargo.toml` file, locate the `[features]` section.\n2. Ensure `polkadot-sdk/std` is included in the `std` array:\n\n    ```toml title=\"runtime/Cargo.toml\"\n    [features]\n    default = [\"std\"]\n    std = [\n        \"codec/std\",\n        \"cumulus-pallet-parachain-system/std\",\n        \"log/std\",\n        \"polkadot-sdk/std\",\n        \"scale-info/std\",\n        # ... other features\n    ]\n    ```\n\n!!! note\n    If you're adding a custom pallet, you must explicitly add its `std` feature:\n\n    ```toml title=\"runtime/Cargo.toml\"\n    std = [\n        # ... other features\n        \"custom-pallet/std\",\n    ]\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#review-the-config-trait", "page_title": "Add an Existing Pallet to the Runtime", "index": 5, "depth": 3, "title": "Review the Config Trait", "anchor": "review-the-config-trait", "start_char": 4224, "end_char": 5952, "estimated_token_count": 381, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Review the Config Trait\n\nEvery pallet defines a Rust trait called `Config` that specifies the types and parameters needed for the pallet to function within a runtime. Before implementing the configuration, you should understand what the pallet requires.\n\nThe `pallet-utility` Config trait requires the following types:\n\n```rust\npub trait Config: frame_system::Config {\n    /// The overarching event type\n    type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;\n\n    /// The overarching call type\n    type RuntimeCall: Parameter \n        + Dispatchable<RuntimeOrigin = Self::RuntimeOrigin>\n        + GetDispatchInfo\n        + From<frame_system::Call<Self>>;\n\n    /// The caller origin, overarching type of all pallets origins\n    type PalletsOrigin: Parameter + Into<<Self as frame_system::Config>::RuntimeOrigin>;\n\n    /// Weight information for extrinsics in this pallet\n    type WeightInfo: WeightInfo;\n}\n```\n\nThis configuration requires:\n\n- **`RuntimeEvent`**: Links the pallet's events to the runtime's event system.\n- **`RuntimeCall`**: Allows the utility pallet to dispatch calls from other pallets, which is needed for batch operations.\n- **`PalletsOrigin`**: Enables origin manipulation for dispatching calls as other pallets.\n- **`WeightInfo`**: Provides weight calculations for pallet operations.\n\n!!! tip\n    You can view a pallet's `Config` trait requirements in the [Polkadot SDK Rust docs](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/index.html). Search for the pallet's name and check the type defined by its [`Config`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/guides/your_first_pallet/pallet/trait.Config.html) trait."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#implement-the-config-trait", "page_title": "Add an Existing Pallet to the Runtime", "index": 6, "depth": 3, "title": "Implement the Config Trait", "anchor": "implement-the-config-trait", "start_char": 5952, "end_char": 6585, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implement the Config Trait\n\nNow you'll implement the pallet's `Config` trait in your runtime to provide the concrete types the pallet needs.\n\nTo implement the Config trait:\n\n1. Open the `runtime/src/configs/mod.rs` file.\n2. Add the following implementation at the end of the file:\n\n    ```rust title=\"runtime/src/configs/mod.rs\"\n    /// Configure the utility pallet\n    impl pallet_utility::Config for Runtime {\n        type RuntimeEvent = RuntimeEvent;\n        type RuntimeCall = RuntimeCall;\n        type PalletsOrigin = OriginCaller;\n        type WeightInfo = pallet_utility::weights::SubstrateWeight<Runtime>;\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#add-to-runtime-construct", "page_title": "Add an Existing Pallet to the Runtime", "index": 7, "depth": 3, "title": "Add to Runtime Construct", "anchor": "add-to-runtime-construct", "start_char": 6585, "end_char": 8335, "estimated_token_count": 344, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add to Runtime Construct\n\nThe final step is to register the pallet in the runtime construct using the [`#[frame_support::runtime]` macro](https://paritytech.github.io/polkadot-sdk/master/frame_support/attr.runtime.html). This macro generates the necessary boilerplate code for including pallets in the runtime.\n\nTo add the pallet to the runtime construct:\n\n1. Open the `runtime/src/lib.rs` file.\n2. Locate the `#[frame_support::runtime]` section (usually near the end of the file).\n3. Add your pallet with a unique `pallet_index`:\n\n    ```rust title=\"runtime/src/lib.rs\"\n    #[frame_support::runtime]\n    mod runtime {\n        #[runtime::runtime]\n        #[runtime::derive(\n            RuntimeCall,\n            RuntimeEvent,\n            RuntimeError,\n            RuntimeOrigin,\n            RuntimeTask,\n            RuntimeFreezeReason,\n            RuntimeHoldReason,\n            RuntimeSlashReason,\n            RuntimeLockId,\n            RuntimeViewFunction\n        )]\n        pub struct Runtime;\n\n        #[runtime::pallet_index(0)]\n        pub type System = frame_system;\n\n        #[runtime::pallet_index(1)]\n        pub type ParachainSystem = cumulus_pallet_parachain_system;\n\n        #[runtime::pallet_index(2)]\n        pub type Timestamp = pallet_timestamp;\n\n        // ... other pallets\n\n        #[runtime::pallet_index(50)]\n        pub type Utility = pallet_utility;\n    }\n    ```\n\nWhen adding the pallet:\n\n- Assign a unique `pallet_index` that doesn't conflict with existing pallets. The index determines the pallet's position in the runtime.\n- Use a descriptive name for the pallet instance, such as `Utility` for `pallet_utility`.\n\n!!! warning\n    Each pallet must have a unique index. Duplicate indices will cause compilation errors."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#verify-the-runtime-compiles", "page_title": "Add an Existing Pallet to the Runtime", "index": 8, "depth": 3, "title": "Verify the Runtime Compiles", "anchor": "verify-the-runtime-compiles", "start_char": 8335, "end_char": 8809, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify the Runtime Compiles\n\nAfter adding and configuring your pallet in the runtime, verify that everything is set up correctly by compiling the runtime.\n\nTo compile the runtime:\n\n1. Navigate to the root directory of your project.\n2. Run the following command:\n\n    ```bash\n    cargo build --release\n    ```\n\n3. Ensure the build completes successfully without errors.\n\nThis command validates the pallet configurations and prepares the build for testing or deployment."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#run-your-chain-locally", "page_title": "Add an Existing Pallet to the Runtime", "index": 9, "depth": 2, "title": "Run Your Chain Locally", "anchor": "run-your-chain-locally", "start_char": 8809, "end_char": 9287, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run Your Chain Locally\n\nNow that you've added the pallet to your runtime, you can launch your parachain locally to test the new functionality using the [Polkadot Omni Node](https://crates.io/crates/polkadot-omni-node). For instructions on setting up the Polkadot Omni Node and [Polkadot Chain Spec Builder](https://crates.io/crates/staging-chain-spec-builder), refer to the [Set Up a Parachain Template](/parachains/launch-a-parachain/set-up-the-parachain-template/) guide."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#generate-a-chain-specification", "page_title": "Add an Existing Pallet to the Runtime", "index": 10, "depth": 3, "title": "Generate a Chain Specification", "anchor": "generate-a-chain-specification", "start_char": 9287, "end_char": 9842, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Generate a Chain Specification\n\nCreate a new chain specification file with the updated runtime by running the following command from your project's root directory using the `chain-spec-builder` tool:\n\n```bash\nchain-spec-builder create -t development \\\n--relay-chain paseo \\\n--para-id 1000 \\\n--runtime ./target/release/wbuild/parachain-template-runtime/parachain_template_runtime.compact.compressed.wasm \\\nnamed-preset development\n```\n\nThis command generates a chain specification file, `chain_spec.json`, for your parachain with the updated runtime."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#start-the-parachain-node", "page_title": "Add an Existing Pallet to the Runtime", "index": 11, "depth": 3, "title": "Start the Parachain Node", "anchor": "start-the-parachain-node", "start_char": 9842, "end_char": 10126, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Start the Parachain Node\n\nLaunch the parachain using the Polkadot Omni Node with the generated chain specification by running the following command:\n\n```bash\npolkadot-omni-node --chain ./chain_spec.json --dev\n```\n\nVerify the node starts successfully and begins producing blocks."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#interact-with-the-pallet", "page_title": "Add an Existing Pallet to the Runtime", "index": 12, "depth": 3, "title": "Interact with the Pallet", "anchor": "interact-with-the-pallet", "start_char": 10126, "end_char": 11077, "estimated_token_count": 267, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Interact with the Pallet\n\nUse the Polkadot.js Apps interface to verify you can interact with the new pallet.\n\nTo interact with the pallet:\n\n1. Navigate to [Polkadot.js Apps](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/extrinsics).\n2. Ensure you're connected to your local node at `ws://127.0.0.1:9944`.\n3. Go to the **Developer** > **Extrinsics** tab.\n4. In the **submit the following extrinsic** section, locate **utility** in the pallet dropdown.\n5. Verify you can see the available extrinsics, such as:\n    - **`batch(calls)`**: Dispatch multiple calls in a single transaction.\n    - **`batchAll(calls)`**: Dispatch multiple calls, stopping on the first error.\n    - **`asDerivative(index, call)`**: Dispatch a call as a derivative account.\n\n    ![](/images/parachains/customize-runtime/add-existing-pallets/add-pallets-01.webp)\n\nYou can now test the pallet's functionality by submitting transactions through the interface."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-existing-pallets", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-existing-pallets/#where-to-go-next", "page_title": "Add an Existing Pallet to the Runtime", "index": 13, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 11077, "end_char": 11669, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5207b5d73d2b711883422212dfdec53ef5b2bd25e0d87d7345505645e1565f30", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Add Multiple Pallet Instances__\n\n    ---\n\n    Learn how to implement multiple instances of the same pallet in your Polkadot SDK-based runtime.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/customize-runtime/add-pallet-instances/)\n\n-   <span class=\"badge guide\">Guide</span> __Make a Custom Pallet__\n\n    ---\n\n    Learn how to create custom pallets using FRAME.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/customize-runtime/pallet-development/create-a-pallet/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#introduction", "page_title": "Add Multiple Pallet Instances", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 34, "end_char": 1398, "estimated_token_count": 245, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [Polkadot SDK Parachain Template](https://github.com/paritytech/polkadot-sdk-parachain-template) provides a solid foundation for building custom parachains. While most pallets are typically included as single instances within a runtime, some scenarios benefit from running multiple instances of the same pallet with different configurations. This approach lets you reuse pallet logic without reimplementing it, enabling diverse functionality from a single codebase.\n\nFor example, you could create multiple governance councils with different voting rules, or several token systems with distinct parameters. The Polkadot SDK makes this possible through instantiable pallets, which allow multiple independent instances of the same pallet to coexist within a runtime.\n\nThis guide demonstrates how to add and configure multiple instances of a pallet to your runtime using [`pallet-collective`](https://paritytech.github.io/polkadot-sdk/master/pallet_collective/index.html) as a practical example. The same process applies to other instantiable pallets.\n\nIn this guide, you'll learn how to:\n\n- Identify instantiable pallets and understand their structure.\n- Configure multiple instances of the same pallet with unique parameters.\n- Register multiple pallet instances in your runtime.\n- Run your parachain locally to test multiple pallet instances."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#check-prerequisites", "page_title": "Add Multiple Pallet Instances", "index": 1, "depth": 2, "title": "Check Prerequisites", "anchor": "check-prerequisites", "start_char": 1398, "end_char": 1683, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Check Prerequisites\n\nBefore you begin, ensure you have:\n\n- A working [Polkadot SDK development environment](/parachains/launch-a-parachain/set-up-the-parachain-template/).\n- Basic understanding of [adding pallets to a runtime](/parachains/customize-runtime/add-existing-pallets/)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#understanding-instantiable-pallets", "page_title": "Add Multiple Pallet Instances", "index": 2, "depth": 2, "title": "Understanding Instantiable Pallets", "anchor": "understanding-instantiable-pallets", "start_char": 1683, "end_char": 1984, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understanding Instantiable Pallets\n\nNot all pallets support multiple instances. Instantiable pallets are specifically designed to allow multiple independent copies within the same runtime. These pallets include an additional generic parameter `I` that creates a unique identity for each instance."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#identifying-an-instantiable-pallet", "page_title": "Add Multiple Pallet Instances", "index": 3, "depth": 3, "title": "Identifying an Instantiable Pallet", "anchor": "identifying-an-instantiable-pallet", "start_char": 1984, "end_char": 2637, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Identifying an Instantiable Pallet\n\nYou can identify an instantiable pallet by examining its `Pallet` struct definition. An instantiable pallet will include both the standard generic `T` (for the runtime configuration) and the instantiation generic `I`:\n\n```rust\n#[pallet::pallet]\npub struct Pallet<T, I = ()>(PhantomData<(T, I)>);\n```\n\nThe `I` generic parameter:\n\n- Creates a unique type identity for each pallet instance.\n- Appears throughout the pallet's components (`Config` trait, storage items, events, errors).\n- Defaults to `()` (unit type) when only one instance is needed.\n- Must be explicitly specified when creating multiple instances."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#how-instance-generics-work", "page_title": "Add Multiple Pallet Instances", "index": 4, "depth": 3, "title": "How Instance Generics Work", "anchor": "how-instance-generics-work", "start_char": 2637, "end_char": 3178, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How Instance Generics Work\n\nThe instantiation generic `I` affects how the pallet's types are structured:\n\n- **`Config` trait**: `trait Config<I: 'static = ()>` - accepts the instance parameter.\n- **Storage items**: Automatically namespaced by instance to prevent conflicts.\n- **Events**: `Event<T, I>` - includes instance information.\n- **Calls**: `Call<T, I>` - dispatched to the correct instance.\n\nThis design ensures that multiple instances of the same pallet maintain completely separate states and don't interfere with each other."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#add-multiple-instances-of-a-pallet-to-your-runtime", "page_title": "Add Multiple Pallet Instances", "index": 5, "depth": 2, "title": "Add Multiple Instances of a Pallet to Your Runtime", "anchor": "add-multiple-instances-of-a-pallet-to-your-runtime", "start_char": 3178, "end_char": 3565, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Add Multiple Instances of a Pallet to Your Runtime\n\nAdding multiple pallet instances involves the same basic steps as adding a single pallet, but with specific configuration for each instance.\n\nIn this example, you'll add two instances of [`pallet-collective`](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/collective) to create different governance bodies."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#add-the-pallet-as-a-dependency", "page_title": "Add Multiple Pallet Instances", "index": 6, "depth": 3, "title": "Add the Pallet as a Dependency", "anchor": "add-the-pallet-as-a-dependency", "start_char": 3565, "end_char": 4197, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add the Pallet as a Dependency\n\nFirst, ensure the instantiable pallet is available in your runtime dependencies. For `pallet-collective`, add it as a feature of the `polkadot-sdk` dependency:\n\n1. Open the `runtime/Cargo.toml` file.\n2. Locate the `[dependencies]` section.\n3. Find the `polkadot-sdk` dependency.\n4. Add `pallet-collective` to the features array:\n\n    ```toml title=\"Cargo.toml\"\n    polkadot-sdk = { workspace = true, features = [\n        \"pallet-collective\",\n        \"cumulus-pallet-aura-ext\",\n        \"cumulus-pallet-session-benchmarking\",\n        # ... other features\n    ], default-features = false }\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#enable-standard-library-features", "page_title": "Add Multiple Pallet Instances", "index": 7, "depth": 3, "title": "Enable Standard Library Features", "anchor": "enable-standard-library-features", "start_char": 4197, "end_char": 4710, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Enable Standard Library Features\n\nEnsure the pallet's standard library features are enabled for native builds:\n\n1. In the `runtime/Cargo.toml` file, locate the `[features]` section.\n2. Ensure `polkadot-sdk/std` is included in the `std` array:\n\n    ```toml title=\"Cargo.toml\"\n    [features]\n    default = [\"std\"]\n    std = [\n        \"codec/std\",\n        \"cumulus-pallet-parachain-system/std\",\n        \"log/std\",\n        \"polkadot-sdk/std\",\n        \"scale-info/std\",\n        # ... other features\n    ]\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#review-the-config-trait", "page_title": "Add Multiple Pallet Instances", "index": 8, "depth": 3, "title": "Review the Config Trait", "anchor": "review-the-config-trait", "start_char": 4710, "end_char": 6439, "estimated_token_count": 357, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Review the Config Trait\n\nBefore configuring multiple instances, understand what the pallet requires. The `pallet-collective` `Config` trait is defined with the instance generic:\n\n```rust\npub trait Config<I: 'static = ()>: frame_system::Config {\n    /// The runtime origin type\n    type RuntimeOrigin: From<RawOrigin<Self::AccountId, I>>;\n\n    /// The runtime call type\n    type Proposal: Parameter \n        + Dispatchable<RuntimeOrigin = Self::RuntimeOrigin>\n        + From<frame_system::Call<Self>>;\n\n    /// The overarching event type\n    type RuntimeEvent: From<Event<Self, I>> \n        + IsType<<Self as frame_system::Config>::RuntimeEvent>;\n\n    /// Duration in blocks for a motion to remain active\n    type MotionDuration: Get<BlockNumberFor<Self>>;\n\n    /// Maximum number of proposals allowed at once\n    type MaxProposals: Get<u32>;\n\n    /// Maximum number of members in the collective\n    type MaxMembers: Get<u32>;\n\n    /// Default voting strategy when a member abstains\n    type DefaultVote: DefaultVote;\n\n    /// Origin that can modify the members\n    type SetMembersOrigin: EnsureOrigin<Self::RuntimeOrigin>;\n\n    /// Weight information for extrinsics\n    type WeightInfo: WeightInfo;\n\n    /// Maximum weight for a proposal\n    type MaxProposalWeight: Get<Weight>;\n\n    /// Origin that can disapprove proposals\n    type DisapproveOrigin: EnsureOrigin<Self::RuntimeOrigin>;\n\n    /// Origin that can kill proposals\n    type KillOrigin: EnsureOrigin<Self::RuntimeOrigin>;\n\n    /// Consideration mechanism (e.g., deposits)\n    type Consideration: Consideration<Self::AccountId>;\n}\n```\n\nThis configuration enables the collective pallet to manage a group of accounts that can propose and vote on proposals together."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#define-pallet-parameters", "page_title": "Add Multiple Pallet Instances", "index": 9, "depth": 3, "title": "Define Pallet Parameters", "anchor": "define-pallet-parameters", "start_char": 6439, "end_char": 7385, "estimated_token_count": 188, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Define Pallet Parameters\n\nBefore implementing the `Config` trait for each instance, define the common parameters that both instances will use. These parameters are defined once and can be shared across instances or customized per instance.\n\nTo define pallet parameters:\n\n1. Open the `runtime/src/configs/mod.rs` file.\n2. Add parameter type definitions for the collective pallet:\n\n    ```rust title=\"runtime/src/configs/mod.rs\"\n    parameter_types! {\n        pub const MotionDuration: BlockNumber = 24 * HOURS;\n        pub const MaxProposals: u32 = 100;\n        pub const MaxMembers: u32 = 100;\n        pub MaxProposalWeight: Weight = Perbill::from_percent(50) * RuntimeBlockWeights::get().max_block;\n    }\n    ```\n\n!!! tip\n    You can define separate parameters for each instance if you need different configurations. For example, you might want a technical committee with a shorter motion duration and fewer members than a general council."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#import-instance-types", "page_title": "Add Multiple Pallet Instances", "index": 10, "depth": 3, "title": "Import Instance Types", "anchor": "import-instance-types", "start_char": 7385, "end_char": 7989, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Import Instance Types\n\nEach pallet instance needs a unique type identifier. The Polkadot SDK provides numbered instance types (`Instance1`, `Instance2`, etc.) in the `frame_support::instances` module.\n\nIn the `runtime/src/configs/mod.rs` file, import the instance types:\n\n```rust title=\"runtime/src/configs/mod.rs\"\nuse frame_support::instances::{Instance1, Instance2};\n```\n\nThese instance types:\n\n- Create distinct identities for each pallet instance.\n- Are used when implementing the `Config` trait and adding to the runtime construct.\n- Are provided by `frame_support`, not by individual pallets."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#implement-config-trait-for-first-instance", "page_title": "Add Multiple Pallet Instances", "index": 11, "depth": 3, "title": "Implement Config Trait for First Instance", "anchor": "implement-config-trait-for-first-instance", "start_char": 7989, "end_char": 9762, "estimated_token_count": 377, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implement Config Trait for First Instance\n\nNow implement the `Config` trait for your first instance. The implementation includes the instance type as a generic parameter.\n\nIn the `runtime/src/configs/mod.rs` file, add the following implementation:\n\n```rust title=\"runtime/src/configs/mod.rs\"\n/// Configure the Technical Committee collective\nimpl pallet_collective::Config<Instance1> for Runtime {\n    type RuntimeOrigin = RuntimeOrigin;\n    type Proposal = RuntimeCall;\n    type RuntimeEvent = RuntimeEvent;\n    type MotionDuration = MotionDuration;\n    type MaxProposals = MaxProposals;\n    type MaxMembers = MaxMembers;\n    type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote;\n    type SetMembersOrigin = EnsureRoot<AccountId>;\n    type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>;\n    type MaxProposalWeight = MaxProposalWeight;\n    type DisapproveOrigin = EnsureRoot<Self::AccountId>;\n    type KillOrigin = EnsureRoot<Self::AccountId>;\n    type Consideration = ();\n}\n```\n\nKey configuration details:\n\n- **`RuntimeOrigin`, `RuntimeCall`, `RuntimeEvent`**: Connect to the runtime's aggregated types.\n- **`MotionDuration`**: How long proposals remain active (5 days in this example).\n- **`MaxProposals`**: Maximum number of active proposals (100).\n- **`MaxMembers`**: Maximum collective members (100).\n- **`DefaultVote`**: Voting strategy when members abstain (majority with prime member tiebreaker).\n- **`SetMembersOrigin`**: Who can modify membership (root in this example).\n- **`MaxProposalWeight`**: Maximum computational weight for proposals (50% of block weight).\n- **`DisapproveOrigin`/`KillOrigin`**: Who can reject proposals (root in this example).\n- **`Consideration`**: Deposit mechanism (none in this example)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#implement-config-trait-for-second-instance", "page_title": "Add Multiple Pallet Instances", "index": 12, "depth": 3, "title": "Implement Config Trait for Second Instance", "anchor": "implement-config-trait-for-second-instance", "start_char": 9762, "end_char": 11047, "estimated_token_count": 228, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implement Config Trait for Second Instance\n\nImplement the `Config` trait for your second instance with the same or a different configuration.\n\nIn the `runtime/src/configs/mod.rs` file, add the following implementation:\n\n```rust title=\"runtime/src/configs/mod.rs\"\n/// Configure the Council collective\nimpl pallet_collective::Config<Instance2> for Runtime {\n    type RuntimeOrigin = RuntimeOrigin;\n    type Proposal = RuntimeCall;\n    type RuntimeEvent = RuntimeEvent;\n    type MotionDuration = MotionDuration;\n    type MaxProposals = MaxProposals;\n    type MaxMembers = MaxMembers;\n    type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote;\n    type SetMembersOrigin = EnsureRoot<AccountId>;\n    type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>;\n    type MaxProposalWeight = MaxProposalWeight;\n    type DisapproveOrigin = EnsureRoot<Self::AccountId>;\n    type KillOrigin = EnsureRoot<Self::AccountId>;\n    type Consideration = ();\n}\n```\n\n!!! tip\n    While this example uses identical configurations for both instances, you can customize each instance's parameters to serve different purposes. For example, you might configure the technical committee with stricter voting requirements or shorter motion durations than the general council."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#add-instances-to-runtime-construct", "page_title": "Add Multiple Pallet Instances", "index": 13, "depth": 3, "title": "Add Instances to Runtime Construct", "anchor": "add-instances-to-runtime-construct", "start_char": 11047, "end_char": 12904, "estimated_token_count": 360, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add Instances to Runtime Construct\n\nThe final configuration step is registering both pallet instances in the runtime construct. Each instance needs a unique pallet index and must specify its instance type.\n\nTo add the pallet instances to the runtime construct:\n\n1. Open the `runtime/src/lib.rs` file.\n2. Locate the `#[frame_support::runtime]` section.\n3. Add both pallet instances with unique indices:\n\n    ```rust title=\"runtime/src/lib.rs\"\n    #[frame_support::runtime]\n    mod runtime {\n        #[runtime::runtime]\n        #[runtime::derive(\n            RuntimeCall,\n            RuntimeEvent,\n            RuntimeError,\n            RuntimeOrigin,\n            RuntimeTask,\n            RuntimeFreezeReason,\n            RuntimeHoldReason,\n            RuntimeSlashReason,\n            RuntimeLockId,\n            RuntimeViewFunction\n        )]\n        pub struct Runtime;\n\n        #[runtime::pallet_index(0)]\n        pub type System = frame_system;\n\n        #[runtime::pallet_index(1)]\n        pub type ParachainSystem = cumulus_pallet_parachain_system;\n\n        // ... other pallets\n\n        #[runtime::pallet_index(50)]\n        pub type TechnicalCommittee = pallet_collective<Instance1>;\n\n        #[runtime::pallet_index(51)]\n        pub type Council = pallet_collective<Instance2>;\n    }\n    ```\n\nImportant considerations when adding instances:\n\n- **Unique indices**: Each instance must have a different `pallet_index`.\n- **Instance type**: Specify the instance type in angle brackets (e.g., `<Instance1>`).\n- **Descriptive names**: Use names that reflect the instance's purpose (e.g., `TechnicalCommittee`, `Council`).\n- **Index management**: Track which indices are used to avoid conflicts.\n\n!!! warning\n    Duplicate pallet indices will cause compilation errors. Keep a list of used indices to prevent conflicts when adding new pallets or instances."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#verify-the-runtime-compiles", "page_title": "Add Multiple Pallet Instances", "index": 14, "depth": 3, "title": "Verify the Runtime Compiles", "anchor": "verify-the-runtime-compiles", "start_char": 12904, "end_char": 13354, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify the Runtime Compiles\n\nAfter adding and configuring both pallet instances, verify that everything is set up correctly by compiling the runtime from your project's root directory:\n\n```bash\ncargo build --release\n```\n\nEnsure the build completes successfully without errors.\n\nThis command validates:\n\n- All pallet instances are properly configured\n- No index conflicts exist\n- Type definitions are correct\n- Dependencies are properly resolved"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#run-your-chain-locally", "page_title": "Add Multiple Pallet Instances", "index": 15, "depth": 2, "title": "Run Your Chain Locally", "anchor": "run-your-chain-locally", "start_char": 13354, "end_char": 13848, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run Your Chain Locally\n\nNow that you've added multiple pallet instances to your runtime, you can launch your parachain locally to test the new functionality using the [Polkadot Omni Node](https://crates.io/crates/polkadot-omni-node). For instructions on setting up the Polkadot Omni Node and [Polkadot Chain Spec Builder](https://crates.io/crates/staging-chain-spec-builder), refer to the [Set Up the Parachain Template](/parachains/launch-a-parachain/set-up-the-parachain-template/) page."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#generate-a-chain-specification", "page_title": "Add Multiple Pallet Instances", "index": 16, "depth": 3, "title": "Generate a Chain Specification", "anchor": "generate-a-chain-specification", "start_char": 13848, "end_char": 14416, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Generate a Chain Specification\n\nCreate a new chain specification file with the updated runtime containing both pallet instances by running the following command from your project's root directory:\n\n```bash\nchain-spec-builder create -t development \\\n    --relay-chain paseo \\\n    --para-id 1000 \\\n    --runtime ./target/release/wbuild/parachain-template-runtime/parachain_template_runtime.compact.compressed.wasm \\\n    named-preset development\n```\n\nThis command generates a chain specification file (`chain_spec.json`) for your parachain with the updated runtime."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#start-the-parachain-node", "page_title": "Add Multiple Pallet Instances", "index": 17, "depth": 3, "title": "Start the Parachain Node", "anchor": "start-the-parachain-node", "start_char": 14416, "end_char": 14750, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Start the Parachain Node\n\nLaunch the parachain using the Polkadot Omni Node with the generated chain specification:\n\n```bash\npolkadot-omni-node --chain ./chain_spec.json --dev\n```\n\nVerify the node starts successfully and begins producing blocks. You should see log messages indicating that both pallet instances are initialized."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#interact-with-both-pallet-instances", "page_title": "Add Multiple Pallet Instances", "index": 18, "depth": 3, "title": "Interact with Both Pallet Instances", "anchor": "interact-with-both-pallet-instances", "start_char": 14750, "end_char": 16089, "estimated_token_count": 352, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Interact with Both Pallet Instances\n\nUse the Polkadot.js Apps interface to verify you can interact with both pallet instances independently.\n\nTo interact with the pallet instances:\n\n1. Navigate to [Polkadot.js Apps](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/extrinsics).\n2. Ensure you're connected to your local node at `ws://127.0.0.1:9944`.\n3. Go to the **Developer** > **Extrinsics** tab.\n4. In the **submit the following extrinsic** section, open the pallet dropdown. Verify that both pallet instances appear and contain the expected extrinsics.\n\n    === \"Technical Committee\"\n\n        Select **`technicalCommittee`** and open the extrinsics dropdown.\n\n        ![](/images/parachains/customize-runtime/add-pallet-instances/add-pallet-instances-01.webp)\n\n    === \"Council\"\n\n        Select **`council`** and open the extrinsics dropdown.\n\n        ![](/images/parachains/customize-runtime/add-pallet-instances/add-pallet-instances-02.webp)\n\nEach instance should display the following extrinsics (this is not an exhaustive list):\n\n- **`close(proposalHash, index, proposalWeightBound, lengthBound)`**: Close voting.\n- **`propose(threshold, proposal, lengthBound)`**: Submit a proposal.\n- **`setMembers(newMembers, prime, oldCount)`**: Update membership.\n- **`vote(proposal, index, approve)`**: Vote on a proposal."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#test-instance-independence", "page_title": "Add Multiple Pallet Instances", "index": 19, "depth": 3, "title": "Test Instance Independence", "anchor": "test-instance-independence", "start_char": 16089, "end_char": 17147, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test Instance Independence\n\nVerify that both instances operate independently by testing their separate functionality.\n\nTo test instance independence:\n\n1. In Polkadot.js Apps, go to **Developer** > **Chain state**.\n2. Query storage for each instance:\n\n    === \"Technical Committee\"\n\n        Select **`technicalCommittee` > `members()`** to view technical committee members.\n\n        ![](/images/parachains/customize-runtime/add-pallet-instances/add-pallet-instances-03.webp)\n\n    === \"Council\"\n\n        Select **`council` > `members()`** to view council members.\n\n        ![](/images/parachains/customize-runtime/add-pallet-instances/add-pallet-instances-04.webp)\n\n3. Verify that:\n    - Each instance maintains separate storage.\n    - Changes to one instance don't affect the other.\n    - Both instances can process proposals simultaneously.\n\nYou can now use both collective instances for different governance purposes in your parachain, such as technical decisions that require expertise and general governance decisions that require broader consensus."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-pallet-instances", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-pallet-instances/#where-to-go-next", "page_title": "Add Multiple Pallet Instances", "index": 20, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 17147, "end_char": 17450, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4d49ed042670268398bd86dec6cbca2cd8425295f6d34b64b4872df8389589", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Make a Custom Pallet__\n\n    ---\n\n    Learn how to create custom pallets using FRAME.\n\n    [:octicons-arrow-right-24: Reference](/parachains/customize-runtime/pallet-development/create-a-pallet/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#introduction", "page_title": "Add Smart Contract Functionality", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 37, "end_char": 721, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nWhen building your custom blockchain with the Polkadot SDK, you can add smart contract capabilities through specialized pallets. These pallets enable users to deploy and execute smart contracts, enhancing your chain's programmability and allowing developers to build decentralized applications on your network.\n\nThis guide covers three approaches to adding smart contracts to your blockchain:\n\n- **[`pallet-revive`](#pallet-revive)**: Modern unified solution supporting both PVM and EVM bytecode\n- **[Frontier](#frontier)**: Ethereum compatibility layer for Polkadot SDK-based chains\n- **[`pallet-contracts`](#pallet-contracts-legacy)**: Wasm smart contract support"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#pallet-revive", "page_title": "Add Smart Contract Functionality", "index": 1, "depth": 2, "title": "pallet-revive", "anchor": "pallet-revive", "start_char": 721, "end_char": 1023, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## pallet-revive\n\n[`pallet-revive`](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive) is the modern smart contract solution for Polkadot SDK-based chains. It provides a unified execution environment that supports both PVM and EVM bytecode through dual execution backends."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#core-components", "page_title": "Add Smart Contract Functionality", "index": 2, "depth": 3, "title": "Core Components", "anchor": "core-components", "start_char": 1023, "end_char": 1750, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Core Components\n\n**Essential Pallet:**\n**[`pallet-revive`](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive)** provides the core smart contract execution environment with [PVM](https://github.com/polkadot-developers/polkadot-docs/blob/71e1b51bb42ef55e20c2f3b953db86e8c26cd591/smart-contracts/for-eth-devs/dual-vm-stack.md#upgrade-to-polkavm) and [REVM](https://github.com/polkadot-developers/polkadot-docs/blob/71e1b51bb42ef55e20c2f3b953db86e8c26cd591/smart-contracts/for-eth-devs/dual-vm-stack.md#migrate-from-evm) backends.\n\n**RPC Adapter:**\n**[`pallet-revive-eth-rpc`](https://crates.io/crates/pallet-revive-eth-rpc)** adds full Ethereum RPC compatibility for Ethereum tooling integration."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#supported-languages-and-compilers", "page_title": "Add Smart Contract Functionality", "index": 3, "depth": 3, "title": "Supported Languages and Compilers", "anchor": "supported-languages-and-compilers", "start_char": 1750, "end_char": 2385, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Supported Languages and Compilers\n\n`pallet-revive` accepts smart contracts from multiple languages and compilation paths:\n\n| Language    | Compiler         | Output Bytecode | Execution Backend |\n|-------------|------------------|-----------------|-------------------|\n| Solidity    | `resolc`         | PVM             | PVM               |\n| Solidity    | `solc`           | EVM             | REVM              |\n\nAny language that can compile to PVM bytecode and utilize `pallet-revive`'s host functions (via [`pallet-revive-uapi`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive_uapi/index.html)) is supported."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#how-it-works", "page_title": "Add Smart Contract Functionality", "index": 4, "depth": 3, "title": "How It Works", "anchor": "how-it-works", "start_char": 2385, "end_char": 2637, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How It Works\n\n**Dual Execution Model:**\n\n1. **PVM Backend**: Executes PVM bytecode with native performance optimization.\n2. **REVM Backend**: Implements EVM bytecode for compatibility with existing Ethereum contracts, ensuring seamless migration."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#key-benefits", "page_title": "Add Smart Contract Functionality", "index": 5, "depth": 3, "title": "Key Benefits", "anchor": "key-benefits", "start_char": 2637, "end_char": 3089, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key Benefits\n\n- **Unified platform**: Deploys both PVM-optimized and EVM-compatible contracts using a single pallet.\n- **Performance**: PVM execution provides improved performance compared to the traditional EVM, leveraging the [RISC-V](https://en.wikipedia.org/wiki/RISC-V) architecture to map instructions to the CPU and requires little transpiling.\n- **Ethereum compatibility**: Supports full integration with Ethereum tooling via RPC adapter."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#implementation-examples", "page_title": "Add Smart Contract Functionality", "index": 6, "depth": 3, "title": "Implementation Examples", "anchor": "implementation-examples", "start_char": 3089, "end_char": 3363, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implementation Examples\n\nSee a real-world implementation in the [Polkadot Hub TestNet](https://github.com/paseo-network/runtimes/blob/c965c42a4e0bc9d1e9cc0a340322bc3b8e347bcf/system-parachains/asset-hub-paseo/src/lib.rs#L1122-L1157) in the Polkadot Fellows repository."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#frontier", "page_title": "Add Smart Contract Functionality", "index": 7, "depth": 2, "title": "Frontier", "anchor": "frontier", "start_char": 3363, "end_char": 3644, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Frontier\n\n[Frontier](https://github.com/polkadot-evm/frontier) is the Ethereum compatibility layer designed for maximum compatibility with the Ethereum ecosystem. It's the ideal choice when you need seamless integration with existing Ethereum tools, dApps, and infrastructure."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#integration-options", "page_title": "Add Smart Contract Functionality", "index": 8, "depth": 3, "title": "Integration Options", "anchor": "integration-options", "start_char": 3644, "end_char": 3746, "estimated_token_count": 15, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Integration Options\n\nFrontier offers flexible integration depending on your compatibility needs:"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#evm-execution-only", "page_title": "Add Smart Contract Functionality", "index": 9, "depth": 3, "title": "EVM Execution Only", "anchor": "evm-execution-only", "start_char": 3746, "end_char": 4070, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### EVM Execution Only\n\nFor basic EVM support using Polkadot SDK native APIs:\n\n- **[`pallet-evm`](https://github.com/polkadot-evm/frontier/tree/master/frame/evm)**: Provides the core EVM execution environment.\n\nThis configuration allows EVM contract execution but requires using Polkadot SDK-specific APIs for interaction."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#full-ethereum-compatibility", "page_title": "Add Smart Contract Functionality", "index": 10, "depth": 3, "title": "Full Ethereum Compatibility", "anchor": "full-ethereum-compatibility", "start_char": 4070, "end_char": 4592, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Full Ethereum Compatibility\n\nFor complete Ethereum ecosystem integration with Ethereum RPC support:\n\n- **[`pallet-evm`](https://github.com/polkadot-evm/frontier/tree/master/frame/evm)**: Integrates core EVM execution environment.\n- **[`pallet-ethereum`](https://github.com/polkadot-evm/frontier/tree/master/frame/ethereum)**: Emulates Ethereum blocks and handles Ethereum-formatted transactions.\n- **[`fc-rpc`](https://github.com/polkadot-evm/frontier/tree/master/client/rpc)**: Provides Ethereum JSON-RPC endpoints."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#key-benefits_1", "page_title": "Add Smart Contract Functionality", "index": 11, "depth": 3, "title": "Key Benefits", "anchor": "key-benefits_1", "start_char": 4592, "end_char": 5047, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key Benefits\n\n- **Ethereum tooling compatibility**: Full compatibility with MetaMask, Hardhat, Remix, Foundry, and other Ethereum development tools.\n- **Minimal-friction migration**: Deployment of existing Ethereum dApps with minimal or no modifications.\n- **Native Ethereum formats**: Support for Ethereum transaction formats, signatures, and gas mechanics.\n- **Block emulation**: Ethereum-style block structure within Substrate's block production."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#implementation-examples_1", "page_title": "Add Smart Contract Functionality", "index": 12, "depth": 3, "title": "Implementation Examples", "anchor": "implementation-examples_1", "start_char": 5047, "end_char": 5482, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implementation Examples\n\nProduction implementations demonstrate Frontier's capabilities:\n\n- **Moonbeam**: See their implementation of [`pallet-evm`](https://github.com/moonbeam-foundation/moonbeam/blob/9e2ddbc9ae8bf65f11701e7ccde50075e5fe2790/runtime/moonbeam/src/lib.rs#L532) and [`pallet-ethereum`](https://github.com/moonbeam-foundation/moonbeam/blob/9e2ddbc9ae8bf65f11701e7ccde50075e5fe2790/runtime/moonbeam/src/lib.rs#L698)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#pallet-contracts-legacy", "page_title": "Add Smart Contract Functionality", "index": 13, "depth": 2, "title": "pallet-contracts (Legacy)", "anchor": "pallet-contracts-legacy", "start_char": 5482, "end_char": 5797, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## pallet-contracts (Legacy)\n\n[`pallet-contracts`](https://docs.rs/pallet-contracts/latest/pallet_contracts/index.html#contracts-pallet) is the original Wasm-based smart contract pallet for Polkadot SDK chains. While still functional, it's considered legacy as development efforts have shifted to `pallet-revive`."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#implementation-example", "page_title": "Add Smart Contract Functionality", "index": 14, "depth": 3, "title": "Implementation Example", "anchor": "implementation-example", "start_char": 5797, "end_char": 6034, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implementation Example\n\nFor reference, Astar's implementation of [`pallet-contracts`](https://github.com/AstarNetwork/Astar/blob/b6f7a408d31377130c3713ed52941a06b5436402/runtime/astar/src/lib.rs#L693) demonstrates production usage."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-add-smart-contract-functionality", "url": "https://developer.polkadot.com/parachains/customize-runtime/add-smart-contract-functionality/#where-to-go-next", "page_title": "Add Smart Contract Functionality", "index": 15, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6034, "end_char": 6384, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ef914bb3ec8aa595ac038c4df953d64a2aec87ef308623a7bee71100fb48d32", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Add a Pallet to the Runtime__\n\n    ---\n\n    Learn the step-by-step process for integrating Polkadot SDK pallets into your blockchain's runtime.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/customize-runtime/add-existing-pallets/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#introduction", "page_title": "Overview of FRAME", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 27, "end_char": 651, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA blockchain runtime is more than just a fixed set of rules—it's a dynamic foundation that you can shape to match your specific needs. With Polkadot SDK's FRAME (Framework for Runtime Aggregation of Modularized Entities), customizing your runtime is straightforward and modular. Instead of building everything from scratch, you combine pre-built pallets with your own custom logic to create a runtime suited to your blockchain's purpose.\n\nThis overview explains how runtime customization works, introduces the building blocks you'll use, and guides you through the key patterns for extending your runtime."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#understanding-your-runtime", "page_title": "Overview of FRAME", "index": 1, "depth": 2, "title": "Understanding Your Runtime", "anchor": "understanding-your-runtime", "start_char": 651, "end_char": 1414, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understanding Your Runtime\n\nThe runtime is the core logic of your blockchain—it processes transactions, manages state, and enforces the rules that govern your network. When a transaction arrives at your blockchain, the [`frame_executive`](https://paritytech.github.io/polkadot-sdk/master/frame_executive/index.html) pallet receives it and routes it to the appropriate pallet for execution.\n\nThink of your runtime as a collection of specialized modules, each handling a different aspect of your blockchain. Need token balances? Use the Balances pallet. Want governance? Add the Governance pallets. Need something custom? Create your own pallet. By mixing and matching these modules, you build a runtime that's efficient, secure, and tailored to your use case."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#runtime-architecture", "page_title": "Overview of FRAME", "index": 2, "depth": 2, "title": "Runtime Architecture", "anchor": "runtime-architecture", "start_char": 1414, "end_char": 1966, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Runtime Architecture\n\nThe following diagram shows how FRAME components work together to form your runtime:\n\n![](/images/parachains/customize-runtime/index/frame-overview-01.webp)\n\nThe main components are:\n\n- **`frame_executive`**: Routes all incoming transactions to the correct pallet for execution.\n- **Pallets**: Domain-specific modules that implement your blockchain's features and business logic.\n- **`frame_system`**: Provides core runtime primitives and storage.\n- **`frame_support`**: Utilities and macros that simplify pallet development."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#building-blocks-pallets", "page_title": "Overview of FRAME", "index": 3, "depth": 2, "title": "Building Blocks: Pallets", "anchor": "building-blocks-pallets", "start_char": 1966, "end_char": 2542, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Building Blocks: Pallets\n\n[Pallets](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/frame_runtime/pallet/index.html) are the fundamental units of runtime customization. Each pallet encapsulates specific functionality and can be independently developed, tested, and integrated.\n\nA pallet can implement virtually any blockchain feature you need:\n\n- Expose new transactions that users can submit.\n- Store data on-chain.\n- Enforce business rules and validation logic.\n- Emit events to notify users of state changes.\n- Handle errors gracefully."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#pre-built-pallets-vs-custom-pallets", "page_title": "Overview of FRAME", "index": 4, "depth": 3, "title": "Pre-Built Pallets vs. Custom Pallets", "anchor": "pre-built-pallets-vs-custom-pallets", "start_char": 2542, "end_char": 3188, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Pre-Built Pallets vs. Custom Pallets\n\nFRAME provides a comprehensive library of [pre-built pallets](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/substrate/frame) for common blockchain features, including consensus, staking, balances, governance, and more. These pallets are battle-tested, optimized, and ready to use.\n\nHowever, you're not limited to pre-built functionality. When pre-built pallets don't meet your needs, you can create custom pallets with entirely custom logic. The real power of FRAME is the flexibility to use pre-built modules for standard features while building your own for unique requirements."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#pallet-structure", "page_title": "Overview of FRAME", "index": 5, "depth": 3, "title": "Pallet Structure", "anchor": "pallet-structure", "start_char": 3188, "end_char": 4487, "estimated_token_count": 366, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Pallet Structure\n\nFRAME uses Rust macros extensively, allowing you to focus on your pallet's logic while the framework handles boilerplate and integration code.\n\nA typical pallet looks like this:\n\n```rust\npub use pallet::*;\n\n#[frame_support::pallet]\npub mod pallet {\n  use frame_support::pallet_prelude::*;\n  use frame_system::pallet_prelude::*;\n\n  #[pallet::pallet]\n  #[pallet::generate_store(pub(super) trait Store)]\n  pub struct Pallet<T>(_);\n\n  #[pallet::config]  // snip\n  #[pallet::event]   // snip\n  #[pallet::error]   // snip\n  #[pallet::storage] // snip\n  #[pallet::call]    // snip\n}\n```\n\nEvery pallet can implement these core macros:\n\n- **`#[frame_support::pallet]`**: Marks your module as a FRAME pallet.\n- **`#[pallet::pallet]`**: Designates the struct that holds pallet metadata.\n- **`#[pallet::config]`**: Defines configuration and associated types.\n- **`#[pallet::event]`**: Defines events emitted by your pallet.\n- **`#[pallet::error]`**: Defines error types your pallet can return.\n- **`#[pallet::storage]`**: Defines on-chain storage items.\n- **`#[pallet::call]`**: Defines dispatchable functions (transactions).\n\nFor a comprehensive reference, see the [`pallet_macros` documentation](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/index.html)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#how-runtime-customization-works", "page_title": "Overview of FRAME", "index": 6, "depth": 2, "title": "How Runtime Customization Works", "anchor": "how-runtime-customization-works", "start_char": 4487, "end_char": 5405, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Runtime Customization Works\n\nCustomizing your runtime typically follows these patterns:\n\n**Adding Pre-Built Pallets**: Select pallets from the FRAME library and integrate them into your runtime configuration. This is the fastest way to add functionality.\n\n**Creating Custom Pallets**: Write custom pallets for features that don't exist in the pre-built library. Custom pallets follow the same structure as pre-built ones and integrate seamlessly.\n\n**Combining Multiple Pallets**: Layer multiple pallets together to create complex behaviors. Pallets can call each other and share storage when needed.\n\n**Configuring Pallet Parameters**: Most pallets are configurable—you can adjust their behavior through configuration traits without modifying their code.\n\nThe following diagram illustrates how pallets combine to form a complete runtime:\n\n![](/images/parachains/customize-runtime/index/frame-overview-02.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#starting-templates", "page_title": "Overview of FRAME", "index": 7, "depth": 2, "title": "Starting Templates", "anchor": "starting-templates", "start_char": 5405, "end_char": 6948, "estimated_token_count": 327, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Starting Templates\n\nThe easiest way to begin customizing your runtime is with a starter template. These templates provide a pre-configured foundation so you can focus on customization rather than setup.\n\n- **[Polkadot SDK Parachain Template](https://github.com/paritytech/polkadot-sdk-parachain-template)**: The recommended choice for most developers, it includes pre-configured pallets for common features (balances, block production, governance), a complete runtime setup, and built-in parachain consensus support. This template offers the best balance of features and learning opportunities.\n\n- **[Polkadot SDK Minimal Template](https://github.com/paritytech/polkadot-sdk-minimal-template)**: Provides a bare-bones runtime with only essential components. Choose this if you want maximum flexibility and prefer building from a clean slate.\n\n- **[Polkadot SDK Solochain Template](https://github.com/paritytech/polkadot-sdk/tree/master/templates/solochain)**: Designed for building standalone blockchains with moderate features, simple consensus, and several core pallets. Use this if you want a sovereign blockchain independent of a relay chain.\n\n- **[OpenZeppelin Runtime Templates](https://github.com/OpenZeppelin/polkadot-runtime-templates)**: Provides security-focused configurations following industry best practices. The [generic-template](https://github.com/OpenZeppelin/polkadot-runtime-templates/tree/main/generic-template) includes curated pallet selections and production-ready defaults—ideal if security is your top priority."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/#key-customization-scenarios", "page_title": "Overview of FRAME", "index": 8, "depth": 2, "title": "Key Customization Scenarios", "anchor": "key-customization-scenarios", "start_char": 6948, "end_char": 7987, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce77f77ab06a9e3986998af427c59044b64b9a12c165b19c7c91bd7a2dae60f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Key Customization Scenarios\n\nThis section covers the most common customization patterns you'll encounter:\n\n- **[Add Existing Pallets to Your Runtime](/parachains/customize-runtime/add-existing-pallets/)**: Integrate pre-built pallets from the FRAME library with minimal configuration.\n\n- **[Add Multiple Instances of a Pallet](/parachains/customize-runtime/add-pallet-instances/)**: Run multiple instances of the same pallet with different configurations—useful for multi-token systems or parallel features.\n\n- **[Add Smart Contract Functionality](/parachains/customize-runtime/add-smart-contract-functionality/)**: Enable smart contract execution on your parachain using Contracts pallets.\n\n- **[Create Custom Pallets](/parachains/customize-runtime/pallet-development/create-a-pallet/)**: Build entirely custom pallets for features unique to your blockchain.\n\n- **[Test Your Runtime](/parachains/customize-runtime/pallet-development/pallet-testing/)**: Unit test pallets and mock complete runtimes to ensure everything works correctly."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#introduction", "page_title": "Benchmark Your Pallet", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 1, "end_char": 647, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nBenchmarking is the process of measuring the computational resources (execution time and storage) required by your pallet's extrinsics. Accurate [weight](https://paritytech.github.io/polkadot-sdk/master/frame_support/weights/index.html) calculations are essential for ensuring your blockchain can process transactions efficiently while protecting against denial-of-service attacks.\n\nThis guide demonstrates how to benchmark a pallet and incorporate the resulting weight values. This example uses the custom counter pallet from previous guides in this series, but you can replace it with the code from another pallet if desired."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#prerequisites", "page_title": "Benchmark Your Pallet", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 647, "end_char": 1603, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have:\n\n- A pallet to benchmark. If you followed the pallet development tutorials, you can use the counter pallet from the [Create a Pallet](/parachains/customize-runtime/pallet-development/create-a-pallet/) guide. You can also follow these steps to benchmark a custom pallet by updating the `benchmarking.rs` functions, and instances of usage in future steps, to calculate weights using your specific pallet functionality.\n- Basic understanding of [computational complexity](https://en.wikipedia.org/wiki/Computational_complexity).\n- Familiarity with [Rust's testing framework](https://doc.rust-lang.org/book/ch11-00-testing.html).\n- Familiarity setting up the Polkadot Omni Node and [Polkadot Chain Spec Builder](https://crates.io/crates/staging-chain-spec-builder). Refer to the [Set Up a Parachain Template](/parachains/launch-a-parachain/set-up-the-parachain-template/) guide for instructions if needed."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#create-the-benchmarking-module", "page_title": "Benchmark Your Pallet", "index": 2, "depth": 2, "title": "Create the Benchmarking Module", "anchor": "create-the-benchmarking-module", "start_char": 1603, "end_char": 3311, "estimated_token_count": 446, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Benchmarking Module\n\nCreate a new file `benchmarking.rs` in your pallet's `src` directory and add the following code:\n\n```rust title=\"pallets/pallet-custom/src/benchmarking.rs\"\n#![cfg(feature = \"runtime-benchmarks\")]\n\nuse super::*;\nuse frame::deps::frame_benchmarking::v2::*;\nuse frame::benchmarking::prelude::RawOrigin;\n\n#[benchmarks]\nmod benchmarks {\n    use super::*;\n\n    #[benchmark]\n    fn set_counter_value() {\n        let new_value: u32 = 100;\n\n        #[extrinsic_call]\n        _(RawOrigin::Root, new_value);\n\n        assert_eq!(CounterValue::<T>::get(), new_value);\n    }\n\n    #[benchmark]\n    fn increment() {\n        let caller: T::AccountId = whitelisted_caller();\n        let amount: u32 = 50;\n\n        #[extrinsic_call]\n        _(RawOrigin::Signed(caller.clone()), amount);\n\n        assert_eq!(CounterValue::<T>::get(), amount);\n        assert_eq!(UserInteractions::<T>::get(caller), 1);\n    }\n\n    #[benchmark]\n    fn decrement() {\n        // First, set the counter to a non-zero value\n        CounterValue::<T>::put(100);\n\n        let caller: T::AccountId = whitelisted_caller();\n        let amount: u32 = 30;\n\n        #[extrinsic_call]\n        _(RawOrigin::Signed(caller.clone()), amount);\n\n        assert_eq!(CounterValue::<T>::get(), 70);\n        assert_eq!(UserInteractions::<T>::get(caller), 1);\n    }\n\n    impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test);\n}\n```\n\nThis module contains all the [benchmarking definitions](https://paritytech.github.io/polkadot-sdk/master/frame_benchmarking/v2/index.html) for your pallet. If you are benchmarking a different pallet, update the testing logic as needed to test your pallet's functionality."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#define-the-weight-trait", "page_title": "Benchmark Your Pallet", "index": 3, "depth": 2, "title": "Define the Weight Trait", "anchor": "define-the-weight-trait", "start_char": 3311, "end_char": 4382, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Define the Weight Trait\n\nAdd a `weights` module to your pallet that defines the `WeightInfo` trait using the following code:\n\n```rust title=\"pallets/pallet-custom/src/weights.rs\"\n#[frame::pallet]\npub mod pallet {\n    use frame::prelude::*;\n    pub use weights::WeightInfo;\n\n    pub mod weights {\n        use frame::prelude::*;\n\n        pub trait WeightInfo {\n            fn set_counter_value() -> Weight;\n            fn increment() -> Weight;\n            fn decrement() -> Weight;\n        }\n\n        impl WeightInfo for () {\n            fn set_counter_value() -> Weight {\n                Weight::from_parts(10_000, 0)\n            }\n            fn increment() -> Weight {\n                Weight::from_parts(15_000, 0)\n            }\n            fn decrement() -> Weight {\n                Weight::from_parts(15_000, 0)\n            }\n        }\n    }\n\n    // ... rest of pallet\n}\n```\n\nThe `WeightInfo for ()` implementation provides placeholder weights for development. If you are using a different pallet, update the `weights` module to use your pallet's function names."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#add-weightinfo-to-config", "page_title": "Benchmark Your Pallet", "index": 4, "depth": 2, "title": "Add WeightInfo to Config", "anchor": "add-weightinfo-to-config", "start_char": 4382, "end_char": 5191, "estimated_token_count": 194, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Add WeightInfo to Config \n\nUpdate your pallet's `Config` trait to include `WeightInfo` by adding the following code:\n\n```rust title=\"pallets/pallet-custom/src/lib.rs\"\n#[pallet::config]\npub trait Config: frame_system::Config {\n    type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;\n\n    #[pallet::constant]\n    type CounterMaxValue: Get<u32>;\n\n    type WeightInfo: weights::WeightInfo;\n}\n```\n\nThe [`WeightInfo`](https://paritytech.github.io/polkadot-sdk/master/frame_system/weights/trait.WeightInfo.html) trait provides an abstraction layer that allows weights to be swapped at runtime configuration. By making `WeightInfo` an associated type in the `Config` trait, you will enable each runtime that uses your pallet to specify which weight implementation to use."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#update-extrinsic-weight-annotations", "page_title": "Benchmark Your Pallet", "index": 5, "depth": 2, "title": "Update Extrinsic Weight Annotations", "anchor": "update-extrinsic-weight-annotations", "start_char": 5191, "end_char": 6479, "estimated_token_count": 311, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Update Extrinsic Weight Annotations\n\nReplace the placeholder weights in your extrinsics with calls to the `WeightInfo` trait by adding the following code:\n\n```rust title=\"pallets/pallet-custom/src/lib.rs\"\n#[pallet::call]\nimpl<T: Config> Pallet<T> {\n    #[pallet::call_index(0)]\n    #[pallet::weight(T::WeightInfo::set_counter_value())]\n    pub fn set_counter_value(origin: OriginFor<T>, new_value: u32) -> DispatchResult {\n        // ... implementation\n    }\n\n    #[pallet::call_index(1)]\n    #[pallet::weight(T::WeightInfo::increment())]\n    pub fn increment(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n        // ... implementation\n    }\n\n    #[pallet::call_index(2)]\n    #[pallet::weight(T::WeightInfo::decrement())]\n    pub fn decrement(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n        // ... implementation\n    }\n}\n```\n\nBy calling `T::WeightInfo::function_name()` instead of using hardcoded `Weight::from_parts()` values, your extrinsics automatically use whichever weight implementation is configured in the runtime. You can switch between placeholder weights for testing and benchmarked weights for production easily, without changing any pallet code.\n\nIf you are using a different pallet, be sure to update the functions for `WeightInfo` accordingly."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#include-the-benchmarking-module", "page_title": "Benchmark Your Pallet", "index": 6, "depth": 2, "title": "Include the Benchmarking Module", "anchor": "include-the-benchmarking-module", "start_char": 6479, "end_char": 7016, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Include the Benchmarking Module\n\nAt the top of your `lib.rs`, add the module declaration by adding the following code:\n\n```rust title=\"pallets/pallet-custom/src/lib.rs\"\n#![cfg_attr(not(feature = \"std\"), no_std)]\n\nextern crate alloc;\nuse alloc::vec::Vec;\n\npub use pallet::*;\n\n#[cfg(feature = \"runtime-benchmarks\")]\nmod benchmarking;\n\n// Additional pallet code\n```\n\nThe `#[cfg(feature = \"runtime-benchmarks\")]` attribute ensures that benchmarking code is only compiled when explicitly needed to keep your production runtime efficient."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#configure-pallet-dependencies", "page_title": "Benchmark Your Pallet", "index": 7, "depth": 2, "title": "Configure Pallet Dependencies", "anchor": "configure-pallet-dependencies", "start_char": 7016, "end_char": 7926, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Pallet Dependencies\n\nUpdate your pallet's `Cargo.toml` to enable the benchmarking feature by adding the following code:\n\n```toml title=\"pallets/pallet-custom/Cargo.toml\"\n[dependencies]\ncodec = { features = [\"derive\"], workspace = true }\nscale-info = { features = [\"derive\"], workspace = true }\nframe = { features = [\"experimental\", \"runtime\"], workspace = true }\n\n[features]\ndefault = [\"std\"]\nruntime-benchmarks = [\n    \"frame/runtime-benchmarks\",\n]\nstd = [\n    \"codec/std\",\n    \"scale-info/std\",\n    \"frame/std\",\n]\n```\n\nThe Cargo feature flag system lets you conditionally compile code based on which features are enabled. By defining a `runtime-benchmarks` feature that cascades to FRAME's benchmarking features, you create a clean way to build your pallet with or without benchmarking support, ensuring all necessary dependencies are available when needed but excluded from production builds."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#update-mock-runtime", "page_title": "Benchmark Your Pallet", "index": 8, "depth": 2, "title": "Update Mock Runtime", "anchor": "update-mock-runtime", "start_char": 7926, "end_char": 8425, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Update Mock Runtime\n\nAdd the `WeightInfo` type to your test configuration in `mock.rs` by adding the following code:\n\n```rust title=\"pallets/pallet-custom/src/mock.rs\"\nimpl pallet_custom::Config for Test {\n    type RuntimeEvent = RuntimeEvent;\n    type CounterMaxValue = ConstU32<1000>;\n    type WeightInfo = ();\n}\n```\n\nIn your mock runtime for testing, use the placeholder `()` implementation of `WeightInfo`, since unit tests focus on verifying functional correctness rather than performance."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#configure-runtime-benchmarking", "page_title": "Benchmark Your Pallet", "index": 9, "depth": 2, "title": "Configure Runtime Benchmarking", "anchor": "configure-runtime-benchmarking", "start_char": 8425, "end_char": 10190, "estimated_token_count": 375, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Runtime Benchmarking\n\nTo execute benchmarks, your pallet must be integrated into the runtime's benchmarking infrastructure. Follow these steps to update the runtime configuration:\n\n1. **Update `runtime/Cargo.toml`**: Add your pallet to the runtime's `runtime-benchmarks` feature as follows:\n\n    ```toml title=\"runtime/Cargo.toml\"\n    runtime-benchmarks = [\n        \"cumulus-pallet-parachain-system/runtime-benchmarks\",\n        \"hex-literal\",\n        \"pallet-parachain-template/runtime-benchmarks\",\n        \"polkadot-sdk/runtime-benchmarks\",\n        \"pallet-custom/runtime-benchmarks\",\n    ]\n    ```\n\n    When you build the runtime with `--features runtime-benchmarks`, this configuration ensures all necessary benchmarking code across all pallets (including yours) is included.\n\n2. **Update runtime configuration**: Using the placeholder implementation, run development benchmarks as follows:\n\n    ```rust title=\"runtime/src/configs/mod.rs\"\n    impl pallet_custom::Config for Runtime {\n        type RuntimeEvent = RuntimeEvent;\n        type CounterMaxValue = ConstU32<1000>;\n        type WeightInfo = ();\n    }\n    ```\n\n3. **Register benchmarks**: Add your pallet to the benchmark list in `runtime/src/benchmarks.rs` as follows:\n\n    ```rust title=\"runtime/src/benchmarks.rs\"\n    polkadot_sdk::frame_benchmarking::define_benchmarks!(\n        [frame_system, SystemBench::<Runtime>]\n        [pallet_balances, Balances]\n        // ... other pallets\n        [pallet_custom, CustomPallet]\n    );\n    ```\n\n    The [`define_benchmarks!`](https://paritytech.github.io/polkadot-sdk/master/frame_benchmarking/macro.define_benchmarks.html) macro creates the infrastructure that allows the benchmarking CLI tool to discover and execute your pallet's benchmarks."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#test-benchmark-compilation", "page_title": "Benchmark Your Pallet", "index": 10, "depth": 2, "title": "Test Benchmark Compilation", "anchor": "test-benchmark-compilation", "start_char": 10190, "end_char": 11182, "estimated_token_count": 245, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Benchmark Compilation\n\nRun the following command to verify your benchmarks compile and run as tests:\n\n```bash\ncargo test -p pallet-custom --features runtime-benchmarks\n```\n\nYou will see terminal output similar to the following as your benchmark tests pass:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>cargo test -p pallet-custom --features runtime-benchmarks</span>\n  <span data-ty>test benchmarking::benchmarks::bench_set_counter_value ... ok</span>\n  <span data-ty>test benchmarking::benchmarks::bench_increment ... ok</span>\n  <span data-ty>test benchmarking::benchmarks::bench_decrement ... ok</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>\n\nThe `impl_benchmark_test_suite!` macro generates unit tests for each benchmark. Running these tests verifies that your benchmarks compile correctly, execute without panicking, and pass their assertions, catching issues early before building the entire runtime."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#build-the-runtime-with-benchmarks", "page_title": "Benchmark Your Pallet", "index": 11, "depth": 2, "title": "Build the Runtime with Benchmarks", "anchor": "build-the-runtime-with-benchmarks", "start_char": 11182, "end_char": 11877, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Build the Runtime with Benchmarks\n\nCompile the runtime with benchmarking enabled to generate the Wasm binary using the following command:\n\n```bash\ncargo build --release --features runtime-benchmarks\n```\n\nThis command produces the runtime WASM file needed for benchmarking, typically located at: `target/release/wbuild/parachain-template-runtime/parachain_template_runtime.wasm`\n\nThe build includes all the benchmarking infrastructure and special host functions needed for measurement. The resulting WASM runtime contains your benchmark code and can communicate with the benchmarking tool's execution environment. You'll create a different build later for operating your chain in production."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#install-the-benchmarking-tool", "page_title": "Benchmark Your Pallet", "index": 12, "depth": 2, "title": "Install the Benchmarking Tool", "anchor": "install-the-benchmarking-tool", "start_char": 11877, "end_char": 13090, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install the Benchmarking Tool\n\n[`frame-omni-bencher`](https://paritytech.github.io/polkadot-sdk/master/frame_omni_bencher/index.html) is the official Polkadot SDK tool designed explicitly for FRAME pallet benchmarking. It provides a standardized way to execute benchmarks, measure execution times and storage operations, and generate properly formatted weight files with full integration into the FRAME weight system.\n\nDownload the pre-built binary from the [Polkadot SDK release](https://github.com/paritytech/polkadot-sdk/releases/tag/polkadot-stable2512-2) (recommended):\n\n=== \"macOS\"\n\n    ```bash\n    curl -L -o frame-omni-bencher https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/frame-omni-bencher-aarch64-apple-darwin\n    chmod +x frame-omni-bencher\n    sudo mv frame-omni-bencher /usr/local/bin/\n    ```\n\n=== \"Ubuntu\"\n\n    ```bash\n    curl -L -o frame-omni-bencher https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/frame-omni-bencher\n    chmod +x frame-omni-bencher\n    sudo mv frame-omni-bencher /usr/local/bin/\n    ```\n\nAlternatively, you can install from source using `cargo`:\n\n```bash\ncargo install frame-omni-bencher --locked\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#download-the-weight-template", "page_title": "Benchmark Your Pallet", "index": 13, "depth": 2, "title": "Download the Weight Template", "anchor": "download-the-weight-template", "start_char": 13090, "end_char": 13892, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Download the Weight Template\n\nDownload the official weight template file using the following commands:\n\n```bash\ncurl -L https://raw.githubusercontent.com/paritytech/polkadot-sdk/refs/tags/polkadot-stable2609/substrate/.maintain/frame-weight-template.hbs \\\n--output ./pallets/pallet-custom/frame-weight-template.hbs\n```\n\nThe weight template is a Handlebars file that transforms raw benchmark data into a correctly formatted Rust source file. It defines the structure of the generated `weights.rs` file, including imports, trait definitions, documentation comments, and formatting. Using the official template ensures your weight files follow the Polkadot SDK conventions and include all necessary metadata, such as benchmark execution parameters, storage operation counts, and hardware information."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#execute-benchmarks", "page_title": "Benchmark Your Pallet", "index": 14, "depth": 2, "title": "Execute Benchmarks", "anchor": "execute-benchmarks", "start_char": 13892, "end_char": 15944, "estimated_token_count": 423, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Execute Benchmarks\n\nRun benchmarks for your pallet to generate weight files using the following commands:\n\n```bash\nframe-omni-bencher v1 benchmark pallet \\\n    --runtime ./target/release/wbuild/parachain-template-runtime/parachain_template_runtime.wasm \\\n    --pallet pallet_custom \\\n    --extrinsic \"\" \\\n    --template ./pallets/pallet-custom/frame-weight-template.hbs \\\n    --output ./pallets/pallet-custom/src/weights.rs\n```\n\nBenchmarks execute against the compiled WASM runtime rather than native code because WASM is what actually runs in production on the blockchain. WASM execution can have different performance characteristics than native code due to compilation and sandboxing overhead, so benchmarking against the WASM ensures your weight measurements reflect real-world conditions.\n\n??? note \"Additional customization\"\n\n    You can customize benchmark execution with additional parameters for more detailed measurements, as shown in the sample code below:\n\n    ```bash\n    frame-omni-bencher v1 benchmark pallet \\\n        --runtime ./target/release/wbuild/parachain-template-runtime/parachain_template_runtime.wasm \\\n        --pallet pallet_custom \\\n        --extrinsic \"\" \\\n        --steps 50 \\\n        --repeat 20 \\\n        --template ./pallets/pallet-custom/frame-weight-template.hbs \\\n        --output ./pallets/pallet-custom/src/weights.rs\n    ```\n    \n    - **`--steps 50`**: Number of different input values to test when using linear components (default: 50). More steps provide finer granularity for detecting complexity trends but increase benchmarking time.\n    - **`--repeat 20`**: Number of repetitions for each measurement (default: 20). More repetitions improve statistical accuracy by averaging out variance, reducing the impact of system noise, and providing more reliable weight estimates.\n    - **`--heap-pages 4096`**: WASM heap pages allocation. Affects available memory during execution.\n    - **`--wasm-execution compiled`**: WASM execution method. Use `compiled` for performance closest to production conditions."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#use-generated-weights", "page_title": "Benchmark Your Pallet", "index": 15, "depth": 2, "title": "Use Generated Weights", "anchor": "use-generated-weights", "start_char": 15944, "end_char": 19724, "estimated_token_count": 845, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use Generated Weights\n\nAfter running benchmarks, a `weights.rs` file is generated containing measured weights based on actual measurements of your code running on real hardware, accounting for the specific complexity of your logic, storage access patterns, and computational requirements.\n\nFollow these steps to use the generated weights with your pallet:\n\n1. Integrate the generated weights by adding the weights module to your pallet's `lib.rs` as follows:\n\n    ```rust title=\"pallets/pallet-custom/src/lib.rs\"\n    #![cfg_attr(not(feature = \"std\"), no_std)]\n\n    extern crate alloc;\n    use alloc::vec::Vec;\n\n    pub use pallet::*;\n\n    #[cfg(feature = \"runtime-benchmarks\")]\n    mod benchmarking;\n\n    pub mod weights;\n\n    #[frame::pallet]\n    pub mod pallet {\n        use super::*;\n        use frame::prelude::*;\n        use crate::weights::WeightInfo;\n        // ... rest of pallet\n    }\n    ```\n\n    Unlike the benchmarking module (which is only needed when running benchmarks), the weights module must be available in all builds because the runtime needs to call the weight functions during regular operation to calculate transaction fees and enforce block limits.\n\n2. Update your runtime configuration to use the generated weights instead of the placeholder `()` implementation by adding the following code:\n\n    ```rust title=\"runtime/src/configs/mod.rs\"\n    impl pallet_custom::Config for Runtime {\n        type RuntimeEvent = RuntimeEvent;\n        type CounterMaxValue = ConstU32<1000>;\n        type WeightInfo = pallet_custom::weights::SubstrateWeight<Runtime>;\n    }\n    ```\n\n    This change activates your benchmarked weights in the production runtime. Now, when users submit transactions that call your pallet's extrinsics, the runtime will use the actual measured weights to calculate fees and enforce block limits.\n\n??? code \"Example generated weight file\"\n    \n    The generated `weights.rs` file will look similar to this:\n\n    ```rust title=\"pallets/pallet-custom/src/weights.rs\"\n    //! Autogenerated weights for `pallet_custom`\n    //!\n    //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0\n    //! DATE: 2025-01-15, STEPS: `50`, REPEAT: `20`\n\n    #![cfg_attr(rustfmt, rustfmt_skip)]\n    #![allow(unused_parens)]\n    #![allow(unused_imports)]\n    #![allow(missing_docs)]\n\n    use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};\n    use core::marker::PhantomData;\n\n    pub trait WeightInfo {\n        fn set_counter_value() -> Weight;\n        fn increment() -> Weight;\n        fn decrement() -> Weight;\n    }\n\n    pub struct SubstrateWeight<T>(PhantomData<T>);\n    impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {\n        fn set_counter_value() -> Weight {\n            Weight::from_parts(8_234_000, 0)\n                .saturating_add(T::DbWeight::get().reads(1))\n                .saturating_add(T::DbWeight::get().writes(1))\n        }\n\n        fn increment() -> Weight {\n            Weight::from_parts(12_456_000, 0)\n                .saturating_add(T::DbWeight::get().reads(2))\n                .saturating_add(T::DbWeight::get().writes(2))\n        }\n\n        fn decrement() -> Weight {\n            Weight::from_parts(11_987_000, 0)\n                .saturating_add(T::DbWeight::get().reads(2))\n                .saturating_add(T::DbWeight::get().writes(2))\n        }\n    }\n    ```\n\n    The actual numbers in your `weights.rs` file will vary based on your hardware and implementation complexity. The [`DbWeight`](https://paritytech.github.io/polkadot-sdk/master/frame_support/weights/struct.RuntimeDbWeight.html) accounts for database read and write operations.\n\nCongratulations, you've successfully benchmarked a pallet and updated your runtime to use the generated weight values."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-benchmark-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/benchmark-pallet/#related-resources", "page_title": "Benchmark Your Pallet", "index": 16, "depth": 2, "title": "Related Resources", "anchor": "related-resources", "start_char": 19724, "end_char": 20200, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cc9395d48fbf6211fbae8ef9e77cbf19122162ec4815719774ab7cca2629b0ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Related Resources\n\n- [FRAME Benchmarking Documentation](https://paritytech.github.io/polkadot-sdk/master/frame_benchmarking/index.html)\n- [Weight Struct Documentation](https://paritytech.github.io/polkadot-sdk/master/frame_support/weights/struct.Weight.html)\n- [Benchmarking v2 API](https://paritytech.github.io/polkadot-sdk/master/frame_benchmarking/v2/index.html)\n- [frame-omni-bencher Tool](https://paritytech.github.io/polkadot-sdk/master/frame_omni_bencher/index.html)"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#introduction", "page_title": "Create a Custom Pallet", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 27, "end_char": 816, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Framework for Runtime Aggregation of Modular Entities (FRAME)](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/frame_runtime/index.html) provides a powerful set of tools for blockchain development through modular components called [pallets](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/frame_runtime/pallet/index.html). These Rust-based runtime modules allow you to build custom blockchain functionality with precision and flexibility. While FRAME includes a library of pre-built pallets, its true strength lies in creating custom pallets tailored to your specific needs.\n\nIn this guide, you'll learn how to build a custom counter pallet from scratch that demonstrates core pallet development concepts."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#prerequisites", "page_title": "Create a Custom Pallet", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 816, "end_char": 1138, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have:\n\n- [Polkadot SDK dependencies installed](/parachains/install-polkadot-sdk/).\n- A [Polkadot SDK Parchain Template](/parachains/launch-a-parachain/set-up-the-parachain-template/) set up locally.\n- Basic familiarity with [FRAME concepts](/parachains/customize-runtime/)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#core-pallet-components", "page_title": "Create a Custom Pallet", "index": 2, "depth": 2, "title": "Core Pallet Components", "anchor": "core-pallet-components", "start_char": 1138, "end_char": 1997, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Pallet Components\n\nAs you build your custom pallet, you'll work with these key sections:\n\n- **Imports and dependencies**: Bring in necessary FRAME libraries and external modules.\n- **Runtime configuration trait**: Specify types and constants for pallet-runtime interaction.\n- **Runtime events**: Define signals that communicate state changes.\n- **Runtime errors**: Define error types returned from dispatchable calls.\n- **Runtime storage**: Declare on-chain storage items for your pallet's state.\n- **Genesis configuration**: Set initial blockchain state.\n- **Dispatchable functions (extrinsics)**: Create callable functions for user interactions.\n\nFor additional macros beyond those covered here, refer to the [pallet_macros](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/index.html) section of the Polkadot SDK Docs."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#create-the-pallet-project", "page_title": "Create a Custom Pallet", "index": 3, "depth": 2, "title": "Create the Pallet Project", "anchor": "create-the-pallet-project", "start_char": 1997, "end_char": 2720, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Pallet Project\n\nBegin by creating a new Rust library project for your custom pallet within the [Polkadot SDK Parachain Template](https://github.com/paritytech/polkadot-sdk-parachain-template):\n\n1. Navigate to the root directory of your parachain template:\n\n    ```bash\n    cd polkadot-sdk-parachain-template\n    ```\n\n2. Navigate to the `pallets` directory:\n\n    ```bash\n    cd pallets\n    ```\n\n3. Create a new Rust library project:\n\n    ```bash\n    cargo new --lib pallet-custom\n    ```\n\n4. Enter the new project directory:\n\n    ```bash\n    cd pallet-custom\n    ```\n\n5. Verify the project structure. It should look like:\n\n    ```\n    pallet-custom/\n    ├── Cargo.toml\n    └── src/\n        └── lib.rs\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#configure-dependencies", "page_title": "Create a Custom Pallet", "index": 4, "depth": 2, "title": "Configure Dependencies", "anchor": "configure-dependencies", "start_char": 2720, "end_char": 4705, "estimated_token_count": 417, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Dependencies\n\nTo integrate your custom pallet into the Polkadot SDK-based runtime, configure the `Cargo.toml` file with the required dependencies. Since your pallet exists within the parachain template workspace, you'll use workspace inheritance to maintain version consistency.\n\n1. Open `Cargo.toml` and replace its contents with:\n\n    ```toml title=\"pallet-custom/Cargo.toml\"\n    [package]\n        name = \"pallet-custom\"\n        description = \"A custom counter pallet for demonstration purposes.\"\n        version = \"0.1.0\"\n        license = \"Unlicense\"\n        authors.workspace = true\n        homepage.workspace = true\n        repository.workspace = true\n        edition.workspace = true\n        publish = false\n    \n        [package.metadata.docs.rs]\n        targets = [\"x86_64-unknown-linux-gnu\"]\n    \n        [dependencies]\n        codec = { features = [\"derive\"], workspace = true }\n        scale-info = { features = [\"derive\"], workspace = true }\n        frame = { features = [\"experimental\", \"runtime\"], workspace = true }\n    \n        [features]\n        default = [\"std\"]\n        std = [\n            \"codec/std\",\n            \"scale-info/std\",\n            \"frame/std\",\n        ]\n    ```\n\n    !!!note \"Version Management\"\n        The parachain template uses workspace inheritance to maintain consistent dependency versions across all packages. The actual versions are defined in the root `Cargo.toml` file, ensuring compatibility throughout the project. By using `workspace = true`, your pallet automatically inherits the correct versions.\n\n2. `pallets/pallet-custom` has already been automatically included in the workspace members of the parachain template, so your new pallet is automatically recognized. Verify this by checking the root `Cargo.toml`:\n\n    ```toml title=\"Cargo.toml\"\n    [workspace]\n    default-members = [\"pallets/template\", \"runtime\"]\n    members = [\"node\", \"pallets/pallet-custom\", \"pallets/template\", \"runtime\"]\n    resolver = \"2\"\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#initialize-the-pallet-structure", "page_title": "Create a Custom Pallet", "index": 5, "depth": 2, "title": "Initialize the Pallet Structure", "anchor": "initialize-the-pallet-structure", "start_char": 4705, "end_char": 6150, "estimated_token_count": 316, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize the Pallet Structure\n\nWith dependencies configured, set up the basic scaffold that will hold your pallet's logic:\n\n1. Open `src/lib.rs` and delete all existing content.\n\n2. Add the initial scaffold structure using the unified `frame` dependency:\n\n    ```rust title=\"src/lib.rs\"\n    #![cfg_attr(not(feature = \"std\"), no_std)]\n    \n    extern crate alloc;\n    \n    pub use pallet::*;\n    \n    #[frame::pallet]\n    pub mod pallet {\n        use frame::prelude::*;\n    \n        #[pallet::pallet]\n        pub struct Pallet<T>(_);\n    \n        #[pallet::config]\n        pub trait Config: frame_system::Config {\n            // Configuration will be added here\n        }\n    \n        #[pallet::storage]\n        pub type CounterValue<T> = StorageValue<_, u32, ValueQuery>;\n    \n        #[pallet::call]\n        impl<T: Config> Pallet<T> {\n            // Dispatchable functions will be added here\n        }\n    }\n    ```\n\n    This setup starts with a minimal scaffold without events and errors. These will be added in the following sections after the `Config` trait is correctly configured with the required `RuntimeEvent` type. The `extern crate alloc;` line is required because the pallet uses `no_std` and will later use `Vec` in the genesis configuration, which comes from the `alloc` crate rather than the standard library.\n\n3. Verify it compiles using the following command:\n\n    ```bash\n    cargo build --package pallet-custom\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#configure-the-pallet", "page_title": "Create a Custom Pallet", "index": 6, "depth": 2, "title": "Configure the Pallet", "anchor": "configure-the-pallet", "start_char": 6150, "end_char": 7373, "estimated_token_count": 301, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure the Pallet\n\nThe [`Config`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/trait.Config.html) trait exposes configurable options and links your pallet to the runtime. All types and constants the pallet depends on must be declared here. These types are defined generically and become concrete when the pallet is instantiated at runtime.\n\nReplace the [`#[pallet::config]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.config.html) section with:\n\n```rust title=\"src/lib.rs\"\n#[pallet::config]\npub trait Config: frame_system::Config {\n    /// The overarching runtime event type.\n    type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;\n\n    /// Maximum value the counter can reach.\n    #[pallet::constant]\n    type CounterMaxValue: Get<u32>;\n}\n\n```\n\nKey configuration elements include the following:\n\n- **[`RuntimeEvent`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/trait.Config.html#associatedtype.RuntimeEvent)**: Required for the pallet to emit events that the runtime can process.\n- **`CounterMaxValue`**: A constant that sets an upper limit on counter values, configurable per runtime."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#define-events", "page_title": "Create a Custom Pallet", "index": 7, "depth": 2, "title": "Define Events", "anchor": "define-events", "start_char": 7373, "end_char": 8740, "estimated_token_count": 327, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Define Events\n\nEvents inform external entities (dApps, explorers, users) about significant runtime changes. Event details are included in the node's metadata, making them accessible to external tools.\n\nThe [`#[pallet::generate_deposit]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.generate_deposit.html) macro automatically generates a `deposit_event` function that converts your pallet's events into the `RuntimeEvent` type and deposits them via [`frame_system::Pallet::deposit_event`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.deposit_event).\n\nAdd the [`#[pallet::event]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.event.html) section after the `Config` trait:\n\n```rust title=\"src/lib.rs\"\n#[pallet::event]\n#[pallet::generate_deposit(pub(super) fn deposit_event)]\npub enum Event<T: Config> {\n    /// Counter value was explicitly set. [new_value]\n    CounterValueSet {\n        new_value: u32,\n    },\n    /// Counter was incremented. [new_value, who, amount]\n    CounterIncremented {\n        new_value: u32,\n        who: T::AccountId,\n        amount: u32,\n    },\n    /// Counter was decremented. [new_value, who, amount]\n    CounterDecremented {\n        new_value: u32,\n        who: T::AccountId,\n        amount: u32,\n    },\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#define-errors", "page_title": "Create a Custom Pallet", "index": 8, "depth": 2, "title": "Define Errors", "anchor": "define-errors", "start_char": 8740, "end_char": 9613, "estimated_token_count": 209, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Define Errors\n\nErrors indicate when and why a call fails. Use informative names and descriptions, as error documentation is included in the node's metadata.\n\nError types must implement the [`TypeInfo`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_prelude/trait.TypeInfo.html) trait, and runtime errors can be up to 4 bytes in size.\n\nAdd the [`#[pallet::error]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.error.html) section after the events:\n\n```rust title=\"src/lib.rs\"\n#[pallet::error]\npub enum Error<T> {\n    /// The counter value has not been set yet.\n    NoneValue,\n    /// Arithmetic operation would cause overflow.\n    Overflow,\n    /// Arithmetic operation would cause underflow.\n    Underflow,\n    /// The counter value would exceed the maximum allowed value.\n    CounterMaxValueExceeded,\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#add-storage-items", "page_title": "Create a Custom Pallet", "index": 9, "depth": 2, "title": "Add Storage Items", "anchor": "add-storage-items", "start_char": 9613, "end_char": 10711, "estimated_token_count": 277, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Add Storage Items\n\nStorage items persist state on-chain. This pallet uses two storage items:\n\n- **`CounterValue`**: Stores the current counter value.\n- **`UserInteractions`**: Tracks interaction counts per user account.\n\nThe initial scaffold already includes the `CounterValue` storage item. Now add the `UserInteractions` storage map after it:\n\n```rust title=\"src/lib.rs\"\n/// Tracks the number of interactions per user.\n#[pallet::storage]\npub type UserInteractions<T: Config> = StorageMap<_, Blake2_128Concat, T::AccountId, u32, ValueQuery>;\n```\n\nYour storage section should now look like this:\n\n```rust title=\"src/lib.rs\"\n/// The current value of the counter.\n#[pallet::storage]\npub type CounterValue<T> = StorageValue<_, u32, ValueQuery>;\n\n/// Tracks the number of interactions per user.\n#[pallet::storage]\npub type UserInteractions<T: Config> = StorageMap<_, Blake2_128Concat, T::AccountId, u32, ValueQuery>;\n```\n\nFor more storage types and patterns, explore the [Polkadot SDK storage documentation](https://paritytech.github.io/polkadot-sdk/master/frame_support/storage/types/index.html)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#configure-genesis-state", "page_title": "Create a Custom Pallet", "index": 10, "depth": 2, "title": "Configure Genesis State", "anchor": "configure-genesis-state", "start_char": 10711, "end_char": 12772, "estimated_token_count": 480, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Genesis State\n\nGenesis configuration allows you to set the initial state of your pallet when the blockchain first starts and is essential for both production networks and testing environments. It is beneficial for:\n\n- Setting initial parameter values.\n- Pre-allocating resources or accounts.\n- Establishing starting conditions for testing.\n- Configuring network-specific initial state.\n\nSince the genesis configuration uses `Vec` for `initial_user_interactions`, you need to import it from the `alloc` crate. Add this import at the top of your pallet module, after the `use frame::prelude::*;` line:\n\n```rust title=\"src/lib.rs\"\nuse alloc::vec::Vec;\n```\n\nAdd the [`#[pallet::genesis_config]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.genesis_config.html) and [`#[pallet::genesis_build]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.genesis_build.html) sections after your storage items:\n\n```rust title=\"src/lib.rs\"\n#[pallet::genesis_config]\n#[derive(DefaultNoBound)]\npub struct GenesisConfig<T: Config> {\n    /// Initial value for the counter\n    pub initial_counter_value: u32,\n    /// Pre-populated user interactions\n    pub initial_user_interactions: Vec<(T::AccountId, u32)>,\n}\n\n#[pallet::genesis_build]\nimpl<T: Config> BuildGenesisConfig for GenesisConfig<T> {\n    fn build(&self) {\n        // Set the initial counter value\n        CounterValue::<T>::put(self.initial_counter_value);\n\n        // Set initial user interactions\n        for (account, count) in &self.initial_user_interactions {\n            UserInteractions::<T>::insert(account, count);\n        }\n    }\n}\n\n```\n\nGenesis configuration components include the following:\n\n- **`GenesisConfig` struct**: Defines what can be configured at genesis.\n- **`#[derive(DefaultNoBound)]`**: Provides sensible defaults (empty vec and 0 for the counter).\n- **`BuildGenesisConfig` implementation**: Executes the logic to set initial storage values.\n- **`build()` method**: Called once when the blockchain initializes."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#implement-dispatchable-functions", "page_title": "Create a Custom Pallet", "index": 11, "depth": 2, "title": "Implement Dispatchable Functions", "anchor": "implement-dispatchable-functions", "start_char": 12772, "end_char": 15897, "estimated_token_count": 741, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Implement Dispatchable Functions\n\nDispatchable functions (extrinsics) allow users to interact with your pallet and trigger state changes. Each function must:\n\n- Return a [`DispatchResult`](https://paritytech.github.io/polkadot-sdk/master/frame_support/dispatch/type.DispatchResult.html).\n- Be annotated with a weight (computational cost).\n- Have an explicit call index for backward compatibility.\n\nReplace the [`#[pallet::call]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.call.html) section with:\n\n```rust title=\"src/lib.rs\"\n#[pallet::call]\nimpl<T: Config> Pallet<T> {\n    /// Set the counter to a specific value. Root origin only.\n    #[pallet::call_index(0)]\n    #[pallet::weight(0)]\n    pub fn set_counter_value(origin: OriginFor<T>, new_value: u32) -> DispatchResult {\n        // Ensure the caller is root\n        ensure_root(origin)?;\n\n        // Validate the new value doesn't exceed the maximum\n        ensure!(new_value <= T::CounterMaxValue::get(), Error::<T>::CounterMaxValueExceeded);\n\n        // Update storage\n        CounterValue::<T>::put(new_value);\n\n        // Emit event\n        Self::deposit_event(Event::CounterValueSet { new_value });\n\n        Ok(())\n    }\n\n    /// Increment the counter by a specified amount.\n    #[pallet::call_index(1)]\n    #[pallet::weight(0)]\n    pub fn increment(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n        // Ensure the caller is signed\n        let who = ensure_signed(origin)?;\n\n        // Get current counter value\n        let current_value = CounterValue::<T>::get();\n\n        // Check for overflow\n        let new_value = current_value.checked_add(amount).ok_or(Error::<T>::Overflow)?;\n\n        // Ensure new value doesn't exceed maximum\n        ensure!(new_value <= T::CounterMaxValue::get(), Error::<T>::CounterMaxValueExceeded);\n\n        // Update counter storage\n        CounterValue::<T>::put(new_value);\n\n        // Track user interaction\n        UserInteractions::<T>::mutate(&who, |count| {\n            *count = count.saturating_add(1);\n        });\n\n        // Emit event\n        Self::deposit_event(Event::CounterIncremented {\n            new_value,\n            who,\n            amount,\n        });\n\n        Ok(())\n    }\n\n    /// Decrement the counter by a specified amount.\n    #[pallet::call_index(2)]\n    #[pallet::weight(0)]\n    pub fn decrement(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n        // Ensure the caller is signed\n        let who = ensure_signed(origin)?;\n\n        // Get current counter value\n        let current_value = CounterValue::<T>::get();\n\n        // Check for underflow\n        let new_value = current_value.checked_sub(amount).ok_or(Error::<T>::Underflow)?;\n\n        // Update counter storage\n        CounterValue::<T>::put(new_value);\n\n        // Track user interaction\n        UserInteractions::<T>::mutate(&who, |count| {\n            *count = count.saturating_add(1);\n        });\n\n        // Emit event\n        Self::deposit_event(Event::CounterDecremented {\n            new_value,\n            who,\n            amount,\n        });\n\n        Ok(())\n    }\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#dispatchable-function-details", "page_title": "Create a Custom Pallet", "index": 12, "depth": 3, "title": "Dispatchable Function Details", "anchor": "dispatchable-function-details", "start_char": 15897, "end_char": 16851, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Dispatchable Function Details\n\n???+ interface \"`set_counter_value`\"\n\n    - **Access**: Root origin only (privileged operations).\n    - **Purpose**: Set counter to a specific value.\n    - **Validations**: New value must not exceed `CounterMaxValue`.\n    - **State changes**: Updates `CounterValue` storage.\n    - **Events**: Emits `CounterValueSet`.\n\n??? interface \"`increment`\"\n\n    - **Access**: Any signed account.\n    - **Purpose**: Increase counter by specified amount.\n    - **Validations**: Checks for overflow and max value compliance.\n    - **State changes**: Updates `CounterValue` and `UserInteractions`.\n    - **Events**: Emits `CounterIncremented`.\n\n??? interface \"`decrement`\"\n\n    - **Access**: Any signed account.\n    - **Purpose**: Decrease counter by specified amount.\n    - **Validations**: Checks for underflow.\n    - **State changes**: Updates `CounterValue` and `UserInteractions`.\n    - **Events**: Emits `CounterDecremented`."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#verify-pallet-compilation", "page_title": "Create a Custom Pallet", "index": 13, "depth": 2, "title": "Verify Pallet Compilation", "anchor": "verify-pallet-compilation", "start_char": 16851, "end_char": 21462, "estimated_token_count": 951, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify Pallet Compilation\n\nBefore proceeding, ensure your pallet compiles without errors by running the following command:\n\n```bash\ncargo build --package pallet-custom\n```\n\nIf you encounter errors, carefully review the code against this guide. Once the build completes successfully, your custom pallet is ready for integration.\n\n??? code \"Complete Pallet Implementation\"\n    \n    ```rust title=\"src/lib.rs\"\n    #![cfg_attr(not(feature = \"std\"), no_std)]\n    \n    extern crate alloc;\n    \n    pub use pallet::*;\n    \n    #[frame::pallet]\n    pub mod pallet {\n        use alloc::vec::Vec;\n        use frame::prelude::*;\n    \n        #[pallet::pallet]\n        pub struct Pallet<T>(_);\n    \n        #[pallet::config]\n        pub trait Config: frame_system::Config {\n            type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;\n    \n            #[pallet::constant]\n            type CounterMaxValue: Get<u32>;\n        }\n    \n        #[pallet::event]\n        #[pallet::generate_deposit(pub(super) fn deposit_event)]\n        pub enum Event<T: Config> {\n            CounterValueSet {\n                new_value: u32,\n            },\n            CounterIncremented {\n                new_value: u32,\n                who: T::AccountId,\n                amount: u32,\n            },\n            CounterDecremented {\n                new_value: u32,\n                who: T::AccountId,\n                amount: u32,\n            },\n        }\n    \n        #[pallet::error]\n        pub enum Error<T> {\n            NoneValue,\n            Overflow,\n            Underflow,\n            CounterMaxValueExceeded,\n        }\n    \n        #[pallet::storage]\n        pub type CounterValue<T> = StorageValue<_, u32, ValueQuery>;\n    \n        #[pallet::storage]\n        pub type UserInteractions<T: Config> = StorageMap<\n            _,\n            Blake2_128Concat,\n            T::AccountId,\n            u32,\n            ValueQuery\n        >;\n    \n        #[pallet::genesis_config]\n        #[derive(DefaultNoBound)]\n        pub struct GenesisConfig<T: Config> {\n            pub initial_counter_value: u32,\n            pub initial_user_interactions: Vec<(T::AccountId, u32)>,\n        }\n    \n        #[pallet::genesis_build]\n        impl<T: Config> BuildGenesisConfig for GenesisConfig<T> {\n            fn build(&self) {\n                CounterValue::<T>::put(self.initial_counter_value);\n                for (account, count) in &self.initial_user_interactions {\n                    UserInteractions::<T>::insert(account, count);\n                }\n            }\n        }\n    \n        #[pallet::call]\n        impl<T: Config> Pallet<T> {\n            #[pallet::call_index(0)]\n            #[pallet::weight(0)]\n            pub fn set_counter_value(origin: OriginFor<T>, new_value: u32) -> DispatchResult {\n                ensure_root(origin)?;\n                ensure!(new_value <= T::CounterMaxValue::get(), Error::<T>::CounterMaxValueExceeded);\n                CounterValue::<T>::put(new_value);\n                Self::deposit_event(Event::CounterValueSet { new_value });\n                Ok(())\n            }\n    \n            #[pallet::call_index(1)]\n            #[pallet::weight(0)]\n            pub fn increment(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n                let who = ensure_signed(origin)?;\n                let current_value = CounterValue::<T>::get();\n                let new_value = current_value.checked_add(amount).ok_or(Error::<T>::Overflow)?;\n                ensure!(new_value <= T::CounterMaxValue::get(), Error::<T>::CounterMaxValueExceeded);\n                CounterValue::<T>::put(new_value);\n                UserInteractions::<T>::mutate(&who, |count| {\n                    *count = count.saturating_add(1);\n                });\n                Self::deposit_event(Event::CounterIncremented { new_value, who, amount });\n                Ok(())\n            }\n    \n            #[pallet::call_index(2)]\n            #[pallet::weight(0)]\n            pub fn decrement(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n                let who = ensure_signed(origin)?;\n                let current_value = CounterValue::<T>::get();\n                let new_value = current_value.checked_sub(amount).ok_or(Error::<T>::Underflow)?;\n                CounterValue::<T>::put(new_value);\n                UserInteractions::<T>::mutate(&who, |count| {\n                    *count = count.saturating_add(1);\n                });\n                Self::deposit_event(Event::CounterDecremented { new_value, who, amount });\n                Ok(())\n            }\n        }\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#add-the-pallet-to-your-runtime", "page_title": "Create a Custom Pallet", "index": 14, "depth": 2, "title": "Add the Pallet to Your Runtime", "anchor": "add-the-pallet-to-your-runtime", "start_char": 21462, "end_char": 21588, "estimated_token_count": 25, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Add the Pallet to Your Runtime\n\nNow that your custom pallet is complete, you can integrate it into the parachain runtime."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#add-runtime-dependency", "page_title": "Create a Custom Pallet", "index": 15, "depth": 3, "title": "Add Runtime Dependency", "anchor": "add-runtime-dependency", "start_char": 21588, "end_char": 22164, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add Runtime Dependency\n\n1. In the `runtime/Cargo.toml`, add your custom pallet to the `[dependencies]` section:\n\n    ```toml title=\"runtime/Cargo.toml\"\n    [dependencies]\n    # Local dependencies\n    pallet-custom = { path = \"../pallets/pallet-custom\", default-features = false }\n    \n    # Other dependencies\n    ```\n\n2. Enable the `std` feature by adding it to the `[features]` section:\n\n    ```toml title=\"runtime/Cargo.toml\"\n    [features]\n    default = [\"std\"]\n    std = [\n        \"codec/std\",\n        \"pallet-custom/std\",\n        # ... other features\n    ]\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#implement-the-config-trait", "page_title": "Create a Custom Pallet", "index": 16, "depth": 3, "title": "Implement the Config Trait", "anchor": "implement-the-config-trait", "start_char": 22164, "end_char": 22719, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implement the Config Trait\n\nAt the end of the `runtime/src/configs/mod.rs` file, add the implementation: \n\n```rust title=\"runtime/src/configs/mod.rs\"\n/// Configure the custom counter pallet\nimpl pallet_custom::Config for Runtime {\n    type RuntimeEvent = RuntimeEvent;\n    type CounterMaxValue = ConstU32<1000>;\n}\n```\n\nThis configuration:\n\n- Links the pallet's events to the runtime's event system.\n- Sets a maximum counter value of 1000 using [`ConstU32`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/struct.ConstU32.html)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#add-to-runtime-construct", "page_title": "Create a Custom Pallet", "index": 17, "depth": 3, "title": "Add to Runtime Construct", "anchor": "add-to-runtime-construct", "start_char": 22719, "end_char": 23705, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add to Runtime Construct\n\nIn the `runtime/src/lib.rs` file, locate the [`#[frame_support::runtime]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/attr.runtime.html) section and add your pallet with a unique `pallet_index`:\n\n```rust title=\"runtime/src/lib.rs\"\n#[frame_support::runtime]\nmod runtime {\n    #[runtime::runtime]\n    #[runtime::derive(\n        RuntimeCall,\n        RuntimeEvent,\n        RuntimeError,\n        RuntimeOrigin,\n        RuntimeTask,\n        RuntimeFreezeReason,\n        RuntimeHoldReason,\n        RuntimeSlashReason,\n        RuntimeLockId,\n        RuntimeViewFunction\n    )]\n    pub struct Runtime;\n\n    #[runtime::pallet_index(0)]\n    pub type System = frame_system;\n\n    // ... other pallets\n\n    #[runtime::pallet_index(51)]\n    pub type CustomPallet = pallet_custom;\n}\n```\n\n!!!warning\n    Each pallet must have a unique index. Duplicate indices will cause compilation errors. Choose an index that doesn't conflict with existing pallets."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#configure-genesis-for-your-runtime", "page_title": "Create a Custom Pallet", "index": 18, "depth": 3, "title": "Configure Genesis for Your Runtime", "anchor": "configure-genesis-for-your-runtime", "start_char": 23705, "end_char": 24203, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Configure Genesis for Your Runtime\n\nTo set initial values for your pallet when the chain starts, you'll need to configure the genesis in your chain specification. Genesis configuration is typically done in the `node/src/chain_spec.rs` file or when generating the chain specification.\n\nFor development and testing, you can use the default values provided by the `#[derive(DefaultNoBound)]` macro. For production networks, you'll want to explicitly set these values in your chain specification."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#verify-runtime-compilation", "page_title": "Create a Custom Pallet", "index": 19, "depth": 3, "title": "Verify Runtime Compilation", "anchor": "verify-runtime-compilation", "start_char": 24203, "end_char": 24426, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify Runtime Compilation\n\nCompile the runtime to ensure everything is configured correctly:\n\n```bash\ncargo build --release\n```\n\nThis command validates all pallet configurations and prepares the build for deployment."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#run-your-chain-locally", "page_title": "Create a Custom Pallet", "index": 20, "depth": 2, "title": "Run Your Chain Locally", "anchor": "run-your-chain-locally", "start_char": 24426, "end_char": 24853, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run Your Chain Locally\n\nLaunch your parachain locally to test the new pallet functionality using the [Polkadot Omni Node](https://crates.io/crates/polkadot-omni-node). For instructions on setting up the Polkadot Omni Node and [Polkadot Chain Spec Builder](https://crates.io/crates/staging-chain-spec-builder), refer to the [Set Up a Parachain Template](/parachains/launch-a-parachain/set-up-the-parachain-template/) guide."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#generate-a-chain-specification", "page_title": "Create a Custom Pallet", "index": 21, "depth": 3, "title": "Generate a Chain Specification", "anchor": "generate-a-chain-specification", "start_char": 24853, "end_char": 25262, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Generate a Chain Specification\n\nCreate a chain specification file with the updated runtime:\n\n```bash\nchain-spec-builder create -t development \\\n--relay-chain paseo \\\n--para-id 1000 \\\n--runtime ./target/release/wbuild/parachain-template-runtime/parachain_template_runtime.compact.compressed.wasm \\\nnamed-preset development\n```\n\nThis command generates a `chain_spec.json` that includes your custom pallet."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#start-the-parachain-node", "page_title": "Create a Custom Pallet", "index": 22, "depth": 3, "title": "Start the Parachain Node", "anchor": "start-the-parachain-node", "start_char": 25262, "end_char": 25445, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Start the Parachain Node\n\nLaunch the parachain:\n\n```bash\npolkadot-omni-node --chain ./chain_spec.json --dev\n```\n\nVerify the node starts successfully and begins producing blocks."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#interact-with-your-pallet", "page_title": "Create a Custom Pallet", "index": 23, "depth": 2, "title": "Interact with Your Pallet", "anchor": "interact-with-your-pallet", "start_char": 25445, "end_char": 26201, "estimated_token_count": 228, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with Your Pallet\n\nUse the Polkadot.js Apps interface to test your pallet:\n\n1. Navigate to [Polkadot.js Apps](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/extrinsics).\n\n2. Ensure you're connected to your local node at `ws://127.0.0.1:9944`.\n\n3. Go to **Developer** > **Extrinsics**.\n\n4. Locate **customPallet** in the pallet dropdown.\n\n5. You should see the available extrinsics:\n\n    - **`increment(amount)`**: Increase the counter by a specified amount.\n    - **`decrement(amount)`**: Decrease the counter by a specified amount.\n    - **`setCounterValue(newValue)`**: Set counter to a specific value (requires sudo/root).\n\n![](/images/parachains/customize-runtime/pallet-development/create-a-pallet/create-a-pallet-01.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#key-takeaways", "page_title": "Create a Custom Pallet", "index": 24, "depth": 2, "title": "Key Takeaways", "anchor": "key-takeaways", "start_char": 26201, "end_char": 26924, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Key Takeaways\n\nYou've successfully created and integrated a custom pallet into a Polkadot SDK-based runtime. You have now successfully:\n\n- Defined runtime-specific types and constants via the `Config` trait.\n- Implemented on-chain state using `StorageValue` and `StorageMap`.\n- Created signals to communicate state changes to external systems.\n- Established clear error handling with descriptive error types.\n- Configured initial blockchain state for both production and testing.\n- Built callable functions with proper validation and access control.\n- Added the pallet to a runtime and tested it locally.\n\nThese components form the foundation for developing sophisticated blockchain logic in Polkadot SDK-based chains."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-create-a-pallet", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/create-a-pallet/#where-to-go-next", "page_title": "Create a Custom Pallet", "index": 25, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 26924, "end_char": 27272, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c5384450e6845fecfbf597dfb84bc17d60c4dd6839a05527ac6f1f945342702", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Mock Your Runtime__\n\n    ---\n\n    Learn to create a mock runtime environment for testing your pallet in isolation before integration.\n\n    [:octicons-arrow-right-24: Continue](/parachains/customize-runtime/pallet-development/mock-runtime/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#introduction", "page_title": "Mock Your Runtime", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 791, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nTesting is a critical part of pallet development. Before integrating your pallet into a full runtime, you need a way to test its functionality in isolation. A mock runtime provides a minimal, simulated blockchain environment where you can verify your pallet's logic without the overhead of running a full node.\n\nIn this guide, you'll learn how to create a mock runtime for the custom counter pallet built in the [Make a Custom Pallet](/parachains/customize-runtime/pallet-development/create-a-pallet/) guide. This mock runtime will enable you to write comprehensive unit tests that verify:\n\n- Dispatchable function behavior.\n- Storage state changes.\n- Event emission.\n- Error handling.\n- Access control and origin validation.\n- Genesis configuration."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#prerequisites", "page_title": "Mock Your Runtime", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 791, "end_char": 1156, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have:\n\n- Completed the [Make a Custom Pallet](/parachains/customize-runtime/pallet-development/create-a-pallet/) guide.\n- The custom counter pallet from the Make a Custom Pallet guide. Available in `pallets/pallet-custom`.\n- Basic understanding of [Rust testing](https://doc.rust-lang.org/book/ch11-00-testing.html)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#understand-mock-runtimes", "page_title": "Mock Your Runtime", "index": 2, "depth": 2, "title": "Understand Mock Runtimes", "anchor": "understand-mock-runtimes", "start_char": 1156, "end_char": 1690, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understand Mock Runtimes\n\nA mock runtime is a minimal implementation of the runtime environment that:\n\n- Simulates blockchain state to provide storage and state management.\n- Satisfies your pallet's `Config` trait requirements.\n- Allows isolated testing without external dependencies.\n- Supports genesis configuration to set initial blockchain state for tests.\n- Provides instant feedback on code changes for a faster development cycle.\n\nMock runtimes are used exclusively for testing and are never deployed to a live blockchain."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#create-the-mock-runtime-module", "page_title": "Mock Your Runtime", "index": 3, "depth": 2, "title": "Create the Mock Runtime Module", "anchor": "create-the-mock-runtime-module", "start_char": 1690, "end_char": 2447, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Mock Runtime Module\n\nStart by creating a new module file within your pallet to house the mock runtime code.\n\n1. Navigate to your pallet directory:\n\n    ```bash\n    cd pallets/pallet-custom/src\n    ```\n\n2. Create a new file named `mock.rs`:\n\n    ```bash\n    touch mock.rs\n    ```\n\n3. Next, open `src/lib.rs` and add the mock module declaration at the top of the file, right after the `pub use pallet::*;` line:\n\n    ```rust title=\"src/lib.rs\"\n    #![cfg_attr(not(feature = \"std\"), no_std)]\n    \n    pub use pallet::*;\n    \n    #[cfg(test)]\n    mod mock;\n    \n    #[frame::pallet]\n    pub mod pallet {\n        // ... existing pallet code\n    }\n    \n    ```\n\n    The `#[cfg(test)]` attribute ensures this module is only compiled during testing."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#set-up-basic-mock", "page_title": "Mock Your Runtime", "index": 4, "depth": 2, "title": "Set Up Basic Mock", "anchor": "set-up-basic-mock", "start_char": 2447, "end_char": 3507, "estimated_token_count": 247, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up Basic Mock\n\nOpen `src/mock.rs` and add the foundational imports and type definitions:\n\n```rust title=\"src/mock.rs\"\nuse crate as pallet_custom;\nuse frame::{\n    deps::{\n        frame_support::{ derive_impl, traits::ConstU32 },\n        sp_io,\n        sp_runtime::{ traits::IdentityLookup, BuildStorage },\n    },\n    prelude::*,\n};\n\ntype Block = frame_system::mocking::MockBlock<Test>;\n\n// Configure a mock runtime to test the pallet.\nframe::deps::frame_support::construct_runtime!(\n        pub enum Test\n        {\n            System: frame_system,\n            CustomPallet: pallet_custom,\n        }\n    );\n```\n\nThe preceding code includes the following key components: \n\n- **[`construct_runtime!`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_frame/runtime/apis/trait.ConstructRuntimeApi.html#tymethod.construct_runtime_api)**: Macro that builds a minimal runtime with only the pallets needed for testing.\n- **`Test`**: The mock runtime type used in tests.\n- **`Block`**: Type alias for the mock block type that the runtime will use."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#implement-essential-configuration", "page_title": "Mock Your Runtime", "index": 5, "depth": 2, "title": "Implement Essential Configuration", "anchor": "implement-essential-configuration", "start_char": 3507, "end_char": 4590, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Implement Essential Configuration\n\nThe [`frame_system`](https://paritytech.github.io/polkadot-sdk/master/frame_system/index.html) pallet provides core blockchain functionality and is required by all other pallets. Configure it for the test environment as follows:\n\n```rust title=\"src/mock.rs\"\n#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]\nimpl frame_system::Config for Test {\n    type Block = Block;\n    type AccountId = u64;\n    type Lookup = IdentityLookup<Self::AccountId>;\n}\n```\n\nThis simplified configuration for testing includes the following:\n\n- **`#[derive_impl]`**: Automatically provides sensible test defaults for most `frame_system::Config` types.\n- **`AccountId = u64`**: Uses simple integers instead of cryptographic account IDs.\n- **`Lookup = IdentityLookup`**: Direct account ID mapping (no address conversion).\n- **`Block = Block`**: Uses the mock block type we defined earlier.\n\nThis approach is much more concise than manually specifying every configuration type, as the `TestDefaultConfig` preset provides appropriate defaults for testing."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#implement-your-pallets-configuration", "page_title": "Mock Your Runtime", "index": 6, "depth": 2, "title": "Implement Your Pallet's Configuration", "anchor": "implement-your-pallets-configuration", "start_char": 4590, "end_char": 5265, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Implement Your Pallet's Configuration\n\nNow implement the `Config` trait for your custom pallet. This trait must match the one defined in your pallet's `src/lib.rs`:\n\n```rust title=\"src/mock.rs\"\nimpl pallet_custom::Config for Test {\n    type RuntimeEvent = RuntimeEvent;\n    type CounterMaxValue = ConstU32<1000>;\n}\n```\n\nConfiguration details include:\n\n- **`RuntimeEvent`**: Connects your pallet's events to the mock runtime's event system.\n- **`CounterMaxValue`**: Sets the maximum counter value to 1000, matching the production configuration.\n\nThe configuration here should mirror what you'll use in production unless you specifically need different values for testing."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#configure-genesis-storage", "page_title": "Mock Your Runtime", "index": 7, "depth": 2, "title": "Configure Genesis Storage", "anchor": "configure-genesis-storage", "start_char": 5265, "end_char": 5549, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Genesis Storage\n\nGenesis storage defines the initial state of your blockchain before any blocks are produced. Since your counter pallet includes the genesis configuration (added in the previous guide), you can now set up test environments with different initial states."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#basic-test-environment", "page_title": "Mock Your Runtime", "index": 8, "depth": 3, "title": "Basic Test Environment", "anchor": "basic-test-environment", "start_char": 5549, "end_char": 6176, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Basic Test Environment\n\nCreate a helper function for the default test environment:\n\n```rust title=\"src/mock.rs\"\n// Build genesis storage according to the mock runtime.\npub fn new_test_ext() -> sp_io::TestExternalities {\n    let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();\n\n    (pallet_custom::GenesisConfig::<Test> {\n        initial_counter_value: 0,\n        initial_user_interactions: vec![],\n    })\n        .assimilate_storage(&mut t)\n        .unwrap();\n\n    t.into()\n}\n```\n\nThis function creates a clean blockchain state with an initial counter value of 0 and no user interactions."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#custom-genesis-configurations", "page_title": "Mock Your Runtime", "index": 9, "depth": 3, "title": "Custom Genesis Configurations", "anchor": "custom-genesis-configurations", "start_char": 6176, "end_char": 7836, "estimated_token_count": 361, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Custom Genesis Configurations\n\nFor testing specific scenarios, create additional helper functions with customized genesis states:\n\n```rust title=\"src/mock.rs\"\n// Helper function to create a test externalities with a specific initial counter value\npub fn new_test_ext_with_counter(initial_value: u32) -> sp_io::TestExternalities {\n    let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();\n\n    (pallet_custom::GenesisConfig::<Test> {\n        initial_counter_value: initial_value,\n        initial_user_interactions: vec![],\n    })\n        .assimilate_storage(&mut t)\n        .unwrap();\n\n    t.into()\n}\n\n// Helper function to create a test externalities with initial user interactions\npub fn new_test_ext_with_interactions(\n    initial_value: u32,\n    interactions: Vec<(u64, u32)>\n) -> sp_io::TestExternalities {\n    let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();\n\n    (pallet_custom::GenesisConfig::<Test> {\n        initial_counter_value: initial_value,\n        initial_user_interactions: interactions,\n    })\n        .assimilate_storage(&mut t)\n        .unwrap();\n\n    t.into()\n}\n```\n\nKey methods used in this step include:\n\n- **[`BuildStorage::build_storage()`](https://paritytech.github.io/polkadot-sdk/master/sp_runtime/trait.BuildStorage.html#method.build_storage)**: Creates the initial storage state.\n- **[`assimilate_storage`](https://paritytech.github.io/polkadot-sdk/master/sp_runtime/trait.BuildStorage.html#method.assimilate_storage)**: Merges pallet genesis config into the existing storage.\n\nYou can chain multiple `assimilate_storage` calls to configure multiple pallets."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#verify-mock-compilation", "page_title": "Mock Your Runtime", "index": 10, "depth": 2, "title": "Verify Mock Compilation", "anchor": "verify-mock-compilation", "start_char": 7836, "end_char": 10810, "estimated_token_count": 564, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify Mock Compilation\n\nBefore proceeding to write tests, ensure your mock runtime compiles correctly:\n\n```bash\ncargo test --package pallet-custom --lib\n```\n\nThis command compiles the test code (including the mock and genesis configuration) without running tests yet. Address any compilation errors before continuing.\n\n??? code \"Complete mock runtime script\"\n\n    Here's the complete `mock.rs` file for reference:\n\n    ```rust title=\"src/mock.rs\"\n    use crate as pallet_custom;\n    use frame::{\n        deps::{\n            frame_support::{ derive_impl, traits::ConstU32 },\n            sp_io,\n            sp_runtime::{ traits::IdentityLookup, BuildStorage },\n        },\n        prelude::*,\n    };\n    \n    type Block = frame_system::mocking::MockBlock<Test>;\n    \n    // Configure a mock runtime to test the pallet.\n    frame::deps::frame_support::construct_runtime!(\n            pub enum Test\n            {\n                System: frame_system,\n                CustomPallet: pallet_custom,\n            }\n        );\n    \n    #[derive_impl(frame_system::config_preludes::TestDefaultConfig)]\n    impl frame_system::Config for Test {\n        type Block = Block;\n        type AccountId = u64;\n        type Lookup = IdentityLookup<Self::AccountId>;\n    }\n    \n    impl pallet_custom::Config for Test {\n        type RuntimeEvent = RuntimeEvent;\n        type CounterMaxValue = ConstU32<1000>;\n    }\n    \n    // Build genesis storage according to the mock runtime.\n    pub fn new_test_ext() -> sp_io::TestExternalities {\n        let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();\n    \n        (pallet_custom::GenesisConfig::<Test> {\n            initial_counter_value: 0,\n            initial_user_interactions: vec![],\n        })\n            .assimilate_storage(&mut t)\n            .unwrap();\n    \n        t.into()\n    }\n    \n    // Helper function to create a test externalities with a specific initial counter value\n    pub fn new_test_ext_with_counter(initial_value: u32) -> sp_io::TestExternalities {\n        let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();\n    \n        (pallet_custom::GenesisConfig::<Test> {\n            initial_counter_value: initial_value,\n            initial_user_interactions: vec![],\n        })\n            .assimilate_storage(&mut t)\n            .unwrap();\n    \n        t.into()\n    }\n    \n    // Helper function to create a test externalities with initial user interactions\n    pub fn new_test_ext_with_interactions(\n        initial_value: u32,\n        interactions: Vec<(u64, u32)>\n    ) -> sp_io::TestExternalities {\n        let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();\n    \n        (pallet_custom::GenesisConfig::<Test> {\n            initial_counter_value: initial_value,\n            initial_user_interactions: interactions,\n        })\n            .assimilate_storage(&mut t)\n            .unwrap();\n    \n        t.into()\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#key-takeaways", "page_title": "Mock Your Runtime", "index": 11, "depth": 2, "title": "Key Takeaways", "anchor": "key-takeaways", "start_char": 10810, "end_char": 11373, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Key Takeaways\n\nYou've successfully created a mock runtime with a genesis configuration for your custom pallet. You can now:\n\n- Test your pallet without a full runtime.\n- Set initial blockchain state for different test scenarios.\n- Create different genesis setups for various testing needs.\n- Use this minimal setup to test all pallet functionality.\n\nThe mock runtime with a genesis configuration is essential for test-driven development, enabling you to verify logic under different initial conditions before integrating it into the actual parachain runtime."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-mock-runtime", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/mock-runtime/#where-to-go-next", "page_title": "Mock Your Runtime", "index": 12, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 11373, "end_char": 11722, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60e3e2bd011b991208e52617236938e29a59fd459a5ad575be449bdfb57d9b15", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Pallet Unit Testing__\n\n    ---\n\n    Learn to write comprehensive unit tests for your pallet using the mock runtime you just created.\n\n    [:octicons-arrow-right-24: Continue](/parachains/customize-runtime/pallet-development/pallet-testing/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#introduction", "page_title": "Unit Test Pallets", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 685, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nUnit testing in the Polkadot SDK helps ensure that the functions provided by a pallet behave as expected. It also confirms that data and events associated with a pallet are processed correctly during interactions. With your mock runtime in place from the [previous guide](/parachains/customize-runtime/pallet-development/mock-runtime/), you can now write comprehensive tests that verify your pallet's behavior in isolation.\n\nIn this guide, you'll learn how to:\n\n- Structure test modules effectively.\n- Test dispatchable functions.\n- Verify storage changes.\n- Check event emission.\n- Test error conditions.\n- Use genesis configurations in tests."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#prerequisites", "page_title": "Unit Test Pallets", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 685, "end_char": 1132, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you:\n\n- Completed the [Make a Custom Pallet](/parachains/customize-runtime/pallet-development/create-a-pallet/) guide.\n- Completed the [Mock Your Runtime](/parachains/customize-runtime/pallet-development/mock-runtime/) guide.\n- Configured custom counter pallet with mock runtime in `pallets/pallet-custom`.\n- Understood the basics of [Rust testing](https://doc.rust-lang.org/book/ch11-00-testing.html)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#understanding-frame-testing-tools", "page_title": "Unit Test Pallets", "index": 2, "depth": 2, "title": "Understanding FRAME Testing Tools", "anchor": "understanding-frame-testing-tools", "start_char": 1132, "end_char": 1328, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understanding FRAME Testing Tools\n\nFRAME (Framework for Runtime Aggregation of Modularized Entities) provides specialized testing macros and utilities that make pallet testing more efficient."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#assertion-macros", "page_title": "Unit Test Pallets", "index": 3, "depth": 3, "title": "Assertion Macros", "anchor": "assertion-macros", "start_char": 1328, "end_char": 2025, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Assertion Macros\n\n- **[`assert_ok!`](https://paritytech.github.io/polkadot-sdk/master/frame_support/macro.assert_ok.html)** - Asserts that a dispatchable call succeeds.\n- **[`assert_noop!`](https://paritytech.github.io/polkadot-sdk/master/frame_support/macro.assert_noop.html)** - Asserts that a call fails without changing state (no operation).\n- **[`assert_eq!`](https://doc.rust-lang.org/std/macro.assert_eq.html)** - Standard Rust equality assertion.\n\n!!!info \"`assert_noop!` Explained\"\n    Use `assert_noop!` to ensure the operation fails without any state changes. This is critical for testing error conditions - it verifies both that the error occurs AND that no storage was modified."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#system-pallet-test-helpers", "page_title": "Unit Test Pallets", "index": 4, "depth": 3, "title": "System Pallet Test Helpers", "anchor": "system-pallet-test-helpers", "start_char": 2025, "end_char": 2957, "estimated_token_count": 255, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### System Pallet Test Helpers\n\nThe [`frame_system`](https://paritytech.github.io/polkadot-sdk/master/frame_system/index.html) pallet provides useful methods for testing:\n\n- **[`System::events()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.events)** - Returns all events emitted during the test.\n- **[`System::assert_last_event()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.assert_last_event)** - Asserts the last event matches expectations.\n- **[`System::set_block_number()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.set_block_number)** - Sets the current block number.\n\n!!!info \"Events and Block Number\"\n    Events are not emitted on block 0 (genesis block). If you need to test events, ensure you set the block number to at least 1 using `System::set_block_number(1)`."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#origin-types", "page_title": "Unit Test Pallets", "index": 5, "depth": 3, "title": "Origin Types", "anchor": "origin-types", "start_char": 2957, "end_char": 3684, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Origin Types\n\n- **[`RuntimeOrigin::root()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/enum.RawOrigin.html#variant.Root)** - Root/sudo origin for privileged operations.\n- **[`RuntimeOrigin::signed(account)`](https://paritytech.github.io/polkadot-sdk/master/frame_system/enum.RawOrigin.html#variant.Signed)** - Signed origin from a specific account.\n- **[`RuntimeOrigin::none()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/enum.RawOrigin.html#variant.None)** - No origin (typically fails for most operations).\n\nLearn more about origins in the [FRAME Origin reference document](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/frame_origin/index.html)."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#create-the-tests-module", "page_title": "Unit Test Pallets", "index": 6, "depth": 2, "title": "Create the Tests Module", "anchor": "create-the-tests-module", "start_char": 3684, "end_char": 4291, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Tests Module\n\nCreate a new file for your tests within the pallet directory:\n\n1. Navigate to your pallet directory:\n\n    ```bash\n    cd pallets/pallet-custom/src\n    ```\n\n2. Create a new file named `tests.rs`:\n\n    ```bash\n    touch tests.rs\n    ```\n\n3. Open `src/lib.rs` and add the tests module declaration after the mock module:\n\n    ```rust title=\"src/lib.rs\"\n    #![cfg_attr(not(feature = \"std\"), no_std)]\n\n    pub use pallet::*;\n\n    #[cfg(test)]\n    mod mock;\n\n    #[cfg(test)]\n    mod tests;\n\n    #[frame::pallet]\n    pub mod pallet {\n        // ... existing pallet code\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#set-up-the-test-module", "page_title": "Unit Test Pallets", "index": 7, "depth": 2, "title": "Set Up the Test Module", "anchor": "set-up-the-test-module", "start_char": 4291, "end_char": 9087, "estimated_token_count": 1024, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Test Module\n\nOpen `src/tests.rs` and add the basic structure with necessary imports:\n\n```rust\nuse crate::{mock::*, Error, Event};\nuse frame::deps::frame_support::{assert_noop, assert_ok};\nuse frame::deps::sp_runtime::DispatchError;\n```\n\nThis setup imports:\n\n- The mock runtime and test utilities from `mock.rs`\n- Your pallet's `Error` and `Event` types\n- FRAME's assertion macros via `frame::deps`\n- `DispatchError` for testing origin checks\n\n???+ code \"Complete Pallet Code Reference\"\n    Here's the complete pallet code that you'll be testing throughout this guide:\n\n    ```rust\n    #![cfg_attr(not(feature = \"std\"), no_std)]\n    \n    extern crate alloc;\n    \n    pub use pallet::*;\n    \n    #[frame::pallet]\n    pub mod pallet {\n        use alloc::vec::Vec;\n        use frame::prelude::*;\n    \n        #[pallet::pallet]\n        pub struct Pallet<T>(_);\n    \n        #[pallet::config]\n        pub trait Config: frame_system::Config {\n            type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;\n    \n            #[pallet::constant]\n            type CounterMaxValue: Get<u32>;\n        }\n    \n        #[pallet::event]\n        #[pallet::generate_deposit(pub(super) fn deposit_event)]\n        pub enum Event<T: Config> {\n            CounterValueSet {\n                new_value: u32,\n            },\n            CounterIncremented {\n                new_value: u32,\n                who: T::AccountId,\n                amount: u32,\n            },\n            CounterDecremented {\n                new_value: u32,\n                who: T::AccountId,\n                amount: u32,\n            },\n        }\n    \n        #[pallet::error]\n        pub enum Error<T> {\n            NoneValue,\n            Overflow,\n            Underflow,\n            CounterMaxValueExceeded,\n        }\n    \n        #[pallet::storage]\n        pub type CounterValue<T> = StorageValue<_, u32, ValueQuery>;\n    \n        #[pallet::storage]\n        pub type UserInteractions<T: Config> = StorageMap<\n            _,\n            Blake2_128Concat,\n            T::AccountId,\n            u32,\n            ValueQuery\n        >;\n    \n        #[pallet::genesis_config]\n        #[derive(DefaultNoBound)]\n        pub struct GenesisConfig<T: Config> {\n            pub initial_counter_value: u32,\n            pub initial_user_interactions: Vec<(T::AccountId, u32)>,\n        }\n    \n        #[pallet::genesis_build]\n        impl<T: Config> BuildGenesisConfig for GenesisConfig<T> {\n            fn build(&self) {\n                CounterValue::<T>::put(self.initial_counter_value);\n                for (account, count) in &self.initial_user_interactions {\n                    UserInteractions::<T>::insert(account, count);\n                }\n            }\n        }\n    \n        #[pallet::call]\n        impl<T: Config> Pallet<T> {\n            #[pallet::call_index(0)]\n            #[pallet::weight(0)]\n            pub fn set_counter_value(origin: OriginFor<T>, new_value: u32) -> DispatchResult {\n                ensure_root(origin)?;\n                ensure!(new_value <= T::CounterMaxValue::get(), Error::<T>::CounterMaxValueExceeded);\n                CounterValue::<T>::put(new_value);\n                Self::deposit_event(Event::CounterValueSet { new_value });\n                Ok(())\n            }\n    \n            #[pallet::call_index(1)]\n            #[pallet::weight(0)]\n            pub fn increment(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n                let who = ensure_signed(origin)?;\n                let current_value = CounterValue::<T>::get();\n                let new_value = current_value.checked_add(amount).ok_or(Error::<T>::Overflow)?;\n                ensure!(new_value <= T::CounterMaxValue::get(), Error::<T>::CounterMaxValueExceeded);\n                CounterValue::<T>::put(new_value);\n                UserInteractions::<T>::mutate(&who, |count| {\n                    *count = count.saturating_add(1);\n                });\n                Self::deposit_event(Event::CounterIncremented { new_value, who, amount });\n                Ok(())\n            }\n    \n            #[pallet::call_index(2)]\n            #[pallet::weight(0)]\n            pub fn decrement(origin: OriginFor<T>, amount: u32) -> DispatchResult {\n                let who = ensure_signed(origin)?;\n                let current_value = CounterValue::<T>::get();\n                let new_value = current_value.checked_sub(amount).ok_or(Error::<T>::Underflow)?;\n                CounterValue::<T>::put(new_value);\n                UserInteractions::<T>::mutate(&who, |count| {\n                    *count = count.saturating_add(1);\n                });\n                Self::deposit_event(Event::CounterDecremented { new_value, who, amount });\n                Ok(())\n            }\n        }\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#write-your-first-test", "page_title": "Unit Test Pallets", "index": 8, "depth": 2, "title": "Write Your First Test", "anchor": "write-your-first-test", "start_char": 9087, "end_char": 9195, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Write Your First Test\n\nLet's start with a simple test to verify the increment function works correctly."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-basic-increment", "page_title": "Unit Test Pallets", "index": 9, "depth": 3, "title": "Test Basic Increment", "anchor": "test-basic-increment", "start_char": 9195, "end_char": 10273, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test Basic Increment\n\nTest that the increment function increases counter value and emits events.\n\n```rust\n#[test]\nfn increment_works() {\n    new_test_ext().execute_with(|| {\n        // Set block number to 1 so events are registered\n        System::set_block_number(1);\n\n        let account = 1u64;\n\n        // Increment by 50\n        assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account), 50));\n        assert_eq!(crate::CounterValue::<Test>::get(), 50);\n\n        // Check event was emitted\n        System::assert_last_event(\n            Event::CounterIncremented {\n                new_value: 50,\n                who: account,\n                amount: 50,\n            }\n            .into(),\n        );\n\n        // Check user interactions were tracked\n        assert_eq!(crate::UserInteractions::<Test>::get(account), 1);\n    });\n}\n```\n\nRun your first test:\n\n```bash\ncargo test --package pallet-custom increment_works\n```\n\nYou should see:\n\n```\nrunning 1 test\ntest tests::increment_works ... ok\n```\n\nCongratulations! You've written and run your first pallet test."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-error-conditions", "page_title": "Unit Test Pallets", "index": 10, "depth": 2, "title": "Test Error Conditions", "anchor": "test-error-conditions", "start_char": 10273, "end_char": 10418, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Error Conditions\n\nNow let's test that our pallet correctly handles errors. Error testing is crucial to ensure your pallet fails safely."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-overflow-protection", "page_title": "Unit Test Pallets", "index": 11, "depth": 3, "title": "Test Overflow Protection", "anchor": "test-overflow-protection", "start_char": 10418, "end_char": 10933, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test Overflow Protection\n\nTest that incrementing at u32::MAX fails with Overflow error.\n\n```rust\n#[test]\nfn increment_fails_on_overflow() {\n    new_test_ext_with_counter(u32::MAX).execute_with(|| {\n        // Attempt to increment when at max u32 should fail\n        assert_noop!(\n            CustomPallet::increment(RuntimeOrigin::signed(1), 1),\n            Error::<Test>::Overflow\n        );\n    });\n}\n```\n\nTest overflow protection:\n\n```bash\ncargo test --package pallet-custom increment_fails_on_overflow\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-underflow-protection", "page_title": "Unit Test Pallets", "index": 12, "depth": 3, "title": "Test Underflow Protection", "anchor": "test-underflow-protection", "start_char": 10933, "end_char": 11445, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test Underflow Protection\n\nTest that decrementing below zero fails with Underflow error.\n\n```rust\n#[test]\nfn decrement_fails_on_underflow() {\n    new_test_ext_with_counter(10).execute_with(|| {\n        // Attempt to decrement below zero should fail\n        assert_noop!(\n            CustomPallet::decrement(RuntimeOrigin::signed(1), 11),\n            Error::<Test>::Underflow\n        );\n    });\n}\n```\n\nVerify underflow protection:\n\n```bash\ncargo test --package pallet-custom decrement_fails_on_underflow\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-access-control", "page_title": "Unit Test Pallets", "index": 13, "depth": 2, "title": "Test Access Control", "anchor": "test-access-control", "start_char": 11445, "end_char": 11549, "estimated_token_count": 17, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Access Control\n\nVerify that origin checks work correctly and unauthorized access is prevented."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-root-only-access", "page_title": "Unit Test Pallets", "index": 14, "depth": 3, "title": "Test Root-Only Access", "anchor": "test-root-only-access", "start_char": 11549, "end_char": 12314, "estimated_token_count": 164, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test Root-Only Access\n\nTest that set_counter_value requires root origin and rejects signed origins.\n\n```rust\n#[test]\nfn set_counter_value_requires_root() {\n    new_test_ext().execute_with(|| {\n        let alice = 1u64;\n\n        // When: non-root user tries to set counter\n        // Then: should fail with BadOrigin\n        assert_noop!(\n            CustomPallet::set_counter_value(RuntimeOrigin::signed(alice), 100),\n            DispatchError::BadOrigin\n        );\n\n        // But root should succeed\n        assert_ok!(CustomPallet::set_counter_value(RuntimeOrigin::root(), 100));\n        assert_eq!(crate::CounterValue::<Test>::get(), 100);\n    });\n}\n```\n\nTest access control:\n\n```bash\ncargo test --package pallet-custom set_counter_value_requires_root\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-event-emission", "page_title": "Unit Test Pallets", "index": 15, "depth": 2, "title": "Test Event Emission", "anchor": "test-event-emission", "start_char": 12314, "end_char": 12401, "estimated_token_count": 16, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Event Emission\n\nVerify that events are emitted correctly with the right data."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-event-data", "page_title": "Unit Test Pallets", "index": 16, "depth": 3, "title": "Test Event Data", "anchor": "test-event-data", "start_char": 12401, "end_char": 13581, "estimated_token_count": 264, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test Event Data\n\nThe [`increment_works`](/parachains/customize-runtime/pallet-development/pallet-testing/#test-basic-increment) test (shown earlier) already demonstrates event testing by:\n\n1. Setting the block number to 1 to enable event emission.\n2. Calling the dispatchable function.\n3. Using `System::assert_last_event()` to verify the correct event was emitted with expected data.\n\nThis pattern applies to all dispatchables that emit events. For a dedicated event-only test focusing on the `set_counter_value` function:\n\nTest that set_counter_value updates storage and emits correct event.\n\n```rust\n#[test]\nfn set_counter_value_works() {\n    new_test_ext().execute_with(|| {\n        // Set block number to 1 so events are registered\n        System::set_block_number(1);\n\n        // Set counter to 100\n        assert_ok!(CustomPallet::set_counter_value(RuntimeOrigin::root(), 100));\n        assert_eq!(crate::CounterValue::<Test>::get(), 100);\n\n        // Check event was emitted\n        System::assert_last_event(Event::CounterValueSet { new_value: 100 }.into());\n    });\n}\n```\n\nRun the event test:\n\n```bash\ncargo test --package pallet-custom set_counter_value_works\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-genesis-configuration", "page_title": "Unit Test Pallets", "index": 17, "depth": 2, "title": "Test Genesis Configuration", "anchor": "test-genesis-configuration", "start_char": 13581, "end_char": 13664, "estimated_token_count": 12, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Genesis Configuration\n\nVerify that genesis configuration works correctly."}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#test-genesis-setup", "page_title": "Unit Test Pallets", "index": 18, "depth": 3, "title": "Test Genesis Setup", "anchor": "test-genesis-setup", "start_char": 13664, "end_char": 14283, "estimated_token_count": 160, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test Genesis Setup\n\nTest that genesis configuration correctly initializes counter and user interactions.\n\n```rust\n#[test]\nfn genesis_config_works() {\n    new_test_ext_with_interactions(42, vec![(1, 5), (2, 10)]).execute_with(|| {\n        // Check initial counter value\n        assert_eq!(crate::CounterValue::<Test>::get(), 42);\n\n        // Check initial user interactions\n        assert_eq!(crate::UserInteractions::<Test>::get(1), 5);\n        assert_eq!(crate::UserInteractions::<Test>::get(2), 10);\n    });\n}\n```\n\nTest genesis configuration:\n\n```bash\ncargo test --package pallet-custom genesis_config_works\n```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#run-all-tests", "page_title": "Unit Test Pallets", "index": 19, "depth": 2, "title": "Run All Tests", "anchor": "run-all-tests", "start_char": 14283, "end_char": 24623, "estimated_token_count": 2250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run All Tests\n\nNow run all your tests together:\n\n```bash\ncargo test --package pallet-custom\n```\n\nYou should see all tests passing:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\">$ cargo test --package pallet-custom</span>\n  <span data-ty>running 15 tests</span>\n  <span data-ty>test mock::__construct_runtime_integrity_test::runtime_integrity_tests ... ok</span>\n  <span data-ty>test mock::test_genesis_config_builds ... ok</span>\n  <span data-ty>test tests::decrement_fails_on_underflow ... ok</span>\n  <span data-ty>test tests::decrement_tracks_multiple_interactions ... ok</span>\n  <span data-ty>test tests::decrement_works ... ok</span>\n  <span data-ty>test tests::different_users_tracked_separately ... ok</span>\n  <span data-ty>test tests::genesis_config_works ... ok</span>\n  <span data-ty>test tests::increment_fails_on_overflow ... ok</span>\n  <span data-ty>test tests::increment_respects_max_value ... ok</span>\n  <span data-ty>test tests::increment_tracks_multiple_interactions ... ok</span>\n  <span data-ty>test tests::increment_works ... ok</span>\n  <span data-ty>test tests::mixed_increment_and_decrement_works ... ok</span>\n  <span data-ty>test tests::set_counter_value_requires_root ... ok</span>\n  <span data-ty>test tests::set_counter_value_respects_max_value ... ok</span>\n  <span data-ty>test tests::set_counter_value_works ... ok</span>\n  <span data-ty></span>\n  <span data-ty>test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out</span>\n</div>\n\n!!!note \"Mock Runtime Tests\"\n    You'll notice 2 additional tests from the `mock` module:\n\n    - `mock::__construct_runtime_integrity_test::runtime_integrity_tests` - Auto-generated test that validates runtime construction\n    - `mock::test_genesis_config_builds` - Validates that genesis configuration builds correctly\n\n    These tests are automatically generated from your mock runtime setup and help ensure the test environment itself is valid.\n\nCongratulations! You have a well-tested pallet covering the essential testing patterns!\n\nThese tests demonstrate comprehensive coverage including basic operations, error conditions, access control, event emission, state management, and genesis configuration. As you build more complex pallets, you'll apply these same patterns to test additional functionality.\n\n??? code \"Full Test Suite Code\"\n    Here's the complete `tests.rs` file for quick reference:\n\n    ```rust\n    use crate::{mock::*, Error, Event};\n    use frame::deps::frame_support::{assert_noop, assert_ok};\n    use frame::deps::sp_runtime::DispatchError;\n\n    #[test]\n    fn set_counter_value_works() {\n        new_test_ext().execute_with(|| {\n            // Set block number to 1 so events are registered\n            System::set_block_number(1);\n\n            // Set counter to 100\n            assert_ok!(CustomPallet::set_counter_value(RuntimeOrigin::root(), 100));\n            assert_eq!(crate::CounterValue::<Test>::get(), 100);\n\n            // Check event was emitted\n            System::assert_last_event(Event::CounterValueSet { new_value: 100 }.into());\n        });\n    }\n\n    #[test]\n    fn set_counter_value_requires_root() {\n        new_test_ext().execute_with(|| {\n            // Attempt to set counter with non-root origin should fail\n            assert_noop!(\n                CustomPallet::set_counter_value(RuntimeOrigin::signed(1), 100),\n                DispatchError::BadOrigin\n            );\n        });\n    }\n\n    #[test]\n    fn set_counter_value_respects_max_value() {\n        new_test_ext().execute_with(|| {\n            // Attempt to set counter above max value (1000) should fail\n            assert_noop!(\n                CustomPallet::set_counter_value(RuntimeOrigin::root(), 1001),\n                Error::<Test>::CounterMaxValueExceeded\n            );\n\n            // Setting to exactly max value should work\n            assert_ok!(CustomPallet::set_counter_value(RuntimeOrigin::root(), 1000));\n            assert_eq!(crate::CounterValue::<Test>::get(), 1000);\n        });\n    }\n\n    #[test]\n    fn increment_works() {\n        new_test_ext().execute_with(|| {\n            // Set block number to 1 so events are registered\n            System::set_block_number(1);\n\n            let account = 1u64;\n\n            // Increment by 50\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account), 50));\n            assert_eq!(crate::CounterValue::<Test>::get(), 50);\n\n            // Check event was emitted\n            System::assert_last_event(\n                Event::CounterIncremented {\n                    new_value: 50,\n                    who: account,\n                    amount: 50,\n                }\n                .into(),\n            );\n\n            // Check user interactions were tracked\n            assert_eq!(crate::UserInteractions::<Test>::get(account), 1);\n        });\n    }\n\n    #[test]\n    fn increment_tracks_multiple_interactions() {\n        new_test_ext().execute_with(|| {\n            let account = 1u64;\n\n            // Increment multiple times\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account), 10));\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account), 20));\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account), 30));\n\n            // Check counter value\n            assert_eq!(crate::CounterValue::<Test>::get(), 60);\n\n            // Check user interactions were tracked (should be 3)\n            assert_eq!(crate::UserInteractions::<Test>::get(account), 3);\n        });\n    }\n\n    #[test]\n    fn increment_fails_on_overflow() {\n        new_test_ext_with_counter(u32::MAX).execute_with(|| {\n            // Attempt to increment when at max u32 should fail\n            assert_noop!(\n                CustomPallet::increment(RuntimeOrigin::signed(1), 1),\n                Error::<Test>::Overflow\n            );\n        });\n    }\n\n    #[test]\n    fn increment_respects_max_value() {\n        new_test_ext_with_counter(950).execute_with(|| {\n            // Incrementing past max value (1000) should fail\n            assert_noop!(\n                CustomPallet::increment(RuntimeOrigin::signed(1), 51),\n                Error::<Test>::CounterMaxValueExceeded\n            );\n\n            // Incrementing to exactly max value should work\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(1), 50));\n            assert_eq!(crate::CounterValue::<Test>::get(), 1000);\n        });\n    }\n\n    #[test]\n    fn decrement_works() {\n        new_test_ext_with_counter(100).execute_with(|| {\n            // Set block number to 1 so events are registered\n            System::set_block_number(1);\n\n            let account = 2u64;\n\n            // Decrement by 30\n            assert_ok!(CustomPallet::decrement(RuntimeOrigin::signed(account), 30));\n            assert_eq!(crate::CounterValue::<Test>::get(), 70);\n\n            // Check event was emitted\n            System::assert_last_event(\n                Event::CounterDecremented {\n                    new_value: 70,\n                    who: account,\n                    amount: 30,\n                }\n                .into(),\n            );\n\n            // Check user interactions were tracked\n            assert_eq!(crate::UserInteractions::<Test>::get(account), 1);\n        });\n    }\n\n    #[test]\n    fn decrement_fails_on_underflow() {\n        new_test_ext_with_counter(10).execute_with(|| {\n            // Attempt to decrement below zero should fail\n            assert_noop!(\n                CustomPallet::decrement(RuntimeOrigin::signed(1), 11),\n                Error::<Test>::Underflow\n            );\n        });\n    }\n\n    #[test]\n    fn decrement_tracks_multiple_interactions() {\n        new_test_ext_with_counter(100).execute_with(|| {\n            let account = 3u64;\n\n            // Decrement multiple times\n            assert_ok!(CustomPallet::decrement(RuntimeOrigin::signed(account), 10));\n            assert_ok!(CustomPallet::decrement(RuntimeOrigin::signed(account), 20));\n\n            // Check counter value\n            assert_eq!(crate::CounterValue::<Test>::get(), 70);\n\n            // Check user interactions were tracked (should be 2)\n            assert_eq!(crate::UserInteractions::<Test>::get(account), 2);\n        });\n    }\n\n    #[test]\n    fn mixed_increment_and_decrement_works() {\n        new_test_ext_with_counter(50).execute_with(|| {\n            let account = 4u64;\n\n            // Mix of increment and decrement\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account), 25));\n            assert_eq!(crate::CounterValue::<Test>::get(), 75);\n\n            assert_ok!(CustomPallet::decrement(RuntimeOrigin::signed(account), 15));\n            assert_eq!(crate::CounterValue::<Test>::get(), 60);\n\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account), 10));\n            assert_eq!(crate::CounterValue::<Test>::get(), 70);\n\n            // Check user interactions were tracked (should be 3)\n            assert_eq!(crate::UserInteractions::<Test>::get(account), 3);\n        });\n    }\n\n    #[test]\n    fn different_users_tracked_separately() {\n        new_test_ext().execute_with(|| {\n            let account1 = 1u64;\n            let account2 = 2u64;\n\n            // User 1 increments\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account1), 10));\n            assert_ok!(CustomPallet::increment(RuntimeOrigin::signed(account1), 10));\n\n            // User 2 decrements\n            assert_ok!(CustomPallet::decrement(RuntimeOrigin::signed(account2), 5));\n\n            // Check counter value (10 + 10 - 5 = 15)\n            assert_eq!(crate::CounterValue::<Test>::get(), 15);\n\n            // Check user interactions are tracked separately\n            assert_eq!(crate::UserInteractions::<Test>::get(account1), 2);\n            assert_eq!(crate::UserInteractions::<Test>::get(account2), 1);\n        });\n    }\n\n    #[test]\n    fn genesis_config_works() {\n        new_test_ext_with_interactions(42, vec![(1, 5), (2, 10)]).execute_with(|| {\n            // Check initial counter value\n            assert_eq!(crate::CounterValue::<Test>::get(), 42);\n\n            // Check initial user interactions\n            assert_eq!(crate::UserInteractions::<Test>::get(1), 5);\n            assert_eq!(crate::UserInteractions::<Test>::get(2), 10);\n        });\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-customize-runtime-pallet-development-pallet-testing", "url": "https://developer.polkadot.com/parachains/customize-runtime/pallet-development/pallet-testing/#where-to-go-next", "page_title": "Unit Test Pallets", "index": 20, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 24623, "end_char": 25005, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0802d2c932ca146d7d5505ca4fa070c301db43b31944618ad6dc926672960e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Benchmark Your Pallet__\n\n    ---\n\n    Learn how to benchmark extrinsics in your custom pallet to generate precise weight calculations suitable for production use.\n\n    [:octicons-arrow-right-24: Integrate](/parachains/customize-runtime/pallet-development/benchmark-pallet/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#quick-start-guides", "page_title": "Get Started with Parachain Development", "index": 0, "depth": 2, "title": "Quick Start Guides", "anchor": "quick-start-guides", "start_char": 187, "end_char": 1326, "estimated_token_count": 345, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Quick Start Guides\n\nQuick start guides help developers set up and interact with the Polkadot parachain ecosystem using various tools and frameworks.\n\n|                                            Tutorial                                            |         Tools         |                               Description                               |\n|:----------------------------------------------------------------------------------------------:|:---------------------:|:-----------------------------------------------------------------------:|\n| [Set Up the Parachain Template](/parachains/launch-a-parachain/set-up-the-parachain-template/) |     Polkadot SDK      | Learn how to set up and run the Polkadot SDK Parachain Template locally |\n|            [Launch a Local Parachain](/parachains/testing/run-a-parachain-network/)            | Zombienet, Chopsticks |           Set up a local development environment for testing            |\n|              [Fork an Existing Parachain](/parachains/testing/fork-a-parachain/)               |      Chopsticks       |           Create a local fork of a live parachain for testing           |"}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#launch-a-simple-parachain", "page_title": "Get Started with Parachain Development", "index": 1, "depth": 2, "title": "Launch a Simple Parachain", "anchor": "launch-a-simple-parachain", "start_char": 1326, "end_char": 1447, "estimated_token_count": 20, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Launch a Simple Parachain\n\nLearn the fundamentals of launching and deploying a parachain to the Polkadot network."}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#customize-your-runtime", "page_title": "Get Started with Parachain Development", "index": 2, "depth": 2, "title": "Customize Your Runtime", "anchor": "customize-your-runtime", "start_char": 1447, "end_char": 1559, "estimated_token_count": 17, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Customize Your Runtime\n\nBuild custom functionality for your parachain by composing and creating pallets."}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#pallet-development", "page_title": "Get Started with Parachain Development", "index": 3, "depth": 3, "title": "Pallet Development", "anchor": "pallet-development", "start_char": 1559, "end_char": 1659, "estimated_token_count": 17, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Pallet Development\n\nDeep dive into creating and managing custom pallets for your parachain."}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#testing", "page_title": "Get Started with Parachain Development", "index": 4, "depth": 2, "title": "Testing", "anchor": "testing", "start_char": 1659, "end_char": 1749, "estimated_token_count": 13, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Testing\n\nTest your parachain in various environments before production deployment."}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#runtime-upgrades-and-maintenance", "page_title": "Get Started with Parachain Development", "index": 5, "depth": 2, "title": "Runtime Upgrades and Maintenance", "anchor": "runtime-upgrades-and-maintenance", "start_char": 1749, "end_char": 1875, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Runtime Upgrades and Maintenance\n\nManage your parachain's lifecycle with forkless upgrades and maintenance operations."}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#interoperability", "page_title": "Get Started with Parachain Development", "index": 6, "depth": 2, "title": "Interoperability", "anchor": "interoperability", "start_char": 1875, "end_char": 1994, "estimated_token_count": 20, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Interoperability\n\nConfigure your parachain for cross-chain communication using XCM (Cross-Consensus Messaging)."}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#integrations", "page_title": "Get Started with Parachain Development", "index": 7, "depth": 2, "title": "Integrations", "anchor": "integrations", "start_char": 1994, "end_char": 2085, "estimated_token_count": 13, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Integrations\n\nIntegrate your parachain with essential ecosystem tools and services."}
{"source": "polkadot-docs", "page_id": "parachains-get-started", "url": "https://developer.polkadot.com/parachains/get-started/#additional-resources", "page_title": "Get Started with Parachain Development", "index": 8, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 2085, "end_char": 2298, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:532b621edaf6b2d6c8550ae6eab96d21de9796ca2a32fe6ffb3322868b3f7901", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Additional Resources\n\n- [Polkadot SDK Documentation](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/index.html)\n- [Polkadot Wiki - Parachains](../wiki/learn/learn-parachains.md)"}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-dependencies-macos", "page_title": "Install Polkadot SDK", "index": 0, "depth": 2, "title": "Install Dependencies: macOS", "anchor": "install-dependencies-macos", "start_char": 496, "end_char": 657, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies: macOS\n\nYou can install Rust and set up a Substrate development environment on Apple macOS computers with Intel or Apple M1 processors."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#before-you-begin-mac-os", "page_title": "Install Polkadot SDK", "index": 1, "depth": 3, "title": "Before You Begin", "anchor": "before-you-begin-mac-os", "start_char": 657, "end_char": 1085, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Before You Begin \n\nBefore you install Rust and set up your development environment on macOS, verify that your computer meets the following basic requirements:\n\n- Operating system version is 10.7 Lion or later.\n- Processor speed of at least 2 GHz. Note that 3 GHz is recommended.\n- Memory of at least 8 GB RAM. Note that 16 GB is recommended.\n- Storage of at least 10 GB of available space.\n- Broadband Internet connection."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-command-line-tools", "page_title": "Install Polkadot SDK", "index": 2, "depth": 3, "title": "Install Command Line Tools", "anchor": "install-command-line-tools", "start_char": 1085, "end_char": 2080, "estimated_token_count": 214, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install Command Line Tools\n\nXcode Command Line Tools provide essential build dependencies including `clang`, `make`, and other tools required to compile native crates like `librocksdb-sys`. To install them, run:\n\n```bash\nxcode-select --install\n```\n\n!!! warning \"Troubleshooting `libclang.dylib` not found\"\n    On some macOS versions, the build fails while compiling `librocksdb-sys` with a `Library not loaded: @rpath/libclang.dylib` error, even though the Command Line Tools include `libclang`. The Command Line Tools directory isn't on the default library search path, so the build script can't load it. To fix this, point the build to the library by running the following commands before you compile:\n\n    ```bash\n    export LIBCLANG_PATH=/Library/Developer/CommandLineTools/usr/lib\n    export DYLD_FALLBACK_LIBRARY_PATH=\"$LIBCLANG_PATH:$DYLD_FALLBACK_LIBRARY_PATH\"\n    ```\n\n    To keep these settings for new terminal sessions, add both lines to your shell profile, such as `~/.zshrc`."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-homebrew", "page_title": "Install Polkadot SDK", "index": 3, "depth": 3, "title": "Install Homebrew", "anchor": "install-homebrew", "start_char": 2080, "end_char": 2936, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install Homebrew\n\nIn most cases, you should use Homebrew to install and manage packages on macOS computers. If you don't already have Homebrew installed on your local computer, you should download and install it before continuing.\n\nTo install Homebrew:\n\n1. Open the Terminal application.\n2. Download and install Homebrew by running the following command:\n\n    ```bash\n    /bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)\"\n    ```\n\n3. Verify Homebrew has been successfully installed by running the following command:\n\n    ```bash\n    brew --version\n    ```\n\n    The command displays output similar to the following:\n\n    <div id=\"termynal\" data-termynal markdown>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>brew --version</span>\n      <span data-ty>Homebrew 4.3.15</span>\n    </div>"}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#support-for-apple-silicon", "page_title": "Install Polkadot SDK", "index": 4, "depth": 3, "title": "Support for Apple Silicon", "anchor": "support-for-apple-silicon", "start_char": 2936, "end_char": 3108, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Support for Apple Silicon\n\nProtobuf must be installed before the build process can begin. To install it, run the following command:\n\n```bash\nbrew install protobuf\n```"}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-required-packages-and-rust-mac-os", "page_title": "Install Polkadot SDK", "index": 5, "depth": 3, "title": "Install Required Packages and Rust", "anchor": "install-required-packages-and-rust-mac-os", "start_char": 3108, "end_char": 4417, "estimated_token_count": 277, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install Required Packages and Rust \n\nBecause the blockchain requires standard cryptography to support the generation of public/private key pairs and the validation of transaction signatures, you must also have a package that provides cryptography, such as `openssl`.\n\nTo install `openssl` and the Rust toolchain on macOS:\n\n1. Open the Terminal application.\n2. Ensure you have an updated version of Homebrew by running the following command:\n\n    ```bash\n    brew update\n    ```\n\n3. Install the `openssl` package by running the following command:\n\n    ```bash\n    brew install openssl\n    ```\n\n4. Download the `rustup` installation program and use it to install Rust by running the following command:\n\n    ```bash\n    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n    ```\n\n5. Follow the prompts displayed to proceed with a default installation.\n6. Update your current shell to include Cargo by running the following command:\n\n    ```bash\n    source ~/.cargo/env\n    ```\n\n7. Configure the Rust toolchain to default to the latest stable version by running the following commands:\n\n    ```bash\n    rustup default stable\n    rustup update\n    rustup target add wasm32-unknown-unknown\n    rustup component add rust-src\n    ```\n\n8. Proceed to [Build the Polkadot SDK](#build-the-polkadot-sdk)."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-dependencies-linux", "page_title": "Install Polkadot SDK", "index": 6, "depth": 2, "title": "Install Dependencies: Linux", "anchor": "install-dependencies-linux", "start_char": 4417, "end_char": 4815, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies: Linux\n\nRust supports most Linux distributions. Depending on the specific distribution and version of the operating system you use, you might need to add some software dependencies to your environment. In general, your development environment should include a linker or a C-compatible compiler, such as `clang`, and an appropriate integrated development environment (IDE)."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#before-you-begin-linux", "page_title": "Install Polkadot SDK", "index": 7, "depth": 3, "title": "Before You Begin", "anchor": "before-you-begin-linux", "start_char": 4815, "end_char": 5539, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Before You Begin \n\nCheck the documentation for your operating system for information about the installed packages and how to download and install any additional packages you might need. For example, if you use Ubuntu, you can use the Ubuntu Advanced Packaging Tool (`apt`) to install the `build-essential` package:\n\n```bash\nsudo apt install build-essential\n```\n\nAt a minimum, you need the following packages before you install Rust:\n\n```text\nclang curl git make\n```\n\nBecause the blockchain requires standard cryptography to support the generation of public/private key pairs and the validation of transaction signatures, you must also have a package that provides cryptography, such as `libssl-dev` or `openssl-devel`."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-required-packages-and-rust-linux", "page_title": "Install Polkadot SDK", "index": 8, "depth": 3, "title": "Install Required Packages and Rust", "anchor": "install-required-packages-and-rust-linux", "start_char": 5539, "end_char": 7936, "estimated_token_count": 488, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install Required Packages and Rust \n\nTo install the Rust toolchain on Linux:\n\n1. Open a terminal shell.\n2. Check the packages installed on the local computer by running the appropriate package management command for your Linux distribution.\n3. Add any package dependencies you are missing to your local development environment by running the appropriate package management command for your Linux distribution:\n\n    === \"Ubuntu\"\n\n        ```bash\n        sudo apt install --assume-yes git clang curl libssl-dev llvm libclang-dev libudev-dev make protobuf-compiler\n        ```\n\n    === \"Debian\"\n\n        ```sh\n        sudo apt install --assume-yes git clang curl libssl-dev llvm libclang-dev libudev-dev make protobuf-compiler\n        ```\n\n    === \"Arch\"\n\n        ```sh\n        pacman -Syu --needed --noconfirm curl git clang make protobuf\n        ```\n\n    === \"Fedora\"\n\n        ```sh\n        sudo dnf update\n        sudo dnf install clang curl git openssl-devel make protobuf-compiler\n        ```\n\n    === \"OpenSUSE\"\n\n        ```sh\n        sudo zypper install clang curl git openssl-devel llvm-devel libudev-devel make protobuf\n        ```\n\n    Remember that different distributions might use different package managers and bundle packages in different ways. For example, depending on your installation selections, Ubuntu Desktop and Ubuntu Server might have different packages and different requirements. However, the packages listed in the command-line examples are applicable to many common Linux distributions, including Debian, Linux Mint, MX Linux, and Elementary OS.\n\n4. Download the `rustup` installation program and use it to install Rust by running the following command:\n\n    ```bash\n    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n    ```\n\n5. Follow the prompts displayed to proceed with a default installation.\n6. Update your current shell to include Cargo by running the following command:\n\n    ```bash\n    source $HOME/.cargo/env\n    ```\n\n7. Verify your installation by running the following command:\n\n    ```bash\n    rustc --version\n    ```\n\n8. Configure the Rust toolchain to default to the latest stable version by running the following commands:\n\n    ```bash\n    rustup default stable\n    rustup update\n    rustup target add wasm32-unknown-unknown\n    rustup component add rust-src\n    ```\n\n9. Proceed to [Build the Polkadot SDK](#build-the-polkadot-sdk)."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-dependencies-windows-wsl", "page_title": "Install Polkadot SDK", "index": 9, "depth": 2, "title": "Install Dependencies: Windows (WSL)", "anchor": "install-dependencies-windows-wsl", "start_char": 7936, "end_char": 8529, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies: Windows (WSL)\n\nIn general, UNIX-based operating systems—like macOS or Linux—provide a better development environment for building Substrate-based blockchains.\n\nHowever, suppose your local computer uses Microsoft Windows instead of a UNIX-based operating system. In that case, you can configure it with additional software to make it a suitable development environment for building Substrate-based blockchains. To prepare a development environment on a Microsoft Windows computer, you can use Windows Subsystem for Linux (WSL) to emulate a UNIX operating environment."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#before-you-begin-windows-wls", "page_title": "Install Polkadot SDK", "index": 10, "depth": 3, "title": "Before You Begin", "anchor": "before-you-begin-windows-wls", "start_char": 8529, "end_char": 9078, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Before You Begin \n\nBefore installing on Microsoft Windows, verify the following basic requirements:\n\n- You have a computer running a supported Microsoft Windows operating system:\n    - **For Windows desktop**: You must be running Microsoft Windows 10, version 2004 or later, or Microsoft Windows 11 to install WSL.\n    - **For Windows server**: You must be running Microsoft Windows Server 2019, or later, to install WSL on a server operating system.\n- You have a good internet connection and access to a shell terminal on your local computer."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#set-up-windows-subsystem-for-linux", "page_title": "Install Polkadot SDK", "index": 11, "depth": 3, "title": "Set Up Windows Subsystem for Linux", "anchor": "set-up-windows-subsystem-for-linux", "start_char": 9078, "end_char": 11327, "estimated_token_count": 484, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Set Up Windows Subsystem for Linux\n\nWSL enables you to emulate a Linux environment on a computer that uses the Windows operating system. The primary advantage of this approach for Substrate development is that you can use all of the code and command-line examples as described in the Substrate documentation. For example, you can run common commands—such as `ls` and `ps`—unmodified. By using WSL, you can avoid configuring a virtual machine image or a dual-boot operating system.\n\nTo prepare a development environment using WSL:\n\n1. Check your Windows version and build number to see if WSL is enabled by default.\n\n    If you have Microsoft Windows 10, version 2004 (Build 19041 and higher), or Microsoft Windows 11, WSL is available by default and you can continue to the next step.\n\n    If you have an older version of Microsoft Windows installed, see the [WSL manual installation steps for older versions](https://learn.microsoft.com/en-us/windows/wsl/install-manual). If you are installing on an older version of Microsoft Windows, you can download and install WLS 2 if your computer has Windows 10, version 1903 or higher.\n\n2. Select **Windows PowerShell** or **Command Prompt** from the **Start** menu, right-click, then **Run as administrator**.\n\n3. In the PowerShell or Command Prompt terminal, run the following command:\n\n    ```bash\n    wsl --install\n    ```\n\n    This command enables the required WSL 2 components that are part of the Windows operating system, downloads the latest Linux kernel, and installs the Ubuntu Linux distribution by default.\n\n    If you want to review the other Linux distributions available, run the following command:\n\n    ```bash\n    wsl --list --online\n    ```\n\n4. After the distribution is downloaded, close the terminal.\n\n5. Click the **Start** menu, select **Shut down or sign out**, then click **Restart** to restart the computer.\n\n    Restarting the computer is required to start the installation of the Linux distribution. It can take a few minutes for the installation to complete after you restart.\n\n    For more information about setting up WSL as a development environment, see the [Set up a WSL development environment](https://learn.microsoft.com/en-us/windows/wsl/setup/environment) docs."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#install-required-packages-and-rust-windows-wls", "page_title": "Install Polkadot SDK", "index": 12, "depth": 3, "title": "Install Required Packages and Rust", "anchor": "install-required-packages-and-rust-windows-wls", "start_char": 11327, "end_char": 12865, "estimated_token_count": 342, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install Required Packages and Rust \n\nTo install the Rust toolchain on WSL:\n\n1. Click the **Start** menu, then select **Ubuntu**.\n2. Type a UNIX user name to create a user account.\n3. Type a password for your UNIX user, then retype the password to confirm it.\n4. Download the latest updates for the Ubuntu distribution using the Ubuntu Advanced Packaging Tool (`apt`) by running the following command:\n\n    ```bash\n    sudo apt update\n    ```\n\n5. Add the required packages for the Ubuntu distribution by running the following command:\n\n    ```bash\n    sudo apt install --assume-yes git clang curl libssl-dev llvm libclang-dev libudev-dev make protobuf-compiler\n    ```\n\n6. Download the `rustup` installation program and use it to install Rust for the Ubuntu distribution by running the following command:\n\n    ```bash\n    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n    ```\n\n7. Follow the prompts displayed to proceed with a default installation.\n\n8. Update your current shell to include Cargo by running the following command:\n\n    ```bash\n    source ~/.cargo/env\n    ```\n\n9. Verify your installation by running the following command:\n\n    ```bash\n    rustc --version\n    ```\n\n10. Configure the Rust toolchain to use the latest stable version as the default toolchain by running the following commands:\n\n    ```bash\n    rustup default stable\n    rustup update\n    rustup target add wasm32-unknown-unknown\n    rustup component add rust-src\n    ```\n\n11. Proceed to [Build the Polkadot SDK](#build-the-polkadot-sdk)."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#build-the-polkadot-sdk", "page_title": "Install Polkadot SDK", "index": 13, "depth": 2, "title": "Build the Polkadot SDK", "anchor": "build-the-polkadot-sdk", "start_char": 12865, "end_char": 13008, "estimated_token_count": 26, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Build the Polkadot SDK\n\nAfter installing all dependencies, you can now clone and compile the Polkadot SDK repository to verify your setup."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#clone-the-polkadot-sdk", "page_title": "Install Polkadot SDK", "index": 14, "depth": 3, "title": "Clone the Polkadot SDK", "anchor": "clone-the-polkadot-sdk", "start_char": 13008, "end_char": 13239, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Clone the Polkadot SDK\n\n1. Clone the Polkadot SDK repository:\n\n    ```bash\n    git clone https://github.com/paritytech/polkadot-sdk.git\n    ```\n\n2. Navigate into the project directory:\n\n    ```bash\n    cd polkadot-sdk\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#compile-the-polkadot-sdk", "page_title": "Install Polkadot SDK", "index": 15, "depth": 3, "title": "Compile the Polkadot SDK", "anchor": "compile-the-polkadot-sdk", "start_char": 13239, "end_char": 13613, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compile the Polkadot SDK\n\nCompile the entire Polkadot SDK repository to ensure your environment is properly configured:\n\n```bash\ncargo build --release --locked\n```\n\n!!!note\n    This initial compilation will take significant time, depending on your machine specifications. It compiles all components of the Polkadot SDK to verify your toolchain is correctly configured."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#verify-the-build", "page_title": "Install Polkadot SDK", "index": 16, "depth": 3, "title": "Verify the Build", "anchor": "verify-the-build", "start_char": 13613, "end_char": 14387, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify the Build\n\nOnce the build completes successfully, verify the installation by checking the compiled binaries:\n\n```bash\nls target/release\n```\n\nYou should see several binaries, including:\n\n- `polkadot`: The Polkadot relay chain node.\n- `polkadot-parachain`: The parachain collator node.\n- `polkadot-omni-node`:The omni node for running parachains.\n- `substrate-node`: The kitchensink node with many pre-configured pallets.\n\nVerify the Polkadot binary works by checking its version:\n\n```bash\n./target/release/polkadot --version\n```\n\nThis should display version information similar to:\n\n```bash\npolkadot 1.16.0-1234abcd567\n```\n\nIf you see the version output without errors, your development environment is correctly configured and ready for Polkadot SDK development!"}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#optional-run-the-kitchensink-node", "page_title": "Install Polkadot SDK", "index": 17, "depth": 2, "title": "Optional: Run the Kitchensink Node", "anchor": "optional-run-the-kitchensink-node", "start_char": 14387, "end_char": 14915, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Optional: Run the Kitchensink Node\n\nThe Polkadot SDK includes a feature-rich node called \"kitchensink\" located at `substrate/bin/node`. This node comes pre-configured with many pallets and features from the Polkadot SDK, making it an excellent reference for exploring capabilities and understanding how different components work together.\n\n!!!note\n    If you've already compiled the Polkadot SDK in the previous step, the `substrate-node` binary is already built and ready to use. You can skip directly to running the node."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#run-the-kitchensink-node-in-development-mode", "page_title": "Install Polkadot SDK", "index": 18, "depth": 3, "title": "Run the Kitchensink Node in Development Mode", "anchor": "run-the-kitchensink-node-in-development-mode", "start_char": 14915, "end_char": 21292, "estimated_token_count": 1779, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Run the Kitchensink Node in Development Mode\n\nFrom the `polkadot-sdk` root directory, start the kitchensink node in development mode:\n\n```bash\n./target/release/substrate-node --dev\n```\n\nThe `--dev` flag enables development mode, which:\n\n- Runs a single-node development chain.\n- Produces and finalizes blocks automatically.\n- Uses pre-configured development accounts (Alice, Bob, etc.).\n- Deletes all data when stopped, ensuring a clean state on restart.\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>./target/release/substrate-node --dev</span>\n  <span data-ty>2025-10-25 09:08:53 Substrate Node</span>\n  <span data-ty>2025-10-25 09:08:53 ✌️  version 3.0.0-dev-7304295748b</span>\n  <span data-ty>2025-10-25 09:08:53 ❤️  by Parity Technologies &lt;admin@parity.io&gt;, 2017-2025</span>\n  <span data-ty>2025-10-25 09:08:53 📋 Chain specification: Development</span>\n  <span data-ty>2025-10-25 09:08:53 🏷  Node name: squalid-shelf-0944</span>\n  <span data-ty>2025-10-25 09:08:53 👤 Role: AUTHORITY</span>\n  <span data-ty>2025-10-25 09:08:53 💾 Database: RocksDb at /var/folders/6t/fw37yfvx14qgwv5sl5p0lcph0000gn/T/substrate0XFsh7/chains/dev/db/full</span>\n  <span data-ty>2025-10-25 09:08:57 🔨 Initializing Genesis block/state (state: 0x9831…a36f, header-hash: 0x6eaf…0764)</span>\n  <span data-ty>2025-10-25 09:08:57 Creating transaction pool txpool_type=ForkAware ready=Limit { count: 8192, total_bytes: 20971520 } future=Limit { count: 819, total_bytes: 2097152 }</span>\n  <span data-ty>2025-10-25 09:08:57 👴 Loading GRANDPA authority set from genesis on what appears to be first startup.</span>\n  <span data-ty>2025-10-25 09:08:57 👶 Creating empty BABE epoch changes on what appears to be first startup.</span>\n  <span data-ty>2025-10-25 09:08:57 Using default protocol ID \"sup\" because none is configured in the chain specs</span>\n  <span data-ty>2025-10-25 09:08:57 Local node identity is: 12D3KooWFug81ps95nGBDXidDv8K9zth3JBwVw3nm8KanZ3Rdi4J</span>\n  <span data-ty>2025-10-25 09:08:57 Running litep2p network backend</span>\n  <span data-ty>2025-10-25 09:08:57 💻 Operating system: macos</span>\n  <span data-ty>2025-10-25 09:08:57 💻 CPU architecture: aarch64</span>\n  <span data-ty>2025-10-25 09:08:57 📦 Highest known block at #0</span>\n  <span data-ty>2025-10-25 09:08:57 〽️ Prometheus exporter started at 127.0.0.1:9615</span>\n  <span data-ty>2025-10-25 09:08:57 Running JSON-RPC server: addr=127.0.0.1:9944,[::1]:9944</span>\n  <span data-ty>2025-10-25 09:08:57 🏁 CPU single core score: 1.55 GiBs, parallelism score: 1.43 GiBs with expected cores: 8</span>\n  <span data-ty>2025-10-25 09:08:57 🏁 Memory score: 65.81 GiBs</span>\n  <span data-ty>2025-10-25 09:08:57 🏁 Disk score (seq. writes): 3.20 GiBs</span>\n  <span data-ty>2025-10-25 09:08:57 🏁 Disk score (rand. writes): 760.04 MiBs</span>\n  <span data-ty>2025-10-25 09:08:57 👶 Starting BABE Authorship worker</span>\n  <span data-ty>2025-10-25 09:08:57 Failed to load AddrCache from file, using empty instead: Failed to encode or decode AddrCache.</span>\n  <span data-ty>2025-10-25 09:08:57 Loaded persisted AddrCache with 0 authority ids.</span>\n  <span data-ty>2025-10-25 09:08:57 🥩 BEEFY gadget waiting for BEEFY pallet to become available...</span>\n  <span data-ty>2025-10-25 09:08:57 Successfully persisted AddrCache on disk</span>\n  <span data-ty>2025-10-25 09:09:00 🙌 Starting consensus session on top of parent 0x6eaf6f7689b01e21821690ce221c6f5a4eeab997242f60d232234b6c1da20764 (#0)</span>\n  <span data-ty>2025-10-25 09:09:00 🎁 Prepared block for proposing at 1 (5 ms) hash: 0xf1937d6bec79950210463b701e187abe7d0d5e3eb6e089f1c15e5857966471ca; parent_hash: 0x6eaf…0764; end: NoMoreTransactions; extrinsics_count: 2</span>\n  <span data-ty>2025-10-25 09:09:00 🔖 Pre-sealed block for proposal at 1. Hash now 0xcf78ec71ff34797161bfeaa325d21f14745b74cbaa59122ed879af024c7a1400, previously 0xf1937d6bec79950210463b701e187abe7d0d5e3eb6e089f1c15e5857966471ca.</span>\n  <span data-ty>2025-10-25 09:09:00 👶 New epoch 0 launching at block 0xcf78…1400 (block slot 587119380 &gt;= start slot 587119380).</span>\n  <span data-ty>2025-10-25 09:09:00 👶 Next epoch starts at slot 587119580</span>\n  <span data-ty>2025-10-25 09:09:00 🏆 Imported #1 (0x6eaf…0764 → 0xcf78…1400)</span>\n  <span data-ty>2025-10-25 09:09:00 maintain txs=(0, 0) a=1 i=1 views=[(1, 0, 0)] event=NewBestBlock { hash: 0xcf78ec71ff34797161bfeaa325d21f14745b74cbaa59122ed879af024c7a1400, tree_route: None } duration=2.034958ms</span>\n  <span data-ty>2025-10-25 09:09:02 💤 Idle (0 peers), best: #1 (0xcf78…1400), finalized #0 (0x6eaf…0764), ⬇ 0 ⬆ 0</span>\n  <span data-ty>2025-10-25 09:09:03 🙌 Starting consensus session on top of parent 0xcf78ec71ff34797161bfeaa325d21f14745b74cbaa59122ed879af024c7a1400 (#1)</span>\n  <span data-ty>2025-10-25 09:09:03 🎁 Prepared block for proposing at 2 (4 ms) hash: 0xc5cc68c6f3dcda8bae3028f2e17a8dcd348c65750332f31af7972f25bf7a7d60; parent_hash: 0xcf78…1400; end: NoMoreTransactions; extrinsics_count: 2</span>\n  <span data-ty>2025-10-25 09:09:03 🔖 Pre-sealed block for proposal at 2. Hash now 0x67d0adc440feeb28c239da9650744d3dbda899b3ca3b8dc00050ce7269ea6aee, previously 0xc5cc68c6f3dcda8bae3028f2e17a8dcd348c65750332f31af7972f25bf7a7d60.</span>\n  <span data-ty>2025-10-25 09:09:03 🏆 Imported #2 (0xcf78…1400 → 0x67d0…6aee)</span>\n  <span data-ty>2025-10-25 09:09:03 maintain txs=(0, 0) a=1 i=2 views=[(2, 0, 0)] event=NewBestBlock { hash: 0x67d0adc440feeb28c239da9650744d3dbda899b3ca3b8dc00050ce7269ea6aee, tree_route: None } duration=301µs</span>\n  <span data-ty>2025-10-25 09:09:06 🙌 Starting consensus session on top of parent 0x67d0adc440feeb28c239da9650744d3dbda899b3ca3b8dc00050ce7269ea6aee (#2)</span>\n  <span data-ty>2025-10-25 09:09:06 🎁 Prepared block for proposing at 3 (5 ms) hash: 0x29eaa5f82783284b25e9c81e851ae5be63c54de28c94f438cbd733f680172ea2; parent_hash: 0x67d0…6aee; end: NoMoreTransactions; extrinsics_count: 2</span>\n  <span data-ty>2025-10-25 09:09:06 🔖 Pre-sealed block for proposal at 3. Hash now 0x8fb26c9192f8738b8971107072f9d106d364ee7f1ece94d8ae5acc9f69cc522f, previously 0x29eaa5f82783284b25e9c81e851ae5be63c54de28c94f438cbd733f680172ea2.</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>\n\nYou should see log output indicating the node is running and producing blocks, with increasing block numbers after `finalized`."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#interact-with-the-kitchensink-node", "page_title": "Install Polkadot SDK", "index": 19, "depth": 3, "title": "Interact with the Kitchensink Node", "anchor": "interact-with-the-kitchensink-node", "start_char": 21292, "end_char": 22169, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Interact with the Kitchensink Node\n\nThe kitchensink node is accessible at `ws://localhost:9944`. Open [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) in your browser to explore its features and connect to the local node.\n\n1. Click the network icon in the top left corner.\n2. Scroll to **Development** and select **Local Node**.\n3. Click **Switch** to connect to your local node.\n\n![](/images/parachains/install-polkadot-sdk/install-polkadot-sdk-1.webp)\n\nOnce connected, the interface updates its color scheme to indicate a successful connection to the local node.\n\n![](/images/parachains/install-polkadot-sdk/install-polkadot-sdk-2.webp)\n\nYou can now explore the various pallets and features included in the kitchensink node, making it a valuable reference as you develop your own blockchain applications.\n\nTo stop the node, press `Control-C` in the terminal."}
{"source": "polkadot-docs", "page_id": "parachains-install-polkadot-sdk", "url": "https://developer.polkadot.com/parachains/install-polkadot-sdk/#where-to-go-next", "page_title": "Install Polkadot SDK", "index": 20, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 22169, "end_char": 22522, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e95e6e374d69052e0bb0eca636f0d26ae52df4cb0632767d3551714465c1e01", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   __Get Started with Parachain Development__\n\n    ---\n\n    Practical examples and tutorials for building and deploying Polkadot parachains, covering everything from launch to customization and cross-chain messaging.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/get-started/)\n \n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-integrations-indexers", "url": "https://developer.polkadot.com/parachains/integrations/indexers/#the-challenge-of-blockchain-data-access", "page_title": "Indexers", "index": 0, "depth": 2, "title": "The Challenge of Blockchain Data Access", "anchor": "the-challenge-of-blockchain-data-access", "start_char": 13, "end_char": 650, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc71f4c7fd92afa07905eaee57febc02dc8e5aa1e3c351312a60c00cb3400904", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Challenge of Blockchain Data Access\n\nBlockchain data is inherently sequential and distributed, with information stored chronologically across numerous blocks. While retrieving data from a single block through JSON-RPC API calls is straightforward, more complex queries that span multiple blocks present significant challenges:\n\n- Data is scattered and unorganized across the blockchain.\n- Retrieving large datasets can take days or weeks to sync.\n- Complex operations (like aggregations, averages, or cross-chain queries) require additional processing.\n- Direct blockchain queries can impact dApp performance and responsiveness."}
{"source": "polkadot-docs", "page_id": "parachains-integrations-indexers", "url": "https://developer.polkadot.com/parachains/integrations/indexers/#what-is-a-blockchain-indexer", "page_title": "Indexers", "index": 1, "depth": 2, "title": "What is a Blockchain Indexer?", "anchor": "what-is-a-blockchain-indexer", "start_char": 650, "end_char": 1196, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc71f4c7fd92afa07905eaee57febc02dc8e5aa1e3c351312a60c00cb3400904", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is a Blockchain Indexer?\n\nA blockchain indexer is a specialized infrastructure tool that processes, organizes, and stores blockchain data in an optimized format for efficient querying. Think of it as a search engine for blockchain data that:\n\n- Continuously monitors the blockchain for new blocks and transactions.\n- Processes and categorizes this data according to predefined schemas.\n- Stores the processed data in an easily queryable database.\n- Provides efficient APIs (typically [GraphQL](https://graphql.org/)) for data retrieval."}
{"source": "polkadot-docs", "page_id": "parachains-integrations-indexers", "url": "https://developer.polkadot.com/parachains/integrations/indexers/#indexer-implementations", "page_title": "Indexers", "index": 2, "depth": 2, "title": "Indexer Implementations", "anchor": "indexer-implementations", "start_char": 1196, "end_char": 2179, "estimated_token_count": 203, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc71f4c7fd92afa07905eaee57febc02dc8e5aa1e3c351312a60c00cb3400904", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Indexer Implementations\n\n<div class=\"grid cards\" markdown>\n\n-   __Subsquid__\n\n    ---\n\n    Subsquid is a data network that allows rapid and cost-efficient retrieval of blockchain data from 100+ chains using Subsquid's decentralized data lake and open-source SDK. In simple terms, Subsquid can be considered an ETL (extract, transform, and load) tool with a GraphQL server included. It enables comprehensive filtering, pagination, and even full-text search capabilities. Subsquid has native and full support for EVM and Substrate data, even within the same project.\n\n    [:octicons-arrow-right-24: Reference](https://sqd.dev/)\n\n-   __Subquery__\n\n    ---\n\n    SubQuery is a fast, flexible, and reliable open-source data decentralised infrastructure network that provides both RPC and indexed data to consumers worldwide.\n    It provides custom APIs for your web3 project across multiple supported chains.\n\n    [:octicons-arrow-right-24: Reference](https://subquery.network/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-integrations-oracles", "url": "https://developer.polkadot.com/parachains/integrations/oracles/#what-is-a-blockchain-oracle", "page_title": "Oracles", "index": 0, "depth": 2, "title": "What is a Blockchain Oracle?", "anchor": "what-is-a-blockchain-oracle", "start_char": 12, "end_char": 750, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d0baa371e903e20c98c4adaeca3b3ab10f4891e286daff4e2dbd70ac6e9b0807", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is a Blockchain Oracle?\n\nOracles enable blockchains to access external data sources. Since blockchains operate as isolated networks, they cannot natively interact with external systems - this limitation is known as the \"blockchain oracle problem.\" Oracles solves this by extracting data from external sources (like APIs, IoT devices, or other blockchains), validating it, and submitting it on-chain.\n\nWhile simple oracle implementations may rely on a single trusted provider, more sophisticated solutions use decentralized networks where multiple providers stake assets and reach consensus on data validity. Typical applications include DeFi price feeds, weather data for insurance contracts, and cross-chain asset verification."}
{"source": "polkadot-docs", "page_id": "parachains-integrations-oracles", "url": "https://developer.polkadot.com/parachains/integrations/oracles/#oracle-implementations", "page_title": "Oracles", "index": 1, "depth": 2, "title": "Oracle Implementations", "anchor": "oracle-implementations", "start_char": 750, "end_char": 1845, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d0baa371e903e20c98c4adaeca3b3ab10f4891e286daff4e2dbd70ac6e9b0807", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Oracle Implementations\n\n<div class=\"grid cards\" markdown>\n\n-   **Acurast**\n\n    ---\n\n    Acurast is a decentralized, serverless cloud platform that uses a distributed network of mobile devices for oracle services, addressing centralized trust and data ownership issues. In the Polkadot ecosystem, it allows developers to define off-chain data and computation needs, which are processed by these devices acting as decentralized oracle nodes, delivering results to Substrate (Wasm) and EVM environments.\n\n    [:octicons-arrow-right-24: Reference](https://acurast.com/)\n\n-   **DIA**\n\n    ---\n\n    DIA is a trustless oracle network providing verifiable price feeds for the Polkadot ecosystem. Data is aggregated from 100+ exchanges and validated by a network of independent feeders, making each feed fully auditable on-chain. The oracle stack covers 20,000+ assets across different asset classes: token price feeds including DOT/USD, RWAs such as tokenized treasuries, and yield-bearing tokens.\n\n    [:octicons-arrow-right-24: Reference](https://www.diadata.org/app/oracle-playground/DOT)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-integrations-wallets", "url": "https://developer.polkadot.com/parachains/integrations/wallets/#what-is-a-blockchain-wallet", "page_title": "Wallets", "index": 0, "depth": 2, "title": "What is a Blockchain Wallet?", "anchor": "what-is-a-blockchain-wallet", "start_char": 12, "end_char": 762, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7253e22e567ebe71c3f9a582985da65a1b1719bedcd72a0261592a61f3424df", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is a Blockchain Wallet?\n\nA wallet serves as your gateway to interacting with blockchain networks. Rather than storing funds, wallets secure your private keys, controlling access to your blockchain assets. Your private key provides complete control over all permitted transactions on your blockchain account, making it essential to keep it secure.\n\nWallet types fall into two categories based on their connection to the internet:\n\n- **[Hot wallets](#hot-wallets)**: Online storage through websites, browser extensions or smartphone apps.\n- **[Cold wallets](#cold-wallets)**: Offline storage using hardware devices or air-gapped systems.\n- **[Wallet tools](#wallet-tools)**: Libraries and SDKs for integrating wallet functionality into dApps."}
{"source": "polkadot-docs", "page_id": "parachains-integrations-wallets", "url": "https://developer.polkadot.com/parachains/integrations/wallets/#hot-wallets", "page_title": "Wallets", "index": 1, "depth": 2, "title": "Hot Wallets", "anchor": "hot-wallets", "start_char": 762, "end_char": 2282, "estimated_token_count": 324, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7253e22e567ebe71c3f9a582985da65a1b1719bedcd72a0261592a61f3424df", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Hot Wallets\n\n<div class=\"grid cards\" markdown>\n\n-   __Nova Wallet__\n\n    ---\n\n    A non-custodial, mobile-first wallet for managing assets and interacting with the Polkadot and Kusama ecosystems. It supports staking, governance, cross-chain transfers, and crowdloans. With advanced features, seamless multi-network support, and strong security, Nova Wallet empowers users to explore the full potential of Polkadot parachains on the go.\n\n    [:octicons-arrow-right-24: Reference](https://novawallet.io/)\n\n-   __Talisman__\n\n    ---\n\n    A non-custodial web browser extension that allows you to manage your portfolio and interact with Polkadot and Ethereum applications. It supports Web3 apps, asset storage, and account management across over 150 Polkadot SDK-based and EVM networks. Features include NFT management, Ledger support, fiat on-ramp, and portfolio tracking.\n\n    [:octicons-arrow-right-24: Reference](https://talisman.xyz/)\n\n-  __Subwallet__\n\n    ---\n\n    A non-custodial web browser extension and mobile wallet for Polkadot and Ethereum. Track, send, receive, and monitor multi-chain assets on 150+ networks. Import account with seed phrase, private key, QR code, and JSON file. Import token & NFT, attach read-only account. XCM Transfer, NFT Management, Parity Signer & Ledger support, light clients support, EVM dApp support, MetaMask compatibility, custom endpoints, fiat on-ramp, phishing detection, transaction history.\n\n    [:octicons-arrow-right-24: Reference](https://www.subwallet.app/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-integrations-wallets", "url": "https://developer.polkadot.com/parachains/integrations/wallets/#cold-wallets", "page_title": "Wallets", "index": 2, "depth": 2, "title": "Cold Wallets", "anchor": "cold-wallets", "start_char": 2282, "end_char": 2948, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7253e22e567ebe71c3f9a582985da65a1b1719bedcd72a0261592a61f3424df", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Cold Wallets\n\n<div class=\"grid cards\" markdown>\n\n-   __Ledger__\n\n    ---\n\n    A hardware wallet that securely stores cryptocurrency private keys offline, protecting them from online threats. Using a secure chip and the Ledger Live app allows safe transactions and asset management while keeping keys secure.\n\n    [:octicons-arrow-right-24: Reference](https://www.ledger.com/)\n\n-   __Polkadot Vault__\n\n    ---\n\n    This cold storage solution lets you use a phone in airplane mode as an air-gapped wallet, turning any spare phone, tablet, or iOS/Android device into a hardware wallet.\n\n    [:octicons-arrow-right-24: Reference](https://vault.novasama.io/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-integrations-wallets", "url": "https://developer.polkadot.com/parachains/integrations/wallets/#wallet-tools", "page_title": "Wallets", "index": 3, "depth": 2, "title": "Wallet Tools", "anchor": "wallet-tools", "start_char": 2948, "end_char": 3491, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c7253e22e567ebe71c3f9a582985da65a1b1719bedcd72a0261592a61f3424df", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Wallet Tools\n\n<div class=\"grid cards\" markdown>\n\n-   __LunoKit__\n\n    ---\n\n    A React library for integrating Polkadot wallet connections into dApps. It offers a unified API for major wallets like Polkadot.js, SubWallet, Talisman, Nova Wallet, PolkaGate, WalletConnect, Enkrypt, Fearless, and Mimir. Includes customizable UI components, React hooks, full TypeScript and multi-chain support, and flexible integration with APIs such as Dedot, PAPI, or Polkadot.js.\n\n    [:octicons-arrow-right-24: Reference](https://www.lunolab.xyz/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#introduction", "page_title": "Opening HRMP Channels Between Parachains", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 45, "end_char": 1024, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nFor establishing communication channels between parachains on the Polkadot network using the Horizontal Relay-routed Message Passing (HRMP) protocol, the following steps are required:\n\n1. **Channel request**: The parachain that wants to open an HRMP channel must make a request to the parachain it wishes to have an open channel with.\n2. **Channel acceptance**: The other parachain must then accept this request to complete the channel establishment.\n\nThis process results in a unidirectional HRMP channel, where messages can flow in only one direction between the two parachains.\n\nAn additional HRMP channel must be established in the opposite direction to enable bidirectional communication. This requires repeating the request and acceptance process but with the parachains reversing their roles.\n\nOnce both unidirectional channels are established, the parachains can send messages back and forth freely through the bidirectional HRMP communication channel."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#prerequisites", "page_title": "Opening HRMP Channels Between Parachains", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1024, "end_char": 1268, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore proceeding, ensure you meet the following requirements:\n\n- Blockchain network with a relay chain and at least two connected parachains.\n- Wallet with sufficient funds to execute transactions on the participant chains."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#procedure-to-initiate-an-hrmp-channel", "page_title": "Opening HRMP Channels Between Parachains", "index": 2, "depth": 2, "title": "Procedure to Initiate an HRMP Channel", "anchor": "procedure-to-initiate-an-hrmp-channel", "start_char": 1268, "end_char": 1445, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Procedure to Initiate an HRMP Channel\n\nThis example will demonstrate how to open a channel between parachain 2500 and parachain 2600, using Rococo Local as the relay chain."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#fund-sender-sovereign-account", "page_title": "Opening HRMP Channels Between Parachains", "index": 3, "depth": 3, "title": "Fund Sender Sovereign Account", "anchor": "fund-sender-sovereign-account", "start_char": 1445, "end_char": 3015, "estimated_token_count": 340, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fund Sender Sovereign Account\n\n\nThe [sovereign account](https://github.com/polkadot-fellows/xcm-format/blob/10726875bd3016c5e528c85ed6e82415e4b847d7/README.md?plain=1#L50) for parachain 2500 on the relay chain must be funded so it can take care of any XCM transact fees.\n\nUse [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) UI to connect to the relay chain and transfer funds from your account to the parachain 2500 sovereign account.\n\n![](/images/parachains/interoperability/channels-common/channels-01.webp)\n\n??? note \"Calculating Parachain Sovereign Account\"\n    To generate the sovereign account address for a parachain, you'll need to follow these steps:\n\n    1. Determine if the parachain is an \"up/down\" chain (parent or child) or a \"sibling\" chain:\n\n        - Up/down chains use the prefix `0x70617261` (which decodes to `b\"para\"`).\n        - Sibling chains use the prefix `0x7369626c` (which decodes to `b\"sibl\"`).\n\n    2. Calculate the u32 scale encoded value of the parachain ID:\n\n        - Parachain 2500 would be encoded as `c4090000`.\n\n    3. Combine the prefix and parachain ID encoding to form the full sovereign account address:\n\n        The sovereign account of parachain 2500 in relay chain will be `0x70617261c4090000000000000000000000000000000000000000000000000000`\n        and the SS58 format of this address is `5Ec4AhPSY2GEE4VoHUVheqv5wwq2C1HMKa7c9fVJ1WKivX1Y`.\n\n    To perform this conversion, you can also use the **\"Para ID\" to Address** section in [Substrate Utilities](https://www.shawntabrizi.com/substrate-js-utilities/)."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#create-channel-opening-extrinsic", "page_title": "Opening HRMP Channels Between Parachains", "index": 4, "depth": 3, "title": "Create Channel Opening Extrinsic", "anchor": "create-channel-opening-extrinsic", "start_char": 3015, "end_char": 3954, "estimated_token_count": 217, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create Channel Opening Extrinsic\n\n1. In Polkadot.js Apps, connect to the relay chain, navigate to the **Developer** dropdown and select the **Extrinsics** option.\n\n    ![](/images/parachains/interoperability/channels-common/channels-02.webp)\n\n2. Construct an `hrmpInitOpenChannel` extrinsic call:\n\n    1. Select the **`hrmp`** pallet.\n    2. Choose the **`hrmpInitOpenChannel`** extrinsic.\n    3. Fill in the parameters:\n        - **`recipient`**: Parachain ID of the target chain (in this case, 2600).\n        - **`proposedMaxCapacity`**: Max number of messages that can be pending in the channel at once.\n        - **`proposedMaxMessageSize`**: Max message size that could be put into the channel.\n    4. Copy the encoded call data.\n\n    ![](/images/parachains/interoperability/channels-between-parachains/parachains-01.webp)\n\n    The encoded call data for opening a channel with parachain 2600 is `0x3c00280a00000800000000001000`."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#craft-and-submit-the-xcm-message-from-the-sender", "page_title": "Opening HRMP Channels Between Parachains", "index": 5, "depth": 3, "title": "Craft and Submit the XCM Message from the Sender", "anchor": "craft-and-submit-the-xcm-message-from-the-sender", "start_char": 3954, "end_char": 7363, "estimated_token_count": 710, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Craft and Submit the XCM Message from the Sender\n\nTo initiate the HRMP channel opening process, you need to create an XCM message that includes the encoded `hrmpInitOpenChannel` call data from the previous step. This message will be sent from your parachain to the relay chain.\n\nThis example uses the `sudo` pallet to dispatch the extrinsic. Verify the XCM configuration of the parachain you're working with and ensure you're using an origin with the necessary privileges to execute the `polkadotXcm.send` extrinsic.\n\nThe XCM message should contain the following instructions:\n\n- **`WithdrawAsset`**: Withdraws assets from the origin's ownership and places them in the Holding Register.\n- **`BuyExecution`**: Pays for the execution of the current message using the assets in the Holding Register.\n- **`Transact`**: Execute the encoded transaction call.\n- **`RefundSurplus`**: Increases the Refunded Weight Register to the value of the Surplus Weight Register, attempting to reclaim any excess fees paid via BuyExecution.\n- **`DepositAsset`**: Subtracts assets from the Holding Register and deposits equivalent on-chain assets under the specified beneficiary's ownership.\n\n!!!note\n    For more detailed information about XCM's functionality, complexities, and instruction set, refer to the [xcm-format](https://github.com/polkadot-fellows/xcm-format) documentation.\n\nIn essence, this process withdraws funds from the parachain's sovereign account to the XCVM Holding Register, then uses these funds to purchase execution time for the XCM `Transact` instruction, executes `Transact`, refunds any unused execution time and deposits any remaining funds into a specified account.\n\nTo send the XCM message to the relay chain, connect to parachain 2500 in Polkadot.js Apps. Fill in the required parameters as shown in the image below, ensuring that you:\n\n1. Replace the **`call`** field with your encoded `hrmpInitOpenChannel` call data from the previous step.\n2. Use the correct beneficiary information.\n3. Click the **Submit Transaction** button to dispatch the XCM message to the relay chain.\n\n![](/images/parachains/interoperability/channels-between-parachains/parachains-02.webp)\n\n!!! note\n    The exact process and parameters for submitting this XCM message may vary depending on your specific parachain and relay chain configurations. Always refer to the most current documentation for your particular network setup.\n\nAfter submitting the XCM message to initiate the HRMP channel opening, you should verify that the request was successful. Follow these steps to check the status of your channel request:\n\n1. Using Polkadot.js Apps, connect to the relay chain and navigate to the **Developer** dropdown, then select the **Chain state** option.\n\n    ![](/images/parachains/interoperability/channels-common/channels-03.webp)\n\n2. Query the HRMP open channel requests:\n\n    1. Select **`hrmp`**.\n    2. Choose the **`hrmpOpenChannelRequests`** call.\n    3. Click the **+** button to execute the query.\n    4. Check the status of all pending channel requests.\n\n    ![](/images/parachains/interoperability/channels-between-parachains/parachains-03.webp)\n\nIf your channel request was successful, you should see an entry for your parachain ID in the list of open channel requests. This confirms that your request has been properly registered on the relay chain and is awaiting acceptance by the target parachain."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#procedure-to-accept-an-hrmp-channel", "page_title": "Opening HRMP Channels Between Parachains", "index": 6, "depth": 2, "title": "Procedure to Accept an HRMP Channel", "anchor": "procedure-to-accept-an-hrmp-channel", "start_char": 7363, "end_char": 7547, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Procedure to Accept an HRMP Channel\n\nFor the channel to be fully established, the target parachain must accept the channel request by submitting an XCM message to the relay chain."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#fund-receiver-sovereign-account", "page_title": "Opening HRMP Channels Between Parachains", "index": 7, "depth": 3, "title": "Fund Receiver Sovereign Account", "anchor": "fund-receiver-sovereign-account", "start_char": 7547, "end_char": 7893, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fund Receiver Sovereign Account\n\nBefore proceeding, ensure that the sovereign account of parachain 2600 on the relay chain is funded. This account will be responsible for covering any XCM transact fees.\nTo fund the account, follow the same process described in the previous section, [Fund Sovereign Account](#fund-sender-sovereign-account)."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#create-channel-accepting-extrinsic", "page_title": "Opening HRMP Channels Between Parachains", "index": 8, "depth": 3, "title": "Create Channel Accepting Extrinsic", "anchor": "create-channel-accepting-extrinsic", "start_char": 7893, "end_char": 8635, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create Channel Accepting Extrinsic\n\n1. In Polkadot.js Apps, connect to the relay chain, navigate to the **Developer** dropdown and select the **Extrinsics** option.\n\n    ![](/images/parachains/interoperability/channels-common/channels-02.webp)\n\n2. Construct an `hrmpAcceptOpenChannel` extrinsic call:\n\n    1. Select the **`hrmp`** pallet.\n    2. Choose the **`hrmpAcceptOpenChannel`** extrinsic.\n    3. Fill in the parameters:\n        - **`sender`**: Parachain ID of the requesting chain (in this case, 2500).\n    4. Copy the encoded call data.\n\n    ![](/images/parachains/interoperability/channels-between-parachains/parachains-04.webp)\n\n    The encoded call data for accepting a channel with parachain 2500 should be `0x3c01c4090000`."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-between-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-between-parachains/#craft-and-submit-the-xcm-message-from-the-receiver", "page_title": "Opening HRMP Channels Between Parachains", "index": 9, "depth": 3, "title": "Craft and Submit the XCM Message from the Receiver", "anchor": "craft-and-submit-the-xcm-message-from-the-receiver", "start_char": 8635, "end_char": 10864, "estimated_token_count": 482, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:647f5972111dc98bdff9207756e3cb59ee5303608a89764fea0fa8b89fa3efdb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Craft and Submit the XCM Message from the Receiver\n\nTo accept the HRMP channel opening, you need to create and submit an XCM message that includes the encoded `hrmpAcceptOpenChannel` call data from the previous step. This process is similar to the one described in the previous section, [Craft and Submit the XCM Message](#craft-and-submit-the-xcm-message-from-the-sender), with a few key differences:\n\n- Use the encoded call data for `hrmpAcceptOpenChannel` obtained in step 2 of this section.\n- In the last XCM instruction (DepositAsset), set the beneficiary to parachain 2600's sovereign account to receive any surplus funds.\n\nTo send the XCM message to the relay chain, connect to parachain 2600 in Polkadot.js Apps. Fill in the required parameters as shown in the image below, ensuring that you:\n\n1. Replace the **`call`** field with your encoded `hrmpAcceptOpenChannel` call data from the previous step.\n2. Use the correct beneficiary information.\n3. Click the **Submit Transaction** button to dispatch the XCM message to the relay chain.\n\n![](/images/parachains/interoperability/channels-between-parachains/parachains-05.webp)\n\nAfter submitting the XCM message to accept the HRMP channel opening, verify that the channel has been set up correctly.\n\n1. Using Polkadot.js Apps, connect to the relay chain and navigate to the **Developer** dropdown, then select the **Chain state** option.\n\n    ![](/images/parachains/interoperability/channels-common/channels-01.webp)\n\n2. Query the HRMP channels:\n\n    1. Select **`hrmp`**.\n    2. Choose the **`hrmpChannels`** call.\n    3. Click the **+** button to execute the query.\n    4. Check the status of the opened channel.\n\n    ![](/images/parachains/interoperability/channels-between-parachains/parachains-06.webp)\n\nIf the channel has been successfully established, you should see the channel details in the query results.\n\nBy following these steps, you will have successfully accepted the HRMP channel request and established a unidirectional channel between the two parachains.\n\n\n!!! note\n    Remember that for full bidirectional communication, you'll need to repeat this process in the opposite direction, with parachain 2600 initiating a channel request to parachain 2500."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-with-system-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-with-system-parachains/#introduction", "page_title": "Opening HRMP Channels with System Parachains", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 49, "end_char": 828, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31a8893644b6a0b3bc2d1840229206504e62fa143b45ddff960fec9c9c2b564b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nWhile establishing Horizontal Relay-routed Message Passing (HRMP) channels between regular parachains involves a two-step request and acceptance procedure, opening channels with system parachains follows a more straightforward approach.\n\nSystem parachains are specialized chains that provide core functionality to the Polkadot network. Examples include Asset Hub for cross-chain asset transfers and Bridge Hub for connecting to external networks. Given their critical role, establishing communication channels with these system parachains has been optimized for efficiency and ease of use.\n\nAny parachain can establish a bidirectional channel with a system chain through a single operation, requiring just one XCM message from the parachain to the relay chain."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-with-system-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-with-system-parachains/#prerequisites", "page_title": "Opening HRMP Channels with System Parachains", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 828, "end_char": 1147, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31a8893644b6a0b3bc2d1840229206504e62fa143b45ddff960fec9c9c2b564b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nTo successfully complete this process, you'll need to have the following in place:\n\n- Access to a blockchain network consisting of:\n    - A relay chain\n    - A parachain\n    - An Asset Hub system chain\n- A wallet containing enough funds to cover transaction fees on each of the participating chains."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-with-system-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-with-system-parachains/#procedure-to-establish-an-hrmp-channel", "page_title": "Opening HRMP Channels with System Parachains", "index": 2, "depth": 2, "title": "Procedure to Establish an HRMP Channel", "anchor": "procedure-to-establish-an-hrmp-channel", "start_char": 1147, "end_char": 1339, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31a8893644b6a0b3bc2d1840229206504e62fa143b45ddff960fec9c9c2b564b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Procedure to Establish an HRMP Channel\n\nThis guide demonstrates opening an HRMP channel between parachain 2500 and system chain Asset Hub (parachain 1000) on the Rococo Local relay chain."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-with-system-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-with-system-parachains/#fund-parachain-sovereign-account", "page_title": "Opening HRMP Channels with System Parachains", "index": 3, "depth": 3, "title": "Fund Parachain Sovereign Account", "anchor": "fund-parachain-sovereign-account", "start_char": 1339, "end_char": 2915, "estimated_token_count": 340, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31a8893644b6a0b3bc2d1840229206504e62fa143b45ddff960fec9c9c2b564b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fund Parachain Sovereign Account\n\nThe [sovereign account](https://github.com/polkadot-fellows/xcm-format/blob/10726875bd3016c5e528c85ed6e82415e4b847d7/README.md?plain=1#L50) for parachain 2500 on the relay chain must be funded so it can take care of any XCM transact fees.\n\nUse [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) UI to connect to the relay chain and transfer funds from your account to the parachain 2500 sovereign account.\n\n![](/images/parachains/interoperability/channels-common/channels-01.webp)\n\n??? note \"Calculating Parachain Sovereign Account\"\n    To generate the sovereign account address for a parachain, you'll need to follow these steps:\n\n    1. Determine if the parachain is an \"up/down\" chain (parent or child) or a \"sibling\" chain:\n\n        - Up/down chains use the prefix `0x70617261` (which decodes to `b\"para\"`).\n        - Sibling chains use the prefix `0x7369626c` (which decodes to `b\"sibl\"`).\n\n    2. Calculate the u32 scale encoded value of the parachain ID:\n\n        - Parachain 2500 would be encoded as `c4090000`.\n\n    3. Combine the prefix and parachain ID encoding to form the full sovereign account address:\n\n        The sovereign account of parachain 2500 in relay chain will be `0x70617261c4090000000000000000000000000000000000000000000000000000`\n        and the SS58 format of this address is `5Ec4AhPSY2GEE4VoHUVheqv5wwq2C1HMKa7c9fVJ1WKivX1Y`.\n    \n    To perform this conversion, you can also use the **\"Para ID\" to Address** section in [Substrate Utilities](https://www.shawntabrizi.com/substrate-js-utilities/)."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-with-system-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-with-system-parachains/#create-establish-channel-with-system-extrinsic", "page_title": "Opening HRMP Channels with System Parachains", "index": 4, "depth": 3, "title": "Create Establish Channel with System Extrinsic", "anchor": "create-establish-channel-with-system-extrinsic", "start_char": 2915, "end_char": 3721, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31a8893644b6a0b3bc2d1840229206504e62fa143b45ddff960fec9c9c2b564b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create Establish Channel with System Extrinsic\n\n1. In Polkadot.js Apps, connect to the relay chain, navigate to the **Developer** dropdown and select the **Extrinsics** option.\n\n    ![](/images/parachains/interoperability/channels-common/channels-02.webp)\n\n2. Construct an `establish_channel_with_system` extrinsic call:\n\n    1. Select the **`hrmp`** pallet.\n    2. Choose the **`establish_channel_with_system`** extrinsic.\n    3. Fill in the parameters:\n        - **`target_system_chain`**: Parachain ID of the target system chain (in this case, 1000).\n    4. Copy the encoded call data.\n    ![](/images/parachains/interoperability/channels-with-system-parachains/system-parachains-01.webp)\n\n    The encoded call data for establishing a channel with system parachain 1000 should be `0x3c0ae8030000`."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-channels-with-system-parachains", "url": "https://developer.polkadot.com/parachains/interoperability/channels-with-system-parachains/#craft-and-submit-the-xcm-message", "page_title": "Opening HRMP Channels with System Parachains", "index": 5, "depth": 3, "title": "Craft and Submit the XCM Message", "anchor": "craft-and-submit-the-xcm-message", "start_char": 3721, "end_char": 7129, "estimated_token_count": 659, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31a8893644b6a0b3bc2d1840229206504e62fa143b45ddff960fec9c9c2b564b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Craft and Submit the XCM Message\n\nConnect to parachain 2500 using Polkadot.js Apps to send the XCM message to the relay chain. Input the necessary parameters as illustrated in the image below. Make sure to:\n\n1. Insert your previously encoded `establish_channel_with_system` call data into the **`call`** field.\n2. Provide beneficiary details.\n3. Dispatch the XCM message to the relay chain by clicking the **Submit Transaction** button.\n\n![](/images/parachains/interoperability/channels-with-system-parachains/system-parachains-02.webp)\n\n!!! note\n    The exact process and parameters for submitting this XCM message may vary depending on your specific parachain and relay chain configurations. Always refer to the most current documentation for your particular network setup.\n\nAfter successfully submitting the XCM message to the relay chain, two [`HrmpSystemChannelOpened`](https://paritytech.github.io/polkadot-sdk/master/polkadot_runtime_parachains/hrmp/pallet/enum.Event.html#variant.HrmpSystemChannelOpened) events are emitted, indicating that the channels are now present in storage under [`HrmpOpenChannelRequests`](https://paritytech.github.io/polkadot-sdk/master/polkadot_runtime_parachains/hrmp/pallet/storage_types/struct.HrmpOpenChannelRequests.html). However, the channels are not actually set up until the start of the next session, at which point bidirectional communication between parachain 2500 and system chain 1000 is established.\n\nTo verify this, wait for the next session and then follow these steps:\n\n1. Using Polkadot.js Apps, connect to the relay chain and navigate to the **Developer** dropdown, then select **Chain state**.\n\n    ![](/images/parachains/interoperability/channels-common/channels-03.webp)\n\n2. Query the HRMP channels:\n\n    1. Select **`hrmp`** from the options.\n    2. Choose the **`hrmpChannels`** call.\n    3. Click the **+** button to execute the query.\n\n    ![](/images/parachains/interoperability/channels-with-system-parachains/system-parachains-03.webp)\n    \n3. Examine the query results. You should see output similar to the following:\n\n    ```json\n    [\n        [\n            [\n                {\n                    \"sender\": 1000,\n                    \"recipient\": 2500\n                }\n            ],\n            {\n                \"maxCapacity\": 8,\n                \"maxTotalSize\": 8192,\n                \"maxMessageSize\": 1048576,\n                \"msgCount\": 0,\n                \"totalSize\": 0,\n                \"mqcHead\": null,\n                \"senderDeposit\": 0,\n                \"recipientDeposit\": 0\n            }\n        ],\n        [\n            [\n                {\n                    \"sender\": 2500,\n                    \"recipient\": 1000\n                }\n            ],\n            {\n                \"maxCapacity\": 8,\n                \"maxTotalSize\": 8192,\n                \"maxMessageSize\": 1048576,\n                \"msgCount\": 0,\n                \"totalSize\": 0,\n                \"mqcHead\": null,\n                \"senderDeposit\": 0,\n                \"recipientDeposit\": 0\n            }\n        ]\n    ]\n    \n    ```\n\nThe output confirms the successful establishment of two HRMP channels:\n\n- From chain 1000 (system chain) to chain 2500 (parachain).\n- From chain 2500 (parachain) to chain 1000 (system chain).\n\nThis bidirectional channel enables direct communication between the system chain and the parachain, allowing for cross-chain message passing."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-get-started", "url": "https://developer.polkadot.com/parachains/interoperability/get-started/#introduction", "page_title": "Get Started with XCM", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 697, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab15deccb37209e5ddb23fcd1c4693a628500e669004d244bacc0848ece0d84b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot’s unique value lies in its ability to enable interoperability between parachains and other blockchain systems. At the core of this capability is XCM (Cross-Consensus Messaging)—a flexible messaging format that facilitates communication and collaboration between independent consensus systems.\n\nWith XCM, one chain can send intents to another one, fostering a more interconnected ecosystem. Although it was developed specifically for Polkadot, XCM is a universal format, usable in any blockchain environment. This guide provides an overview of XCM’s core principles, design, and functionality, alongside practical examples of its implementation."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-get-started", "url": "https://developer.polkadot.com/parachains/interoperability/get-started/#messaging-format", "page_title": "Get Started with XCM", "index": 1, "depth": 2, "title": "Messaging Format", "anchor": "messaging-format", "start_char": 697, "end_char": 1555, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab15deccb37209e5ddb23fcd1c4693a628500e669004d244bacc0848ece0d84b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Messaging Format\n\nXCM is not a protocol but a standardized [messaging format](https://github.com/polkadot-fellows/xcm-format). It defines the structure and behavior of messages but does not handle their delivery. This separation allows developers to focus on crafting instructions for target systems without worrying about transmission mechanics.\n\nXCM messages are intent-driven, outlining desired actions for the receiving blockchain to consider and potentially alter its state. These messages do not directly execute changes; instead, they rely on the host chain's environment to interpret and implement them. By utilizing asynchronous composability, XCM facilitates efficient execution where messages can be processed independently of their original order, similar to how RESTful services handle HTTP requests without requiring sequential processing."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-get-started", "url": "https://developer.polkadot.com/parachains/interoperability/get-started/#the-four-principles-of-xcm", "page_title": "Get Started with XCM", "index": 2, "depth": 2, "title": "The Four Principles of XCM", "anchor": "the-four-principles-of-xcm", "start_char": 1555, "end_char": 2491, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab15deccb37209e5ddb23fcd1c4693a628500e669004d244bacc0848ece0d84b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Four Principles of XCM\n\nXCM adheres to four guiding principles that ensure robust and reliable communication across consensus systems:\n\n- **Asynchronous**: XCM messages operate independently of sender acknowledgment, avoiding delays due to blocked processes.\n- **Absolute**: XCM messages are guaranteed to be delivered and interpreted accurately, in order, and timely. Once a message is sent, one can be sure it will be processed as intended.\n- **Asymmetric**: XCM messages follow the 'fire and forget' paradigm meaning no automatic feedback is provided to the sender. Any results must be communicated separately to the sender with an additional message back to the origin.\n- **Agnostic**: XCM operates independently of the specific consensus mechanisms, making it compatible across diverse systems.\n\nThese principles guarantee that XCM provides a reliable framework for cross-chain communication, even in complex environments."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-get-started", "url": "https://developer.polkadot.com/parachains/interoperability/get-started/#the-xcm-tech-stack", "page_title": "Get Started with XCM", "index": 3, "depth": 2, "title": "The XCM Tech Stack", "anchor": "the-xcm-tech-stack", "start_char": 2491, "end_char": 2855, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab15deccb37209e5ddb23fcd1c4693a628500e669004d244bacc0848ece0d84b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The XCM Tech Stack\n\n![Diagram of the XCM tech stack](/images/parachains/interoperability/get-started/intro-to-xcm-01.webp)\n\nThe XCM tech stack is designed to facilitate seamless interoperable communication between chains that reside within the Polkadot ecosystem. XCM can be used to express the meaning of the messages over each of the communication channels."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-get-started", "url": "https://developer.polkadot.com/parachains/interoperability/get-started/#core-functionalities-of-xcm", "page_title": "Get Started with XCM", "index": 4, "depth": 2, "title": "Core Functionalities of XCM", "anchor": "core-functionalities-of-xcm", "start_char": 2855, "end_char": 3851, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab15deccb37209e5ddb23fcd1c4693a628500e669004d244bacc0848ece0d84b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Functionalities of XCM\n\nXCM enhances cross-consensus communication by introducing several powerful features:\n\n- **Programmability**: Supports dynamic message handling, allowing for more comprehensive use cases. Includes branching logic, safe dispatches for version checks, and asset operations like NFT management.\n- **Functional Multichain Decomposition**: Enables mechanisms such as remote asset locking, asset namespacing, and inter-chain state referencing, with contextual message identification.\n- **Bridging**: Establishes a universal reference framework for multi-hop setups, connecting disparate systems like Ethereum and Bitcoin with the Polkadot relay chain acting as a universal location.\n\nThe standardized format for messages allows parachains to handle tasks like user balances, governance, and staking, freeing the Polkadot relay chain to focus on shared security. These features make XCM indispensable for implementing scalable and interoperable blockchain applications."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-get-started", "url": "https://developer.polkadot.com/parachains/interoperability/get-started/#xcm-example", "page_title": "Get Started with XCM", "index": 5, "depth": 2, "title": "XCM Example", "anchor": "xcm-example", "start_char": 3851, "end_char": 6692, "estimated_token_count": 663, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab15deccb37209e5ddb23fcd1c4693a628500e669004d244bacc0848ece0d84b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## XCM Example\n\nThe following is a simplified XCM message demonstrating a token transfer from Alice to Bob on the same chain (ParaA).\n\n```rust\nlet message = Xcm(vec![\n    WithdrawAsset((Here, amount).into()),\n    BuyExecution { \n        fees: (Here, amount).into(), \n        weight_limit: WeightLimit::Unlimited \n    },\n    DepositAsset {\n        assets: All.into(),\n        beneficiary: MultiLocation {\n            parents: 0,\n            interior: Junction::AccountId32 {\n                network: None,\n                id: BOB.clone().into()\n            }.into(),\n        }.into()\n    }\n]);\n```\n\nThe message consists of three instructions described as follows:\n\n- **[WithdrawAsset](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#withdrawasset)**: Transfers a specified number of tokens from Alice's account to a holding register.\n\n    ```rust\n    WithdrawAsset((Here, amount).into()),\n    ```\n\n    - **`Here`**: The native parachain token.\n    - **`amount`**: The number of tokens that are transferred.\n\n    The first instruction takes as an input the MultiAsset that should be withdrawn. The MultiAsset describes the native parachain token with the `Here` keyword. The `amount` parameter is the number of tokens that are transferred. The withdrawal account depends on the origin of the message. In this example the origin of the message is Alice. The `WithdrawAsset` instruction moves `amount` number of native tokens from Alice's account into the holding register.\n\n- **[BuyExecution](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#buyexecution)**: Allocates fees to cover the execution Weight of the XCM instructions.\n\n    ```rust\n    BuyExecution { \n        fees: (Here, amount).into(), \n        weight_limit: WeightLimit::Unlimited \n    },\n    ```\n\n    - **`fees`**: Describes the asset in the holding register that should be used to pay for the weight.\n    - **`weight_limit`**: Defines the maximum fees that can be used to buy weight.\n\n- **[DepositAsset](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#depositasset)**: Moves the remaining tokens from the holding register to Bob’s account.\n\n    ```rust\n    DepositAsset {\n        assets: All.into(),\n        beneficiary: MultiLocation {\n            parents: 0,\n            interior: Junction::AccountId32 {\n                network: None,\n                id: BOB.clone().into()\n            }.into(),\n        }.into()\n    }\n    ```\n\n    - **`All`**: The wildcard for the asset(s) to be deposited. In this case, all assets in the holding register should be deposited.\n    \nThis step-by-step process showcases how XCM enables precise state changes within a blockchain system. You can find a complete XCM message example in the [XCM repository](https://github.com/paritytech/xcm-docs/blob/main/examples/src/0_first_look/mod.rs)."}
{"source": "polkadot-docs", "page_id": "parachains-interoperability-get-started", "url": "https://developer.polkadot.com/parachains/interoperability/get-started/#overview", "page_title": "Get Started with XCM", "index": 6, "depth": 2, "title": "Overview", "anchor": "overview", "start_char": 6692, "end_char": 7248, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab15deccb37209e5ddb23fcd1c4693a628500e669004d244bacc0848ece0d84b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Overview\n\nXCM revolutionizes cross-chain communication by enabling use cases such as:\n\n- Token transfers between blockchains.\n- Asset locking for cross-chain smart contract interactions.\n- Remote execution of functions on other blockchains.\n\nThese functionalities empower developers to build innovative, multi-chain applications, leveraging the strengths of various blockchain networks. To stay updated on XCM’s evolving format or contribute, visit the [XCM repository](https://github.com/paritytech/xcm-docs/blob/main/examples/src/0_first_look/mod.rs)."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#introduction", "page_title": "Deploy on Polkadot", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 436, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nPreviously, you learned how to [choose and set up a parachain template](/parachains/launch-a-parachain/set-up-the-parachain-template/). Now, you'll take the next step towards a production-like environment by deploying your parachain to the Polkadot TestNet. Deploying to a TestNet is a crucial step for validating your parachain's functionality and preparing it for eventual MainNet deployment."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#get-started-with-an-account-and-tokens", "page_title": "Deploy on Polkadot", "index": 1, "depth": 2, "title": "Get Started with an Account and Tokens", "anchor": "get-started-with-an-account-and-tokens", "start_char": 436, "end_char": 2327, "estimated_token_count": 509, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Get Started with an Account and Tokens\n\nTo perform any action on the Polkadot TestNet, you need PAS tokens, which can be requested from the [Polkadot Faucet](https://faucet.polkadot.io/?parachain=0). To store the tokens, you must have access to a Polkadot-SDK-compatible wallet. Go to the [Polkadot Wallets](../../wiki/general/build-open-source.md#wallets) page to view different options for a Polkadot wallet, or use the [Polkadot.js browser extension](https://polkadot.js.org/extension/), which is suitable for development purposes.\n\n!!!warning \n    Development keys and accounts should never hold assets of actual value and should not be used for production.\n\nThe [Polkadot.js Apps](https://polkadot.js.org/apps/) interface can be used to get you started for testing purposes.\n\nTo prepare an account, follow these steps:\n\n1. Open the [Polkadot.js Apps: Paseo](https://polkadot.js.org/apps/?rpc=wss://paseo.dotters.network#/explorer) interface and connect to the Polkadot TestNet (Paseo).\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-1.webp)\n\n2. Navigate to the **Accounts** section:\n\n    1. Click on the **Accounts** tab in the top menu.\n    2. Select the **Accounts** option from the dropdown menu.\n  \n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-2.webp)\n\n3. Copy the address of the account you want to use for the parachain deployment.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-3.webp)\n\n4. Visit the [Polkadot Faucet](https://faucet.polkadot.io/?parachain=0) and paste the copied address in the input field. Ensure that the network is set to Paseo and click on the **Get some PASs** button.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-4.webp)\n\n    After a few seconds, you will receive 5000 PAS tokens in your account."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#reserve-a-parachain-identifier", "page_title": "Deploy on Polkadot", "index": 2, "depth": 2, "title": "Reserve a Parachain Identifier", "anchor": "reserve-a-parachain-identifier", "start_char": 2327, "end_char": 3484, "estimated_token_count": 303, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Reserve a Parachain Identifier\n\nYou must reserve a parachain identifier (ID) before registering your parachain on Paseo. You'll be assigned the next available identifier.\n\nTo reserve a parachain identifier, follow these steps:\n\n1. Navigate to the **Parachains** section:\n\n    1. Click on the **Network** tab in the top menu.\n    2. Select the **Parachains** option from the dropdown menu.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-5.webp)\n\n2. Register a ParaId:\n\n    1. Select the **Parathreads** tab.\n    2. Click on the **+ ParaId** button.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-6.webp)\n\n3. Review the transaction and click on the **+ Submit** button.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-7.webp)\n\n    For this case, the next available parachain identifier is `4508`.\n\n4. After submitting the transaction, you can navigate to the **Explorer** tab and check the list of recent events for successful `registrar.Reserved`.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-8.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#generate-custom-keys-for-your-collators", "page_title": "Deploy on Polkadot", "index": 3, "depth": 2, "title": "Generate Custom Keys for Your Collators", "anchor": "generate-custom-keys-for-your-collators", "start_char": 3484, "end_char": 5479, "estimated_token_count": 404, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Generate Custom Keys for Your Collators\n\nTo securely deploy your parachain, it is essential to generate custom keys specifically for your Collators (block producers). You should generate two sets of keys for each collator:\n\n- **Account keys**: Used to interact with the network and manage funds. These should be protected carefully and should never exist on the filesystem of the collator node.\n\n- **Session keys**: Used in block production to identify your node and its blocks on the network. These keys are stored in the parachain keystore and function as disposable \"hot wallet\" keys. If these keys are leaked, someone could impersonate your node, which could result in the slashing of your funds. To minimize these risks, rotating your session keys frequently is essential. Treat them with the same level of caution as you would a hot wallet to ensure the security of your node.\n\nTo perform this step, you can use [subkey](https://docs.rs/crate/subkey/latest), a command-line tool for generating and managing keys:\n\n```bash\ndocker run -it parity/subkey:latest generate --scheme sr25519\n```\n\nThe output should look similar to the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>docker run -it parity/subkey:latest generate --scheme sr25519</span>\n  <span> <br />Secret phrase: lemon play remain picture leopard frog mad bridge hire hazard best buddy <br />Network ID: substrate <br />Secret seed: 0xb748b501de061bae1fcab1c0b814255979d74d9637b84e06414a57a1a149c004 <br />Public key (hex): 0xf4ec62ec6e70a3c0f8dcbe0531e2b1b8916cf16d30635bbe9232f6ed3f0bf422 <br />Account ID: 0xf4ec62ec6e70a3c0f8dcbe0531e2b1b8916cf16d30635bbe9232f6ed3f0bf422 <br />Public key (SS58): 5HbqmBBJ5ALUzho7tw1k1jEgKBJM7dNsQwrtfSfUskT1a3oe <br />SS58 Address: 5HbqmBBJ5ALUzho7tw1k1jEgKBJM7dNsQwrtfSfUskT1a3oe </span>\n</div>\n\n\nEnsure that this command is executed twice to generate the keys for both the account and session keys. Save them for future reference."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#generate-the-chain-specification", "page_title": "Deploy on Polkadot", "index": 4, "depth": 2, "title": "Generate the Chain Specification", "anchor": "generate-the-chain-specification", "start_char": 5479, "end_char": 14550, "estimated_token_count": 1439, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Generate the Chain Specification\n\nPolkadot SDK-based parachains are defined by a file called the Chain Specification, or chain spec for short. There are two types of chain spec files:\n\n- **Plain chain spec**: A human-readable JSON file that can be modified to suit your parachain's requirements. It serves as a template for initial configuration and includes human-readable keys and structures.\n- **Raw chain spec**: A binary-encoded file used to start your parachain node. This file is generated from the plain chain spec and contains the encoded information necessary for the parachain node to synchronize with the blockchain network. It ensures compatibility across different runtime versions by providing data in a format directly interpretable by the node's runtime, regardless of upgrades since the chain's genesis.\n\nThe chain spec file is only required during the initial blockchain creation (genesis). You do not need to generate a new chain spec when performing runtime upgrades after your chain is already running.\n\nThe files required to register a parachain must specify the correct relay chain to connect to and the parachain identifier you have been assigned. To make these changes, you must build and modify the chain specification file for your parachain. In this tutorial, the relay chain is `paseo`, and the parachain identifier is `4508`.\n\nTo define your chain specification:\n\n1. Generate the plain chain specification for the parachain template node by running the following command. Make sure to use the `*.compact.compressed.wasm` version of your compiled runtime when generating your chain specification, and replace `INSERT_PARA_ID` with the ID you obtained in the [Reserve a Parachain Identifier](#reserve-a-parachain-identifier) section:\n\n    ```bash\n    chain-spec-builder \\\n    --chain-spec-path ./plain_chain_spec.json \\\n    create \\\n    --relay-chain paseo \\\n    --para-id INSERT_PARA_ID \\\n    --runtime target/release/wbuild/parachain-template-runtime/parachain_template_runtime.compact.compressed.wasm \\\n    named-preset local_testnet\n    ```\n\n2. Edit the `plain_chain_spec.json` file:\n\n    - Update the `name`, `id`, and `protocolId` fields to unique values for your parachain.\n    - Change `para_id` and `parachainInfo.parachainId` fields to the parachain ID you obtained previously. Make sure to use a number without quotes.\n    - Modify the `balances` field to specify the initial balances for your accounts in SS58 format.\n    - Insert the account IDs and session keys in SS58 format generated for your collators in the `collatorSelection.invulnerables` and `session.keys` fields.\n    - Modify the `sudo` value to specify the account that will have sudo access to the parachain.\n  \n    ```json\n    {\n        \"bootNodes\": [],\n        \"chainType\": \"Live\",\n        \"codeSubstitutes\": {},\n        \"genesis\": {\n            \"runtimeGenesis\": {\n                \"code\": \"0x...\",\n                \"patch\": {\n                    \"aura\": {\n                        \"authorities\": []\n                    },\n                    \"auraExt\": {},\n                    \"balances\": {\n                        \"balances\": [[\"INSERT_SUDO_ACCOUNT\", 1152921504606846976]]\n                    },\n                    \"collatorSelection\": {\n                        \"candidacyBond\": 16000000000,\n                        \"desiredCandidates\": 0,\n                        \"invulnerables\": [\"INSERT_ACCOUNT_ID_COLLATOR_1\"]\n                    },\n                    \"parachainInfo\": {\n                        \"parachainId\": \"INSERT_PARA_ID\"\n                    },\n                    \"parachainSystem\": {},\n                    \"polkadotXcm\": {\n                        \"safeXcmVersion\": 4\n                    },\n                    \"session\": {\n                        \"keys\": [\n                            [\n                                \"INSERT_ACCOUNT_ID_COLLATOR_1\",\n                                \"INSERT_ACCOUNT_ID_COLLATOR_1\",\n                                {\n                                    \"aura\": \"INSERT_SESSION_KEY_COLLATOR_1\"\n                                }\n                            ]\n                        ],\n                        \"nonAuthorityKeys\": []\n                    },\n                    \"sudo\": {\n                        \"key\": \"INSERT_SUDO_ACCOUNT\"\n                    },\n                    \"system\": {},\n                    \"transactionPayment\": {\n                        \"multiplier\": \"1000000000000000000\"\n                    }\n                }\n            }\n        },\n        \"id\": \"INSERT_ID\",\n        \"name\": \"INSERT_NAME\",\n        \"para_id\": \"INSERT_PARA_ID\",\n        \"properties\": {\n            \"tokenDecimals\": 12,\n            \"tokenSymbol\": \"UNIT\"\n        },\n        \"protocolId\": \"INSERT_PROTOCOL_ID\",\n        \"relay_chain\": \"paseo\",\n        \"telemetryEndpoints\": null\n    }\n    \n    ```\n\n    For this tutorial, the `plain_chain_spec.json` file should look similar to the following. Take into account that the same account is being used for the collator and sudo, which must not be the case in a production environment:\n\n    ??? code \"View complete script\"\n\n        ```json title=\"plain_chain_spec.json\"\n        {\n            \"bootNodes\": [],\n            \"chainType\": \"Live\",\n            \"codeSubstitutes\": {},\n            \"genesis\": {\n                \"runtimeGenesis\": {\n                    \"code\": \"0x...\",\n                    \"patch\": {\n                        \"aura\": {\n                            \"authorities\": []\n                        },\n                        \"auraExt\": {},\n                        \"balances\": {\n                            \"balances\": [\n                                [\n                                    \"5F9Zteceg3Q4ywi63AxQNVb2b2r5caFSqjQxBkCrux6j8ZpS\",\n                                    1152921504606846976\n                                ]\n                            ]\n                        },\n                        \"collatorSelection\": {\n                            \"candidacyBond\": 16000000000,\n                            \"desiredCandidates\": 0,\n                            \"invulnerables\": [\n                                \"5F9Zteceg3Q4ywi63AxQNVb2b2r5caFSqjQxBkCrux6j8ZpS\"\n                            ]\n                        },\n                        \"parachainInfo\": {\n                            \"parachainId\": 4508\n                        },\n                        \"parachainSystem\": {},\n                        \"polkadotXcm\": {\n                            \"safeXcmVersion\": 4\n                        },\n                        \"session\": {\n                            \"keys\": [\n                                [\n                                    \"5F9Zteceg3Q4ywi63AxQNVb2b2r5caFSqjQxBkCrux6j8ZpS\",\n                                    \"5F9Zteceg3Q4ywi63AxQNVb2b2r5caFSqjQxBkCrux6j8ZpS\",\n                                    {\n                                        \"aura\": \"5GcAKNdYcw5ybb2kAnta8WVFyiQbGJ5od3aH9MsgYDmVcrhJ\"\n                                    }\n                                ]\n                            ],\n                            \"nonAuthorityKeys\": []\n                        },\n                        \"sudo\": {\n                            \"key\": \"5F9Zteceg3Q4ywi63AxQNVb2b2r5caFSqjQxBkCrux6j8ZpS\"\n                        },\n                        \"system\": {},\n                        \"transactionPayment\": {\n                            \"multiplier\": \"1000000000000000000\"\n                        }\n                    }\n                }\n            },\n            \"id\": \"custom\",\n            \"name\": \"Custom\",\n            \"para_id\": 4508,\n            \"properties\": {\n                \"tokenDecimals\": 12,\n                \"tokenSymbol\": \"UNIT\"\n            },\n            \"protocolId\": null,\n            \"relay_chain\": \"paseo\",\n            \"telemetryEndpoints\": null\n        }\n        \n        ```\n\n3. Save your changes and close the plain text chain specification file.\n\n4. Convert the modified plain chain specification file to a raw chain specification file:\n\n    ```bash\n    chain-spec-builder \\\n    --chain-spec-path ./raw_chain_spec.json \\\n    convert-to-raw plain_chain_spec.json\n    ```\n\n    You should now see your chain specification containing SCALE-encoded hex values versus plain text.\n\n\n!!!note \"`para_id` Considerations\"\n\n    The `para_id` field in JSON chain specifications, added through the [`chain-spec-builder`](https://paritytech.github.io/polkadot-sdk/master/staging_chain_spec_builder/index.html) command, is used by nodes for configuration purposes. Beginning with Polkadot SDK release `stable2509`, runtimes can optionally implement the [`cumulus_primitives_core::GetParachainInfo`](https://paritytech.github.io/polkadot-sdk/master/cumulus_primitives_core/trait.GetParachainInfo.html) trait as an alternative method for parachain identification.\n\n    However, the `para_id` field will remain supported in chain specifications for backwards compatibility. This ensures that nodes can still sync from genesis or from runtime states that existed before the `GetParachainInfo` runtime API was introduced."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#export-required-files", "page_title": "Deploy on Polkadot", "index": 5, "depth": 2, "title": "Export Required Files", "anchor": "export-required-files", "start_char": 14550, "end_char": 15036, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Export Required Files\n\nTo prepare the parachain collator to be registered on Paseo, follow these steps:\n\n1. Export the Wasm runtime for the parachain by running the following command:\n\n    ```bash\n    polkadot-omni-node export-genesis-wasm \\\n    --chain raw_chain_spec.json para-wasm\n    ```\n\n2. Export the genesis state for the parachain by running the following command:\n\n    ```bash\n    polkadot-omni-node export-genesis-head \\\n    --chain raw_chain_spec.json para-state\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#register-a-parathread", "page_title": "Deploy on Polkadot", "index": 6, "depth": 2, "title": "Register a Parathread", "anchor": "register-a-parathread", "start_char": 15036, "end_char": 16265, "estimated_token_count": 300, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Register a Parathread\n\nOnce you have the genesis state and runtime, you can now register these with your parachain ID.\n\n1. Go to the [Parachains > Parathreads](https://polkadot.js.org/apps/#/parachains/parathreads) tab, and select **+ Parathread**.\n   \n2. You should see fields to place your runtime Wasm and genesis state respectively, along with the parachain ID. Select your parachain ID, and upload `para-wasm` in the **code** field and `para-state` in the **initial state** field.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-9.webp)\n   \n3. Confirm your details and click the **+ Submit** button, where there should be a new Parathread with your parachain ID and an active **Deregister** button.\n\n    ![](/images/parachains/launch-a-parachain/deploy-to-polkadot/deploy-to-polkadot-10.webp)\n\nYour parachain's runtime logic and genesis are now part of the relay chain. The next step is to ensure you are able to run a Collator to produce blocks for your parachain.\n\n!!!note \n    You may need to wait several hours for your parachain to onboard. Until it has onboarded, you will be unable to purchase coretime, and therefore will not be able to perform transactions on your network."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#start-the-collator-node", "page_title": "Deploy on Polkadot", "index": 7, "depth": 2, "title": "Start the Collator Node", "anchor": "start-the-collator-node", "start_char": 16265, "end_char": 19089, "estimated_token_count": 705, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Start the Collator Node\n\nBefore starting a collator, you need to generate a node key. This key is responsible for communicating with other nodes over Libp2p:\n\n```bash\npolkadot-omni-node key generate-node-key \\\n--base-path data \\\n--chain raw_chain_spec.json\n```\n\nAfter running the command, you should see the following output, indicating the base path now has a suitable node key: \n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>polkadot-omni-node key generate-node-key --base-path data --chain raw_chain_spec.json</span>\n  <br />\n  <span data-ty=\"progress\">Generating key in \"/data/chains/custom/network/secret_ed25519\"</span>\n  <span data-ty=\"progress\">12D3KooWKGW964eG4fAwsNMFdckbj3GwhpmSGFU9dd8LFAVAa4EE</span>\n</div>\n\n\nYou must have the ports for the collator publicly accessible and discoverable to enable parachain nodes to peer with Paseo validator nodes to produce blocks. You can specify the ports with the `--port` command-line option. You can start the collator with a command similar to the following (ensure you replace `INSERT_ID` with the `\"id\"` you used in the `plain_chain_spec.json` file:\n\n```bash\npolkadot-omni-node --collator \\\n--chain raw_chain_spec.json \\\n--base-path data \\\n--port 40333 \\\n--rpc-port 8845 \\\n--force-authoring \\\n--node-key-file ./data/chains/INSERT_ID/network/secret_ed25519 \\\n-- \\\n--sync warp \\\n--chain paseo \\\n--port 50343 \\\n--rpc-port 9988\n```\n\nIn this example, the first `--port` setting specifies the port for the collator node, and the second `--port` specifies the embedded relay chain node port. The first `--rpc-port` setting specifies the port you can connect to the collator. The second `--rpc-port` specifies the port for connecting to the embedded relay chain.\n\nBefore proceeding, ensure that the collator node is running. Then, open a new terminal and insert your generated session key into the collator keystore by running the following command. Use the same port specified in the `--rpc-port` parameter when starting the collator node (`8845` in this example) to connect to it. Replace `INSERT_SECRET_PHRASE` and `INSERT_PUBLIC_KEY_HEX_FORMAT` with the values from the session key you generated in the [Generate Custom Keys for Your Collators](#generate-custom-keys-for-your-collators) section:\n\n```bash\ncurl -H \"Content-Type: application/json\" \\\n--data '{\n  \"jsonrpc\":\"2.0\",\n  \"method\":\"author_insertKey\",\n  \"params\":[\n    \"aura\",\n    \"INSERT_SECRET_PHRASE\",\n    \"INSERT_PUBLIC_KEY_HEX_FORMAT\"\n  ],\n  \"id\":1\n}' \\\nhttp://localhost:8845\n```\n\nIf successful, you should see the following response:\n\n```json\n{\"jsonrpc\":\"2.0\",\"result\":null,\"id\":1}\n```\n\nOnce your collator is synced with the Paseo relay chain, and your parathread finished onboarding, it will be ready to start producing blocks. This process may take some time."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-deploy-to-polkadot", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/deploy-to-polkadot/#producing-blocks", "page_title": "Deploy on Polkadot", "index": 8, "depth": 2, "title": "Producing Blocks", "anchor": "producing-blocks", "start_char": 19089, "end_char": 20050, "estimated_token_count": 196, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:529b416bad28e2cc1486221368b48fa1cd394f0443f5b5d92616234261f6abbb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Producing Blocks\n\nWith your parachain collator operational, the next step is acquiring coretime. This is essential for ensuring your parachain's security through the relay chain. [Agile Coretime](../../wiki/learn/learn-agile-coretime.md) enhances Polkadot's resource management, offering developers greater economic adaptability. Once you have configured your parachain, you can follow two paths:\n\n- Bulk coretime is purchased via the Broker pallet on the respective coretime system parachain. You can purchase bulk coretime on the coretime chain and assign the purchased core to the registered `ParaID`.\n- On-demand coretime is ordered via the [`OnDemand`](https://paritytech.github.io/polkadot-sdk/master/polkadot_runtime_parachains/on_demand/index.html) pallet, which is located on the respective relay chain.\n\nOnce coretime is correctly assigned to your parachain, whether bulk or on-demand, blocks should be produced (provided your collator is running)."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#introduction", "page_title": "Obtain Coretime", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 990, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nAfter deploying a parachain to Paseo in the [Deploy on Polkadot](/parachains/launch-a-parachain/deploy-to-polkadot/) tutorial, the next critical step is obtaining coretime. Coretime is the mechanism through which validation resources are allocated from the relay chain to your parachain. Your parachain can only produce and finalize blocks on the relay chain by obtaining coretime.\n\nThere are two primary ways to obtain coretime:\n\n- **[On-demand coretime](#order-on-demand-coretime)**: Purchase coretime on a block-by-block basis, ideal for variable or unpredictable workloads.\n- **[Bulk coretime](#purchase-bulk-coretime)**: Obtain a core or portion of a core for an extended period (up to 28 days), requiring renewal upon lease expiration.\n\nIn this tutorial, you will:\n\n- Understand the different coretime options available.\n- Learn how bulk coretime is purchased and assigned to a parachain.\n- Explore on-demand coretime as an alternative approach."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#prerequisites", "page_title": "Obtain Coretime", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 990, "end_char": 1594, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Prerequisites\n\nBefore proceeding, ensure you have the following:\n\n- A parachain ID reserved on Paseo.\n- A properly configured chain specification file (both plain and raw versions).\n- A registered parathread with the correct genesis state and runtime.\n- A synced collator node running and connected to the Paseo relay chain.\n- [PAS tokens](https://faucet.polkadot.io/?parachain=1005) in your account on the Coretime Chain for transaction fees.\n\nIf you haven't completed these prerequisites, start by referring to the [Deploy on Polkadot](/parachains/launch-a-parachain/deploy-to-polkadot/) tutorial."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#order-on-demand-coretime", "page_title": "Obtain Coretime", "index": 2, "depth": 2, "title": "Order On-Demand Coretime", "anchor": "order-on-demand-coretime", "start_char": 1594, "end_char": 1848, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Order On-Demand Coretime\n\nOn-demand coretime allows you to purchase validation resources on a per-block basis. This approach is useful when you don't need continuous block production or want to test your parachain before committing to bulk coretime."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#on-demand-extrinsics", "page_title": "Obtain Coretime", "index": 3, "depth": 3, "title": "On-Demand Extrinsics", "anchor": "on-demand-extrinsics", "start_char": 1848, "end_char": 2542, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### On-Demand Extrinsics\n\nThere are two extrinsics available for ordering on-demand coretime:\n\n- **[`onDemand.placeOrderAllowDeath`](https://paritytech.github.io/polkadot-sdk/master/polkadot_runtime_parachains/on_demand/pallet/struct.Pallet.html#method.place_order_allow_death)**: Will [reap](../../wiki/learn/learn-accounts.md#existential-deposit-and-reaping) the account once the provided funds are depleted.\n- **[`onDemand.placeOrderKeepAlive`](https://paritytech.github.io/polkadot-sdk/master/polkadot_runtime_parachains/on_demand/pallet/struct.Pallet.html#method.place_order_keep_alive)**: Includes a check to prevent reaping the account, ensuring it remains alive even if funds run out."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#place-an-on-demand-order", "page_title": "Obtain Coretime", "index": 4, "depth": 3, "title": "Place an On-Demand Order", "anchor": "place-an-on-demand-order", "start_char": 2542, "end_char": 3841, "estimated_token_count": 309, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Place an On-Demand Order\n\nTo place an on-demand coretime order, follow these steps:\n\n1. Open the [Polkadot.js Apps interface connected to the Polkadot TestNet (Paseo)](https://polkadot.js.org/apps/?rpc=wss://paseo.dotters.network).\n\n2. Navigate to **Developer > Extrinsics** in the top menu.\n\n3. Select the account that registered your parachain ID.\n\n4. From the **submit the following extrinsic** dropdown, select **onDemand** and then choose **placeOrderAllowDeath** as the extrinsic.\n\n5. Configure the parameters:\n\n    - **maxAmount**: The maximum amount of tokens you're willing to spend (e.g., `1000000000000`). This value may vary depending on network conditions.\n    - **paraId**: Your reserved parachain ID (e.g., `4508`).\n\n6. Review the transaction details and click **Submit Transaction**.\n\n![Placing an on-demand order for coretime](/images/parachains/launch-a-parachain/obtain-coretime/obtain-coretime-01.webp)\n\nUpon successful submission, your parachain will produce a new block. You can verify this by checking your collator node logs, which should display output confirming block production.\n\n!!!note\n    Each successful on-demand extrinsic will trigger one block production cycle. For continuous block production, you'll need to place multiple orders or consider bulk coretime."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#purchase-bulk-coretime", "page_title": "Obtain Coretime", "index": 5, "depth": 2, "title": "Purchase Bulk Coretime", "anchor": "purchase-bulk-coretime", "start_char": 3841, "end_char": 4332, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Purchase Bulk Coretime\n\nBulk coretime offers a cost-effective way to maintain continuous block production. It lets you reserve a core for up to 28 days and renew it as needed.\n\nYou purchase and manage cores on the [Coretime Chain](../../wiki/learn/learn-system-chains.md#coretime-chain), a system parachain that runs [`pallet_broker`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/index.html) to handle core sales, allocation, and renewal across the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#bulk-coretime-extrinsics", "page_title": "Obtain Coretime", "index": 6, "depth": 3, "title": "Bulk Coretime Extrinsics", "anchor": "bulk-coretime-extrinsics", "start_char": 4332, "end_char": 5659, "estimated_token_count": 327, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Bulk Coretime Extrinsics\n\nObtaining bulk coretime for a parachain takes two extrinsics on the Coretime Chain:\n\n- **[`broker.purchase`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/pallet/struct.Pallet.html#method.purchase)**: Buys a core in the current sale. The `price_limit` parameter caps what you pay, and the call fails with an `Overpriced` error if the current price is higher. A successful purchase emits a [`Purchased`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/pallet/enum.Event.html#variant.Purchased) event containing the `region_id` of the region you now own.\n- **[`broker.assign`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/pallet/struct.Pallet.html#method.assign)**: Assigns a region you own to a task, which for a parachain is its parachain ID. The [`finality`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/enum.Finality.html) parameter is either `Provisional`, which keeps the region with you so you can change the assignment later, or `Final`, which fixes the assignment and makes the region eligible for renewal. Choose `Final` if you plan to renew the core.\n\nThe region you buy covers the sale's upcoming period, so your parachain starts producing blocks on that core when the region begins, not immediately after assignment."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#obtain-coretime-chain-funds", "page_title": "Obtain Coretime", "index": 7, "depth": 3, "title": "Obtain Coretime Chain Funds", "anchor": "obtain-coretime-chain-funds", "start_char": 5659, "end_char": 6707, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Obtain Coretime Chain Funds\n\nTo purchase a core, you need funds on the Coretime Chain. You can fund your account directly on the Coretime Chain using the Polkadot Faucet:\n\n1. Visit the [Polkadot Faucet](https://faucet.polkadot.io/?parachain=0).\n\n2. Select the **Coretime (Paseo)** network from the dropdown menu.\n\n3. Paste your wallet address in the input field.\n\n4. Click **Get some PASs** to receive 5000 PAS tokens.\n\n!!!note\n    The Polkadot Faucet has a daily limit of 5,000 PAS tokens per account. If you need more tokens than this limit allows, you have two options:\n    \n    - Return to the faucet on consecutive days to accumulate additional tokens.\n    - Create additional accounts, fund each one separately, and then transfer the tokens to your primary account that will be making the bulk coretime purchase.\n\n    Alternatively, to expedite the process, you can send a message to the [Paseo Support channel](https://matrix.to/#/#paseo-testnet-support:parity.io) on Matrix, and the Paseo team will assist you in funding your account."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#obtain-a-core-on-paseo", "page_title": "Obtain Coretime", "index": 8, "depth": 3, "title": "Obtain a Core on Paseo", "anchor": "obtain-a-core-on-paseo", "start_char": 6707, "end_char": 7575, "estimated_token_count": 216, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Obtain a Core on Paseo\n\nPaseo allocates cores through its own onboarding process, which prioritizes teams based on the resources available on the network:\n\n1. Read the [PAS-10 Onboard Paras Coretime](https://github.com/paseo-network/paseo-action-submission/blob/main/pas/PAS-10-Onboard-paras-coretime.md#summary) guide, which describes the onboarding flow.\n\n2. Open a parachain onboarding issue in the [Paseo support repository](https://github.com/paseo-network/support/issues).\n\n3. Once the Paseo team has processed your request, purchase a core with `broker.purchase` and assign it to your parachain ID with `broker.assign`, using `Final` finality if you plan to renew.\n\nIf no cores are available or you run into problems, follow up on your onboarding issue or ask in the [Paseo Support channel](https://matrix.to/#/#paseo-testnet-support:parity.io) on Matrix."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#verify-block-production", "page_title": "Obtain Coretime", "index": 9, "depth": 3, "title": "Verify Block Production", "anchor": "verify-block-production", "start_char": 7575, "end_char": 7812, "estimated_token_count": 43, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Verify Block Production\n\nOnce the region assigned to your parachain begins, check your collator node logs. They should show new blocks being produced and finalized, provided your collator is running and synced with the relay chain."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-obtain-coretime", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/obtain-coretime/#next-steps", "page_title": "Obtain Coretime", "index": 10, "depth": 2, "title": "Next Steps", "anchor": "next-steps", "start_char": 7812, "end_char": 8256, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c0b3d45eda2a886f5cde17603cd553651af3cc3ab8b0cd78558d3788ef1db036", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Next Steps\n\nYour parachain is now set up for block production. Consider the following:\n\n- **Monitor your collator**: Keep your collator node running and monitor its performance.\n- **Plan coretime renewal**: If using bulk coretime, plan to renew your core before the current lease expires.\n- **Explore runtime upgrades**: Once comfortable with your setup, explore how to upgrade your parachain's runtime without interrupting block production."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#introduction", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 47, "end_char": 1094, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nThe [Polkadot SDK](https://github.com/paritytech/polkadot-sdk) includes several [templates](/parachains/customize-runtime/#starting-templates) designed to help you quickly start building your own blockchain. Each template offers a different level of configuration, from minimal setups to feature-rich environments, allowing you to choose the foundation that best fits your project's needs.\n\nAmong these, the [Parachain Template](https://github.com/paritytech/polkadot-sdk-parachain-template) provides a preconfigured runtime with commonly used pallets, making it an ideal starting point for most parachain development projects.\n\nThis guide walks you through the full process of working with this template. You will:\n\n- Set up the Polkadot SDK Parachain Template.\n- Understand the project structure and key components.\n- Verify your template is ready for development.\n- Run the parachain template locally in development mode.\n\nBy the end of this guide, you'll have a working template ready to customize and deploy as a parachain."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#prerequisites", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1094, "end_char": 2031, "estimated_token_count": 224, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have done the following:\n\n- Completed the [Install Polkadot SDK](/parachains/install-polkadot-sdk/) guide and successfully installed [Rust](https://rust-lang.org/) and the required packages to set up your development environment.\n\nFor this tutorial series, you need to use Rust `1.88`. Newer versions of the compiler may not work with this parachain template version.\n\nRun the following commands to set up the correct Rust version:\n\n=== \"macOS\"\n\n    ```bash\n    rustup install 1.88\n    rustup default 1.88\n    rustup target add wasm32-unknown-unknown --toolchain 1.88-aarch64-apple-darwin\n    rustup component add rust-src --toolchain 1.88-aarch64-apple-darwin\n    ```\n\n=== \"Ubuntu\"\n\n    ```bash\n    rustup toolchain install 1.88.0\n    rustup default 1.88.0\n    rustup target add wasm32-unknown-unknown --toolchain 1.88.0\n    rustup component add rust-src --toolchain 1.88.0\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#polkadot-sdk-utility-tools", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 2, "depth": 2, "title": "Polkadot SDK Utility Tools", "anchor": "polkadot-sdk-utility-tools", "start_char": 2031, "end_char": 4034, "estimated_token_count": 544, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot SDK Utility Tools\n\nThis tutorial requires two essential tools:\n\n- [**Chain spec builder**](https://crates.io/crates/staging-chain-spec-builder/16.0.0) - a Polkadot SDK utility for generating chain specifications. Refer to the [Generate Chain Specs](/parachains/launch-a-parachain/deploy-to-polkadot/#generate-the-chain-specification) documentation for detailed usage\n- [**Polkadot Omni Node**](https://crates.io/crates/polkadot-omni-node/0.13.2) - a white-labeled binary, released as a part of Polkadot SDK, that can act as the collator of a parachain in production, with all the related auxiliary functionalities that a normal collator node has: RPC server, archiving state, etc. It can also run the Wasm blob of the parachain locally for testing and development\n\nDownload the pre-built binaries from the [Polkadot SDK release](https://github.com/paritytech/polkadot-sdk/releases/tag/polkadot-stable2512-2) (recommended):\n\n=== \"macOS\"\n\n    ```bash\n    curl -L -o chain-spec-builder https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/chain-spec-builder-aarch64-apple-darwin\n    curl -L -o polkadot-omni-node https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/polkadot-omni-node-aarch64-apple-darwin\n    chmod +x chain-spec-builder polkadot-omni-node\n    sudo mv chain-spec-builder polkadot-omni-node /usr/local/bin/\n    ```\n\n=== \"Ubuntu\"\n\n    ```bash\n    curl -L -o chain-spec-builder https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/chain-spec-builder\n    curl -L -o polkadot-omni-node https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/polkadot-omni-node\n    chmod +x chain-spec-builder polkadot-omni-node\n    sudo mv chain-spec-builder polkadot-omni-node /usr/local/bin/\n    ```\n\nAlternatively, you can install from source using `cargo`:\n\n```bash\ncargo install --locked staging-chain-spec-builder@16.0.0\ncargo install --locked polkadot-omni-node@0.13.2\n```"}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#clone-the-template", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 3, "depth": 2, "title": "Clone the Template", "anchor": "clone-the-template", "start_char": 4034, "end_char": 4575, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Clone the Template\n\nThe [Polkadot SDK Parachain Template](https://github.com/paritytech/polkadot-sdk-parachain-template) provides a ready-to-use development environment for building with the [Polkadot SDK](https://github.com/paritytech/polkadot-sdk). Follow these steps to set up the template:\n\n1. Clone the template repository:\n\n    ```bash\n    git clone https://github.com/paritytech/polkadot-sdk-parachain-template.git parachain-template\n    ```\n\n2. Navigate into the project directory:\n\n    ```bash\n    cd parachain-template\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#explore-the-project-structure", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 4, "depth": 2, "title": "Explore the Project Structure", "anchor": "explore-the-project-structure", "start_char": 4575, "end_char": 5800, "estimated_token_count": 244, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Explore the Project Structure\n\nBefore building the template, take a moment to familiarize yourself with its structure. Understanding this organization will help you navigate the codebase as you develop your parachain.\n\nThe template follows a standard Polkadot SDK project layout:\n\n```text\nparachain-template/\n├── node/              # Node implementation and client\n├── pallets/           # Custom pallets for your parachain\n├── runtime/           # Runtime configuration and logic\n├── Cargo.toml         # Workspace configuration\n└── README.md          # Documentation\n```\n\nKey directories explained:\n\n- **runtime/**: Contains your parachain's state transition function and pallet configuration. This is where you'll define what your blockchain can do.\n- **node/**: Houses the client implementation that runs your blockchain, handles networking, and manages the database.\n- **pallets/**: Where you'll create custom business logic modules (pallets) for your specific use case.\n- **Cargo.toml**: The workspace configuration that ties all components together.\n\n!!!note\n    The runtime is compiled to WebAssembly (Wasm), enabling forkless upgrades. The node binary remains constant while the runtime can be updated on-chain."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#compile-the-runtime", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 5, "depth": 2, "title": "Compile the Runtime", "anchor": "compile-the-runtime", "start_char": 5800, "end_char": 6764, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Compile the Runtime\n\nNow that you understand the template structure, let's compile the runtime to ensure everything is working correctly.\n\n1. Compile the runtime:\n\n    ```bash\n    cargo build --release --locked\n    ```\n\n    !!!tip\n        Initial compilation may take several minutes, depending on your machine specifications. Use the `--release` flag for improved runtime performance compared to the default `--debug` build. If you need to troubleshoot issues, the `--debug` build provides better diagnostics.\n        \n        For production deployments, consider using a dedicated `--profile production` flag - this can provide an additional 15-30% performance improvement over the standard `--release` profile.\n\n2. Upon successful compilation, you should see output indicating the build was successful. The compiled runtime will be located at:\n    \n    `./target/release/wbuild/parachain-template-runtime/parachain_template_runtime.compact.compressed.wasm`"}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#verify-the-build", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 6, "depth": 2, "title": "Verify the Build", "anchor": "verify-the-build", "start_char": 6764, "end_char": 7097, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Verify the Build\n\nAfter compilation completes, verify that the runtime was created successfully by checking for the Wasm blob:\n\n```bash\nls -la ./target/release/wbuild/parachain-template-runtime/\n```\n\nYou should see the `parachain_template_runtime.compact.compressed.wasm` file in the output, confirming the build was successful."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#run-the-node-locally", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 7, "depth": 2, "title": "Run the Node Locally", "anchor": "run-the-node-locally", "start_char": 7097, "end_char": 8811, "estimated_token_count": 343, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Run the Node Locally\n\nAfter successfully compiling your runtime, you can spin up a local chain and produce blocks. This process will start your local parachain using the Polkadot Omni Node and allow you to interact with it. You'll first need to generate a chain specification that defines your network's identity, initial connections, and genesis state, providing the foundational configuration for how your nodes connect and what initial state they agree upon.\n\nFollow these steps to launch your node in development mode:\n\n1. Generate the chain specification file of your parachain:\n\n    ```bash\n    chain-spec-builder create -t development \\\n    --relay-chain paseo \\\n    --para-id 1000 \\\n    --runtime ./target/release/wbuild/parachain-template-runtime/parachain_template_runtime.compact.compressed.wasm \\\n    named-preset development\n    ```\n\n2. Start the Omni Node with the generated chain spec. You'll start it in development mode (without a relay chain config), producing and finalizing blocks:\n\n    ```bash\n    polkadot-omni-node --chain ./chain_spec.json --dev\n    ```\n\n    The `--dev` option does the following:\n\n    - Deletes all active data (keys, blockchain database, networking information) when stopped.\n    - Ensures a clean working state each time you restart the node.\n\n3. Verify that your node is running by reviewing the terminal output. You should see log messages indicating block production and finalization.\n\n4. Confirm that your blockchain is producing new blocks by checking if the number after `finalized` is increasing in the output.\n\nThe details of the log output will be explored in a later tutorial. For now, knowing that your node is running and producing blocks is sufficient."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#interact-with-the-node", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 8, "depth": 2, "title": "Interact with the Node", "anchor": "interact-with-the-node", "start_char": 8811, "end_char": 10316, "estimated_token_count": 393, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Interact with the Node\n\nWhen running the template node, it's accessible by default at `ws://localhost:9944`. To interact with your node using the [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) interface, follow these steps:\n\n1. Open [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) in your web browser and click the network icon (which should be the Polkadot logo) in the top left corner:\n    \n    ![](/images/parachains/launch-a-parachain/set-up-the-parachain-template/parachain-template-01.webp)\n\n2. Connect to your local node:\n\n    1. Scroll to the bottom and select **Development**.\n    2. Choose **Custom**.\n    3. Enter `ws://localhost:9944` in the **custom endpoint** input field.\n    4. Click the **Switch** button.\n    \n    ![](/images/parachains/launch-a-parachain/set-up-the-parachain-template/parachain-template-02.webp)\n\n3. Once connected, you should see **parachain-template-runtime** in the top left corner, with the interface displaying information about your local blockchain.\n    \n    ![](/images/parachains/launch-a-parachain/set-up-the-parachain-template/parachain-template-03.webp)\n\nYou are now connected to your local node and can interact with it through the Polkadot.js Apps interface. This tool enables you to explore blocks, execute transactions, and interact with your blockchain's features. For in-depth guidance on using the interface effectively, refer to the [Polkadot.js Guides](../../wiki/general/polkadotjs.md) available on the Polkadot Wiki."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#stop-the-node", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 9, "depth": 2, "title": "Stop the Node", "anchor": "stop-the-node", "start_char": 10316, "end_char": 10822, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Stop the Node\n\nWhen you're done exploring your local node, you can stop it to remove any state changes you've made. Since you started the node with the `--dev` option, stopping the node will purge all persistent block data, allowing you to start fresh the next time.\n\nTo stop the local node:\n\n1. Return to the terminal window where the node output is displayed.\n2. Press `Control-C` to stop the running process.\n3. Verify that your terminal returns to the prompt in the `parachain-template` directory."}
{"source": "polkadot-docs", "page_id": "parachains-launch-a-parachain-set-up-the-parachain-template", "url": "https://developer.polkadot.com/parachains/launch-a-parachain/set-up-the-parachain-template/#where-to-go-next", "page_title": "Set Up the Polkadot SDK Parachain Template", "index": 10, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 10822, "end_char": 11227, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d914a9dc37bd92c45034c7d9a50655e6de2bb77447bf1bc9e70581ee9f0c7bdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge tutorial\">Tutorial</span> __Deploy to Polkadot__\n\n    ---\n\n    Learn how to deploy your parachain template to a relay chain testnet. Configure your chain specification, register as a parachain, and start producing blocks.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/launch-a-parachain/deploy-to-polkadot/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#introduction", "page_title": "Coretime Renewal", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 440, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nCoretime can be purchased in bulk for 28 days, providing access to Polkadot's shared security and interoperability for Polkadot parachains. The bulk purchase of coretime includes a rent-control mechanism that keeps future purchases within a predictable price range of the initial purchase, allowing cores to be renewed at a known price without competing against other participants in the open market."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#bulk-sale-phases", "page_title": "Coretime Renewal", "index": 1, "depth": 2, "title": "Bulk Sale Phases", "anchor": "bulk-sale-phases", "start_char": 440, "end_char": 1427, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bulk Sale Phases\n\nThe bulk sale process consists of three distinct phases:\n\n1. **Interlude phase**: The period between bulk sales when renewals are prioritized.\n2. **Lead-in phase**: Following the interlude phase, a new `start_price` is set, and a Dutch auction begins, lasting for `leadin_length` blocks. During this phase, prices experience downward pressure as the system aims to find market equilibrium. The final price at the end of this phase becomes the `regular_price`, which will be used in the subsequent fixed price phase.\n3. **Fixed price phase**: The final phase where remaining cores are sold at the `regular_price` established during the lead-in phase, providing a stable and predictable pricing environment for participants who did not purchase during the price discovery period.\n\nFor more comprehensive information about the coretime sales process, refer to the [Coretime Sales](../../wiki/learn/learn-agile-coretime.md#coretime-sales) section in the Polkadot Wiki."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#renewal-timing", "page_title": "Coretime Renewal", "index": 2, "depth": 2, "title": "Renewal Timing", "anchor": "renewal-timing", "start_char": 1427, "end_char": 2059, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Renewal Timing\n\nWhile renewals can technically be made during any phase, it is strongly recommended that they be completed during the interlude phase. Delaying renewal introduces the risk that the core could be sold to another market participant, preventing successful renewal. Renewals must be initiated well in advance to avoid the scenario above.\n\nFor example, if you purchase a core in bulk sale #1, you obtain coretime for the upcoming bulk period (during which bulk sale #2 takes place).\nYour renewal must be completed during bulk sale #2, ideally during its interlude phase, to secure coretime for the subsequent period."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#manual-renewal", "page_title": "Coretime Renewal", "index": 3, "depth": 2, "title": "Manual Renewal", "anchor": "manual-renewal", "start_char": 2059, "end_char": 3353, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Manual Renewal\n\nCores can be renewed by issuing the [`broker.renew(core)`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/pallet/struct.Pallet.html#method.renew) extrinsic during the coretime sale period. While this process is straightforward, it requires manual action that must not be overlooked. Failure to complete this renewal step before all available cores are sold could result in your parachain being unable to secure a core for the next operational period.\n\nTo manually renew a core:\n\n1. In [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer), connect to the Coretime chain, navigate to the **Developer** dropdown, and select the **Extrinsics** option.\n\n    ![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-1.webp)\n\n2. Submit the `broker.renew` extrinsic:\n\n    1. Select the **broker** pallet.\n    2. Choose the **renew** extrinsic.\n    3. Fill in the **core** parameter.\n    4. Click the **Submit Transaction** button.\n\n    ![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-2.webp)\n\nFor optimal results, the renewal should be performed during the interlude phase. Upon successful submission, your core will be renewed for the next coretime period, ensuring the continued operation of your parachain."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#auto-renewal", "page_title": "Coretime Renewal", "index": 4, "depth": 2, "title": "Auto-Renewal", "anchor": "auto-renewal", "start_char": 3353, "end_char": 4545, "estimated_token_count": 225, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Auto-Renewal\n\nThe coretime auto-renewal feature simplifies maintaining continuous coretime allocation by automatically renewing cores at the start of each sale period, eliminating the need for parachains to renew their cores for each bulk period manually and reducing operational overhead and the risk of missing renewal deadlines.\n\nWhen auto-renewal is enabled, the system follows this process at the start of each sale:\n\n1. The system scans all registered auto-renewal records.\n2. For each record, it attempts to process renewal payments from the task's Sovereign Account (which is the sibling account on the Coretime chain derived from the parachain ID).\n3. Upon successful payment, the system emits a `Renewed` event and secures the core for the next period.\n4. If payment fails due to insufficient funds or other issues, the system emits an `AutoRenewalFailed` event.\n\nEven if an auto-renewal attempt fails, the auto-renewal setting remains active for subsequent sales. Instead, the setting persists across multiple periods once you've configured auto-renewal.\n\nTo enable auto-renewal for your parachain, you must configure several components, as detailed in the following sections."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#set-up-an-hrmp-channel", "page_title": "Coretime Renewal", "index": 5, "depth": 3, "title": "Set Up an HRMP Channel", "anchor": "set-up-an-hrmp-channel", "start_char": 4545, "end_char": 4912, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Set Up an HRMP Channel\n\nA Horizontal Relay-routed Message Passing (HRMP) channel must be opened between your parachain and the Coretime system chain before configuring auto-renewal.\n\nFor instructions on establishing this connection, consult the [Opening HRMP Channels with System Parachains](/parachains/interoperability/channels-with-system-parachains/) guide."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#fund-sovereign-account", "page_title": "Coretime Renewal", "index": 6, "depth": 3, "title": "Fund Sovereign Account", "anchor": "fund-sovereign-account", "start_char": 4912, "end_char": 6007, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Fund Sovereign Account\n\nThe [sovereign account](https://github.com/polkadot-fellows/xcm-format/blob/10726875bd3016c5e528c85ed6e82415e4b847d7/README.md?plain=1#L50) of your parachain on the Coretime chain needs adequate funding to cover both XCM transaction fees and the recurring coretime renewal payments.\n\nTo determine your parachain's sovereign account address, you can:\n\n- Use the **\"Para ID\" to Address** section in [Substrate Utilities](https://www.shawntabrizi.com/substrate-js-utilities/) with the **Sibling** option selected.\n\n- Calculate it manually:\n\n    1. Identify the appropriate prefix:\n\n        - **For sibling chains**: `0x7369626c` (decodes to `b\"sibl\"`).\n\n    2. Encode your parachain ID as a u32 [SCALE](/reference/parachains/data-encoding/#data-types) value:\n\n        - For parachain 2000, this would be `d0070000`.\n\n    3. Combine the prefix with the encoded ID to form the sovereign account address:\n\n        - **Hex**: `0x7369626cd0070000000000000000000000000000000000000000000000000000`\n        - **SS58 format**: `5Eg2fntJ27qsari4FGrGhrMqKFDRnkNSR6UshkZYBGXmSuC8`"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#auto-renewal-configuration-extrinsics", "page_title": "Coretime Renewal", "index": 7, "depth": 3, "title": "Auto-Renewal Configuration Extrinsics", "anchor": "auto-renewal-configuration-extrinsics", "start_char": 6007, "end_char": 7643, "estimated_token_count": 371, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Auto-Renewal Configuration Extrinsics\n\nThe Coretime chain provides two primary extrinsics for managing the auto-renewal functionality:\n\n- **[`enable_auto_renew(core, task, workload_end_hint)`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/pallet/struct.Pallet.html#method.enable_auto_renew)**: Use this extrinsic to activate automatic renewals for a specific core. This transaction must originate from the sovereign account of the parachain task.\n\n    **Parameters:**\n\n    - **`core`**: The core currently assigned to the task.\n    - **`task`**: The task for which auto-renewal is being enabled.\n    - **`workload_end_hint`**: The timeslice at which the currently assigned core will stop being used. This value helps the system determine when auto-renewal should begin. You should always provide this value to avoid ambiguity.\n\n        - If the coretime expires in the current sale period, use the last timeslice of the current sale period.\n\n        - If the coretime expires at the end of the next sale period (e.g., because you've already renewed), use the last timeslice of the next sale period.\n\n        - If a lease is active, use the timeslice when the lease ends.\n\n- **[`disable_auto_renew(core, task)`](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/pallet/struct.Pallet.html#method.disable_auto_renew)**: Use this extrinsic to stop automatic renewals. This extrinsic also requires that the origin is the sovereign account of the parachain task.\n\n     **Parameters:**\n\n    - **`core`**: The core currently assigned to the task.\n    - **`task`**: The task for which auto-renewal is enabled."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#construct-the-enable-auto-renewal-extrinsic", "page_title": "Coretime Renewal", "index": 8, "depth": 3, "title": "Construct the Enable Auto-Renewal Extrinsic", "anchor": "construct-the-enable-auto-renewal-extrinsic", "start_char": 7643, "end_char": 11227, "estimated_token_count": 798, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Construct the Enable Auto-Renewal Extrinsic\n\nTo configure auto-renewal, you'll need to gather specific information for the `enable_auto_renew` extrinsic parameters:\n\n- **`core`**: Identify which core your parachain is assigned to when it expires by checking both current assignments and planned future assignments.\n    - **For current period**: Query `broker.workload()`.\n    - **For next period**: Query `broker.workplan()`.\n\n    **Example for parachain `2000`:**\n\n    - Current assignment (workload):\n\n        ```txt\n        [\n          [50]\n          [{\n            mask: 0xffffffffffffffffffff\n            assignment: {Task: 2,000}\n          }]\n        ]\n        ```\n\n    - Future assignment (workplan):\n\n        ```txt\n        [\n          [[322,845, 48]]\n          [{\n            mask: 0xffffffffffffffffffff\n            assignment: {Task: 2,000}\n          }]\n        ]\n        ```\n\n    If your task appears in the `workplan` query results, use the core from `workplan` (`48` in this example). Only use the core from `workload` if your task is not listed in `workplan`.\n\n- **`task`**: Use your parachain ID, which can be verified by connecting to your parachain and querying `parachainInfo.parachainId()`.\n\n- **`workload_end_hint`**: You should always set it explicitly to avoid misbehavior. This value indicates when your assigned core will expire. Here's how to calculate the correct value based on how your core is assigned.\n    - If the parachain uses bulk coretime, query `broker.saleinfo`. You'll get a result like:\n\n        ```json\n        {\n        \"saleStart\": 1544949,\n        \"leadinLength\": 100800,\n        \"endPrice\": 922760076,\n        \"regionBegin\": 322845,\n        \"regionEnd\": 327885,\n        \"idealCoresSold\": 18,\n        \"coresOffered\": 18,\n        \"firstCore\": 44,\n        \"selloutPrice\": 92272712073,\n        \"coresSold\": 18\n        }\n        ```\n\n        - If the core expires in the current sale, use the `regionBegin` value, which in this case is  `322845`.\n\n        - If the core has already been renewed and will expire in the next sale, use the `regionEnd` value. In this example, that would be `327885`.\n\n\n    - If the parachain has a lease, query `broker.leases`, which returns entries like:\n\n        ```json\n        [\n          {\n            \"until\": 359280,\n            \"task\": 2035\n          },\n          ...\n        ]\n        ```\n\n        - Use the `until` value of the lease that corresponds to your task. For example, `359280` would be the value for `workload_end_hint` in the case of task `2035`.\n\nOnce you have these values, construct the extrinsic:\n\n1. In [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer), connect to the Coretime chain, navigate to the **Developer** dropdown, and select the **Extrinsics** option.\n\n    ![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-1.webp)\n\n2. Create the `broker.enable_auto_renew` extrinsic:\n\n    1. Select the **broker** pallet.\n    2. Choose the **enableAutoRenew** extrinsic.\n    3. Fill in the parameters.\n    4. Copy the encoded call data.\n\n    ![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-3.webp)\n\n    For parachain `2000` on core `48` with `workload_end_hint` `327885`, the **encoded call data** is:`0x32153000d007000001cd000500`.\n\n3. Check the transaction weight for executing the call. You can estimate this by executing the `transactionPaymentCallApi.queryCallInfo` runtime call with the encoded call data previously obtained.\n\n    ![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-4.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#submit-the-xcm-from-your-parachain", "page_title": "Coretime Renewal", "index": 9, "depth": 3, "title": "Submit the XCM from Your Parachain", "anchor": "submit-the-xcm-from-your-parachain", "start_char": 11227, "end_char": 14900, "estimated_token_count": 862, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Submit the XCM from Your Parachain\n\nTo activate auto-renewal, you must submit an XCM from your parachain to the Coretime chain using Root origin. This can be done through the sudo pallet (if available) or your parachain's governance system.\n\n!!! note \"XCM Version\"\n    The Coretime chain uses XCM v5. When constructing messages in Polkadot.js Apps, select **V5** for the XCM version. Key changes in v5 include:\n\n    - Type renames: `Location` (previously `MultiLocation`), `Asset`/`Assets` (previously `MultiAsset`/`MultiAssets`)\n    - New fee instruction: `PayFees` replaces `BuyExecution`\n\nThe XCM needs to execute these operations:\n\n1. Withdraw DOT from your parachain's sovereign account on the Coretime chain.\n2. Pay fees for execution using the new `PayFees` instruction.\n3. Execute the auto-renewal extrinsic.\n4. Refund surplus fees and deposit remaining assets back to the sovereign account.\n\nHere's how to submit this XCM using parachain `2000` as an example:\n\n!!! note \"Root Origin Required\"\n    The following example uses the `sudo` pallet for simplicity. Production parachains typically don't have sudo enabled and instead submit this XCM through their governance system (e.g., an OpenGov referendum, a council motion, or a democracy proposal).\n\n1. In [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer), connect to your parachain, navigate to the **Developer** dropdown and select the **Extrinsics** option.\n\n2. Create a `sudo.sudo` extrinsic that executes `polkadotXcm.send`:\n    1. Use the `sudo.sudo` extrinsic to execute the following call as Root (or wrap in a governance proposal for production chains).\n    2. Select the **polkadotXcm** pallet.\n    3. Choose the **send** extrinsic.\n    4. Set the **dest** parameter to target the Coretime chain using XCM v5 `Location` format:\n        - **parents**: `1` (go up to relay chain)\n        - **interior**: `X1` with `Parachain: 1005`\n\n    ![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-5.webp)\n\n\n3. Construct the XCM message using v5 instructions and submit it:\n\n    1. Add a **WithdrawAsset** instruction with the DOT amount to withdraw (specified as `Assets` in v5).\n    2. Add a **PayFees** instruction to pay for execution fees:\n        - **asset**: The asset to use for fees (must be a subset of the withdrawn assets)\n    3. Add a **Transact** instruction with the following parameters:\n        - **originKind**: Use `SovereignAccount`\n        - **fallbackMaxWeight**: Use the weight calculated previously (specify both `refTime` and `proofSize`)\n        - **call**: Use the encoded call data generated before\n    4. Add a **RefundSurplus** instruction to return unused fees from the fees register to the holding register.\n    5. Add a **DepositAsset** instruction to return remaining funds:\n        - **assets**: Use `Wild::All` to deposit all remaining assets\n        - **beneficiary**: Your parachain's sovereign account `Location`\n    6. Click the **Submit Transaction** button.\n\n    ![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-6.webp)\n\nAfter successful execution, your parachain should have auto-renewal enabled. To verify this, check the events emitted in the Coretime chain. You should see a confirmation event named `broker.AutoRenewalEnabled`, which includes two parameters:\n\n- **core**: The core currently assigned to your task, in this example, `48`.\n- **task**: The task for which auto-renewal was enabled, in this example, `2000`.\n\nYou can find this event in the list of recent events. It should look similar to the following:\n\n![](/images/parachains/runtime-maintenance/coretime-renewal/coretime-renewal-7.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-coretime-renewal", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/coretime-renewal/#where-to-go-next", "page_title": "Coretime Renewal", "index": 10, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 14900, "end_char": 15254, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:913a925f39b2a925502bf5ec357e997ac3edfa612ae76ce4fdfe233a8ec84cd8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Unlock Your Parachain__\n\n    ---\n\n    Learn how to unlock your parachain's potential by migrating from a legacy lease to on-demand or bulk coretime.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/runtime-maintenance/unlock-parachains/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#introduction", "page_title": "Runtime Upgrades", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 815, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nUpgrading the runtime of your Polkadot SDK-based blockchain is a fundamental feature that allows you to add new functionality, fix bugs, or improve performance without requiring a hard fork. Runtime upgrades are performed by submitting a special extrinsic that replaces the existing on-chain WebAssembly (Wasm) runtime code. This process is trustless, transparent, and can be executed either through governance or using sudo, depending on your chain's configuration.\n\nThis tutorial guides you through preparing, submitting, and verifying a runtime upgrade for your parachain or standalone Polkadot SDK-based chain. You add a new dispatchable function to your custom pallet, bump the runtime version, build the new Wasm binary, and submit the upgrade through Polkadot.js Apps."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#prerequisites", "page_title": "Runtime Upgrades", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 815, "end_char": 1385, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nComplete the following before you begin:\n\n- Complete the [Install Polkadot SDK](/parachains/install-polkadot-sdk/) guide.\n- Set up and run the parachain template by following the [Set Up the Parachain Template](/parachains/launch-a-parachain/set-up-the-parachain-template/) tutorial.\n- Create and integrate a custom pallet by following the [Create a Custom Pallet](/parachains/customize-runtime/pallet-development/create-a-pallet/) tutorial.\n- Ensure access to [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) connected to your local node."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#start-your-chain", "page_title": "Runtime Upgrades", "index": 2, "depth": 2, "title": "Start Your Chain", "anchor": "start-your-chain", "start_char": 1385, "end_char": 2165, "estimated_token_count": 211, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Start Your Chain\n\nIf you don't already have the parachain template running, start the Omni Node in development mode:\n\n```bash\npolkadot-omni-node --chain ./chain_spec.json --dev\n```\n\nOnce the node is running and producing blocks, open [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer?rpc=ws://127.0.0.1:9944) and connect it to your local node at `ws://127.0.0.1:9944`.\n\nVerify your chain is operational. You should see `parachain-template-runtime/1` in the top left corner of the Polkadot.js Apps header, indicating the chain is running with spec version `1`:\n\n![Initial runtime version showing spec version 1 in the Polkadot.js Apps header](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-01.webp)\n\nKeep this chain running in the background."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#add-a-new-feature", "page_title": "Runtime Upgrades", "index": 3, "depth": 2, "title": "Add a New Feature", "anchor": "add-a-new-feature", "start_char": 2165, "end_char": 3367, "estimated_token_count": 288, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Add a New Feature\n\nExtend your existing custom pallet by adding a new dispatchable function to reset the counter to zero. This provides a meaningful upgrade that demonstrates new functionality.\n\nOpen your custom pallet's `lib.rs` file and add the following function inside the `#[pallet::call]` block, after the existing dispatchables:\n\n```rust title=\"custom-pallet/src/lib.rs\"\n/// Reset the counter to zero.\n///\n/// The dispatch origin of this call must be _Root_.\n///\n/// Emits `CounterValueSet` event when successful.\n#[pallet::call_index(3)]\n#[pallet::weight(0)]\npub fn reset_counter(origin: OriginFor<T>) -> DispatchResult {\n\tensure_root(origin)?;\n\t<CounterValue<T>>::put(0u32);\n\tSelf::deposit_event(Event::CounterValueSet { new_value: 0 });\n\tOk(())\n}\n\n```\n\nThe `reset_counter` function is a Root-only operation that sets the counter value back to zero, regardless of its current state. This is useful for administrative purposes. Unlike the existing `increment` and `decrement` functions that any signed user can call, this reset function requires Root privileges, making it a controlled administrative action.\n\nEnsure that your runtime compiles correctly:\n\n```bash\ncargo build --release\n```"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#bump-the-runtime-version", "page_title": "Runtime Upgrades", "index": 4, "depth": 2, "title": "Bump the Runtime Version", "anchor": "bump-the-runtime-version", "start_char": 3367, "end_char": 4792, "estimated_token_count": 344, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Bump the Runtime Version\n\nBefore building the final Wasm binary, you must increment the `spec_version` in the runtime. This tells the chain's executor that the new runtime contains changes and should replace the current one.\n\nOpen `runtime/src/lib.rs` and find the `VERSION` constant. The current version looks like this:\n\n```rust title=\"runtime/src/lib.rs\"\n#[sp_version::runtime_version]\npub const VERSION: RuntimeVersion = RuntimeVersion {\n\tspec_name: alloc::borrow::Cow::Borrowed(\"parachain-template-runtime\"),\n\timpl_name: alloc::borrow::Cow::Borrowed(\"parachain-template-runtime\"),\n\tauthoring_version: 1,\n\tspec_version: 1,\n\timpl_version: 0,\n\tapis: apis::RUNTIME_API_VERSIONS,\n\ttransaction_version: 1,\n\tsystem_version: 1,\n};\n\n```\n\nChange `spec_version` from `1` to `2`:\n\n```rust title=\"runtime/src/lib.rs\" hl_lines=\"6\"\n#[sp_version::runtime_version]\npub const VERSION: RuntimeVersion = RuntimeVersion {\n\tspec_name: alloc::borrow::Cow::Borrowed(\"parachain-template-runtime\"),\n\timpl_name: alloc::borrow::Cow::Borrowed(\"parachain-template-runtime\"),\n\tauthoring_version: 1,\n\tspec_version: 2,\n\timpl_version: 0,\n\tapis: apis::RUNTIME_API_VERSIONS,\n\ttransaction_version: 1,\n\tsystem_version: 1,\n};\n\n```\n\n!!! warning\n    Forgetting to bump `spec_version` is a common mistake. If you submit a runtime upgrade without incrementing this value, the chain will not recognize it as a new runtime, and the upgrade will have no effect."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#build-the-new-runtime", "page_title": "Runtime Upgrades", "index": 5, "depth": 2, "title": "Build the New Runtime", "anchor": "build-the-new-runtime", "start_char": 4792, "end_char": 5483, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Build the New Runtime\n\nWith the new feature added and the version bumped, build the runtime:\n\n```bash\ncargo build --release\n```\n\nAfter compilation, verify the Wasm binaries were generated:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>ls -la target/release/wbuild/parachain-template-runtime/</span>\n  <br />\n  <span data-ty>parachain_template_runtime.wasm</span>\n  <span data-ty>parachain_template_runtime.compact.wasm</span>\n  <span data-ty>parachain_template_runtime.compact.compressed.wasm</span>\n</div>\n\n\n\nIn the next section, you'll use the `.compact.compressed.wasm` file for the upgrade, as it's the smallest and most efficient format."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#submit-the-runtime-upgrade", "page_title": "Runtime Upgrades", "index": 6, "depth": 2, "title": "Submit the Runtime Upgrade", "anchor": "submit-the-runtime-upgrade", "start_char": 5483, "end_char": 7212, "estimated_token_count": 419, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Submit the Runtime Upgrade\n\nNow submit the new runtime to the chain using the Sudo pallet through Polkadot.js Apps.\n\n1. Open [Polkadot.js Apps](https://polkadot.js.org/apps/) and connect to your node:\n\n    1. Click on **Developer**.\n    2. Select **Extrinsics** from the dropdown.\n\n    ![Navigate to Developer then Extrinsics](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-02.webp)\n\n2. Prepare the sudo call:\n\n    1. Select the **sudo** pallet.\n    2. Select the **sudo(call)** extrinsic from the list.\n\n    ![Select the sudo pallet and sudo(call) extrinsic](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-03.webp)\n\n3. In the sudo call:\n\n    1. Select the **system** pallet.\n    2. Select the **setCode(code)** extrinsic from the list.\n\n    ![Select system pallet and setCode extrinsic](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-04.webp)\n\n4. Upload the Wasm binary for the `code` parameter:\n\n    1. Click **file upload**.\n    2. Select the `parachain_template_runtime.compact.compressed.wasm` file from `target/release/wbuild/parachain-template-runtime/`.\n\n    ![Upload the Wasm file](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-05.webp)\n\n5. Click **Submit Transaction** and sign the transaction with the sudo key.\n\n    ![Sign and submit the transaction](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-06.webp)\n\n!!! info\n    On production chains, runtime upgrades are submitted through governance rather than Sudo. The process involves a referendum where token holders vote to approve the upgrade.\n\nAfter the transaction is included in a block, the runtime upgrade takes effect immediately."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#verify-the-upgrade", "page_title": "Runtime Upgrades", "index": 7, "depth": 2, "title": "Verify the Upgrade", "anchor": "verify-the-upgrade", "start_char": 7212, "end_char": 7235, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify the Upgrade"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#check-runtime-version", "page_title": "Runtime Upgrades", "index": 8, "depth": 3, "title": "Check Runtime Version", "anchor": "check-runtime-version", "start_char": 7235, "end_char": 8386, "estimated_token_count": 266, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Check Runtime Version\n\nTo confirm the upgrade was successful, navigate to the **Developer** dropdown and select **Chain State**. The runtime version in the header changes to `parachain-template-runtime/2`. Additionally, the recent events show `parachainSystem.ValidationFunctionApplied`, confirming the upgrade was applied:\n\n![Explorer showing updated runtime version and upgrade events](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-07.webp)\n\nQuery the on-chain runtime version:\n\n1. Query the last runtime upgrade:\n\n    1. Select the **system** pallet.\n    2. Select **lastRuntimeUpgrade()** from the query dropdown.\n\n    ![Select system pallet and lastRuntimeUpgrade query](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-08.webp)\n\n2. Click the **+** button to execute the query.\n\n    ![Click the plus button to query](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-09.webp)\n\n3. The result should show `specVersion: 2`, confirming the upgrade was applied.\n\n    ![Verify specVersion is 2](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-10.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#test-new-functionality", "page_title": "Runtime Upgrades", "index": 9, "depth": 3, "title": "Test New Functionality", "anchor": "test-new-functionality", "start_char": 8386, "end_char": 8964, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test New Functionality\n\nNavigate to **Developer** > **Extrinsics** and select your **customPallet**. The new `resetCounter` function appears alongside the existing `increment`, `decrement`, and `setCounterValue` functions.\n\n![Custom pallet showing the new resetCounter function](/images/parachains/runtime-maintenance/runtime-upgrades/runtime-upgrade-11.webp)\n\nTest the new functionality:\n\n1. Increment the counter using the existing `increment` function.\n2. Use the new `resetCounter` function (requires sudo/root privileges).\n3. Verify the counter value is reset to `0`."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-runtime-upgrades", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/runtime-upgrades/#where-to-go-next", "page_title": "Runtime Upgrades", "index": 10, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 8964, "end_char": 9624, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:04886bdb722efaa429ad7df90073798b6b73b27517dbc1fd8db93eb6266181db", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Storage Migrations__\n\n    ---\n\n    Learn how to write and manage storage migrations when runtime upgrades change how data is stored on-chain.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/runtime-maintenance/storage-migrations/)\n\n-   <span class=\"badge tutorial\">Tutorial</span> __Create a Custom Pallet__\n\n    ---\n\n    Learn how to build a custom pallet from scratch to add new functionality to your Polkadot SDK-based runtime.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/customize-runtime/pallet-development/create-a-pallet/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#introduction", "page_title": "Storage Migrations", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 1260, "estimated_token_count": 261, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nStorage migrations are a crucial part of the runtime upgrade process. They allow you to update the [storage items](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.storage.html) of your blockchain, adapting to changes in the runtime. Whenever you change the encoding or data types used to represent data in storage, you'll need to provide a storage migration to ensure the runtime can correctly interpret the existing stored values in the new runtime state.\n\nStorage migrations must be executed precisely during the runtime upgrade process to ensure data consistency and prevent [runtime panics](https://doc.rust-lang.org/std/macro.panic.html). The migration code needs to run as follows:\n\n- After the new runtime is deployed.\n- Before any other code from the new runtime executes.\n- Before any [`on_initialize`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.on_initialize) hooks run.\n- Before any transactions are processed.\n\nThis timing is critical because the new runtime expects data to be in the updated format. Any attempt to decode the old data format without proper migration could result in runtime panics or undefined behavior."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#storage-migration-scenarios", "page_title": "Storage Migrations", "index": 1, "depth": 2, "title": "Storage Migration Scenarios", "anchor": "storage-migration-scenarios", "start_char": 1260, "end_char": 4302, "estimated_token_count": 635, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Storage Migration Scenarios\n\nA storage migration is necessary whenever a runtime upgrade changes the storage layout or the encoding/interpretation of existing data. Even if the underlying data type appears to still \"fit\" the new storage representation, a migration may be required if the interpretation of the stored values has changed.\n\nStorage migrations ensure data consistency and prevent corruption during runtime upgrades. Below are common scenarios categorized by their impact on storage and migration requirements:\n\n- Migration required:\n    - Reordering or mutating fields of an existing data type to change the encoded/decoded data representation.\n    - Removal of a pallet or storage item warrants cleaning up storage via a migration to avoid state bloat.\n\n- Migration not required:\n    - Adding a new storage item would not require any migration since no existing data needs transformation.\n    - Adding or removing an extrinsic introduces no new interpretation of preexisting data, so no migration is required.\n\nThe following are some common scenarios where a storage migration is needed:\n\n- **Changing data types**: Changing the underlying data type requires a migration to convert the existing values.\n\n    ```rust\n    #[pallet::storage]\n    pub type FooValue = StorageValue<_, Foo>;\n    // old\n    pub struct Foo(u32)\n    // new\n    pub struct Foo(u64)\n    ```\n\n- **Changing data representation**: Modifying the representation of the stored data, even if the size appears unchanged, requires a migration to ensure the runtime can correctly interpret the existing values.\n\n    ```rust\n    #[pallet::storage]\n    pub type FooValue = StorageValue<_, Foo>;\n    // old\n    pub struct Foo(u32)\n    // new\n    pub struct Foo(i32)\n    // or\n    pub struct Foo(u16, u16)\n    ```\n\n- **Extending an enum**: Adding new variants to an enum requires a migration if you reorder existing variants, insert new variants between existing ones, or change the data type of existing variants. No migration is required when adding new variants at the end of the enum.\n\n    ```rust\n    #[pallet::storage]\n    pub type FooValue = StorageValue<_, Foo>;\n    // old\n    pub enum Foo { A(u32), B(u32) }\n    // new (New variant added at the end. No migration required)\n    pub enum Foo { A(u32), B(u32), C(u128) }\n    // new (Reordered variants. Requires migration)\n    pub enum Foo { A(u32), C(u128), B(u32) }\n    ```\n\n- **Changing the storage key**: Modifying the storage key, even if the underlying data type remains the same, requires a migration to ensure the runtime can locate the correct stored values.\n\n    ```rust\n    #[pallet::storage]\n    pub type FooValue = StorageValue<_, u32>;\n    // new\n    #[pallet::storage]\n    pub type BarValue = StorageValue<_, u32>;\n    ```\n\n!!!warning\n    In general, any change to the storage layout or data encoding used in your runtime requires careful consideration of the need for a storage migration. Overlooking a necessary migration can lead to undefined behavior or data loss during a runtime upgrade."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#implement-storage-migrations", "page_title": "Storage Migrations", "index": 2, "depth": 2, "title": "Implement Storage Migrations", "anchor": "implement-storage-migrations", "start_char": 4302, "end_char": 4912, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Implement Storage Migrations\n\nThe [`OnRuntimeUpgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.OnRuntimeUpgrade.html) trait provides the foundation for implementing storage migrations in your runtime. Here's a detailed look at its essential functions:\n\n```rust\npub trait OnRuntimeUpgrade {\n    fn on_runtime_upgrade() -> Weight { ... }\n    fn try_on_runtime_upgrade(checks: bool) -> Result<Weight, TryRuntimeError> { ... }\n    fn pre_upgrade() -> Result<Vec<u8>, TryRuntimeError> { ... }\n    fn post_upgrade(_state: Vec<u8>) -> Result<(), TryRuntimeError> { ... }\n}\n```"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#core-migration-function", "page_title": "Storage Migrations", "index": 3, "depth": 3, "title": "Core Migration Function", "anchor": "core-migration-function", "start_char": 4912, "end_char": 5912, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Core Migration Function\n\nThe [`on_runtime_upgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.on_runtime_upgrade) function executes when the FRAME Executive pallet detects a runtime upgrade. Important considerations when using this function include:\n\n- It runs before any pallet's `on_initialize` hooks.\n- Critical storage items (like [`block_number`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.block_number)) may not be set.\n- Execution is mandatory and must be completed.\n- Careful weight calculation is required to prevent bricking the chain.\n\nWhen implementing the migration logic, your code must handle several vital responsibilities. A migration implementation must do the following to operate correctly:\n\n- Read existing storage values in their original format.\n- Transform data to match the new format.\n- Write updated values back to storage.\n- Calculate and return consumed weight."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#migration-testing-hooks", "page_title": "Storage Migrations", "index": 4, "depth": 3, "title": "Migration Testing Hooks", "anchor": "migration-testing-hooks", "start_char": 5912, "end_char": 7880, "estimated_token_count": 381, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Migration Testing Hooks\n\nThe `OnRuntimeUpgrade` trait provides some functions designed specifically for testing migrations. These functions never execute on-chain but are essential for validating migration behavior in test environments. The migration test hooks are as follows:\n\n- **[`try_on_runtime_upgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.OnRuntimeUpgrade.html#method.try_on_runtime_upgrade)**: This function serves as the primary orchestrator for testing the complete migration process. It coordinates the execution flow from `pre-upgrade` checks through the actual migration to `post-upgrade` verification. Handling the entire migration sequence ensures that storage modifications occur correctly and in the proper order. Preserving this sequence is particularly valuable when testing multiple dependent migrations, where the execution order matters.\n\n- **[`pre_upgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.pre_upgrade)**: Before a runtime upgrade begins, the `pre_upgrade` function performs preliminary checks and captures the current state. It returns encoded state data that can be used for `post-upgrade` verification. This function must never modify storage: it should only read and verify the existing state. The data it returns includes critical state values that should remain consistent or transform predictably during migration.\n\n- **[`post_upgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.post_upgrade)**: After the migration completes, `post_upgrade` validates its success. It receives the state data captured by `pre_upgrade` to verify that the migration was executed correctly. This function checks for storage consistency and ensures all data transformations are completed as expected. Like `pre_upgrade`, it operates exclusively in testing environments and should not modify storage."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#migration-structure", "page_title": "Storage Migrations", "index": 5, "depth": 3, "title": "Migration Structure", "anchor": "migration-structure", "start_char": 7880, "end_char": 9767, "estimated_token_count": 407, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Migration Structure\n\nThere are two approaches to implementing storage migrations. The first method involves directly implementing `OnRuntimeUpgrade` on structs. This approach requires manually checking the on-chain storage version against the new [`StorageVersion`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/struct.StorageVersion.html) and executing the transformation logic only when the check passes. This version verification prevents multiple executions of the migration during subsequent runtime upgrades.\n\nThe recommended approach is to implement [`UncheckedOnRuntimeUpgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.UncheckedOnRuntimeUpgrade.html) and wrap it with [`VersionedMigration`](https://paritytech.github.io/polkadot-sdk/master/frame_support/migrations/struct.VersionedMigration.html). `VersionedMigration` implements `OnRuntimeUpgrade` and handles storage version management automatically, following best practices and reducing potential errors.\n\n`VersionedMigration` requires five type parameters:\n\n- **`From`**: The source version for the upgrade.\n- **`To`**: The target version for the upgrade.\n- **`Inner`**: The `UncheckedOnRuntimeUpgrade` implementation.\n- **`Pallet`**: The pallet being upgraded.\n- **`Weight`**: The runtime's [`RuntimeDbWeight`](https://paritytech.github.io/polkadot-sdk/master/frame_support/weights/struct.RuntimeDbWeight.html) implementation.\n\nExamine the following migration example that transforms a simple `StorageValue` storing a `u32` into a more complex structure that tracks both current and previous values using the `CurrentAndPreviousValue` struct:\n\n- Old `StorageValue` format:\n\n    ```rust\n    #[pallet::storage]\n    pub type Value<T: Config> = StorageValue<_, u32>;\n    ```\n\n- New `StorageValue` format:\n\n    ```rust\n\n    ```\n\n- Migration:\n\n    ```rust\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#migration-organization", "page_title": "Storage Migrations", "index": 6, "depth": 3, "title": "Migration Organization", "anchor": "migration-organization", "start_char": 9767, "end_char": 10459, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Migration Organization\n\nBest practices recommend organizing migrations in a separate module within your pallet. Here's the recommended file structure:\n\n```plain\nmy-pallet/\n├── src/\n│   ├── lib.rs       # Main pallet implementation\n│   └── migrations/  # All migration-related code\n│       ├── mod.rs   # Migrations module definition\n│       ├── v1.rs    # V0 -> V1 migration\n│       └── v2.rs    # V1 -> V2 migration\n└── Cargo.toml\n```\n\nThis structure provides several benefits:\n\n- Separates migration logic from core pallet functionality.\n- Makes migrations easier to test and maintain.\n- Provides explicit versioning of storage changes.\n- Simplifies the addition of future migrations."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#scheduling-migrations", "page_title": "Storage Migrations", "index": 7, "depth": 3, "title": "Scheduling Migrations", "anchor": "scheduling-migrations", "start_char": 10459, "end_char": 11034, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Scheduling Migrations\n\nTo execute migrations during a runtime upgrade, you must configure them in your runtime's Executive pallet. Add your migrations in `runtime/src/lib.rs`:\n\n```rust\n/// Tuple of migrations (structs that implement `OnRuntimeUpgrade`)\ntype Migrations = (\n    pallet_my_pallet::migrations::v1::Migration,\n    // More migrations can be added here\n);\npub type Executive = frame_executive::Executive<\n    Runtime,\n    Block,\n    frame_system::ChainContext<Runtime>,\n    Runtime,\n    AllPalletsWithSystem,\n    Migrations, // Include migrations here\n>;\n\n```"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#single-block-migrations", "page_title": "Storage Migrations", "index": 8, "depth": 2, "title": "Single-Block Migrations", "anchor": "single-block-migrations", "start_char": 11034, "end_char": 12106, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Single-Block Migrations\n\nSingle-block migrations execute their logic within one block immediately following a runtime upgrade. They run as part of the runtime upgrade process through the `OnRuntimeUpgrade` trait implementation and must be completed before any other runtime logic executes.\n\nWhile single-block migrations are straightforward to implement and provide immediate data transformation, they carry significant risks. The most critical consideration is that they must complete within one block's weight limits. This is especially crucial for parachains, where exceeding block weight limits will brick the chain.\n\nUse single-block migrations only when you can guarantee:\n\n- The migration has a bounded execution time.\n- Weight calculations are thoroughly tested.\n- Total weight will never exceed block limits.\n\nFor a complete implementation example of a single-block migration, refer to the [single-block migration example]( https://paritytech.github.io/polkadot-sdk/master/pallet_example_single_block_migrations/index.html) in the Polkadot SDK documentation."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-storage-migrations", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/storage-migrations/#multi-block-migrations", "page_title": "Storage Migrations", "index": 9, "depth": 2, "title": "Multi Block Migrations", "anchor": "multi-block-migrations", "start_char": 12106, "end_char": 13368, "estimated_token_count": 222, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5e8301baf6cb4339aa81efcf0a476c1dd14b54372699829f37ad4f5265a8070", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Multi Block Migrations\n\nMulti-block migrations distribute the migration workload across multiple blocks, providing a safer approach for production environments. The migration state is tracked in storage, allowing the process to pause and resume across blocks.\n\nThis approach is essential for production networks and parachains as the risk of exceeding block weight limits is eliminated. Multi-block migrations can safely handle large storage collections, unbounded data structures, and complex nested data types where weight consumption might be unpredictable.\n\nMulti-block migrations are ideal when dealing with:\n\n- Large-scale storage migrations.\n- Unbounded storage items or collections.\n- Complex data structures with uncertain weight costs.\n\nThe primary trade-off is increased implementation complexity, as you must manage the migration state and handle partial completion scenarios. However, multi-block migrations' significant safety benefits and operational reliability are typically worth the increased complexity.\n\nFor a complete implementation example of multi-block migrations, refer to the [official example](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/substrate/frame/examples/multi-block-migrations) in the Polkadot SDK."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-unlock-parachains", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/unlock-parachains/#introduction", "page_title": "Unlock a Parachain", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 1058, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:680ae9beb696f4f272d67ba18a8cef28880e391b4133825ff2f7a19278e67655", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nParachain locks are a critical security mechanism in the Polkadot ecosystem designed to maintain decentralization during the parachain lifecycle. These locks prevent potential centralization risks that could emerge during the early stages of parachain operation.\n\nThe locking system follows strict, well-defined conditions that distribute control across multiple authorities:\n\n- Relay chain governance has the authority to lock any parachain.\n- A parachain can lock its own lock.\n- Parachain managers have permission to lock the parachain.\n- Parachains are locked automatically when they successfully produce their first block.\n\nSimilarly, unlocking a parachain follows controlled procedures:\n\n- Relay chain governance retains the authority to unlock any parachain.\n- A parachain can unlock its own lock.\n\nThis document guides you through checking a parachain's lock status and safely executing the unlock procedure from a parachain using [XCM (Cross-Consensus Messaging)](/parachains/interoperability/get-started/)."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-unlock-parachains", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/unlock-parachains/#check-if-the-parachain-is-locked", "page_title": "Unlock a Parachain", "index": 1, "depth": 2, "title": "Check If the Parachain Is Locked", "anchor": "check-if-the-parachain-is-locked", "start_char": 1058, "end_char": 2072, "estimated_token_count": 256, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:680ae9beb696f4f272d67ba18a8cef28880e391b4133825ff2f7a19278e67655", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Check If the Parachain Is Locked\n\nBefore unlocking a parachain, you should verify its current lock status. This can be done through the Polkadot.js interface:\n\n1. In [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer), connect to the relay chain, navigate to the **Developer** dropdown and select the **Chain State** option.\n\n2. Query the parachain locked status:\n    1. Select **`registrar`**.\n    2. Choose the **`paras`** option.\n    3. Input the parachain ID you want to check as a parameter (e.g. `2006`).\n    4. Click the **+** button to execute the query.\n    5. Check the status of the parachain lock.\n        - **`manager`**: The account that has placed a deposit for registering this parachain.\n        - **`deposit`**: The amount reserved by the `manager` account for the registration.\n        - **`locked`**: Whether the parachain registration should be locked from being controlled by the manager.\n\n    ![](/images/parachains/runtime-maintenance/unlock-parachains/unlock-parachain-1.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-unlock-parachains", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/unlock-parachains/#how-to-unlock-a-parachain", "page_title": "Unlock a Parachain", "index": 2, "depth": 2, "title": "How to Unlock a Parachain", "anchor": "how-to-unlock-a-parachain", "start_char": 2072, "end_char": 2727, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:680ae9beb696f4f272d67ba18a8cef28880e391b4133825ff2f7a19278e67655", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How to Unlock a Parachain\n\nUnlocking a parachain requires sending an XCM (Cross-Consensus Message) to the relay chain from the parachain itself, sending a message with Root origin, or this can be accomplished through the relay chain's governance mechanism, executing a root call.\n\nIf sending an XCM, the parachain origin must have proper authorization, typically from either the parachain's sudo pallet (if enabled) or its governance system.\n\nThis guide demonstrates the unlocking process using a parachain with the sudo pallet. For parachains using governance-based authorization instead, the process will require adjustments to how the XCM is sent."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-unlock-parachains", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/unlock-parachains/#prepare-the-unlock-call", "page_title": "Unlock a Parachain", "index": 3, "depth": 3, "title": "Prepare the Unlock Call", "anchor": "prepare-the-unlock-call", "start_char": 2727, "end_char": 4111, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:680ae9beb696f4f272d67ba18a8cef28880e391b4133825ff2f7a19278e67655", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Prepare the Unlock Call\n\nBefore sending the XCM, you need to construct the relay chain call that will be executed. Follow these steps to prepare the `registrar.removeLock` extrinsic:\n\n1. In [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer), connect to the relay chain, navigate to the **Developer** dropdown and select the **Extrinsics** option.\n\n2. Build the `registrar.removeLock` extrinsic:\n\n    1. Select the **registrar** pallet.\n    2. Choose the **removeLock** extrinsic.\n    3. Fill in the parachain ID parameter (e.g., `2006`).\n    4. Copy the **encoded call data**.\n\n    ![](/images/parachains/runtime-maintenance/unlock-parachains/unlock-parachain-2.webp)\n\n    To ensure your encoded call data is correct, check this [example](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fdot-rpc.stakeworld.io#/extrinsics/decode/0x4604d6070000) of a decoded `removeLock` call for parachain 2006. Your encoded data should follow the same pattern.\n\n3. Determine the transaction weight required for executing the call. You can estimate this by executing the `transactionPaymentCallApi.queryCallInfo` runtime call with the encoded call data previously obtained:\n\n    ![](/images/parachains/runtime-maintenance/unlock-parachains/unlock-parachain-3.webp)\n\n    This weight information is crucial for properly configuring your XCM message's execution parameters in the next steps."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-unlock-parachains", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/unlock-parachains/#fund-the-sovereign-account", "page_title": "Unlock a Parachain", "index": 4, "depth": 3, "title": "Fund the Sovereign Account", "anchor": "fund-the-sovereign-account", "start_char": 4111, "end_char": 5947, "estimated_token_count": 395, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:680ae9beb696f4f272d67ba18a8cef28880e391b4133825ff2f7a19278e67655", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fund the Sovereign Account\n\nFor a successful XCM execution, the [sovereign account](https://github.com/polkadot-fellows/xcm-format/blob/10726875bd3016c5e528c85ed6e82415e4b847d7/README.md?plain=1#L50) of your parachain on the relay chain must have sufficient funds to cover transaction fees. The sovereign account is a deterministic address derived from your parachain ID.\n\nYou can identify your parachain's sovereign account using either of these methods:\n\n=== \"Runtime API\"\n\n    Execute the `locationToAccountApi.convertLocation` runtime API call to convert your parachain's location into its sovereign account address on the relay chain.\n\n    ![](/images/parachains/runtime-maintenance/unlock-parachains/unlock-parachain-7.webp)\n\n=== \"Substrate Utilities\"\n\n    Use the **\"Para ID\" to Address** section in [Substrate Utilities](https://www.shawntabrizi.com/substrate-js-utilities/) with the **Child** option selected.\n\n=== \"Manual Calculation\"\n\n    1. Identify the appropriate prefix:\n\n        - For parent/child chains use the prefix `0x70617261` (which decodes to `b\"para\"`).\n         \n    2. Encode your parachain ID as a u32 [SCALE](/reference/parachains/data-encoding/#data-types) value:\n\n        - For parachain 2006, this would be `d6070000`.\n\n    3. Combine the prefix with the encoded ID to form the sovereign account address:\n\n        - **Hex**: `0x70617261d6070000000000000000000000000000000000000000000000000000`\n        - **SS58 format**: `5Ec4AhPW97z4ZyYkd3mYkJrSeZWcwVv4wiANES2QrJi1x17F`\n\nYou can transfer funds to this account from any account on the relay chain using a standard transfer. To calculate the amount needed, refer to the [XCM Payment API](https://paritytech.github.io/polkadot-sdk/master/xcm_runtime_apis/fees/trait.XcmPaymentApi.html). The calculation will depend on the XCM built in the next step."}
{"source": "polkadot-docs", "page_id": "parachains-runtime-maintenance-unlock-parachains", "url": "https://developer.polkadot.com/parachains/runtime-maintenance/unlock-parachains/#craft-and-submit-the-xcm", "page_title": "Unlock a Parachain", "index": 5, "depth": 3, "title": "Craft and Submit the XCM", "anchor": "craft-and-submit-the-xcm", "start_char": 5947, "end_char": 9096, "estimated_token_count": 699, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:680ae9beb696f4f272d67ba18a8cef28880e391b4133825ff2f7a19278e67655", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Craft and Submit the XCM\n\nWith the call data prepared and the sovereign account funded, you can now construct and send the XCM from your parachain to the relay chain. The XCM will need to perform several operations in sequence:\n\n1. Withdraw DOT from your parachain's sovereign account.\n2. Buy execution to pay for transaction fees.\n3. Execute the `registrar.removeLock` extrinsic.\n4. Return any unused funds to your sovereign account.\n\nHere's how to submit this XCM using Astar (Parachain 2006) as an example:\n\n1. In [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer), connect to the parachain, navigate to the **Developer** dropdown and select the **Extrinsics** option.\n\n2. Create a `sudo.sudo` extrinsic that executes `polkadotXcm.send`:\n\n    1. Use the `sudo.sudo` extrinsic to execute the following call as Root.\n    2. Select the **polkadotXcm** pallet.\n    3. Choose the **send** extrinsic.\n    4. Set the **dest** parameter as the relay chain.\n\n    ![](/images/parachains/runtime-maintenance/unlock-parachains/unlock-parachain-4.webp)\n\n3. Construct the XCM and submit it:\n\n    1. Add a **WithdrawAsset** instruction.\n    2. Add a **BuyExecution** instruction.\n        - **fees**:\n            - **id**: The asset location to use for the fee payment. In this example, the relay chain native asset is used.\n            - **fun**: Select `Fungible` and use the same amount you withdrew from the sovereign account in the previous step.\n        - **weightLimit**: Use `Unlimited`.\n    3. Add a **Transact** instruction with the following parameters:\n        - **originKind**: Use `Native`.\n        - **requireWeightAtMost**: Use the weight calculated previously.\n        - **call**: Use the encoded call data generated before.\n    4. Add a **RefundSurplus** instruction.\n    5. Add a **DepositAsset** instruction to send the remaining funds to the parachain sovereign account.\n    6. Click the **Submit Transaction** button.\n\n    ![](/images/parachains/runtime-maintenance/unlock-parachains/unlock-parachain-5.webp)\n\n    If the amount withdrawn in the first instruction is exactly the amount needed to pay the transaction fees, instructions 4 and 5 can be omitted.\n\n    To validate your XCM, examine the following reference [extrinsic](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fastar.public.curie.radiumblock.co%2Fws#/extrinsics/decode/0x63003300040100041400040000000700e40b5402130000000700e40b540200060042d3c91800184604d6070000140d0100000100591f) showing the proper instruction sequence and parameter formatting. Following this structure will help ensure successful execution of your message.\n\nAfter submitting the transaction, wait for it to be finalized and then verify that your parachain has been successfully unlocked by following the steps described in the [Check if the Parachain is Locked](#check-if-the-parachain-is-locked) section. If the parachain shows as unlocked, your operation has been successful. If it still appears locked, verify that your XCM transaction was processed correctly and consider troubleshooting the XCM built.\n\n![](/images/parachains/runtime-maintenance/unlock-parachains/unlock-parachain-6.webp)"}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#introduction", "page_title": "Fork a Parachain Using Chopsticks", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 38, "end_char": 1154, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Chopsticks](https://github.com/AcalaNetwork/chopsticks/), developed by the [Acala Foundation](https://github.com/AcalaNetwork), is a versatile tool tailored for developers working on Polkadot SDK-based blockchains. With Chopsticks, you can fork live chains locally, replay blocks to analyze extrinsics, and simulate complex scenarios like XCM interactions all without deploying to a live network.\n\nThis guide walks you through installing Chopsticks and provides information on configuring a local blockchain fork. By streamlining testing and experimentation, Chopsticks empowers developers to innovate and accelerate their blockchain projects within the Polkadot ecosystem.\n\nFor additional support and information, please reach out through [GitHub Issues](https://github.com/AcalaNetwork/chopsticks/issues).\n\n!!! warning\n    Chopsticks uses [Smoldot](https://github.com/smol-dot/smoldot) light client, which only supports the native Polkadot SDK API. Consequently, a Chopsticks-based fork doesn't support Ethereum JSON-RPC calls, meaning you cannot use it to fork your chain and connect Metamask."}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#prerequisites", "page_title": "Fork a Parachain Using Chopsticks", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1154, "end_char": 1413, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following installed:\n\n- [Node.js](https://nodejs.org/en/).\n- A package manager such as [npm](https://www.npmjs.com/), which should be installed with Node.js by default, or [Yarn](https://yarnpkg.com/)."}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#install-chopsticks", "page_title": "Fork a Parachain Using Chopsticks", "index": 2, "depth": 2, "title": "Install Chopsticks", "anchor": "install-chopsticks", "start_char": 1413, "end_char": 1705, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Chopsticks\n\nYou can install Chopsticks globally or locally in your project. Choose the option that best fits your development workflow. This documentation explains the features of Chopsticks version `1.5.2`. Make sure you're using the correct version to match these instructions."}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#global-installation", "page_title": "Fork a Parachain Using Chopsticks", "index": 3, "depth": 3, "title": "Global Installation", "anchor": "global-installation", "start_char": 1705, "end_char": 1948, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Global Installation\n\nTo install Chopsticks globally, allowing you to use it across multiple projects, run:\n\n```bash\nnpm i -g @acala-network/chopsticks@1.5.2\n```\n\nNow, you should be able to run the `chopsticks` command from your terminal."}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#local-installation", "page_title": "Fork a Parachain Using Chopsticks", "index": 4, "depth": 3, "title": "Local Installation", "anchor": "local-installation", "start_char": 1948, "end_char": 2437, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Local Installation\n\nTo use Chopsticks in a specific project, first create a new directory and initialize a Node.js project:\n\n```bash\nmkdir my-chopsticks-project\ncd my-chopsticks-project\nnpm init -y\n```\n\nThen, install Chopsticks as a local dependency:\n\n```bash\nnpm i @acala-network/chopsticks@1.5.2\n```\n\nFinally, you can run Chopsticks using the `npx` command. To see all available options and commands, run it with the `--help` flag:\n\n```bash\nnpx @acala-network/chopsticks --help\n```"}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#configure-chopsticks", "page_title": "Fork a Parachain Using Chopsticks", "index": 5, "depth": 2, "title": "Configure Chopsticks", "anchor": "configure-chopsticks", "start_char": 2437, "end_char": 3786, "estimated_token_count": 360, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Chopsticks\n\nTo run Chopsticks, you need to configure some parameters. This can be set either through using a configuration file or the command line interface (CLI). The parameters that can be configured are as follows:\n\n- **`genesis`**: The link to a parachain's raw genesis file to build the fork from, instead of an endpoint.\n- **`timestamp`**: Timestamp of the block to fork from.\n- **`endpoint`**: The endpoint of the parachain to fork.\n- **`block`**: Use to specify at which block hash or number to replay the fork.\n- **`wasm-override`**: Path of the Wasm to use as the parachain runtime, instead of an endpoint's runtime.\n- **`db`**: Path to the name of the file that stores or will store the parachain's database.\n- **`config`**: Path or URL of the config file.\n- **`port`**: The port to expose an endpoint on.\n- **`build-block-mode`**: How blocks should be built in the fork: batch, manual, instant.\n- **`import-storage`**: A pre-defined JSON/YAML storage path to override in the parachain's storage.\n- **`allow-unresolved-imports`**: Whether to allow Wasm unresolved imports when using a Wasm to build the parachain.\n- **`html`**: Include to generate storage diff preview between blocks.\n- **`mock-signature-host`**: Mock signature host so that any signature starts with `0xdeadbeef` and filled by `0xcd` is considered valid."}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#configuration-file", "page_title": "Fork a Parachain Using Chopsticks", "index": 6, "depth": 3, "title": "Configuration File", "anchor": "configuration-file", "start_char": 3786, "end_char": 4930, "estimated_token_count": 249, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Configuration File\n\nThe Chopsticks source repository includes a collection of [YAML](https://yaml.org/) files that can be used to set up various Polkadot SDK chains locally. You can download these configuration files from the [repository's `configs` folder](https://github.com/AcalaNetwork/chopsticks/tree/master/configs).\n\nAn example of a configuration file for Polkadot is as follows:\n\n```yaml\nendpoint:\n  - wss://rpc.ibp.network/polkadot\n  - wss://polkadot-rpc.dwellir.com\nmock-signature-host: true\nblock: ${env.POLKADOT_BLOCK_NUMBER}\ndb: ./db.sqlite\nruntime-log-level: 5\n\nimport-storage:\n  System:\n    Account:\n      - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY\n        - providers: 1\n          data:\n            free: '10000000000000000000'\n  ParasDisputes:\n    $removePrefix: ['disputes'] # those can makes block building super slow\n\n```\n\nThe configuration file allows you to modify the storage of the forked network by rewriting the pallet, state component and value that you want to change. For example, Polkadot's file rewrites Alice's `system.Account` storage so that the free balance is set to `10000000000000000000`."}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#cli-flags", "page_title": "Fork a Parachain Using Chopsticks", "index": 7, "depth": 3, "title": "CLI Flags", "anchor": "cli-flags", "start_char": 4930, "end_char": 5111, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### CLI Flags\n\nAlternatively, all settings (except for genesis and timestamp) can be configured via command-line flags, providing a comprehensive method to set up the environment."}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#websocket-commands", "page_title": "Fork a Parachain Using Chopsticks", "index": 8, "depth": 2, "title": "WebSocket Commands", "anchor": "websocket-commands", "start_char": 5111, "end_char": 10539, "estimated_token_count": 1272, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## WebSocket Commands\n\nChopstick's internal WebSocket server has special endpoints that allow the manipulation of the local Polkadot SDK chain.\n\nThese are the methods that can be invoked and their parameters:\n\n- **dev_newBlock** (newBlockParams): Generates one or more new blocks.\n\n    === \"Parameters\"\n\n        - **`newBlockParams` ++\"NewBlockParams\"++**: The parameters to build the new block with. Where the `NewBlockParams` interface includes the following properties.\n\n            - **`count` ++\"number\"++**: The number of blocks to build.\n            - **`dmp` ++\"{ msg: string, sentAt: number }[]\"++**: The downward messages to include in the block.\n            - **`hrmp` ++\"Record<string | number, { data: string, sentAt: number }[]>\"++**: The horizontal messages to include in the block.\n            - **`to` ++\"number\"++**: The block number to build to.\n            - **`transactions` ++\"string[]\"++**: The transactions to include in the block.\n            - **`ump` ++\"Record<number, string[]>\"++**: The upward messages to include in the block.\n            - **`unsafeBlockHeight` ++\"number\"++**: Build block using a specific block height (unsafe).\n\n    === \"Example\"\n\n        ```js\n        import { ApiPromise, WsProvider } from '@polkadot/api';\n        \n        async function main() {\n          const wsProvider = new WsProvider('ws://localhost:8000');\n          const api = await ApiPromise.create({ provider: wsProvider });\n          await api.isReady;\n          await api.rpc('dev_newBlock', { count: 1 });\n        }\n        \n        main();\n        \n        ```\n\n- **dev_setBlockBuildMode** (buildBlockMode): Sets block build mode.\n\n    === \"Parameter\"\n    \n        - **`buildBlockMode` ++\"BuildBlockMode\"++**: The build mode. Can be any of the following modes:\n\n            ```ts\n            export enum BuildBlockMode {\n              Batch = 'Batch', /** One block per batch (default) */\n              Instant = 'Instant', /** One block per transaction */\n              Manual = 'Manual', /** Only build when triggered */\n            }\n            ```\n            \n    === \"Example\"\n\n        ```js\n        import { ApiPromise, WsProvider } from '@polkadot/api';\n        \n        async function main() {\n          const wsProvider = new WsProvider('ws://localhost:8000');\n          const api = await ApiPromise.create({ provider: wsProvider });\n          await api.isReady;\n          await api.rpc('dev_setBlockBuildMode', 'Instant');\n        }\n        \n        main();\n        \n        ```\n\n- **dev_setHead** (hashOrNumber): Sets the head of the blockchain to a specific hash or number.\n\n    === \"Parameter\"\n\n        - **`hashOrNumber` ++\"string | number\"++**: The block hash or number to set as head.\n\n    === \"Example\"\n\n        ```js\n        import { ApiPromise, WsProvider } from '@polkadot/api';\n        \n        async function main() {\n          const wsProvider = new WsProvider('ws://localhost:8000');\n          const api = await ApiPromise.create({ provider: wsProvider });\n          await api.isReady;\n          await api.rpc('dev_setHead', 500);\n        }\n        \n        main();\n        \n        ```\n\n- **dev_setRuntimeLogLevel** (runtimeLogLevel): Sets the runtime log level.\n\n    === \"Parameter\"\n\n        - **`runtimeLogLevel` ++\"number\"++**: The runtime log level to set.\n\n    === \"Example\"\n\n        ```js\n        import { ApiPromise, WsProvider } from '@polkadot/api';\n        \n        async function main() {\n          const wsProvider = new WsProvider('ws://localhost:8000');\n          const api = await ApiPromise.create({ provider: wsProvider });\n          await api.isReady;\n          await api.rpc('dev_setRuntimeLogLevel', 1);\n        }\n        \n        main();\n        \n        ```\n\n- **dev_setStorage** (values, blockHash): Creates or overwrites the value of any storage.\n\n    === \"Parameters\"\n\n        - **`values` ++\"object\"++**: JSON object resembling the path to a storage value.\n        - **`blockHash` ++\"string\"++**: The block hash to set the storage value.\n\n    === \"Example\"\n\n        ```js\n        import { ApiPromise, WsProvider } from '@polkadot/api';\n        \n        import { Keyring } from '@polkadot/keyring';\n        async function main() {\n          const wsProvider = new WsProvider('ws://localhost:8000');\n          const api = await ApiPromise.create({ provider: wsProvider });\n          await api.isReady;\n          const keyring = new Keyring({ type: 'ed25519' });\n          const bob = keyring.addFromUri('//Bob');\n          const storage = {\n            System: {\n              Account: [[[bob.address], { data: { free: 100000 }, nonce: 1 }]],\n            },\n          };\n          await api.rpc('dev_setStorage', storage);\n        }\n        \n        main();\n        \n        ```\n\n- **dev_timeTravel** (date): Sets the timestamp of the block to a specific date\".\n\n    === \"Parameter\"\n\n        - **`date` ++\"string\"++**: Timestamp or date string to set. All future blocks will be sequentially created after this point in time.\n\n    === \"Example\"\n\n        ```js\n        import { ApiPromise, WsProvider } from '@polkadot/api';\n        \n        async function main() {\n          const wsProvider = new WsProvider('ws://localhost:8000');\n          const api = await ApiPromise.create({ provider: wsProvider });\n          await api.isReady;\n          await api.rpc('dev_timeTravel', '2030-08-15T00:00:00');\n        }\n        \n        main();\n        \n        ```"}
{"source": "polkadot-docs", "page_id": "parachains-testing-fork-a-parachain", "url": "https://developer.polkadot.com/parachains/testing/fork-a-parachain/#where-to-go-next", "page_title": "Fork a Parachain Using Chopsticks", "index": 9, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 10539, "end_char": 10897, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a358b9857f6b463e0d909a44c06902b4b2f7b5ab575d5f252d770a56a7c16a37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Chopsticks Documentation__\n\n    ---\n\n    For reference documentation on the methods exposed by Chopsticks, see the official Chopsticks documentation.\n\n    [:octicons-arrow-right-24: Get Started](https://acalanetwork.github.io/chopsticks/docs/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#introduction", "page_title": "Run a Parachain Network", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 44, "end_char": 898, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Zombienet](https://github.com/paritytech/zombienet) is a testing framework designed for Polkadot SDK-based blockchain networks. It enables developers to efficiently deploy and test ephemeral blockchain environments using a simple CLI.\n\nThis tutorial walks you through spawning a local parachain test network using Zombienet's native provider. You will build a custom parachain binary from the [Polkadot SDK parachain template](https://github.com/paritytech/polkadot-sdk-parachain-template), download the relay chain binaries, configure a network with two relay chain validators and a parachain collator, and verify that the network produces blocks.\n\nFor detailed information about Zombienet installation methods, providers, CLI commands, and configuration options, refer to the [Zombienet reference page](/reference/tools/zombienet/)."}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#prerequisites", "page_title": "Run a Parachain Network", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 898, "end_char": 1307, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, ensure you have the following installed:\n\n- [Rust](https://rust-lang.org/tools/install/) and Cargo\n- The `wasm32-unknown-unknown` target. Add it with:\n\n    ```bash\n    rustup target add wasm32-unknown-unknown\n    ```\n\n- [Zombienet](/reference/tools/zombienet/#install-zombienet) - see the reference page for installation instructions\n- [Git](https://git-scm.com/downloads)"}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#set-up-the-parachain-template", "page_title": "Run a Parachain Network", "index": 2, "depth": 2, "title": "Set Up the Parachain Template", "anchor": "set-up-the-parachain-template", "start_char": 1307, "end_char": 1846, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Parachain Template\n\nClone and build the Polkadot SDK parachain template:\n\n1. Clone the repository:\n\n    ```bash\n    git clone --branch v0.0.5 \\\n      https://github.com/paritytech/polkadot-sdk-parachain-template \\\n    && cd polkadot-sdk-parachain-template\n    ```\n\n2. Build the parachain node binary:\n\n    ```bash\n    cargo build --release\n    ```\n\n    This compiles the `parachain-template-node` binary to `target/release/`.\n\n3. Add the binary to your PATH:\n\n    ```bash\n    export PATH=$PATH:$(pwd)/target/release\n    ```"}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#download-relay-chain-binaries", "page_title": "Run a Parachain Network", "index": 3, "depth": 2, "title": "Download Relay Chain Binaries", "anchor": "download-relay-chain-binaries", "start_char": 1846, "end_char": 3025, "estimated_token_count": 299, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Download Relay Chain Binaries\n\nYou need the Polkadot relay chain binaries (`polkadot`, `polkadot-prepare-worker`, and `polkadot-execute-worker`) to run the relay chain validators.\n\n!!! note\n    When using the parachain template v0.0.5, ensure you use a compatible relay chain binary. The recommended version is `polkadot-stable2512-2`, which you can download from the [Polkadot SDK releases](https://github.com/paritytech/polkadot-sdk/releases/tag/polkadot-stable2512-2).\n\nDownload the binaries for your platform and make them executable:\n\n```bash\nmkdir -p bin\ncurl -L -o bin/polkadot \\\n  https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/polkadot\ncurl -L -o bin/polkadot-prepare-worker \\\n  https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/polkadot-prepare-worker\ncurl -L -o bin/polkadot-execute-worker \\\n  https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/polkadot-execute-worker\nchmod +x bin/polkadot bin/polkadot-prepare-worker bin/polkadot-execute-worker\n```\n\nAlternatively, you can use Zombienet's setup command:\n\n```bash\nzombienet setup polkadot polkadot-parachain\n```"}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#generate-a-paseo-local-chain-spec", "page_title": "Run a Parachain Network", "index": 4, "depth": 2, "title": "Generate a Paseo Local Chain Spec", "anchor": "generate-a-paseo-local-chain-spec", "start_char": 3025, "end_char": 4288, "estimated_token_count": 311, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Generate a Paseo Local Chain Spec\n\nTo run a local Paseo-based relay chain, you need to generate a chain spec using `chain-spec-builder` and the Paseo runtime. This creates a local testnet chain spec with development accounts (Alice, Bob) as validators.\n\n1. Download `chain-spec-builder` from the [Polkadot SDK releases](https://github.com/paritytech/polkadot-sdk/releases/tag/polkadot-stable2512-2):\n\n    ```bash\n    curl -L -o bin/chain-spec-builder \\\n      https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2512-2/chain-spec-builder\n    chmod +x bin/chain-spec-builder\n    ```\n\n2. Download the Paseo runtime Wasm from the [Paseo runtimes releases](https://github.com/paseo-network/runtimes/releases):\n\n    ```bash\n    curl -L -o bin/paseo_runtime.compressed.wasm \\\n      https://github.com/paseo-network/runtimes/releases/download/INSERT_PASEO_RUNTIME_VERSION/paseo_runtime.compressed.wasm\n    ```\n\n3. Generate the local testnet chain spec:\n\n    ```bash\n    bin/chain-spec-builder -c configs/paseo-local.json \\\n      create -r bin/paseo_runtime.compressed.wasm named-preset local_testnet\n    ```\n\n    This creates a `configs/paseo-local.json` chain spec with the `local_testnet` preset, which includes Alice and Bob as validators."}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#configure-the-network", "page_title": "Run a Parachain Network", "index": 5, "depth": 2, "title": "Configure the Network", "anchor": "configure-the-network", "start_char": 4288, "end_char": 5172, "estimated_token_count": 209, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure the Network\n\nCreate a `network.toml` file that defines the network topology. This configuration sets up a relay chain with two validators and a parachain with one collator, using the Paseo local chain spec generated in the previous step:\n\n```toml title=\"network.toml\"\n[settings]\ntimeout = 1000\nprovider = \"native\"\n\n[relaychain]\nchain_spec_path = \"./configs/paseo-local.json\"\ndefault_command = \"./bin/polkadot\"\n\n[[relaychain.nodes]]\nname = \"alice\"\nvalidator = true\nrpc_port = 9944\n\n[[relaychain.nodes]]\nname = \"bob\"\nvalidator = true\nrpc_port = 9945\n\n[[parachains]]\nid = 1000\n\n[[parachains.collators]]\nname = \"collator01\"\ncommand = \"./polkadot-sdk-parachain-template/target/release/parachain-template-node\"\nrpc_port = 9988\n```\n\nFor a full reference of all available configuration options, see the [Zombienet configuration reference](/reference/tools/zombienet/#settings)."}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#spawn-the-network", "page_title": "Run a Parachain Network", "index": 6, "depth": 2, "title": "Spawn the Network", "anchor": "spawn-the-network", "start_char": 5172, "end_char": 5578, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Spawn the Network\n\nLaunch the network using Zombienet:\n\n```bash\nzombienet spawn network.toml --provider native\n```\n\nZombienet will:\n\n1. Generate chain specifications.\n2. Start relay chain validators (Alice and Bob).\n3. Register and start the parachain collator.\n4. Display connection endpoints and logs.\n\nWait for the output to confirm the network has launched. You'll see RPC endpoints for each node."}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#verify-the-network", "page_title": "Run a Parachain Network", "index": 7, "depth": 2, "title": "Verify the Network", "anchor": "verify-the-network", "start_char": 5578, "end_char": 6278, "estimated_token_count": 221, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify the Network\n\nOnce the network is running, verify that the relay chain is producing blocks by querying the RPC endpoint:\n\n```bash\ncurl -s -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"chain_getHeader\",\"params\":[],\"id\":1}' \\\n  http://127.0.0.1:9944\n```\n\nThe response should include a `number` field showing the current block number, confirming the relay chain is producing blocks.\n\nYou can also check the parachain collator:\n\n```bash\ncurl -s -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"chain_getHeader\",\"params\":[],\"id\":1}' \\\n  http://127.0.0.1:9988\n```\n\nTo stop the network, press **Ctrl + C** in the terminal where Zombienet is running."}
{"source": "polkadot-docs", "page_id": "parachains-testing-run-a-parachain-network", "url": "https://developer.polkadot.com/parachains/testing/run-a-parachain-network/#where-to-go-next", "page_title": "Run a Parachain Network", "index": 8, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6278, "end_char": 7131, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c511030b1e2539070129e187e15c967ff4e703331959de52e09574ceaaea1bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   __Zombienet Reference__\n\n    ---\n\n    Explore the full Zombienet configuration reference, including all settings, relay chain, parachain, and collator options.\n\n    [:octicons-arrow-right-24: Zombienet Reference](/reference/tools/zombienet/)\n\n-  <span class=\"badge external\">External</span> __Zombienet Support__\n\n    ---\n\n    [Parity Technologies](https://www.parity.io/) has designed and developed this framework, now maintained by the Zombienet team.\n\n    For further support and information, refer to the following contact points:\n\n    [:octicons-arrow-right-24: Zombienet repository](https://github.com/paritytech/zombienet)\n\n    [:octicons-arrow-right-24: Element public channel](https://matrix.to/#/!FWyuEyNvIFygLnWNMh:parity.io?via=parity.io&via=matrix.org&via=web3.foundation)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-chat", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/chat/#introduction", "page_title": "Chat in the Polkadot App", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 9, "end_char": 1250, "estimated_token_count": 247, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a74896d1c3df1a713155e837e1785227ab7084b01230e54e117e8df833a220d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nChat is the Polkadot App's in-App messaging surface — and the canonical example of a feature that composes two Polkadot infrastructure layers. The [Statement Store](/reference/apps/infrastructure/statement-store/) carries the real-time signaling (who is online, who said what, when); the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/) stores the encrypted message content that has to outlive the gossip TTL.\n\nA Product can participate in Chat in two ways:\n\n- **Bot**: Your Product registers as a bot in a chat room and publishes and receives typed messages on behalf of the user.\n- **Custom message renderer**: Your Product responds to a _reverse subscription_ the App opens against it, providing custom UI for message types you define. The App calls `product_chat_custom_message_render_subscribe` and your Product returns rendered output for each message it owns.\n\n!!! warning \"Provisional\"\n    The internal architecture of Chat in the App (the local message queue, the bot registry, the proof-routing for outgoing statements) is still being finalized. Architecture diagrams and lifecycle specifics will be added once they are confirmed. The narrative below covers the developer-observable surface only."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-chat", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/chat/#room-and-bot-registration", "page_title": "Chat in the Polkadot App", "index": 1, "depth": 2, "title": "Room and Bot Registration", "anchor": "room-and-bot-registration", "start_char": 1250, "end_char": 1968, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a74896d1c3df1a713155e837e1785227ab7084b01230e54e117e8df833a220d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Room and Bot Registration\n\nTwo registration concepts gate participation:\n\n- **Room registration**: Identifies a logical conversation. Rooms can be DM-style (two users), simple group chats, or feature-specific (a Product registers a room to deliver messages to its users).\n- **Bot registration**: Identifies a Product participating in a room. A Product that wants to publish messages on the user's behalf registers as a bot inside the room.\n\nA `host_chat_create_simple_group` host call (introduced in TrUAPI v0.2) creates a simple group chat from a Product. Full lifecycle specifics — invitation flow, membership semantics, leave behavior — are documented in the TrUAPI Chat method group once that reference lands."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-chat", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/chat/#message-types", "page_title": "Chat in the Polkadot App", "index": 2, "depth": 2, "title": "Message Types", "anchor": "message-types", "start_char": 1968, "end_char": 2479, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a74896d1c3df1a713155e837e1785227ab7084b01230e54e117e8df833a220d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Message Types\n\nChat uses a typed message system. The canonical types are:\n\n- **`Text`**: Plain-text messages\n- **`RichText`**: Formatted messages, such as links, mentions, and basic formatting\n- **`Actions`**: Actionable messages users can interact with directly in-App\n- **`File`**: File attachments backed by Bulletin Chain content addresses\n- **`Reaction`**: Reactions attached to an existing message\n- **`Custom`**: Product-defined message types rendered by the originating Product via custom rendering"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-chat", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/chat/#custom-message-rendering", "page_title": "Chat in the Polkadot App", "index": 3, "depth": 2, "title": "Custom Message Rendering", "anchor": "custom-message-rendering", "start_char": 2479, "end_char": 3000, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a74896d1c3df1a713155e837e1785227ab7084b01230e54e117e8df833a220d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Custom Message Rendering\n\nCustom rendering inverts the usual Host→Product call direction. When the App needs to display a custom message type your Product defined, it opens a subscription against your Product and asks it to render. The host call is `product_chat_custom_message_render_subscribe`. Your Product receives the message payload, produces UI output, and returns it for the App to display in the chat thread.\n\nThis is how Chat stays extensible without baking every possible message type into the App itself."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-chat", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/chat/#message-queueing", "page_title": "Chat in the Polkadot App", "index": 4, "depth": 2, "title": "Message Queueing", "anchor": "message-queueing", "start_char": 3000, "end_char": 3304, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a74896d1c3df1a713155e837e1785227ab7084b01230e54e117e8df833a220d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Message Queueing\n\nMessages a Product sends before it has registered as a bot in a room are queued automatically. The Product does not need to track registration state to avoid losing messages. Submit the outgoing chat message on the user's behalf, and the queue resolves once registration completes."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-chat", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/chat/#composition-statement-store-bulletin-chain", "page_title": "Chat in the Polkadot App", "index": 5, "depth": 2, "title": "Composition: Statement Store + Bulletin Chain", "anchor": "composition-statement-store-bulletin-chain", "start_char": 3304, "end_char": 4239, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a74896d1c3df1a713155e837e1785227ab7084b01230e54e117e8df833a220d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Composition: Statement Store + Bulletin Chain\n\nChat is the model composition for Product developers building real-time-with-durable-content features. It pairs two infrastructure layers documented separately in this reference:\n\n- **Statement Store**: Carries signaling, such as presence, typing indicators, message-arrival notifications, and room-membership events. Statements are gossiped, allowance-gated, and short-lived. For mechanics, see [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/).\n- **Bulletin Chain**: Stores the encrypted message content readers fetch by CID after they see the statement that points to it. See [Store Data on Chain](/apps/build/store-data-on-chain/).\n\nThe composition is general. Many Products with chat-like or activity-feed semantics will use the same split: Statement Store for the live signal, Bulletin Chain for content that needs to survive longer than a session."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-chat", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/chat/#where-to-go-next", "page_title": "Chat in the Polkadot App", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4239, "end_char": 4602, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a74896d1c3df1a713155e837e1785227ab7084b01230e54e117e8df833a220d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Exchange Ephemeral Messages**\n\n    ---\n\n    The underlying Statement Store layer that Chat is built on — useful when you need pub/sub semantics without the full Chat surface.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/pub-sub-off-chain-data/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-coinage", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/coinage/#introduction", "page_title": "Coinage in the Polkadot App", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 1244, "estimated_token_count": 259, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae151dcd50c5a2d44979f3514c2ff9e0e39dba3ad1c9151388843d4b2498d12", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nCoinage is the Polkadot App's peer-to-peer payment feature. From a user perspective, it is a way to send and receive funds App-to-App with the privacy and personhood properties of the underlying `pallet-coinage` primitive. From a Product developer perspective, Coinage is one of two payment surfaces a Product can route through:\n\n- **Coinage**: Personhood-gated, peer-to-peer payments where the App is the originating UI on both sides.\n- **Standard `Balances` transfer surface**: General transfers and merchant-style flows.\n\n!!! info \"Underlying asset: HOLLAR before pUSD\"\n    Coinage is backed by a stablecoin on Asset Hub (configured via `UnderlyingAssetId`). The configured asset is HOLLAR, and the system is designed to migrate to pUSD when pUSD lands. The asset is an implementation detail of the recycler, onboard, and offboard layer, not a gate on the developer-facing surface. The narrative below is stable across the HOLLAR-to-pUSD transition.\n\n!!! warning \"Provisional\"\n    The App's send/receive UX details and the recommended Product-side integration pattern are still being finalized by Parity. This page documents the conceptual model; per-flow specifics will be added once the surface is confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-coinage", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/coinage/#conceptual-model", "page_title": "Coinage in the Polkadot App", "index": 1, "depth": 2, "title": "Conceptual Model", "anchor": "conceptual-model", "start_char": 1244, "end_char": 2110, "estimated_token_count": 192, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae151dcd50c5a2d44979f3514c2ff9e0e39dba3ad1c9151388843d4b2498d12", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Model\n\nThree properties differentiate Coinage from a plain `Balances.transfer_keep_alive`:\n\n- **Personhood-aware**: Coinage payments can be gated on PoP, sending to \"any real person on the network\" rather than to a specific account address. The recipient's address need not be known to the sender.\n- **Privacy-preserving by default**: Coinage routes through the alias and Ring-VRF surface where appropriate, so the on-chain trail does not link the sender's account to the recipient's account in the same way a public transfer does.\n- **App-native UX**: The send and receive flows are rendered in the Polkadot App on both sides, with the user approving the transaction on their phone.\n\nFor the pallet-level storage model, privacy primitives, and dispatch surface, see the [pallet-coinage reference](/reference/apps/infrastructure/pop/pallet-coinage/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-coinage", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/coinage/#where-to-go-next", "page_title": "Coinage in the Polkadot App", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2110, "end_char": 2438, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae151dcd50c5a2d44979f3514c2ff9e0e39dba3ad1c9151388843d4b2498d12", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Proof of Personhood**\n\n    ---\n\n    The personhood surface Coinage gates on, including Ring-VRF aliases and the Full and Lite tier model.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/pop/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/#introduction", "page_title": "Polkadot App Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 1627, "estimated_token_count": 396, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5dd4712d3ae0fb25a6ed4c70a7ac984bbfb2048fb807905af096b0fc0ea41b36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Polkadot App is the mobile wallet that holds every Polkadot Product user's private key. It runs on the user's phone and is the only place in the [Polkadot Triangle](/reference/glossary/#triangle) where the key lives — [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) and [Polkadot Web](/reference/apps/hosts/polkadot-web/) never touch it.\n\nFrom a Product developer's perspective, the App plays three roles no other Host plays:\n\n- **It holds the user's private key**: The key lives on the device, in the App's on-device storage. No other Host and no Product ever sees the key.\n- **It signs every transaction**: Every signing request that originates from a Product — whether the Product runs inside Desktop or Web — is routed back to the App for the user to approve on their phone.\n- **It runs Proof of Personhood**: [Proof of Personhood](pop/) is the privacy-preserving \"real human\" check that unlocks alias-gated features. The verification happens inside the App; the Product never sees who the user is.\n\nThe App also exposes two groups of features that Products integrate against:\n\n- **Host-level features**: [Chat](chat/) is the messaging surface that pairs the [Statement Store](/reference/apps/infrastructure/statement-store/) and [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/). [Sign In with Polkadot](sign-in/) is the cross-Host authentication handshake initiated by Desktop or Web.\n- **Payment-side features**: [Coinage](coinage/) is the peer-to-peer payment flow. [Pocket](pocket/) is the App-side recipient counterpart to Desktop's Pocket send flow."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/#how-it-works", "page_title": "Polkadot App Reference", "index": 1, "depth": 2, "title": "How It Works", "anchor": "how-it-works", "start_char": 1627, "end_char": 2826, "estimated_token_count": 266, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5dd4712d3ae0fb25a6ed4c70a7ac984bbfb2048fb807905af096b0fc0ea41b36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How It Works\n\nFrom a Product developer's perspective, three things matter about how the App runs:\n\n- **Session pairing**: Pairing establishes a session, not a copy of the key. When the user pairs the App with Polkadot Desktop, the App returns a derived _session public key_ (see [Install Desktop and Pair](/apps/get-started/)). Desktop stores that public key so it can identify the user and construct per-Product sub-accounts. The private key never leaves the phone.\n- **Asynchronous signing**: Signing is asynchronous because it happens on a separate device. When a Product calls `signAndSubmit`, Desktop renders a signing modal locally, but the actual signature happens on the user's phone after they approve in the App. Build UI that tolerates the round-trip; see the [Sign and Submit Transactions](/apps/build/sign-and-submit/) guide for the patterns.\n- **PoP verification**: The App is the only place PoP runs. A Product can gate features on Proof of Personhood (alias-based or general personhood), but the verification flow itself happens in the App. The Product never sees the underlying biometric or the user's identity record, only the alias or alias-proof it requested through TrUAPI."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/#where-the-app-fits-in-the-sdk-surface", "page_title": "Polkadot App Reference", "index": 2, "depth": 2, "title": "Where the App Fits in the SDK Surface", "anchor": "where-the-app-fits-in-the-sdk-surface", "start_char": 2826, "end_char": 3381, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5dd4712d3ae0fb25a6ed4c70a7ac984bbfb2048fb807905af096b0fc0ea41b36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where the App Fits in the SDK Surface\n\nThe App is both a consumer and a producer of [TrUAPI](/reference/apps/protocol/truapi/) methods:\n\n- The App consumes Host API methods for chain interaction and storage when its own features (Chat, Coinage, PoP) need to talk to the People Chain, Statement Store, or Bulletin Chain.\n- The App produces the signing primitive every other Host's `signAndSubmit` ultimately resolves against. Methods Products call through the SDK — like `createProof` and `getAnonymousAlias` — complete in the App on the user's phone."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/#where-to-go-next", "page_title": "Polkadot App Reference", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3381, "end_char": 4575, "estimated_token_count": 328, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5dd4712d3ae0fb25a6ed4c70a7ac984bbfb2048fb807905af096b0fc0ea41b36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Chat**\n\n    ---\n\n    The in-App messaging surface: room/bot registration, the typed-message system, and how Chat composes the Statement Store with the Bulletin Chain.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/chat/)\n\n- <span class=\"badge learn\">Learn</span> **Proof of Personhood**\n\n    ---\n\n    Where the App's PoP verification happens, what Ring-VRF aliases are, and the PoP Full vs PoP Lite tier model.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/pop/)\n\n- <span class=\"badge learn\">Learn</span> **Sign In with Polkadot**\n\n    ---\n\n    The Host-level handshake the App resolves when Desktop or Web wants to authenticate a session against the paired identity.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/sign-in/)\n\n- <span class=\"badge guide\">Guide</span> **Accounts and Signing**\n\n    ---\n\n    The how-to guide for wiring a Product up to a paired account and submitting signed transactions through the SDK.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/sign-and-submit/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pocket", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pocket/#introduction", "page_title": "Pocket Recipient in the Polkadot App", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 949, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2a73d3422229f21ce1f3944b27ba2f7be658414f045c11342258ddfd819c6b41", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPocket is Polkadot Desktop's send flow, a feature that lets a Desktop user package a payment or asset transfer and route it to a recipient identified by their App identity. This page documents the App-side counterpart, covering how the Polkadot App receives a Pocket transfer initiated from Desktop and the user-visible flow inside the App.\n\nThe Desktop sender-side view is documented at [Pocket Send Flow in Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/pocket/). This page is the receiver's view.\n\n!!! warning \"Provisional\"\n    The recipient-side flow inside the App is still being defined. The exact handshake between Desktop's Pocket dispatch and the App's incoming-Pocket UI, the notification surface, and the accept and decline mechanics are still being finalized. This page captures the conceptual model only; the detailed flow and any sequence diagram will be added once they are confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pocket", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pocket/#conceptual-model", "page_title": "Pocket Recipient in the Polkadot App", "index": 1, "depth": 2, "title": "Conceptual Model", "anchor": "conceptual-model", "start_char": 949, "end_char": 2042, "estimated_token_count": 214, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2a73d3422229f21ce1f3944b27ba2f7be658414f045c11342258ddfd819c6b41", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Model\n\nFrom the recipient's perspective:\n\n- A Desktop user (the sender) initiates a Pocket transfer addressed to the recipient's paired App identity.\n- The transfer arrives at the App as a pending incoming item, surfaced to the recipient in the App's UI.\n- The recipient reviews and either accepts or declines the transfer.\n- On accept, the transfer settles to the recipient's account. On decline (or timeout), it does not.\n\nThe distinguishing property of Pocket relative to a plain `Balances.transfer_keep_alive` is the accept step. A standard transfer settles unilaterally, so the recipient cannot reject it. Pocket's two-sided flow gives the recipient a chance to refuse, which matters when the transfer is contextually meaningful (an in-band payment between users who know each other) rather than a balance change.\n\nThe Product-developer surface that bridges to Pocket is part of the open question above, including whether a Product can initiate a Pocket transfer programmatically, or only the Desktop UI can. Once resolved, the integration pattern will be documented here."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pocket", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pocket/#where-to-go-next", "page_title": "Pocket Recipient in the Polkadot App", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2042, "end_char": 2411, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2a73d3422229f21ce1f3944b27ba2f7be658414f045c11342258ddfd819c6b41", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge reference\">Reference</span> **Payment Method Group**\n\n    ---\n\n    The TrUAPI method group covering `Balances.transfer_keep_alive` and the Pocket peer-to-peer payment flow available to Products.\n\n    [:octicons-arrow-right-24: View Reference](/reference/apps/protocol/truapi/payment/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pop/#introduction", "page_title": "Proof of Personhood in the Polkadot App", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 24, "end_char": 1060, "estimated_token_count": 213, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97e5e4a87a004bba8d7379f18323dd394ee75516ae424561bbcd79a73f1134eb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nProof of Personhood (PoP) is Polkadot's privacy-preserving \"real human\" check. The Polkadot App is the only place PoP verification happens. When a user completes PoP, they do it on their phone, in the App, once. From then on, a single proof unlocks the developer-facing surface area that gates on personhood, including the TestNet faucet, short `.dot` names, and any alias-gated feature inside a Polkadot Product.\n\nThe App's role is narrow but load-bearing. It runs the verification flow, registers the result on the People Chain, and produces Ring-VRF aliases on demand for Products that ask for one through the Host API. Products see the aliases, not the underlying identity.\n\n!!! warning \"Provisional\"\n    The exact PoP verification flow inside the App (the video or biometric interaction, the on-device key-derivation path, peer-attestation cadence for ongoing membership) is still being finalized. Lifecycle diagrams and the precise list of pallets a PoP submission touches will be added once they are confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pop/#ring-vrf-aliases", "page_title": "Proof of Personhood in the Polkadot App", "index": 1, "depth": 2, "title": "Ring-VRF Aliases", "anchor": "ring-vrf-aliases", "start_char": 1060, "end_char": 1980, "estimated_token_count": 205, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97e5e4a87a004bba8d7379f18323dd394ee75516ae424561bbcd79a73f1134eb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ring-VRF Aliases\n\nA Ring-VRF alias is a context-specific pseudonym derived from the user's PoP-anchored identity. Aliases have three properties Product developers depend on:\n\n- **Anchored in personhood**: An alias only exists for users who have completed PoP. A valid Ring-VRF proof over an alias is also a valid proof of personhood for the user behind it.\n- **Scoped to a context**: The default context is the requesting Product's `.dot` domain. The same user produces a consistent alias each time they return to your Product, but a different alias for any other Product.\n- **Unlinkable across domains**: Two Products cannot correlate that they share a user unless the user explicitly grants a cross-domain alias.\n\nThe App is the side of the system that holds the alias-producing material. A Product's call to `app.wallet.getAnonymousAlias()` resolves to the App on the user's phone, which signs the alias request."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pop/#pop-tiers-full-vs-lite", "page_title": "Proof of Personhood in the Polkadot App", "index": 2, "depth": 2, "title": "PoP Tiers: Full vs. Lite", "anchor": "pop-tiers-full-vs-lite", "start_char": 1980, "end_char": 3190, "estimated_token_count": 248, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97e5e4a87a004bba8d7379f18323dd394ee75516ae424561bbcd79a73f1134eb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PoP Tiers: Full vs. Lite\n\nThe People Chain recognizes two personhood tiers, both registered in the App:\n\n- **PoP Full**: Cryptographically proven personhood. The user completes the full verification flow in the App: a biometric scan plus ongoing peer-attestation via recurring online sessions. The user's key joins the active membership ring on the People Chain. PoP Full holders can generate zero-knowledge proofs that they are a real person without revealing which one.\n- **PoP Lite**: Third-party attestation. An attester authorized by governance submits an on-chain attestation that an account belongs to a real user. The account is then registered against a separate `lite-people` ring on the People Chain alongside a communication identifier and a username. Lite supply is bounded by governance, which is the spam-resistance mechanism. Lite holders can produce lite-ring Ring-VRF proofs but do not yet hold membership in the full personhood ring.\n\nLite is the on-ramp; Full is the destination. The dotNS registrar uses tier to gate which name lengths a user can register for free. See [dotNS PopRules Pricing](/reference/apps/infrastructure/dotns/poprules-pricing/) for the full PopRules tier table."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pop/#what-this-unlocks-for-a-product", "page_title": "Proof of Personhood in the Polkadot App", "index": 3, "depth": 2, "title": "What This Unlocks for a Product", "anchor": "what-this-unlocks-for-a-product", "start_char": 3190, "end_char": 3849, "estimated_token_count": 156, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97e5e4a87a004bba8d7379f18323dd394ee75516ae424561bbcd79a73f1134eb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What This Unlocks for a Product\n\nA Product running inside Polkadot Desktop can reach the App's PoP surface in two ways via `@parity/product-sdk`:\n\n- **Alias-gated features**: Call `getAnonymousAlias()` for the user's per-Product alias, then `createProof(challenge)` to prove control of that alias against a challenge. Gate features on the proof rather than on the user's account address.\n- **On-chain personhood gates**: Dispatch calls under the `under_alias` runtime origin against PoP pallets (e.g. `pallet-people`). The runtime verifies the underlying Ring-VRF proof and the called pallet's view of the caller is the alias, not the underlying account."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-pop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/pop/#where-to-go-next", "page_title": "Proof of Personhood in the Polkadot App", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3849, "end_char": 4173, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97e5e4a87a004bba8d7379f18323dd394ee75516ae424561bbcd79a73f1134eb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Verify Your Identity**\n\n    ---\n\n    The setup step where the developer completes PoP, plus the PopRules tier table.\n\n    [:octicons-arrow-right-24: Get Started](/reference/apps/infrastructure/dotns/poprules-pricing/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-sign-in", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/sign-in/#introduction", "page_title": "Sign In with Polkadot", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 26, "end_char": 1061, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4a6edac8072d6a7b499e5e71ff63dac957d378e1a02b8f78516a91a53b8e8ead", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nSign In with Polkadot is the handshake that lets a user authenticate to [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/) or [Polkadot Web](/reference/apps/hosts/polkadot-web/) using just their paired Polkadot App on their phone — no password, no extension, no copied keys. Desktop or Web initiates the handshake, the user approves on their phone, and the session is established.\n\nThis feature lives in the App's reference because the App is the side that _resolves_ the handshake, while Desktop or Web initiates it and the App signs.\n\n!!! info \"Products do not invoke this directly\"\n    For a Product running inside Polkadot Desktop, sign-in is complete before your code loads. The user paired their App with Desktop during set-up, and Desktop established a session at that point. Sign In with Polkadot is the host-level primitive sitting underneath your Product's session, not a function you call. The Product-side surfaces you reach for instead are `getAnonymousAlias`, `createProof`, and `under_alias`."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-sign-in", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/sign-in/#how-the-handshake-works", "page_title": "Sign In with Polkadot", "index": 1, "depth": 2, "title": "How the Handshake Works", "anchor": "how-the-handshake-works", "start_char": 1061, "end_char": 2131, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4a6edac8072d6a7b499e5e71ff63dac957d378e1a02b8f78516a91a53b8e8ead", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How the Handshake Works\n\nThe handshake uses the Statement Store as its rendezvous and the paired session as its trust anchor:\n\n1. The Host (Desktop or Web) posts a sign-in request statement to the Statement Store, addressed to the paired App.\n2. The App, subscribed to its own inbox, picks up the request from gossip.\n3. The user sees a sign-in prompt in the App and approves or rejects on their phone.\n4. On approval, the App returns a signed payload back over the encrypted channel.\n5. The Host validates the payload and binds the session.\n\nThe handshake is one-time per session; subsequent Product calls inside the session reuse the binding rather than re-prompting the user.\n\n!!! warning \"Provisional\"\n    The exact wire format of the request and response statements, the topic-filter scoping at the Statement Store boundary, the timeout/rejection failure modes, and any per-session session-key derivation steps are still being finalized. This page documents the developer-observable shape only; the protocol-level details will be added once they are confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-sign-in", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/sign-in/#where-sign-in-differs-from-per-transaction-signing", "page_title": "Sign In with Polkadot", "index": 2, "depth": 2, "title": "Where Sign In Differs from Per-Transaction Signing", "anchor": "where-sign-in-differs-from-per-transaction-signing", "start_char": 2131, "end_char": 3105, "estimated_token_count": 218, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4a6edac8072d6a7b499e5e71ff63dac957d378e1a02b8f78516a91a53b8e8ead", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where Sign In Differs from Per-Transaction Signing\n\nBoth Sign In and `signAndSubmit` route to the App and require user approval, but they serve different jobs:\n\n- **Sign In**: Establishes session identity. It runs once when the user lands in a Host, and reruns if the session expires. It tells the Host who the user is so the Host can construct per-Product sub-accounts and surface Product UI.\n- **`signAndSubmit`**: Signs a _specific transaction_ with a Product's account. Every transaction requires its own approval in the App; there is no \"auto-sign for the rest of this session\" mode. This is intentional. See the [Sign and Submit Transactions](/apps/build/sign-and-submit/) reference for the rationale.\n\nA Product that wants to gate a feature on \"is this the real user paired with this session?\" can rely on the session being authenticated already and instead reach for alias-based or `under_alias` patterns. Re-running Sign In is not the right primitive for that."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-app-sign-in", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-app/sign-in/#where-to-go-next", "page_title": "Sign In with Polkadot", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3105, "end_char": 3727, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4a6edac8072d6a7b499e5e71ff63dac957d378e1a02b8f78516a91a53b8e8ead", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Accounts and Signing**\n\n    ---\n\n    How `signAndSubmit` works for per-transaction signing: the surface a Product actually calls, with the round-trip-to-phone pattern.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/sign-and-submit/)\n\n- <span class=\"badge guide\">Guide</span> **Install and Pair**\n\n    ---\n\n    The set-up step that establishes the initial paired session between Desktop and the App, before Sign In with Polkadot can resolve.\n\n    [:octicons-arrow-right-24: Get Started](/apps/get-started/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/#introduction", "page_title": "Polkadot Desktop Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 1226, "estimated_token_count": 259, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e88dd46a89c4369b07d29c8f13aa723b6111887c3b1309df22bbe3aa2425d8a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Desktop is the workstation app where developers and users actually run Polkadot Products. Think of it as a specialized browser — but instead of typing a URL, the user types a `.dot` name, and instead of rendering arbitrary web pages, Desktop fetches a published Product bundle from decentralized cloud storage and runs it inside a sandbox where signing, storage, and outbound network requests are all mediated by the Host.\n\nDesktop never holds the user's private key. The key lives on the paired [Polkadot App](/reference/apps/hosts/polkadot-app/) on the user's phone. Desktop holds only a derived session public key, enough to identify the user and construct per-Product accounts. Every signing operation routes back to the App for user approval.\n\nThis section documents Desktop's developer-facing surface: how a Product runs inside it, how signing works end to end, how the permissions model enforces sandbox boundaries, and how Desktop exposes [Statement Store](/reference/apps/hosts/polkadot-desktop/statement-store/), [Preimage](/reference/apps/hosts/polkadot-desktop/preimage/), and [Pocket](/reference/apps/hosts/polkadot-desktop/pocket/) features to Products and users."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/#how-it-works", "page_title": "Polkadot Desktop Reference", "index": 1, "depth": 2, "title": "How It Works", "anchor": "how-it-works", "start_char": 1226, "end_char": 2360, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e88dd46a89c4369b07d29c8f13aa723b6111887c3b1309df22bbe3aa2425d8a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How It Works\n\nFrom a Product developer's perspective, three properties define how Desktop behaves:\n\n- **`.dot`-name addressing**: A published Product is addressed by its `.dot` name. Desktop resolves the name through [dotNS](/reference/apps/infrastructure/dotns/), fetches the published bundle, and loads it in the sandbox. During development, Desktop's address bar accepts `localhost:PORT` as a whitelisted bypass so you can iterate against a local dev server. See [Set Up Your Project](/apps/build/#set-up-your-project).\n- **Sandboxed runtime**: A Product runs inside a sandboxed container, not an arbitrary browser tab. It cannot make outbound network requests, access local storage, or sign transactions except through the Host API. See [Permissions](/reference/apps/hosts/polkadot-desktop/permissions/).\n- **Mediated signing**: Every transaction a Product submits, whether dispatched through the Product SDK or directly through TrUAPI, goes through Desktop's signing modal and on to the paired App. There is no path for a Product to sign without user approval. See [Signing](/reference/apps/hosts/polkadot-desktop/signing/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/#where-desktop-fits-in-the-sdk-surface", "page_title": "Polkadot Desktop Reference", "index": 2, "depth": 2, "title": "Where Desktop Fits in the SDK Surface", "anchor": "where-desktop-fits-in-the-sdk-surface", "start_char": 2360, "end_char": 2984, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e88dd46a89c4369b07d29c8f13aa723b6111887c3b1309df22bbe3aa2425d8a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where Desktop Fits in the SDK Surface\n\nDesktop both consumes and produces the [TrUAPI](/reference/apps/protocol/truapi/) surface:\n\n- It consumes Host API methods from the App (signing, PoP proofs) and from infrastructure layers (Bulletin Chain, Statement Store, dotNS) when its own features (Pocket, Preimage, Statement Store mediation) need to talk to those layers.\n- It produces the surface Products call into: chain interaction, local storage, account management, signing, statement submission, preimage submission, and so on. The Product SDK (`@parity/product-sdk` and friends) is a typed wrapper over that surface."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/#where-to-go-next", "page_title": "Polkadot Desktop Reference", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2984, "end_char": 4655, "estimated_token_count": 433, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e88dd46a89c4369b07d29c8f13aa723b6111887c3b1309df22bbe3aa2425d8a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Signing**\n\n    ---\n\n    The full mediated-signing flow: how a `signAndSubmit` call travels from a Product through Desktop to the paired App and back, including the `ChainSubmit` permission model and the timeout or rejection failure modes you need to handle.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/signing/)\n\n- <span class=\"badge learn\">Learn</span> **Permissions**\n\n    ---\n\n    What a Product can do inside the Desktop sandbox is gated by declared permissions. Reference for the permission types, the manifest declaration model, and how denial is surfaced.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/permissions/)\n\n- <span class=\"badge learn\">Learn</span> **Statement Store via Host API**\n\n    ---\n\n    How a Product publishes to and subscribes from the Statement Store through Desktop's mediated surface.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/statement-store/)\n\n- <span class=\"badge learn\">Learn</span> **Preimage**\n\n    ---\n\n    Preimage submission through Desktop, including the Statement-vs-Preimage distinction for off-chain content.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/preimage/)\n\n- <span class=\"badge learn\">Learn</span> **Pocket**\n\n    ---\n\n    Desktop's peer-to-peer send flow. Pair this with the [App-side recipient view](/reference/apps/hosts/polkadot-app/pocket/) for the full round trip.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/pocket/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-permissions", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/permissions/#introduction", "page_title": "Permissions in Polkadot Desktop", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 16, "end_char": 456, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341b1feaa8d363d7900cd84175305df8114dde1d1506f03cbf982dfda1edef88", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA Polkadot Product runs inside a Host-governed sandbox; it cannot reach the network, the chain, the user's microphone, or any other resource without an explicit permission. Permissions are declared in your Product's manifest and enforced by Polkadot Desktop at the Host API boundary. This page is the reference for what each permission means, how the declaration works, and what happens when the user denies a permission."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-permissions", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/permissions/#capability-types", "page_title": "Permissions in Polkadot Desktop", "index": 1, "depth": 2, "title": "Capability Types", "anchor": "capability-types", "start_char": 456, "end_char": 1732, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341b1feaa8d363d7900cd84175305df8114dde1d1506f03cbf982dfda1edef88", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Capability Types\n\n!!! warning \"Provisional\"\n    The exact permission taxonomy on the active Desktop build is still being finalized. The capabilities below are the ones a Product developer encounters in this surface; the complete reference (every permission name, its scope, and its enforcement point) will be added once the taxonomy is confirmed.\n\nThe three permissions most Products will encounter:\n\n- **`Microphone`**: Grants the Product audio-input access. Standard browser-style media permission.\n- **`ExternalRequest`**: Grants the Product the ability to make outbound HTTP requests to URLs that match a declared pattern. The pattern is part of the declaration, not requested at runtime. Your manifest says \"my Product needs to talk to `https://api.example.com/v1/*`\", and Desktop blocks any request the Product makes to URLs outside that pattern, even if the user granted the permission. Pattern scoping is the boundary, not user consent.\n- **`ChainSubmit`**: Grants the Product the ability to request a transaction signing. Despite the name, this does not authorize Desktop to sign for the user; every individual transaction still requires a per-request approval on the paired App. See [Signing](/reference/apps/hosts/polkadot-desktop/signing/) for the full model."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-permissions", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/permissions/#declaring-permissions", "page_title": "Permissions in Polkadot Desktop", "index": 2, "depth": 2, "title": "Declaring Permissions", "anchor": "declaring-permissions", "start_char": 1732, "end_char": 2329, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341b1feaa8d363d7900cd84175305df8114dde1d1506f03cbf982dfda1edef88", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Declaring Permissions\n\nPermissions are declared in your Product's manifest. The declaration is static: your Product cannot dynamically request new permission types at runtime. If a future feature needs a permission you did not declare, you publish a new bundle with an updated manifest and the user re-approves on first open of the new version.\n\nOn the first time a user opens your Product, Desktop presents the declared permissions as prompts. The user grants or denies each one. Their decision is persisted; subsequent opens of the same Product do not re-prompt unless the manifest changes."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-permissions", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/permissions/#denial-ux", "page_title": "Permissions in Polkadot Desktop", "index": 3, "depth": 2, "title": "Denial UX", "anchor": "denial-ux", "start_char": 2329, "end_char": 3055, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341b1feaa8d363d7900cd84175305df8114dde1d1506f03cbf982dfda1edef88", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Denial UX\n\nWhen a permission is denied:\n\n- **Capability response**: The capability returns `PermissionDenied` every time the Product attempts to use it. Your Product code should handle this error explicitly: show the user why the feature cannot proceed and what they can do about it.\n- **Desktop prompt**: Desktop surfaces an \"Enable access in App Settings\" prompt alongside your Product's error UI, pointing the user to the settings screen where they can flip the permission back on.\n\nA Product that crashes on `PermissionDenied` (instead of falling through to a graceful \"this feature needs X, enable it in Settings\" state) is failing this contract. The denial path is part of the normal control flow, not an exception."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-permissions", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/permissions/#where-to-go-next", "page_title": "Permissions in Polkadot Desktop", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3055, "end_char": 3391, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341b1feaa8d363d7900cd84175305df8114dde1d1506f03cbf982dfda1edef88", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Signing**\n\n    ---\n\n    The signing model that the `ChainSubmit` permission gates: what the permission grants and what it does not grant.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/signing/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-pocket", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/pocket/#introduction", "page_title": "Pocket Send Flow in Polkadot Desktop", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 11, "end_char": 987, "estimated_token_count": 198, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8a055a6c1e614da270c286eacd461cee3e23a5d909df1dfcfeafa83791b473e2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPocket is Polkadot Desktop's peer-to-peer send flow. From the sender's side, Pocket is a UI in Desktop that lets a user package a payment or asset transfer addressed to another real person. The recipient is identified by their personhood identity in Polkadot's network, not necessarily by their account address. The receiver sees the incoming transfer in their paired Polkadot App and can accept or decline.\n\nThis page is the sender's view. The App-side receiver view is documented at [Pocket Recipient](/reference/apps/hosts/polkadot-app/pocket/).\n\n!!! warning \"Provisional\"\n    Pocket's exact developer surface is still being finalized, including whether a Product can initiate a Pocket transfer programmatically, the supported asset types and amounts, and the cross-chain routing details. This page captures the conceptual model and the user-visible flow only; the API-level reference and any sequence diagram will be added once the surface is confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-pocket", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/pocket/#conceptual-model", "page_title": "Pocket Send Flow in Polkadot Desktop", "index": 1, "depth": 2, "title": "Conceptual Model", "anchor": "conceptual-model", "start_char": 987, "end_char": 1978, "estimated_token_count": 205, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8a055a6c1e614da270c286eacd461cee3e23a5d909df1dfcfeafa83791b473e2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Model\n\nThree properties distinguish Pocket from a plain `Balances.transfer_keep_alive`:\n\n- **Personhood-aware addressing**: Instead of (or alongside) an SS58 account address, the sender can address a transfer to a recipient identified by their personhood. The sender does not need to know the recipient's account up front. The recipient resolves to the right address inside their App.\n- **Two-sided confirmation**: A standard transfer settles unilaterally, so the recipient cannot refuse it. A Pocket transfer arrives at the recipient's App as a pending item; the recipient explicitly accepts or declines. On accept, it settles; on decline (or timeout), it does not.\n- **Split UX**: The sender UX lives in Desktop, and the receiver UX lives in the App. The two sides of the flow are deliberately on different devices: the sender packages the transfer at a desk, the receiver approves on their phone with the same per-transaction approval model that gates every signed action."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-pocket", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/pocket/#what-the-user-sees", "page_title": "Pocket Send Flow in Polkadot Desktop", "index": 2, "depth": 2, "title": "What the User Sees", "anchor": "what-the-user-sees", "start_char": 1978, "end_char": 2946, "estimated_token_count": 202, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8a055a6c1e614da270c286eacd461cee3e23a5d909df1dfcfeafa83791b473e2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the User Sees\n\nFrom the sender's side in Desktop:\n\n1. The sender opens Pocket from Desktop's UI and selects a recipient (by personhood identifier, contact name, or address).\n2. The sender enters the amount and any optional memo.\n3. The sender confirms in Desktop, which triggers the standard signing modal and routes a per-transaction approval to the sender's own paired App.\n4. After the sender approves on their App, Desktop dispatches the Pocket transfer.\n5. The recipient sees an incoming Pocket item in their App and either accepts or declines (see [Pocket Recipient](/reference/apps/hosts/polkadot-app/pocket/)).\n\nFor everyday merchant-style payments where the payer is responsive in a browser or a Product, and the merchant wants the funds settled, use the standard `Balances.transfer_keep_alive` flow. Pocket is the right tool when the recipient identity matters more than the recipient address, and when accept-decline semantics fit the interaction."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-pocket", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/pocket/#where-to-go-next", "page_title": "Pocket Send Flow in Polkadot Desktop", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2946, "end_char": 3313, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8a055a6c1e614da270c286eacd461cee3e23a5d909df1dfcfeafa83791b473e2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Pocket Recipient (App side)**\n\n    ---\n\n    The other half of the round trip: what a Pocket transfer looks like to the recipient, including the accept and decline mechanics.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/pocket/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-preimage", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/preimage/#introduction", "page_title": "Preimage Submission via Polkadot Desktop", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 686, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2ecbbd368e12790766d5368a36d7fbd16d648fcaa35db57c2c9718296a7fb921", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA preimage is the original content of a hash that has been referenced on-chain. The classic example: a governance referendum points at the hash of a proposal, and the preimage is the proposal's actual bytes. The chain stores only the hash to keep block size down; the bytes have to be made available off-chain before the referenced operation can execute. Polkadot Desktop exposes a preimage submission surface that Products can call through the Host API.\n\nThis page is the reference for that surface. The [Bulletin Chain reference](/reference/apps/infrastructure/bulletin-chain/) documents the storage layer that preimage submission often interacts with."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-preimage", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/preimage/#what-the-preimage-surface-does", "page_title": "Preimage Submission via Polkadot Desktop", "index": 1, "depth": 2, "title": "What the Preimage Surface Does", "anchor": "what-the-preimage-surface-does", "start_char": 686, "end_char": 1664, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2ecbbd368e12790766d5368a36d7fbd16d648fcaa35db57c2c9718296a7fb921", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the Preimage Surface Does\n\n!!! warning \"Provisional\"\n    The exact set of host calls Desktop exposes for preimage submission, the supported size limits, and the lifecycle hooks for preimage availability are still being finalized. This page documents the conceptual model; the current method-group frame is in the [Preimage TrUAPI reference](/reference/apps/protocol/truapi/preimage/).\n\nConceptually, the preimage surface lets a Product:\n\n- **Submit a preimage**: Submit off-chain content for an on-chain operation that will reference it by hash. The Host signs the submission with the user's account, subject to the usual `ChainSubmit` permission and per-transaction approval on the paired App.\n- **Provide hosting**: Host the preimage so it is reachable when the on-chain operation executes. In practice, this often means writing the bytes to the Bulletin Chain and recording the resulting CID, but the exact storage path is part of the surface still being finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-preimage", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/preimage/#statement-vs-preimage", "page_title": "Preimage Submission via Polkadot Desktop", "index": 2, "depth": 2, "title": "Statement vs Preimage", "anchor": "statement-vs-preimage", "start_char": 1664, "end_char": 3811, "estimated_token_count": 532, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2ecbbd368e12790766d5368a36d7fbd16d648fcaa35db57c2c9718296a7fb921", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Statement vs Preimage\n\nStatements and preimages are off-chain content addressed by hash, and both surfaces look superficially similar: your Product submits some bytes, gets a hash back, and the on-chain world refers to that hash later. The two are not interchangeable, though, and choosing the wrong one is a real failure mode.\n\n| Property               | Statement (Statement Store)                                                             | Preimage                                                                                                     |\n| :--------------------: | :-------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------: |\n| What it is for         | Real-time signaling between users: chat, presence, typing indicators, multiplayer state | Off-chain content that an on-chain operation must dereference: governance proposals, scheduled call payloads |\n| Lifetime               | Short TTL (default 30 seconds, gossip-distributed)                                      | Lives until the referencing on-chain operation has completed (or until explicitly cleaned up)                |\n| Availability guarantee | Best-effort gossip; can be missed entirely if no peer was listening on the topic        | Must be available for the referencing operation to execute; storage is durable                               |\n| Validation gate        | Allowance-gated by `pallet-statement-store` (`max_count` and `max_size` per account)    | Gated by the same permission and signing requirements as any other on-chain submission                       |\n| When to use            | Anything users observe in real time and accept losing if the network dropped it         | Anything an on-chain operation needs to read back later                                                      |\n\nA useful rule of thumb: if your Product would still be correct after the bytes expire from network gossip, it is a statement. If the bytes need to be there in 30 minutes for a referendum to execute, it is a preimage."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-preimage", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/preimage/#where-to-go-next", "page_title": "Preimage Submission via Polkadot Desktop", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3811, "end_char": 4500, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2ecbbd368e12790766d5368a36d7fbd16d648fcaa35db57c2c9718296a7fb921", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Statement Store via Host API**\n\n    ---\n\n    The other half of the Statement-vs-Preimage decision: when your content belongs on the gossip-distributed signaling layer instead of as an on-chain-referenced preimage.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/statement-store/)\n\n- <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The Product-side how-to for Bulletin Chain storage, which the preimage surface often delegates to underneath.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/store-data-on-chain/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-signing", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/signing/#introduction", "page_title": "Signing in Polkadot Desktop", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 561, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce275d1ba9b836ac9368813a96bee16e750add6a021b384e0bc5d3641cd4883b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Desktop is the mediator in the signing model; the Polkadot App on the user's phone is the signer. Desktop never has the private key, and Desktop cannot sign anything on its own. Every transaction a Product submits, no matter how small, completes only after the user explicitly approves it on their phone.\n\nThis page is the reference for how that mediation actually works. The Product-side how-to lives at [Sign and Submit Transactions](/apps/build/sign-and-submit/); this page documents the part of the flow Desktop owns."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-signing", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/signing/#the-three-actor-model", "page_title": "Signing in Polkadot Desktop", "index": 1, "depth": 2, "title": "The Three-Actor Model", "anchor": "the-three-actor-model", "start_char": 561, "end_char": 1567, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce275d1ba9b836ac9368813a96bee16e750add6a021b384e0bc5d3641cd4883b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Three-Actor Model\n\nA signing operation always involves three actors:\n\n- **Product**: Builds the transaction and calls `signAndSubmit` through `@parity/product-sdk` or directly through TrUAPI.\n- **Polkadot Desktop**: Receives the encoded payload, renders the signing modal showing the user what they are about to sign, and forwards the request to the paired App.\n- **Polkadot App**: Receives the request, prompts the user on their phone, signs on approval, and returns the signature.\n\n```mermaid\nsequenceDiagram\n    participant Product\n    participant Desktop as Polkadot Desktop\n    participant App as Polkadot App\n    Product->>Desktop: signAndSubmit(payload)\n    Desktop->>Desktop: render signing modal\n    Desktop->>App: signing request (via paired session)\n    App->>App: user approves or rejects\n    App->>Desktop: signature or rejection\n    Desktop->>Desktop: broadcast signed extrinsic\n    Desktop->>Product: result\n```\n\nYour Product code awaits a single promise for this entire round trip."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-signing", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/signing/#chainsubmit-ability-to-request-auto-sign", "page_title": "Signing in Polkadot Desktop", "index": 2, "depth": 2, "title": "`ChainSubmit`: Ability to Request ≠ Auto-Sign", "anchor": "chainsubmit-ability-to-request-auto-sign", "start_char": 1567, "end_char": 2612, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce275d1ba9b836ac9368813a96bee16e750add6a021b384e0bc5d3641cd4883b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## `ChainSubmit`: Ability to Request ≠ Auto-Sign\n\nThe most common point of confusion in the signing model is what the `ChainSubmit` permission actually grants. It does not authorize Desktop to sign on the user's behalf. It authorizes your Product to _request_ that a signing prompt be presented to the user.\n\nThe distinction matters because it determines what UI you need to build:\n\n- Without `ChainSubmit`, your Product cannot even ask. Desktop blocks the dispatch at the Host API boundary and returns `PermissionDenied`. The user has to enable the permission in App Settings before your Product can request signing.\n- With `ChainSubmit`, your Product can ask, and every individual transaction triggers a fresh per-request prompt on the paired App that the user must approve. There is no \"auto-sign for the rest of this session\" mode. Two consecutive transactions produce two prompts; ten produce ten.\n\nThis is intentional. The key only ever leaves the App as a signature over a specific payload the user reviewed, never as a blanket consent."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-signing", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/signing/#what-the-user-sees", "page_title": "Signing in Polkadot Desktop", "index": 3, "depth": 2, "title": "What the User Sees", "anchor": "what-the-user-sees", "start_char": 2612, "end_char": 3497, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce275d1ba9b836ac9368813a96bee16e750add6a021b384e0bc5d3641cd4883b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the User Sees\n\nWhen your Product calls `signAndSubmit`, Desktop drives the following sequence:\n\n1. Desktop displays a signing modal. The modal shows the network name, transaction type (for example, Balances Transfer), the call arguments, and an estimated fee. A **More details** toggle reveals the encoded call data for advanced users.\n2. The user clicks **Continue to Sign**. Desktop transitions to a waiting screen with the message **Open the Polkadot App on your device, then tap Sign or Reject** and a countdown timer indicating the remaining session validity.\n3. The user approves or rejects on the App. The App returns the signature or a rejection.\n4. Desktop receives the result. If approved, Desktop broadcasts the signed extrinsic and returns the outcome to your Product. If rejected, or if the timer reached zero before the user responded, Desktop returns an error."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-signing", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/signing/#asynchronous-approval-and-timeouts", "page_title": "Signing in Polkadot Desktop", "index": 4, "depth": 2, "title": "Asynchronous Approval and Timeouts", "anchor": "asynchronous-approval-and-timeouts", "start_char": 3497, "end_char": 4700, "estimated_token_count": 254, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce275d1ba9b836ac9368813a96bee16e750add6a021b384e0bc5d3641cd4883b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Asynchronous Approval and Timeouts\n\nBecause the App is a separate device, signing is inherently asynchronous. Your Product needs to tolerate the round-trip latency between the dispatch and the result.\n\nTwo failure modes are first-class and your Product UI should handle both:\n\n- **User-initiated rejection**: The user dismissed the prompt on the App. From your Product's perspective, this should be treated like a cancellation. Return the user to a stable UI state and let them retry. The Product SDK surfaces this as `HostRejectedError`.\n- **Session timeout**: The countdown reached zero before the user responded. From your Product's perspective, this is functionally identical to a rejection. Use the same response: stable UI, retry available. The Product SDK surfaces this as `TimeoutError`.\n\nFor the Product-side `try`/`catch` pattern, see [Sign and Submit Transactions](/apps/build/sign-and-submit/).\n\nA practical UI consequence: do not freeze your interface for the duration of a sign request. The user may glance at their phone, get distracted, and approve later. Show a non-blocking pending state and make sure your retry path is idempotent in case the user attempts the same action twice."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-signing", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/signing/#where-to-go-next", "page_title": "Signing in Polkadot Desktop", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4700, "end_char": 5348, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ce275d1ba9b836ac9368813a96bee16e750add6a021b384e0bc5d3641cd4883b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Accounts and Signing**\n\n    ---\n\n    The Product-side how-to for building, signing, and submitting transactions, including the `try`/`catch` patterns for the failure modes documented above.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/sign-and-submit/)\n\n- <span class=\"badge learn\">Learn</span> **Permissions**\n\n    ---\n\n    How `ChainSubmit` is declared in your Product manifest and how Desktop enforces it at the Host API boundary.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/permissions/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-statement-store", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/statement-store/#introduction", "page_title": "Statement Store via Polkadot Desktop's Host API", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 37, "end_char": 924, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be7724f8324e21899dca60feaba24394efe2efe9b9bdf1d2b62c6f807ca6e7b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Statement Store is a network-layer pub/sub primitive on Polkadot's People Chain for short-lived, gossiped, signed statements. Products do not talk to a Statement Store node directly; they go through Polkadot Desktop's Host API, which adds the things a Product on its own cannot do safely, including producing an authentication proof on the user's behalf, attaching the right account context, and applying the per-Product topic scope.\n\nThis page documents what Desktop adds when it mediates Statement Store traffic for a Product. The Statement Store itself (the pallet, the gossip layer, the lifecycle and validation rules) is documented separately in the [Statement Store infrastructure reference](/reference/apps/infrastructure/statement-store/). The Product-side how-to is the [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/) guide."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-statement-store", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/statement-store/#what-desktop-adds", "page_title": "Statement Store via Polkadot Desktop's Host API", "index": 1, "depth": 2, "title": "What Desktop Adds", "anchor": "what-desktop-adds", "start_char": 924, "end_char": 2045, "estimated_token_count": 239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be7724f8324e21899dca60feaba24394efe2efe9b9bdf1d2b62c6f807ca6e7b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Desktop Adds\n\nA Product that calls `client.publish(...)` through the Product SDK is really doing this through Desktop:\n\n- **Proof routing**: Every Statement Store submission carries an authentication proof. The Product does not produce the proof itself. It requests one through the Host API, and Desktop forwards the request to the paired App, which signs and returns the proof. Desktop then submits the statement to the People Chain node on the Product's behalf with the proof attached.\n- **Account context**: The statement is signed by the user's per-Product account: a sub-account derived from the user's identity and scoped to the Product's `.dot` domain. The Product never has to know the account address up front. Desktop resolves the right account and uses it for the submission.\n- **Per-Product topic scope**: The Product SDK tags every submission with `blake2b(appName)` as its primary topic; subscribers from other Products on the same network see only their own traffic. The scope is set up at the Host API boundary so a misconfigured Product cannot accidentally publish into another Product's topic."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-statement-store", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/statement-store/#what-desktop-does-not-do", "page_title": "Statement Store via Polkadot Desktop's Host API", "index": 2, "depth": 2, "title": "What Desktop Does Not Do", "anchor": "what-desktop-does-not-do", "start_char": 2045, "end_char": 2681, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be7724f8324e21899dca60feaba24394efe2efe9b9bdf1d2b62c6f807ca6e7b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Desktop Does Not Do\n\nA few responsibilities sit with the Product, not with Desktop:\n\n- **Product topic settings**: The Host attaches the per-Product primary topic, but secondary `topic2`, channels (last-write-wins state), and per-statement TTL come from the Product's call.\n- **Delivery semantics**: Statement Store delivery is best-effort gossip. There is no retry, no acknowledgement, and no ordering guarantee at the network layer. If your Product needs an acknowledgement, the recipient publishes one back. Reliability is composed at the application layer; Desktop does not add a queue or retry pipeline behind the scenes."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-statement-store", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/statement-store/#composition-with-the-bulletin-chain", "page_title": "Statement Store via Polkadot Desktop's Host API", "index": 3, "depth": 2, "title": "Composition with the Bulletin Chain", "anchor": "composition-with-the-bulletin-chain", "start_char": 2681, "end_char": 3366, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be7724f8324e21899dca60feaba24394efe2efe9b9bdf1d2b62c6f807ca6e7b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Composition with the Bulletin Chain\n\nThe Statement Store is the right layer for ephemeral signaling. When content needs to outlive the statement TTL, the canonical pattern is to store it on the Bulletin Chain and publish the resulting CID as the statement payload. This composition powers the App's [Chat](/reference/apps/hosts/polkadot-app/chat/) feature and many other Product patterns:\n\n- **Statement Store** carries the live signal (presence, \"new message arrived\", typing indicators).\n- **Bulletin Chain** stores the durable content readers fetch later by hash.\n\nBoth layers are reached through Desktop's Host API and the same per-Product account context applies across them."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-desktop-statement-store", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-desktop/statement-store/#where-to-go-next", "page_title": "Statement Store via Polkadot Desktop's Host API", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3366, "end_char": 4033, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be7724f8324e21899dca60feaba24394efe2efe9b9bdf1d2b62c6f807ca6e7b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Exchange Ephemeral Messages**\n\n    ---\n\n    The Product-side how-to: setting up the Statement Store client, subscribing, publishing typed statements, and using channels for last-write-wins state.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/pub-sub-off-chain-data/)\n\n- <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The Bulletin Chain layer that composes with the Statement Store: write the durable content, publish the CID as a statement.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/store-data-on-chain/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-host-api", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/host-api/#introduction", "page_title": "Host API on Polkadot Web", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 928, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:931b3f1398c246def0e63ae57f496fbc4721c2d67ce4b998a5d069b1076a13ee", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Host API surface a Product calls on Polkadot Web is the same TrUAPI surface as on Polkadot Desktop. The same method groups, the same signatures, and the same SDK packages apply. Code written for Desktop runs on Web. This page documents the _exceptions_ to that statement, focusing on the small number of capabilities whose underlying behavior is materially different because the runtime is a browser, not an installed application.\n\nFor the full TrUAPI reference (method groups, versioning, package table), see [Protocol: TrUAPI](/reference/apps/protocol/truapi/).\n\n!!! warning \"Provisional\"\n    The per-method-group behavioral matrix between Polkadot Web and Polkadot Desktop is still being finalized. This page documents the categories where behavior is known to differ and the conceptual reason for each; the per-method specifics will be added once the surface is confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-host-api", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/host-api/#what-is-the-same", "page_title": "Host API on Polkadot Web", "index": 1, "depth": 2, "title": "What Is the Same", "anchor": "what-is-the-same", "start_char": 928, "end_char": 1600, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:931b3f1398c246def0e63ae57f496fbc4721c2d67ce4b998a5d069b1076a13ee", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Is the Same\n\nBy default, assume the following behavior is the same on Web as on Desktop:\n\n- Chain interaction, storage reads, transaction building, and `signAndSubmit` work identically.\n- Per-Product sub-accounts derive the same way and resolve to the same addresses.\n- Permissions are declared the same way in the manifest and gate the same capabilities at the Host API boundary.\n- Signing routes to the paired Polkadot App with the same per-transaction approval model.\n\nA Product that targets Web can use the same `@parity/product-sdk` packages and the same TrUAPI method group calls; the SDK abstracts away the Host difference at every point where it matters."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-host-api", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/host-api/#where-browser-context-differs", "page_title": "Host API on Polkadot Web", "index": 2, "depth": 2, "title": "Where Browser-Context Differs", "anchor": "where-browser-context-differs", "start_char": 1600, "end_char": 2826, "estimated_token_count": 264, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:931b3f1398c246def0e63ae57f496fbc4721c2d67ce4b998a5d069b1076a13ee", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where Browser-Context Differs\n\nThree categories are where browser-context behavior diverges and a Product developer may need Web-specific handling:\n\n- **Local storage backing**: The Product SDK's [`KvStore`](/apps/build/persist-data-locally/) routes through the Host on Web exactly as on Desktop, but the underlying backend the Host uses is different: browser-managed storage rather than the installed app's on-device storage. Capacity, eviction behavior, and clear-history semantics follow the browser's rules.\n- **Outbound requests under the `ExternalRequest` permission**: Pattern-scoped outbound requests still work, but the request itself is dispatched from a browser context. CORS, cookies, and the browser's network policies all apply on top of the Host's pattern enforcement. A request the Host would allow may still be blocked by the browser if the target server's CORS policy rejects it.\n- **Media capabilities**: Media-access permissions such as `Microphone` are gated by both the Host's permission system and the browser's media-permission prompt. The user has to grant both. Build UI that handles the two-prompt path gracefully.\n\nA Product that uses none of those three categories needs no Web-specific code."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-host-api", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/host-api/#where-to-go-next", "page_title": "Host API on Polkadot Web", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2826, "end_char": 3152, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:931b3f1398c246def0e63ae57f496fbc4721c2d67ce4b998a5d069b1076a13ee", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Persist Data Locally**\n\n    ---\n\n    The Product-side how-to for `KvStore`, including the cross-environment behavior the Web Host inherits.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/persist-data-locally/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/#introduction", "page_title": "Polkadot Web Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 1417, "estimated_token_count": 306, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6455f95607965aefb7acf447435bc8ee31ff9e49d92e156eb6e647b48e7d3d20", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Web is the browser-based Host that loads Polkadot Products from any browser tab — no install required. Served at `dot.li`, it is the third sibling alongside the [Polkadot App](/reference/apps/hosts/polkadot-app/) and [Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/). Its job is the same as theirs: load a Polkadot Product inside a sandbox, mediate everything it touches (signing, chain access, storage, outbound requests) through the Host API.\n\nWhat makes Web different from Desktop is not the _model_ — it is the _delivery_. Web runs in a regular browser instead of an installed application, which changes:\n\n- **The trust surface**: The browser is the runtime.\n- **The visiting flow**: A Product is loaded by navigating to it in a browser tab, not from an installed address bar.\n- **The upgrade path**: Products and the Host itself update on page load, not via an OS installer.\n\nThe Product surface a developer targets, including `.dot` name addressing, the TrUAPI surface, and the per-Product sub-account model, is the same in either Host.\n\n!!! warning \"Provisional\"\n    Polkadot Web is being actively built and several of its developer-facing surfaces are not yet finalized. Pages in this subsection document the conceptual model and the parts that are stable; surface-level specifics carry per-page provisional callouts and will be filled in once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/#architecture", "page_title": "Polkadot Web Reference", "index": 1, "depth": 2, "title": "Architecture", "anchor": "architecture", "start_char": 1417, "end_char": 2196, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6455f95607965aefb7acf447435bc8ee31ff9e49d92e156eb6e647b48e7d3d20", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Architecture\n\nAt a high level, three properties matter to a Product developer building for Web:\n\n- **Browser-tab runtime**: Polkadot Web is a regular browser page at `dot.li`. Products are loaded inside it, not as standalone tabs.\n- **Same sandbox contract as Desktop**: A Product running on Web sees the same per-Product account model, the same TrUAPI surface, and the same permission system as a Product running on Desktop. Code that works in Desktop will work on Web, with surface differences called out per-page in this subsection.\n- **Pairs with the Polkadot App for signing**: Like Desktop, Polkadot Web does not hold the user's signing key. A browser session pairs with the user's paired App, and every signed action goes through the App for per-transaction approval."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/#visiting-and-shield-states", "page_title": "Polkadot Web Reference", "index": 2, "depth": 2, "title": "Visiting and Shield States", "anchor": "visiting-and-shield-states", "start_char": 2196, "end_char": 2692, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6455f95607965aefb7acf447435bc8ee31ff9e49d92e156eb6e647b48e7d3d20", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Visiting and Shield States\n\nTwo concepts are specific enough to Web to deserve their own pages:\n\n- [Visiting a Product](/reference/apps/hosts/polkadot-web/visiting/): How a `.dot` name is resolved and a Product is loaded into a browser tab, and how this differs from Desktop's address-bar flow.\n- [Shield States](/reference/apps/hosts/polkadot-web/shield-states/): The security-indicator UI that surfaces the trust posture of the loaded Product, including bundle verification and Host state."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/#host-api-on-web", "page_title": "Polkadot Web Reference", "index": 3, "depth": 2, "title": "Host API on Web", "anchor": "host-api-on-web", "start_char": 2692, "end_char": 3033, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6455f95607965aefb7acf447435bc8ee31ff9e49d92e156eb6e647b48e7d3d20", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Host API on Web\n\nThe TrUAPI surface a Product calls on Web is materially the same as on Desktop. There are a small number of capabilities where the underlying behavior differs because of the browser context (storage, outbound requests, media access), and those are documented at [Host API](/reference/apps/hosts/polkadot-web/host-api/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/#on-chain-polkadotcom", "page_title": "Polkadot Web Reference", "index": 4, "depth": 2, "title": "On-Chain `polkadot.com`", "anchor": "on-chain-polkadotcom", "start_char": 3033, "end_char": 3385, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6455f95607965aefb7acf447435bc8ee31ff9e49d92e156eb6e647b48e7d3d20", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## On-Chain `polkadot.com`\n\nA Polkadot Product can also serve as the meta-surface that points to other Products: a discovery layer running as a Product itself. The canonical instance of this is [On-Chain polkadot.com](/reference/apps/hosts/polkadot-web/onchain-polkadot-com/), which is the on-chain-published presence backing the `polkadot.com` site."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/#upload-journeys", "page_title": "Polkadot Web Reference", "index": 5, "depth": 2, "title": "Upload Journeys", "anchor": "upload-journeys", "start_char": 3385, "end_char": 3671, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6455f95607965aefb7acf447435bc8ee31ff9e49d92e156eb6e647b48e7d3d20", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Upload Journeys\n\n!!! warning \"Provisional\"\n    The flows for publishing content from a Polkadot Web Host are still being defined, including uploading assets, registering a `.dot` Product, and updating a published bundle from within Web. They will be documented here once finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/#where-to-go-next", "page_title": "Polkadot Web Reference", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3671, "end_char": 4537, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6455f95607965aefb7acf447435bc8ee31ff9e49d92e156eb6e647b48e7d3d20", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Visiting a Product**\n\n    ---\n\n    How Polkadot Web resolves a `.dot` name and loads the resulting Product into a browser tab.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-web/visiting/)\n\n- <span class=\"badge learn\">Learn</span> **Shield States**\n\n    ---\n\n    The security-indicator UI on Web and what each shield state means for a Product the user is interacting with.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-web/shield-states/)\n\n- <span class=\"badge learn\">Learn</span> **Host API on Web**\n\n    ---\n\n    Where the Web Host's TrUAPI surface differs in behavior from Desktop because of the browser context.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-web/host-api/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-onchain-polkadot-com", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/onchain-polkadot-com/#introduction", "page_title": "On-Chain polkadot.com", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 28, "end_char": 676, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b34b82e26836a1da065307ef294e96937dbd9bae9d1dcebbf61950913092e124", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nOn-chain `polkadot.com` is `polkadot.com` itself, served as a Polkadot Product. It is the discovery layer for the ecosystem, a directory that points at other Polkadot Products, but it is not hosted on a centralized server. It is published as a bundle, resolved through [dotNS](/reference/apps/infrastructure/dotns/), and loaded by Polkadot Web or Polkadot Desktop into the Host sandbox, the same way any other Product is.\n\nThis page explains what makes the on-chain `polkadot.com` Product different from any other Product, and where it fits in the larger publishing flow. Mechanically, it is not different, and that is the point."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-onchain-polkadot-com", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/onchain-polkadot-com/#why-an-on-chain-discovery-layer", "page_title": "On-Chain polkadot.com", "index": 1, "depth": 2, "title": "Why an On-Chain Discovery Layer", "anchor": "why-an-on-chain-discovery-layer", "start_char": 676, "end_char": 1553, "estimated_token_count": 194, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b34b82e26836a1da065307ef294e96937dbd9bae9d1dcebbf61950913092e124", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why an On-Chain Discovery Layer\n\nA Polkadot Product is addressed by its `.dot` name, but `.dot` names alone are flat. A user has to know the name before they can visit it. Discovery is the layer above that: showcases, categories, recommendations, search.\n\nPutting discovery on-chain as a Polkadot Product itself has two properties an off-chain discovery site does not:\n\n- **Verifiable provenance**: The directory's contents are addressable and verifiable; a user can confirm that the discovery layer they are looking at matches the on-chain CID that dotNS resolves to, and the same shield-state checks that apply to any other Product apply here.\n- **Composability**: Other Products can read the same on-chain discovery state through the chain client surface (see [Read Chain State](/apps/build/read-chain-state/)), without needing a private API to a centralized directory."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-onchain-polkadot-com", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/onchain-polkadot-com/#implications-for-a-product-developer", "page_title": "On-Chain polkadot.com", "index": 2, "depth": 2, "title": "Implications for a Product Developer", "anchor": "implications-for-a-product-developer", "start_char": 1553, "end_char": 2277, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b34b82e26836a1da065307ef294e96937dbd9bae9d1dcebbf61950913092e124", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Implications for a Product Developer\n\nIf you are building a Product, two things matter about on-chain `polkadot.com`:\n\n- **Publishing target**: The flow for getting your Product listed on the canonical discovery surface goes through whatever submission and curation process on-chain `polkadot.com` defines. The Product-side how-to for the underlying publishing steps is [Register and Publish](/apps/deploy-your-app/).\n- **Model to copy**: Any Product that wants to be a discovery surface for a specific category, such as a games directory, a wallet directory, or an asset explorer, can follow the same pattern: publish a Product whose state is the directory, read it from chain, and let the Host render it the same way."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-onchain-polkadot-com", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/onchain-polkadot-com/#where-to-go-next", "page_title": "On-Chain polkadot.com", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2277, "end_char": 2942, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b34b82e26836a1da065307ef294e96937dbd9bae9d1dcebbf61950913092e124", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Publish Your App Bundle**\n\n    ---\n\n    The Product-side how-to for bundling and publishing your Product, including the artifact-addressing steps that any directory-listed Product goes through.\n\n    [:octicons-arrow-right-24: Get Started](/apps/deploy-your-app/)\n\n- <span class=\"badge guide\">Guide</span> **Read Chain State**\n\n    ---\n\n    The how-to for reading on-chain state from inside a Product, including reading state published by other Products like on-chain `polkadot.com`.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/read-chain-state/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-shield-states", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/shield-states/#introduction", "page_title": "Shield States in Polkadot Web", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 1000, "estimated_token_count": 205, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:892685064b370e50948d49b4180613c2afc893b97493a4978b4b410fda3c97fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nWhen a user opens a Polkadot Product on Polkadot Web, they're trusting a few things: that the bundle their browser fetched matches what [dotNS](/reference/apps/infrastructure/dotns/) says the `.dot` name points at, that the Host's state is what it should be, and that nothing in the runtime has been tampered with. Shield states are how Polkadot Web surfaces that trust posture in the browser UI — a security indicator the user can glance at to see whether the loaded Product is in a known-good state.\n\nThis page documents what shield states exist, what each one means, and when the state changes.\n\n!!! warning \"Provisional\"\n    The full list of shield states, the exact UI affordances Polkadot Web uses to surface them, and the triggers that cause a state transition are still being finalized. This page describes the conceptual model; the per-state reference (every name, color, icon, and verbatim explanation surfaced to the user) will be added once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-shield-states", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/shield-states/#conceptual-model", "page_title": "Shield States in Polkadot Web", "index": 1, "depth": 2, "title": "Conceptual Model", "anchor": "conceptual-model", "start_char": 1000, "end_char": 1705, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:892685064b370e50948d49b4180613c2afc893b97493a4978b4b410fda3c97fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Model\n\nA shield state communicates two things at once:\n\n- **Bundle integrity**: Does the running bundle match the CID that dotNS resolves to for the `.dot` name in the address bar? A mismatch, such as a Product loaded from a stale cache that no longer matches the published version, is a state transition worth showing.\n- **Host posture**: Is the Host's expected runtime state intact? Web's sandbox guarantees only hold if the Host itself is in a known state; the shield surfaces deviations.\n\nA user will see a single shield indicator at any moment, and that indicator tells them whether everything is in the \"expected\" posture or whether something the user should know about has happened."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-shield-states", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/shield-states/#why-products-should-care", "page_title": "Shield States in Polkadot Web", "index": 2, "depth": 2, "title": "Why Products Should Care", "anchor": "why-products-should-care", "start_char": 1705, "end_char": 2630, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:892685064b370e50948d49b4180613c2afc893b97493a4978b4b410fda3c97fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why Products Should Care\n\nFor a Product developer, the shield states are not a surface your code calls directly. They are a property of the Host that affects how users perceive your Product. Two implications:\n\n- **Host-owned indicator**: A Product cannot override or hide the shield state. The indicator lives in the Host's UI, outside the Product's sandbox. This is intentional: a Product cannot mask a security state from its users.\n- **Reload signals**: Drastic shield-state changes can signal a reload. If a user is in the middle of a long-running interaction with your Product and dotNS points the `.dot` name at a different CID, the Host may transition to an \"out-of-sync\" state and prompt the user to reload. Build flows that tolerate this, such as idempotent retries and durable client-side state via [`KvStore`](/apps/build/persist-data-locally/), rather than assuming a single Product session is uninterrupted."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-shield-states", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/shield-states/#where-to-go-next", "page_title": "Shield States in Polkadot Web", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2630, "end_char": 2946, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:892685064b370e50948d49b4180613c2afc893b97493a4978b4b410fda3c97fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Visiting a Product**\n\n    ---\n\n    The visiting flow that establishes the initial shield state when a Product is loaded.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-web/visiting/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-visiting", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/visiting/#introduction", "page_title": "Visiting a Product on Polkadot Web", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 469, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:89b42c7a4306126a07d9f16e1799d6c355bf78cf9439649076aa719039e8f701", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe defining flow of Polkadot Web is visiting a Polkadot Product by its `.dot` name from inside a regular browser tab. The mechanism is conceptually the same as Polkadot Desktop's address-bar resolution, but the delivery is different. There is no installed application, and the entry point is a URL.\n\nThis page is the reference for what happens between the user typing a `.dot` name and the Product running inside the Web Host."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-visiting", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/visiting/#the-visiting-flow", "page_title": "Visiting a Product on Polkadot Web", "index": 1, "depth": 2, "title": "The Visiting Flow", "anchor": "the-visiting-flow", "start_char": 469, "end_char": 1296, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:89b42c7a4306126a07d9f16e1799d6c355bf78cf9439649076aa719039e8f701", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Visiting Flow\n\nFrom the user's perspective:\n\n1. The user navigates to `https://<name>.dot.li` (or otherwise enters a `.dot` name in the Web Host's UI).\n2. Web resolves the `.dot` name through dotNS, retrieving the content reference (CID) for the published Product bundle.\n3. Web fetches the bundle from the Bulletin Chain (or its delivery layer) by CID.\n4. Web prepares the sandboxed container the Product will run inside and loads the bundle.\n5. The Product is now running in the user's browser, with the Host API available for it to call.\n\nIf the user is not already signed in via their Polkadot App, the Host triggers the pairing handshake before any signed action becomes possible. Reading chain state, browsing the Product's UI, and interacting with anything that does not require signing all work before sign-in."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-visiting", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/visiting/#how-this-differs-from-polkadot-desktop", "page_title": "Visiting a Product on Polkadot Web", "index": 2, "depth": 2, "title": "How This Differs from Polkadot Desktop", "anchor": "how-this-differs-from-polkadot-desktop", "start_char": 1296, "end_char": 2214, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:89b42c7a4306126a07d9f16e1799d6c355bf78cf9439649076aa719039e8f701", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How This Differs from Polkadot Desktop\n\nThe Product's experience is the same; the path to the Product is what differs:\n\n- **No installer**: Desktop is a specialized browser the user installs; Web is a URL.\n- **Browser-tab entry**: Web inherits the browser's history, back/forward, and tab model. A Product on Web behaves more like a navigated webpage than an opened application.\n- **Updates on load**: Each visit fetches the published bundle. Web has no \"update available\" prompt. The user gets the version dotNS resolves to for that visit.\n\nThe trade-off is on the trust surface: Web depends on the user's browser as part of its runtime. The Host can verify the bundle it fetched matches the CID dotNS resolved to, but the user has to trust the browser to honor the sandbox. The [Shield States](/reference/apps/hosts/polkadot-web/shield-states/) reference documents how Web surfaces this trust posture in its UI."}
{"source": "polkadot-docs", "page_id": "reference-apps-hosts-polkadot-web-visiting", "url": "https://developer.polkadot.com/reference/apps/hosts/polkadot-web/visiting/#where-to-go-next", "page_title": "Visiting a Product on Polkadot Web", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2214, "end_char": 2571, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:89b42c7a4306126a07d9f16e1799d6c355bf78cf9439649076aa719039e8f701", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Shield States**\n\n    ---\n\n    How Polkadot Web surfaces the trust posture of the loaded Product, including what each shield state means and when it changes.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-web/shield-states/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps", "url": "https://developer.polkadot.com/reference/apps/#introduction", "page_title": "App Development Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 30, "end_char": 1213, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae6faaf5c0aadb2823216eab231cef418d823f62a144e0e5b505d44cb1f1603", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis is the technical-depth companion to the [App Development](/apps/) how-to guides. Where the guides walk you through tasks step by step, this section explains _what each component is, how it works, and where its limits are_ — the level of detail you need when integrating against the surface.\n\nA Polkadot Product is a sandboxed application you build that runs inside one of the Polkadot Apps. The Host it runs in mediates everything sensitive, including signing, chain access, storage, and outbound requests, through a protocol called TrUAPI, and the Product talks to Polkadot's on-chain infrastructure through the SDK and the Host. This reference is organized along those axes: Hosts, the TrUAPI protocol between Host and Product, and the infrastructure components Products consume.\n\n!!! info \"Depth target\"\n    Each page in this section follows the same shape: a short conceptual frame up top, then the developer-facing surface (Host API method tables for Hosts, pallet surface tables for infrastructure) at the bottom. The [TrUAPI](/reference/apps/protocol/truapi/) subsection, with one page per method group, is the depth model for protocol reference pages."}
{"source": "polkadot-docs", "page_id": "reference-apps", "url": "https://developer.polkadot.com/reference/apps/#architecture", "page_title": "App Development Reference", "index": 1, "depth": 2, "title": "Architecture", "anchor": "architecture", "start_char": 1213, "end_char": 1975, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae6faaf5c0aadb2823216eab231cef418d823f62a144e0e5b505d44cb1f1603", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Architecture\n\nYour Product sits at the top of a layered stack. You write the Product itself; everything below — the [Product SDK](/apps/product-sdk/) that exposes typed methods, the Polkadot Apps that load and sandbox your Product, and the underlying chains, decentralized storage, and name service — is provided by the platform. The [Host](/reference/glossary/#host) (whichever Polkadot App is loading your Product) mediates every interaction through [TrUAPI](/reference/apps/protocol/truapi/) and prompts the user for anything sensitive.\n\n![Polkadot Apps architecture: your Polkadot Product uses the Product SDK to talk to a Polkadot App (App, Desktop, or Web), which accesses Polkadot infrastructure](/images/reference/apps/index/polkadot-environment.svg)"}
{"source": "polkadot-docs", "page_id": "reference-apps", "url": "https://developer.polkadot.com/reference/apps/#hosts", "page_title": "App Development Reference", "index": 2, "depth": 2, "title": "Hosts", "anchor": "hosts", "start_char": 1975, "end_char": 2727, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae6faaf5c0aadb2823216eab231cef418d823f62a144e0e5b505d44cb1f1603", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Hosts\n\nHosts are the runtime containers that load and run Polkadot Products:\n\n- **[Polkadot App](/reference/apps/hosts/polkadot-app/)**: The mobile Host. Holds the user's signing key, runs Proof of Personhood, and is the canonical signer for every transaction a Product submits anywhere in the Triangle.\n- **[Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/)**: The desktop Host. Loads Products by `.dot` name, mediates signing requests to the paired mobile App, and exposes the Host API surface to the Product running inside it.\n- **[Polkadot Web](/reference/apps/hosts/polkadot-web/)**: The web Host (`dot.li`). Loads Products in a browser sandbox and documents the visiting flow, shield states, and on-chain `polkadot.com` integration."}
{"source": "polkadot-docs", "page_id": "reference-apps", "url": "https://developer.polkadot.com/reference/apps/#protocol", "page_title": "App Development Reference", "index": 3, "depth": 2, "title": "Protocol", "anchor": "protocol", "start_char": 2727, "end_char": 3098, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae6faaf5c0aadb2823216eab231cef418d823f62a144e0e5b505d44cb1f1603", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Protocol\n\nThe [TrUAPI](/reference/apps/protocol/truapi/) reference documents the protocol between Hosts and Products: the conceptual sandbox model, the 11 method groups (TrUAPI Calls, Permissions, Local Storage, Account Management, Signing, Chat, Statement Store, Preimage, Chain Interaction, Payment, Entropy), the versioning model, and the package reference table."}
{"source": "polkadot-docs", "page_id": "reference-apps", "url": "https://developer.polkadot.com/reference/apps/#infrastructure", "page_title": "App Development Reference", "index": 4, "depth": 2, "title": "Infrastructure", "anchor": "infrastructure", "start_char": 3098, "end_char": 3967, "estimated_token_count": 216, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae6faaf5c0aadb2823216eab231cef418d823f62a144e0e5b505d44cb1f1603", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Infrastructure\n\nPer-component reference for the on-chain infrastructure Products consume:\n\n- **[Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/)**: Content-addressed storage with explicit authorization, chunked uploads, time-bound retention, and renewal.\n- **[Statement Store](/reference/apps/infrastructure/statement-store/)**: Gossip-distributed, signed statements on the People Chain for real-time signaling between users.\n- **[dotNS](/reference/apps/infrastructure/dotns/)**: The `.dot` name system, including PopRules pricing, the contract architecture, and the registration flow.\n- **[Proof of Personhood](/reference/apps/infrastructure/pop/)**: The Ring-VRF mechanism and the per-pallet surface (people, game, score, identity, universal basic capacity, coinage).\n- **[HOP](/reference/apps/infrastructure/hop/)**: The cross-chain hop protocol."}
{"source": "polkadot-docs", "page_id": "reference-apps", "url": "https://developer.polkadot.com/reference/apps/#skills", "page_title": "App Development Reference", "index": 5, "depth": 2, "title": "Skills", "anchor": "skills", "start_char": 3967, "end_char": 4138, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae6faaf5c0aadb2823216eab231cef418d823f62a144e0e5b505d44cb1f1603", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Skills\n\nThe [product-sdk](/reference/apps/skills/) skills reference documents what skills exist, what each one does, and how to use them inside your Product workflow."}
{"source": "polkadot-docs", "page_id": "reference-apps", "url": "https://developer.polkadot.com/reference/apps/#where-to-go-next", "page_title": "App Development Reference", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4138, "end_char": 4786, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eae6faaf5c0aadb2823216eab231cef418d823f62a144e0e5b505d44cb1f1603", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Hosts**\n\n    ---\n\n    Start with the Polkadot App, the mobile Host that holds the signing key and runs Proof of Personhood for every Product in the Triangle.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/)\n\n- <span class=\"badge guide\">Guide</span> **App Development How-To**\n\n    ---\n\n    If you are new here, start with the how-to guides: set up Polkadot Desktop, then build your first Product against the SDK surface this reference documents.\n\n    [:octicons-arrow-right-24: Get Started](/apps/get-started/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-authorization", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/authorization/#introduction", "page_title": "Bulletin Chain Authorization", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 541, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0abedee3312b6bc1cbe04672c797efc89d8531b8b2b158f1cbe6b9837c2e969d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Bulletin Chain has no token balance for storage. You cannot \"pay for storage\" the way you pay a transaction fee on a typical chain. Instead, every account that wants to write to Bulletin needs an explicit authorization: an on-chain record that grants a quota of transactions and bytes, with an expiration block.\n\nA write attempted without authorization is rejected at the boundary. This page is the reference for how authorizations are shaped, how they are checked, and what happens when they expire."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-authorization", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/authorization/#what-an-authorization-records", "page_title": "Bulletin Chain Authorization", "index": 1, "depth": 2, "title": "What an Authorization Records", "anchor": "what-an-authorization-records", "start_char": 541, "end_char": 1244, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0abedee3312b6bc1cbe04672c797efc89d8531b8b2b158f1cbe6b9837c2e969d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What an Authorization Records\n\nAn authorization is a per-account on-chain record stored in the `Authorizations` storage map of the `transaction-storage` pallet. It records, for the account it covers:\n\n- **Remaining transactions**: How many storage extrinsics the account may still submit before the quota is exhausted.\n- **Remaining bytes**: How many bytes total the account may still write across those transactions.\n- **Expiration block**: The block at which the authorization expires. Unused capacity is _not_ refunded when this block passes.\n\nA Product can verify an account's current authorization by reading the `Authorizations` storage map for that account through the standard chain client."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-authorization", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/authorization/#what-a-write-costs", "page_title": "Bulletin Chain Authorization", "index": 2, "depth": 2, "title": "What a Write Costs", "anchor": "what-a-write-costs", "start_char": 1244, "end_char": 1676, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0abedee3312b6bc1cbe04672c797efc89d8531b8b2b158f1cbe6b9837c2e969d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Write Costs\n\nEach storage submission decrements both counters:\n\n- The transaction counter decrements by one per extrinsic.\n- The byte counter decrements by the payload size.\n\nThe transaction counter is the one most Products will hit first. Even a small upload that uses chunking (because the payload exceeds the per-transaction byte limit) consumes one transaction per chunk; large files consume the corresponding count."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-authorization", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/authorization/#expiration", "page_title": "Bulletin Chain Authorization", "index": 3, "depth": 2, "title": "Expiration", "anchor": "expiration", "start_char": 1676, "end_char": 2297, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0abedee3312b6bc1cbe04672c797efc89d8531b8b2b158f1cbe6b9837c2e969d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Expiration\n\nAuthorizations are time-bounded for a reason: storage on the network is finite, and an unexpiring authorization would let an inactive account hold reserved capacity indefinitely. When the expiration block passes:\n\n- Any remaining transaction and byte quota in that authorization is _forfeited_ (not credited to a new authorization, not refunded to the user).\n- Subsequent storage attempts return an authorization error until a new authorization is provisioned.\n\nA Product whose users store data over time needs to think about authorization renewal as a first-class concern, not a once-at-onboarding step."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-authorization", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/authorization/#provisioning-on-testnet", "page_title": "Bulletin Chain Authorization", "index": 4, "depth": 2, "title": "Provisioning on TestNet", "anchor": "provisioning-on-testnet", "start_char": 2297, "end_char": 2896, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0abedee3312b6bc1cbe04672c797efc89d8531b8b2b158f1cbe6b9837c2e969d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Provisioning on TestNet\n\n!!! warning \"Provisional\"\n    The TestNet provisioning flow — the faucet endpoint, the request UX, governance- or sudo-routed grants where they apply — is being firmed up. The current flow lives in the [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/) guide; that guide is the source of truth as the surface stabilizes.\n\nOn TestNet today, authorizations are provisioned through a faucet built into the Bulletin Chain Console. The [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/) guide walks through requesting an authorization for a paired account."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-authorization", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/authorization/#where-to-go-next", "page_title": "Bulletin Chain Authorization", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2896, "end_char": 3504, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0abedee3312b6bc1cbe04672c797efc89d8531b8b2b158f1cbe6b9837c2e969d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Renewal**\n\n    ---\n\n    What happens when an authorization or a stored item approaches expiration, and the mechanics of keeping data alive.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/bulletin-chain/renewal/)\n\n- <span class=\"badge guide\">Guide</span> **Get TestNet Funds**\n\n    ---\n\n    The setup step that provisions an authorization on TestNet alongside PAS tokens for transaction fees.\n\n    [:octicons-arrow-right-24: Get Started](/apps/get-started/get-testnet-tokens/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-chunked-upload", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/chunked-upload/#introduction", "page_title": "Chunked Uploads on the Bulletin Chain", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 841, "estimated_token_count": 164, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4772f8296da01bf3e125da1edba261de0ec03bd91a9a73e72dfa7f0adbee8fde", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nEvery Bulletin Chain storage extrinsic carries a hard per-transaction byte limit. A payload smaller than the limit goes in a single transaction. A payload larger than the limit is chunked: the SDK splits the bytes into chunks, uploads each chunk in its own transaction, and writes a small DAG-PB manifest describing how the chunks reassemble. The CID returned for a chunked upload is the CID of the manifest, not of any individual chunk; readers fetching that CID get the manifest, follow it to the chunk CIDs, and reassemble the original payload.\n\nFor most Products, this is transparent — `app.bulletin.upload(bytes)` accepts a payload of any size up to the SDK's supported maximum, and the chunking pipeline runs underneath. This page documents what the pipeline does and what trade-offs it surfaces."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-chunked-upload", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/chunked-upload/#what-happens-internally", "page_title": "Chunked Uploads on the Bulletin Chain", "index": 1, "depth": 2, "title": "What Happens Internally", "anchor": "what-happens-internally", "start_char": 841, "end_char": 1642, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4772f8296da01bf3e125da1edba261de0ec03bd91a9a73e72dfa7f0adbee8fde", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Happens Internally\n\nThe SDK's chunking pipeline runs roughly this sequence:\n\n1. Split the payload into fixed-size chunks (the chunk size is the SDK default, sized to fit comfortably under the per-transaction byte limit).\n2. Upload each chunk in its own extrinsic, accumulating CIDs as the chain returns them.\n3. Build a DAG-PB manifest a small object that lists the chunk CIDs in order, encoded in the DAG-PB format that IPFS-style readers recognize.\n4. Upload the manifest itself as a final small transaction.\n5. Return the manifest CID to the Product.\n\nReaders retrieving the manifest CID get back the manifest first, then issue parallel fetches for each chunk CID and reassemble. Because both the chunks and the manifest are content-addressed, readers can verify each piece independently."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-chunked-upload", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/chunked-upload/#what-this-costs", "page_title": "Chunked Uploads on the Bulletin Chain", "index": 2, "depth": 2, "title": "What This Costs", "anchor": "what-this-costs", "start_char": 1642, "end_char": 2468, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4772f8296da01bf3e125da1edba261de0ec03bd91a9a73e72dfa7f0adbee8fde", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What This Costs\n\nChunked uploads cost more than single-transaction uploads because each chunk consumes one transaction from the [authorization](/reference/apps/infrastructure/bulletin-chain/authorization/) quota. A Product uploading large payloads on behalf of many users should budget transaction quota accordingly — running out of transactions even with plenty of bytes remaining is a realistic failure mode.\n\nThe manifest itself counts as one additional transaction on top of the chunk count.\n\n!!! warning \"Provisional\"\n    The exact chunk size used by the SDK, the maximum supported payload size, the per-transaction byte limit on the current chain build, and any tunables exposed for advanced flows are still being finalized. The conceptual pipeline above is stable; per-value specifics will be added once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-chunked-upload", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/chunked-upload/#what-a-product-sees", "page_title": "Chunked Uploads on the Bulletin Chain", "index": 3, "depth": 2, "title": "What a Product Sees", "anchor": "what-a-product-sees", "start_char": 2468, "end_char": 3247, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4772f8296da01bf3e125da1edba261de0ec03bd91a9a73e72dfa7f0adbee8fde", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Product Sees\n\nA Product calling `app.bulletin.upload(bytes)` sees the same shape regardless of whether chunking ran underneath:\n\n- The call returns a CID.\n- The call decremented the account's authorization quota by the appropriate amount (1 + chunk count for a chunked upload, 1 for a single-transaction upload).\n- A subsequent `app.bulletin.fetch(cid)` retrieves the original payload.\n\nThe chunking is an implementation detail of the upload pipeline, not part of the surface a Product needs to manage. For Products that want explicit control (custom chunk size, parallelism limits, progress reporting on large uploads), the [Store Data on Chain](/apps/build/store-data-on-chain/) guide covers the lower-level `BulletinClient` and the chunk-level controls it exposes."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-chunked-upload", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/chunked-upload/#where-to-go-next", "page_title": "Chunked Uploads on the Bulletin Chain", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3247, "end_char": 3907, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4772f8296da01bf3e125da1edba261de0ec03bd91a9a73e72dfa7f0adbee8fde", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Authorization**\n\n    ---\n\n    The quota model that chunked uploads consume — why transaction count, not only byte count, matters when uploading large files.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/bulletin-chain/authorization/)\n\n- <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The Product-side how-to: small writes, larger files with chunking, and the lower-level `BulletinClient` surface for advanced control.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/store-data-on-chain/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/#introduction", "page_title": "Bulletin Chain Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 1674, "estimated_token_count": 353, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f31b58d5b2e2bcd8d3cff67528427c0e53a6c4ebfc0da083ba768f825800c4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Bulletin Chain is Polkadot's decentralized cloud storage layer for Products. Your Product's files and content live there, addressed by their hash so anyone can verify what they fetched. A Product writes data; the chain returns a [Content Identifier (CID)](/reference/glossary/#content-identifier-cid), which is a Blake2b-256 hash of the bytes, and anyone with that CID can fetch the data back peer-to-peer from the network.\n\nIf you have used IPFS, the mental model is the same: content addressed by hash, retrieved without a central host. The difference is that storage records and authorizations live natively on Polkadot.\n\nFour properties define how a Product interacts with Bulletin:\n\n- **Content-addressed by design**: The CID is the hash of the bytes; two users uploading identical bytes produce the same CID. Readers verify they got the bytes they expected without trusting the host that served them.\n- **Permissionless reads**: Anyone with the CID can fetch from the network — no URL signing, no read auth, no CDN to configure. Privacy through encryption is the Product's responsibility (encrypt before storing if the payload is sensitive).\n- **Explicit authorization for writes**: Bulletin Chain has no token balance for storage. Every account needs an [authorization](/reference/apps/infrastructure/bulletin-chain/authorization/) — a quota of transactions and bytes — before it can store anything.\n- **Time-bound retention with renewal**: Data is retained for a default window (about two weeks); [renewal](/reference/apps/infrastructure/bulletin-chain/renewal/) keeps it alive past expiration; without renewal it falls off."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/#architecture", "page_title": "Bulletin Chain Reference", "index": 1, "depth": 2, "title": "Architecture", "anchor": "architecture", "start_char": 1674, "end_char": 2723, "estimated_token_count": 211, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f31b58d5b2e2bcd8d3cff67528427c0e53a6c4ebfc0da083ba768f825800c4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Architecture\n\n!!! warning \"Provisional\"\n    The full architecture diagram — the relationship between the on-chain storage records and the collator network that serves CIDs to readers — is still being finalized. Per-layer specifics will be added once they are confirmed.\n\nAt a high level, two layers cooperate:\n\n- The on-chain Bulletin Chain holds the _records_ — the CIDs, who is authorized to store, when each item expires. This is where writes are gated and where the authorization model is enforced. See [Authorization](/reference/apps/infrastructure/bulletin-chain/authorization/).\n- The collator-served content network holds the _bytes_. Readers fetch by CID over the peer-to-peer layer; the chain holds the commitment that the bytes existed and the CID was valid at write time, the collator network actually delivers them.\n\nThis split is what makes Bulletin practical at content sizes that would not fit on a typical blockchain's storage: the chain's job is to bound _what counts as authorized storage_, not to physically hold every byte."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/#when-to-use-bulletin", "page_title": "Bulletin Chain Reference", "index": 2, "depth": 2, "title": "When to Use Bulletin", "anchor": "when-to-use-bulletin", "start_char": 2723, "end_char": 3285, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f31b58d5b2e2bcd8d3cff67528427c0e53a6c4ebfc0da083ba768f825800c4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use Bulletin\n\nBulletin is the right layer for content that needs to outlive a session and be fetched later by hash. Profile photos, published articles, app bundles, encrypted message content for chat — anything where the readers are not all present at the same moment and the bytes have to be there later, by hash.\n\nFor the storage-layer comparison (Bulletin vs Statement Store vs local `KvStore`) see [Where to Store Data](/apps/concepts/data-placement/), and for the Product-side how-to use [Store Data on Chain](/apps/build/store-data-on-chain/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/#where-to-go-next", "page_title": "Bulletin Chain Reference", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3285, "end_char": 4511, "estimated_token_count": 324, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f31b58d5b2e2bcd8d3cff67528427c0e53a6c4ebfc0da083ba768f825800c4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Authorization**\n\n    ---\n\n    The model that gates writes: no token balance, an explicit per-account authorization with a transaction-and-byte quota and an expiration block.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/bulletin-chain/authorization/)\n\n- <span class=\"badge learn\">Learn</span> **Chunked Uploads**\n\n    ---\n\n    How a payload larger than the per-transaction limit is uploaded as chunks under a DAG-PB manifest, transparently to the Product.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/bulletin-chain/chunked-upload/)\n\n- <span class=\"badge learn\">Learn</span> **Renewal**\n\n    ---\n\n    The retention lifecycle and the mechanics of renewing data before it falls off the network.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/bulletin-chain/renewal/)\n\n- <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The Product-side how-to: setting up the storage client, the Hello World write, retrieval, larger files, renewal.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/store-data-on-chain/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-renewal", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/renewal/#introduction", "page_title": "Bulletin Chain Renewal", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 499, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90541a02f2a0cc39168baaaf1983ae92568cc71aed989b4258f210a12cdfcd52", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nData on the Bulletin Chain has a bounded retention window. The chain doesn't promise to keep bytes forever; it promises to keep them for a default period (about two weeks), after which the storage record expires and the bytes can be evicted from the collator network unless the record is renewed.\n\nThis page documents the renewal lifecycle: what counts as \"alive,\" what happens at expiration, what a Product has to do to keep data alive, and what costs renewal incurs."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-renewal", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/renewal/#the-default-retention-window", "page_title": "Bulletin Chain Renewal", "index": 1, "depth": 2, "title": "The Default Retention Window", "anchor": "the-default-retention-window", "start_char": 499, "end_char": 1318, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90541a02f2a0cc39168baaaf1983ae92568cc71aed989b4258f210a12cdfcd52", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Default Retention Window\n\nWhen a Product writes to Bulletin, the resulting storage record carries an expiration block — by default, approximately two weeks of blocks from the write. Between the write and the expiration block:\n\n- **The data is _alive_**: Any reader with the CID can fetch the bytes from the collator network.\n- **The chain enforces availability**: The on-chain record exists, and collators serving the network are expected to hold the bytes.\n\nAfter the expiration block:\n\n- The on-chain record is no longer \"active.\" Fetches against the CID may continue to succeed for a window depending on collator caching, but the chain no longer guarantees the bytes are reachable.\n- Eventually, collators evict the bytes. The CID still exists as a content reference, but the network can no longer serve it."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-renewal", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/renewal/#what-renewal-does", "page_title": "Bulletin Chain Renewal", "index": 2, "depth": 2, "title": "What Renewal Does", "anchor": "what-renewal-does", "start_char": 1318, "end_char": 3341, "estimated_token_count": 423, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90541a02f2a0cc39168baaaf1983ae92568cc71aed989b4258f210a12cdfcd52", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Renewal Does\n\nA _renewal_ is a separate transaction, submitted to the `DataRenewal` pallet, that keeps a storage record alive for another retention window. Renewal comes in three forms:\n\n- **One-time renewal (`renew`)**: Registered ahead of time. When the current window ends, the chain stores the data again for another full window.\n- **Immediate renewal (`force_renew`)**: Stores the data again right away. The new window starts from the current block.\n- **Auto-renewal (`enable_auto_renew`)**: Renews the data at the end of every window, until the account's authorization can no longer cover a renewal.\n\nOne-time and immediate renewals identify the data by its content hash, which is the multihash digest of its CID, or by its position (block number and index). Auto-renewal, and disabling it, take the content hash only.\n\nA position identifies one stored copy of the data and stays valid until that copy's retention window ends. Each renewal stores a new copy at a new position. When a renewal takes effect at the end of the window, the original copy expires at the same time. After an immediate renewal, the original copy keeps its position until its own window ends, so renewing that position again stores and pays for another copy. The content hash always resolves to the latest copy.\n\nEach content hash can have only one registered renewal at a time, across all accounts. Registering a one-time renewal or auto-renewal while one is already registered fails with `RenewalAlreadyEnabled`, so a one-time renewal is registered once per window.\n\nA chunked upload is several storage records: one per chunk, plus the manifest. Each record has its own window, so keeping a chunked file available means renewing the manifest and every chunk.\n\nRenewal does not change the CID — readers continue to use the same hash they had before. A Product that has published a CID externally (in another statement, embedded in a `.dot` site, referenced by another pallet) does not have to update those references when it renews."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-renewal", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/renewal/#what-renewal-costs", "page_title": "Bulletin Chain Renewal", "index": 3, "depth": 2, "title": "What Renewal Costs", "anchor": "what-renewal-costs", "start_char": 3341, "end_char": 5140, "estimated_token_count": 365, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90541a02f2a0cc39168baaaf1983ae92568cc71aed989b4258f210a12cdfcd52", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Renewal Costs\n\nRenewal draws on the renewing account's [authorization](/reference/apps/infrastructure/bulletin-chain/authorization/): each renewal uses one transaction, and its size is added to a renewed-bytes counter that the authorization keeps separately from the bytes it has stored. One-time and immediate renewals are charged when you submit them; auto-renewal prepays the first renewal and charges each later one when it takes effect.\n\nUnlike a store, a renewal is rejected when the renewed-bytes counter plus the size of the data would exceed the authorization's byte allowance. Stored bytes do not count toward this check: an account with a 10 MiB allowance that has stored 9 MiB can still renew 8 MiB, while an account that has renewed 9.5 MiB cannot renew another 1 MiB. The chain also caps the total size of renewed data across all accounts. Clients see these rejections as `InvalidTransaction::Custom(5)` (the pallet's `PERMANENT_ALLOWANCE_EXCEEDED`) and `InvalidTransaction::Custom(6)` (`CHAIN_PERMANENT_CAP_REACHED`). If an auto-renewal cannot be paid, its registration is dropped and the data expires.\n\nThe storage quota a Product reads for stores does not predict renewals. To check whether a renewal would be accepted, call the `BulletinTransactionStorageApi.can_renew(account, entry)` runtime API.\n\nFor long-lived content (a profile photo, a published article, an app bundle), a Product should:\n\n- Budget for periodic renewals as part of the account's quota planning, counting renewed bytes against the byte allowance separately from stored bytes.\n- Register renewals before the expiration block, not at it, because submission, inclusion, and finalization take time. For auto-renewal, keep the account's authorization active, because each later renewal is charged to it."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-renewal", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/renewal/#what-happens-to-forgotten-data", "page_title": "Bulletin Chain Renewal", "index": 4, "depth": 2, "title": "What Happens to Forgotten Data", "anchor": "what-happens-to-forgotten-data", "start_char": 5140, "end_char": 5755, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90541a02f2a0cc39168baaaf1983ae92568cc71aed989b4258f210a12cdfcd52", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Happens to Forgotten Data\n\nIf a Product (or its operator) forgets to renew, the data eventually becomes unreachable. There is no manual recovery: once collators have evicted the bytes, only re-uploading the same payload from outside the chain restores availability. The CID will be the same (because the bytes are the same), but a new upload is a fresh transaction against a fresh authorization slot.\n\n!!! warning \"Provisional\"\n    The exact default retention window and the renewal grace period (if any) between expiration and eviction are still being finalized. The conceptual lifecycle above is stable."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-bulletin-chain-renewal", "url": "https://developer.polkadot.com/reference/apps/infrastructure/bulletin-chain/renewal/#where-to-go-next", "page_title": "Bulletin Chain Renewal", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5755, "end_char": 6367, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:90541a02f2a0cc39168baaaf1983ae92568cc71aed989b4258f210a12cdfcd52", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Authorization**\n\n    ---\n\n    The quota model that renewals consume — why a renewal needs a live authorization the same way a fresh upload does.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/bulletin-chain/authorization/)\n\n- <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The Product-side how-to that covers the renewal call alongside the basic store and retrieve flow.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/store-data-on-chain/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-architecture", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/architecture/#introduction", "page_title": "dotNS Architecture", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 991, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bba52682ba29ec1b9abbc7f451c01da08f297bdf25d6cc752193b1feb0f8bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\ndotNS is implemented as a set of cooperating contracts on Polkadot Hub, not as a single monolithic registrar. The split exists because the responsibilities are genuinely different: holding name records, deciding who may register a label, setting the deposit, and holding that deposit are separate jobs, and each gets its own contract.\n\nThis page documents what each contract is responsible for at a conceptual level, so a Product developer building against the dotNS surface knows which contract handles which interaction.\n\n!!! note \"Where to find addresses and ABIs\"\n    This page documents conceptual responsibilities rather than per-contract interfaces. For the deployed contract names and their addresses, see [MainNet Contracts](/reference/apps/infrastructure/dotns/mainnet-contracts/) and [TestNet Contracts](/reference/apps/infrastructure/dotns/testnet-contracts/); generate the ABIs you build against from the artifact published with each release."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-architecture", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/architecture/#conceptual-responsibilities", "page_title": "dotNS Architecture", "index": 1, "depth": 2, "title": "Conceptual Responsibilities", "anchor": "conceptual-responsibilities", "start_char": 991, "end_char": 4447, "estimated_token_count": 689, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bba52682ba29ec1b9abbc7f451c01da08f297bdf25d6cc752193b1feb0f8bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Responsibilities\n\nEvery contract resolves its siblings through a single protocol registry, a keyed address book that is the only address an integration has to configure by hand. The contract set behind it covers the registry's job in three families:\n\n- **Registry core**: The contracts that hold the name records themselves:\n\n    - A registry contract holding the `(namehash → record)` mapping and gating who can write to each record.\n    - Resolver contracts responding to queries and holding the records themselves: the `contenthash`, addresses, text entries, chat keys, and reverse names. There is no separate records contract; a resolver is where a record lives.\n    - A per-user label store holding the readable label strings for the names an account owns, which is the only route back from a `namehash` to the text it came from.\n    - A lens contract listing the names issued to one person, for clients that enumerate a person's names rather than resolve a single one.\n\n- **Registration and pricing**: The contracts that gate who can register what:\n\n    - A PopRules contract that places a label in a length band and decides who may register it, with the deposit coming from a separately registered cost model.\n    - Controller contracts that orchestrate the registration flow: the PopRules check, fee collection if applicable, and the write to the registry. The public commit-reveal path and the personhood gateway are separate controllers.\n    - A registrar contract that is the ERC-721 carrying ownership of public and personhood names, so owning one means holding its token. It mints and burns on a controller's instruction and holds no pricing or personhood policy of its own. A device name is the exception: it has no token, and its ownership lives on the registry record as a subname under a controller-held container.\n    - An escrow contract holding the deposits registrations pay. Deposits are refundable and stay in escrow, so no value is routed to a treasury. It also runs the release, redeem, withdraw, and reclaim lifecycle by which a name returns to circulation. See [Escrow and Deposits](/reference/apps/infrastructure/dotns/escrow/).\n    - A cost model registry naming the pricing contract in force, which governance can repoint. The deployed model charges one deposit for every name it admits, whatever its length.\n    - A whitelist contract holding the per-name grants that the reserved registration path spends.\n\n- **Lifecycle**: What happens to a name after registration. Neither case has a contract of its own:\n\n    - Owner changes for an existing name happen on the registrar itself, through its fee-on-transfer hook and the escrow. A gateway-issued name cannot transfer at all: a personhood name is a soulbound token, and a device name has no token. See [Name Transfers](/reference/apps/infrastructure/dotns/transfer/).\n    - Governance-routed operations, spread across the contracts they act on: grants are issued on the whitelist, and each upgradeable contract authorizes its own upgrade through its owner.\n\nA Product developer rarely interacts with the contracts directly: the [CLI](/reference/apps/infrastructure/dotns/cli/) and the higher-level [Register and Publish](/apps/deploy-your-app/) flow wrap the registration interactions. A Product reading name resolution data does so through the standard chain-client surface, calling into the resolver contract via the typed PAPI descriptor for Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-architecture", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/architecture/#where-to-go-next", "page_title": "dotNS Architecture", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4447, "end_char": 5334, "estimated_token_count": 228, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:63bba52682ba29ec1b9abbc7f451c01da08f297bdf25d6cc752193b1feb0f8bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **PopRules and Pricing**\n\n    ---\n\n    The bands PopRules evaluates: name length, the PoP tier each band requires, and the deposit.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/poprules-pricing/)\n\n- <span class=\"badge learn\">Learn</span> **MainNet Contracts**\n\n    ---\n\n    The Polkadot addresses for the dotNS contract set, and how to resolve them from the protocol registry.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/mainnet-contracts/)\n\n- <span class=\"badge learn\">Learn</span> **TestNet Contracts**\n\n    ---\n\n    The current TestNet addresses for the dotNS contract set, tracked as the surface stabilizes.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/testnet-contracts/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-cli", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/cli/#introduction", "page_title": "dotNS CLI Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 8, "end_char": 1366, "estimated_token_count": 320, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c89d52ee734d9e7e8480bcd2b9eb968005920b3aeed0617f9a9b4b23749babec", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[`@parity/dotns-cli`](https://www.npmjs.com/package/@parity/dotns-cli) is the command-line tool for interacting with the dotNS registry: registering a `.dot` name, updating its `contenthash`, and transferring ownership. It is the canonical tool for these operations; the higher-level [Register and Publish](/apps/deploy-your-app/) flow wraps it for the Polkadot Product setup track.\n\nNames carry the TLD of the network the CLI targets: `.dot` on Polkadot, and `.paseo` on the Paseo TestNet. Registrations do not expire and there is no renewal step. A name stays with its owner until it is transferred or deliberately released.\n\nA Product developer building a typical publishing pipeline rarely calls the CLI directly — the setup track handles the common path. The CLI is the right tool when you need a fine-grained, scriptable interaction (CI publishing, batch operations across multiple names, debugging a registration failure).\n\n!!! info \"CLI version\"\n    This page targets `@parity/dotns-cli` `1.0.0`, aligned with dotNS contracts `1.0.0` and compatible with `0.8.0`. Before it reads or signs, the CLI checks the protocol release the network declares, and it refuses a network that declares any release other than `0.8.0` or `1.0.0`, or declares none. The CLI is in active development and breaking changes between versions are expected."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-cli", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/cli/#command-families", "page_title": "dotNS CLI Reference", "index": 1, "depth": 2, "title": "Command Families", "anchor": "command-families", "start_char": 1366, "end_char": 3136, "estimated_token_count": 378, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c89d52ee734d9e7e8480bcd2b9eb968005920b3aeed0617f9a9b4b23749babec", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Command Families\n\nThe CLI groups its commands into five families that map onto the dotNS contract responsibilities:\n\n- **Registration**: Commands that create a name record:\n\n    - Register a name on the public path. Registration checks `PopRules` eligibility for the label and account before it commits, so an ineligible name fails before any transaction is sent.\n    - Register a subname beneath a name you own.\n    - Resume, inspect, or discard a commitment left by an interrupted registration.\n\n- **Records management**: Commands that read or change an existing name's records:\n\n    - Set the `contenthash` to a new CID. This is what a Product owner runs after publishing a new bundle, so the `.dot` name points at the new version.\n    - Set text records, and choose the primary name shown for an account.\n    - Look up a name's owner and records, and check an account's personhood status.\n\n- **Lifecycle**: Commands that change who controls a name or its escrow position:\n\n    - Transfer a name that is not soulbound to another account.\n    - Let another account manage and transfer a name on your behalf, and revoke that delegation.\n    - Release a name into escrow, inspect its position, redeem it, withdraw the deposit, and claim it. See [Escrow and Deposits](/reference/apps/infrastructure/dotns/escrow/).\n\n- **Accounts**: Commands that manage the signing account and its on-chain mapping:\n\n    - Manage the encrypted keystore the CLI signs with.\n    - Show balances, map a Substrate account to its EVM address, and check a name's governance grant.\n\n- **Bulletin storage**: Commands that upload a Product bundle to the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/) and track what was uploaded, producing the CID a `contenthash` points at."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-cli", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/cli/#installing-and-authenticating", "page_title": "dotNS CLI Reference", "index": 2, "depth": 2, "title": "Installing and Authenticating", "anchor": "installing-and-authenticating", "start_char": 3136, "end_char": 4509, "estimated_token_count": 322, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c89d52ee734d9e7e8480bcd2b9eb968005920b3aeed0617f9a9b4b23749babec", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installing and Authenticating\n\nThe CLI is distributed as an npm package and installs the `dotns` command. Install it globally or run it with `npx`. It targets one environment at a time, set with `--env` or `DOTNS_ENV`: `polkadot` (the default), `paseo-v2`, or `previewnet`. On `polkadot`, registrations, transfers, and Bulletin uploads spend DOT, so pass `--env paseo-v2` to work on the TestNet.\n\nOperations that mutate state (registration, record updates, transfers) need an account that can sign the resulting Polkadot Hub transaction. The CLI signs with one of the following:\n\n- **An encrypted keystore**: The default. `dotns auth` creates and manages keystore accounts, and `--account` selects one.\n- **A mnemonic or key URI**: Passed with `--mnemonic` or `--key-uri`, or through the matching environment variables, which suits CI pipelines.\n- **The Polkadot App**: `--signer qr` pairs the CLI with the Polkadot App by QR code, so the App signs each transaction. This signer is experimental.\n\nWith none of these configured, a command that signs stops before it connects. The CLI signs with the shared development account only when you pass `--allow-dev-account` or set `DOTNS_ALLOW_DEV_ACCOUNT=1`.\n\nThe `PopRules` check reads the personhood status of the account the name is registered to: the signing account, or the account passed with `register domain --owner`."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-cli", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/cli/#command-surface", "page_title": "dotNS CLI Reference", "index": 3, "depth": 2, "title": "Command Surface", "anchor": "command-surface", "start_char": 4509, "end_char": 6276, "estimated_token_count": 566, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c89d52ee734d9e7e8480bcd2b9eb968005920b3aeed0617f9a9b4b23749babec", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Command Surface\n\nThe table lists every command in `1.0.0`. Run `dotns <command> --help` for each command's flags.\n\n| Command | Subcommands | Purpose |\n|:--------|:------------|:--------|\n| `register` | `domain`, `subname`, `retry`, `clear`, `list` | Register a name or subname, and manage commitments cached by an interrupted registration. |\n| `lookup` | `name`, `owner-of`, `transfer` | Show a name's records and owner, and transfer a name. |\n| `content` | `view`, `set` | Read and set a name's `contenthash`. |\n| `text` | `view`, `set` | Read and set a name's text records. |\n| `primary` | `set`, `status` | Set and show the primary name for an account. |\n| `delegate` | `set`, `revoke`, `status`, `records`, `records-status` | Let another account manage a name, or edit records on all of an owner's names. |\n| `escrow` | `status`, `positions`, `release`, `redeem`, `withdraw`, `claim-withdrawal`, `balance`, `refunds list`, `refunds claim`, `refunds claim-batch` | Manage deposits, the release lifecycle, the pull-payment balance, and the time-locked refund ledger. |\n| `pop` | `info` | Show an account's personhood status. There is no command to set a tier. |\n| `store` | `claim`, `info`, `list`, `names`, `cids`, `get`, `set`, `delete`, `sync` | Manage the account's User Store and the names in its label store. |\n| `account` | `address`, `info`, `map`, `is-mapped`, `grant` | Show account details and balances, map a Substrate account to its EVM address, and show a name's governance grant. |\n| `auth` | `set`, `list`, `use`, `remove`, `clear` | Manage the encrypted keystore. |\n| `bulletin` | `authorize`, `refresh`, `upload`, `status`, `history`, `history:remove`, `history:clear`, `verify` | Upload content to the Bulletin Chain and track the uploads. |"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-cli", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/cli/#where-to-go-next", "page_title": "dotNS CLI Reference", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6276, "end_char": 7060, "estimated_token_count": 213, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c89d52ee734d9e7e8480bcd2b9eb968005920b3aeed0617f9a9b4b23749babec", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Register and Publish**\n\n    ---\n\n    The higher-level publishing flow that wraps the most common CLI operations.\n\n    [:octicons-arrow-right-24: Get Started](/apps/deploy-your-app/)\n    \n- <span class=\"badge learn\">Learn</span> **MainNet Contracts**\n\n    ---\n\n    The Polkadot contract addresses the CLI targets by default.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/mainnet-contracts/)\n\n- <span class=\"badge learn\">Learn</span> **TestNet Contracts**\n\n    ---\n\n    The Paseo TestNet contract addresses the CLI targets with `--env paseo-v2`.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/testnet-contracts/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#introduction", "page_title": "Name Escrow and Deposits", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 24, "end_char": 870, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA name registered on the public path pays a refundable deposit. The deposit is not a purchase price, and no part of it is routed to a treasury: it sits in the escrow contract while the name is held, and it returns to the holder when the name is given up. See [PopRules and Pricing](/reference/apps/infrastructure/dotns/poprules-pricing/) for which names pay a deposit and what it costs.\n\nEscrow is also the route by which a name leaves its holder and returns to circulation. This page documents that lifecycle, the two clocks that bound it, and what happens to the deposit when a name changes hands.\n\nOnly a name registered on the public path has an escrow position. A device or personhood name is issued through the personhood gateway, carries no deposit, and cannot be transferred, so none of the operations here apply to it."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#the-lifecycle", "page_title": "Name Escrow and Deposits", "index": 1, "depth": 2, "title": "The Lifecycle", "anchor": "the-lifecycle", "start_char": 870, "end_char": 1665, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Lifecycle\n\nFour operations move a name and its deposit through escrow. The holder drives all of them except `reclaim`:\n\n| Operation  | Caller                 | Available                                                            |\n|:-----------|:-----------------------|:---------------------------------------------------------------------|\n| `release`  | The current holder     | Any time                                                             |\n| `redeem`   | The releasing holder   | During the redeem window, and only while the deposit is not withdrawn |\n| `withdraw` | The releasing holder   | After the withdrawal cooldown                                        |\n| `reclaim`  | The controller         | After the redeem window has elapsed                                  |"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#release", "page_title": "Name Escrow and Deposits", "index": 2, "depth": 3, "title": "Release", "anchor": "release", "start_char": 1665, "end_char": 2110, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Release\n\n`release(tokenId)` moves the name into escrow custody. It starts two independent clocks: a withdrawal cooldown, which gates when the deposit can be taken back, and a redeem window, which gates how long the holder can change their mind.\n\nReleasing is not a sale, and it costs nothing beyond gas. A transfer into or out of escrow is exempt from the transfer fee. See [Name Transfers](/reference/apps/infrastructure/dotns/transfer/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#redeem", "page_title": "Name Escrow and Deposits", "index": 3, "depth": 3, "title": "Redeem", "anchor": "redeem", "start_char": 2110, "end_char": 2485, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Redeem\n\n`redeem(tokenId)` is the undo. While the redeem window is open, and only while the deposit has not been withdrawn, the releasing holder takes the name back. No value moves, because the deposit never left escrow.\n\nWithdrawing a funded deposit forecloses this. Once `withdraw` has paid one out, the name cannot be redeemed even if the redeem window is still open."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#withdraw", "page_title": "Name Escrow and Deposits", "index": 4, "depth": 3, "title": "Withdraw", "anchor": "withdraw", "start_char": 2485, "end_char": 2938, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Withdraw\n\n`withdraw(tokenId)` credits the refundable deposit to the holder's pull-payment balance once the withdrawal cooldown has elapsed. It does not send funds. A second call, `claimWithdrawal()`, pulls the credited balance into the holder's account.\n\nThe two-step shape is the standard pull-payment pattern: crediting a balance cannot fail on the recipient's side, so a holder that cannot accept a direct transfer does not block the operation."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#reclaim", "page_title": "Name Escrow and Deposits", "index": 5, "depth": 3, "title": "Reclaim", "anchor": "reclaim", "start_char": 2938, "end_char": 3495, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Reclaim\n\n`reclaim(tokenId, newOwner)` is the only operation a holder does not drive. The controller calls it once the redeem window has elapsed, handing the name to a new registrant and settling any outstanding deposit to the previous holder's balance.\n\nA holder who releases a name and never returns therefore keeps the value: the deposit lands in their pull-payment balance whether or not they were present when the name recycled. Reclaim also resets the name's resolver pointer, so the new registrant does not inherit the previous holder's records."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#deposits-and-transfers", "page_title": "Name Escrow and Deposits", "index": 6, "depth": 2, "title": "Deposits and Transfers", "anchor": "deposits-and-transfers", "start_char": 3495, "end_char": 3999, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deposits and Transfers\n\nThe deposit is bound to the name rather than to the account that paid it. On every transfer the escrow rebinds the refund recipient to the new holder, and nothing is refunded at transfer time. A buyer who later releases the name withdraws the deposit the seller originally paid.\n\nA transfer therefore settles nothing between the two accounts. If the parties intend the buyer to compensate the seller for the deposit, that is a separate payment, and dotNS does not mediate it."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-escrow", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/escrow/#where-to-go-next", "page_title": "Name Escrow and Deposits", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3999, "end_char": 4615, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d96255cf537062ca29aaab56e3fa1d3f733768789e093d19791a8b4eb1271841", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Name Transfers**\n\n    ---\n\n    Which names can move, the two conditions that trigger a transfer fee, and why an escrow move is always exempt.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/transfer/)\n\n- <span class=\"badge learn\">Learn</span> **PopRules and Pricing**\n\n    ---\n\n    Which names pay a deposit, what it costs, and the three routes by which a name reaches an owner.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/poprules-pricing/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/#introduction", "page_title": "dotNS Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 10, "end_char": 2257, "estimated_token_count": 520, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b40132635ce396c77a5ee3e8b11da53be74b25b50c295234da0a06aca75a51df", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\ndotNS is Polkadot's decentralized name service for Products — the registry that turns a human-readable `.dot` name like `awesome.dot` into the published Polkadot Product it points at. It's the lookup every Host runs whenever a user navigates to a `.dot` address.\n\nIf you have used a DNS provider, the role is similar: human-readable names map to content. dotNS exists for the guarantees DNS lacks. A name belongs to its holder alone, with no registry operator able to suspend or transfer it, and it resolves wherever the chain is reachable, with no server in the path. Resolution returns a [Content Identifier (CID)](/reference/glossary/#content-identifier-cid) for a Product bundle rather than an IP address. And eligibility for the shorter names is tied to [Proof of Personhood](/reference/apps/infrastructure/pop/), so short, human-scale names go to people rather than to whoever arrives first with the most capital.\n\nFour properties shape how a Product developer interacts with dotNS:\n\n- **The registry lives on Polkadot Hub**: Names, owners, and the content references they point at are stored as contract state on Polkadot Hub.\n- **Name resolution is content-addressed at the end**: A `.dot` name resolves to a CID, and the CID points at bytes on the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/) (or via an IPFS gateway). See [Name Mechanism](/reference/apps/infrastructure/dotns/name-mechanism/).\n- **Eligibility is set by PopRules**: A name's length places it in a band. Nine or more characters is open to anyone on the public path. Six to eight is closed there by a governance switch that is off by default, so those names come only through the personhood gateway. Five or fewer is not sold there at all. Every name the public path admits pays the same refundable deposit. See [PopRules and Pricing](/reference/apps/infrastructure/dotns/poprules-pricing/).\n- **The architecture is a small set of cooperating contracts**: Not a single registrar — a set of contracts each handling a slice of the model. See [Architecture](/reference/apps/infrastructure/dotns/architecture/).\n\nFor the Product-side how-to (registering a name, publishing your bundle), see [Register and Publish](/apps/deploy-your-app/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/#one-deployment-per-network", "page_title": "dotNS Reference", "index": 1, "depth": 2, "title": "One Deployment per Network", "anchor": "one-deployment-per-network", "start_char": 2257, "end_char": 3899, "estimated_token_count": 372, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b40132635ce396c77a5ee3e8b11da53be74b25b50c295234da0a06aca75a51df", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## One Deployment per Network\n\ndotNS is deployed separately on each network, and three things follow from that.\n\n- **The TLD is set at deploy time**: Each network's registry carries one TLD. A TestNet uses its own, so a name reads `awesome.paseo` on Paseo, and the Polkadot deployment uses `.dot`. Tools take the bare label and append the TLD of the environment they target, so a label carrying a different TLD is rejected rather than translated.\n- **The deposit is the network's native token**: A registration costs 10 units of whatever the chain uses, so 10 DOT on Polkadot and 10 PAS on Paseo. See [PopRules and Pricing](/reference/apps/infrastructure/dotns/poprules-pricing/).\n- **Registrations do not cross networks**: Each deployment keeps its own registry, so holding a name on a TestNet grants no claim to the matching name on Polkadot. A name has to be registered on each network where it is needed.\n\nThe deployments have different operators. Parity runs dotNS on Paseo Next v2, and the [Polkadot Community Foundation](../../../../apps/polkadot-app.md) runs the Products Devnet deployment and the deployment on Polkadot. The contracts are the same, but each operator deploys its own instance, so deployer-set values such as the deposit amount need not match between them. For the addresses, see [MainNet Contracts](/reference/apps/infrastructure/dotns/mainnet-contracts/) and [TestNet Contracts](/reference/apps/infrastructure/dotns/testnet-contracts/).\n\n!!! note \"Scope\"\n    This reference covers the developer-facing surface. Operator-side procedures, such as migration, batch updates, and contract upgrade paths, are outside it."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/#where-to-go-next", "page_title": "dotNS Reference", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3899, "end_char": 5091, "estimated_token_count": 321, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b40132635ce396c77a5ee3e8b11da53be74b25b50c295234da0a06aca75a51df", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Name Mechanism**\n\n    ---\n\n    How a `.dot` name resolves to a Product bundle — `namehash` derivation, the `contenthash` → CID mapping, and the IPFS/Bulletin delivery path.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/name-mechanism/)\n\n- <span class=\"badge learn\">Learn</span> **Architecture**\n\n    ---\n\n    The contract architecture on Polkadot Hub that backs the registry: what each contract is responsible for and how they cooperate.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/architecture/)\n\n- <span class=\"badge learn\">Learn</span> **PopRules and Pricing**\n\n    ---\n\n    Which length band a name falls in, who may register it, and what the deposit is.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/poprules-pricing/)\n\n- <span class=\"badge guide\">Guide</span> **Register and Publish**\n\n    ---\n\n    The Product-side how-to: registering a `.dot` name, attaching your published Product bundle, and going live.\n\n    [:octicons-arrow-right-24: Get Started](/apps/deploy-your-app/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-mainnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/mainnet-contracts/#introduction", "page_title": "dotNS MainNet Contracts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 479, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0c181430f3d41ebbea00720e651104f65e38cefc330557bb1c6691e15043771", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nThis page lists the contract addresses for the dotNS deployment on Polkadot Hub. A Product or tool that calls the registry directly on MainNet needs these addresses; the [CLI](/reference/apps/infrastructure/dotns/cli/) ships with them for its `polkadot` environment.\n\n!!! note \"Resolve addresses rather than pinning them\"\n    An integration that calls contracts should hold only the protocol registry address and resolve the rest from it."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-mainnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/mainnet-contracts/#contract-address-table", "page_title": "dotNS MainNet Contracts", "index": 1, "depth": 2, "title": "Contract Address Table", "anchor": "contract-address-table", "start_char": 479, "end_char": 3835, "estimated_token_count": 698, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0c181430f3d41ebbea00720e651104f65e38cefc330557bb1c6691e15043771", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Contract Address Table\n\n| Contract                   | Responsibility                                                                       | Polkadot MainNet Address                     |\n|:---------------------------|:------------------------------------------------------------------------------------|:---------------------------------------------|\n| `DotnsProtocolRegistry`    | Keyed address book every other contract resolves its siblings through.               | `0x371693bEeAD209FBb94E2Fe5a6E43C3C15fe376F` |\n| `DotnsRegistry`            | Holds `(namehash → record)` mappings, subnodes, and resolver pointers.               | `0x1Ae9a72865eC7092fC7036892f3349748d31A71e` |\n| `DotnsRegistrar`           | The ERC-721 for public and personhood names. A device name has no token.             | `0x37442d086e282F7C497FC4Ffe00D0A06B84a1f81` |\n| `DotnsRegistrarController` | The public commit-reveal registration path.                                          | `0x76c19abE11404e43445670F13173AFA60BED53f8` |\n| `DotnsPopController`       | The personhood gateway path, and the `isPopIssued` provenance record.                | `0xA06d1CB1e3FedFF7b5dFa779b4Cc61703F8A46A1` |\n| `DotnsPopLens`             | Listing surface for a person's names, gated on `isPopIssued`.                        | `0xE98fE2437eEc5e867B232409D29dAE61A0255C31` |\n| `PopRules`                 | Classification and eligibility: which band a label falls in and who may register it. | `0x088C8de68FD3c199E64C65153B3B628760413BD7` |\n| `DotnsCostModelRegistry`   | Names the cost model in force; that model is where the deposit amount lives.         | `0xc6ef04dcD0f7d4F8E6d918d8101eC5f9D5a16198` |\n| `DotnsFlatPricing`         | The registered model itself: one deposit for every band.                             | `0x1Ad2d2078adEd836eced1D1ac297Cb664Da8DE75` |\n| `DotnsNameEscrow`          | Holds deposits and runs the release, redeem, withdraw, and reclaim lifecycle.        | `0xd76134522FAF788F8dF110E1166441E4468d2c81` |\n| `DotnsNameWhitelist`       | Per-name grants for reserved registration.                                           | `0xEc2f4c007b51c35DEfa96bF654f357Fc850362Ab` |\n| `DotnsContentResolver`     | The `contenthash` record a Product resolves through.                                 | `0xF460c6406217E62A0d2717cD45D6385fe5832001` |\n| `StoreFactory`             | Deploys the per-user label store that maps a node back to its text.                  | `0xFe75036170a5c800a939DF476D756c3d8FF56A8A` |\n\nThese addresses belong to the Polkadot Hub deployment, on chain ID `420420419`, which runs [dotNS `1.0.0`](https://github.com/paritytech/dotns/releases/tag/v1.0.0) under the `.dot` TLD and is operated by the [Polkadot Community Foundation](../../../../apps/polkadot-app.md). They differ from the [TestNet Contracts](/reference/apps/infrastructure/dotns/testnet-contracts/). The dotNS repository records them in [`deployments/polkadot/420420419.json`](https://github.com/paritytech/dotns/blob/master/deployments/polkadot/420420419.json), and the protocol registry is the authoritative source: `get(key)` returns the address each key points at now.\n\nOnly `DotnsProtocolRegistry` needs to be configured by hand. Every other address is resolved from it at call time, so an integration that holds the registry address can find the rest without pinning them."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-mainnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/mainnet-contracts/#how-to-use-these-addresses", "page_title": "dotNS MainNet Contracts", "index": 2, "depth": 2, "title": "How to Use These Addresses", "anchor": "how-to-use-these-addresses", "start_char": 3835, "end_char": 4548, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0c181430f3d41ebbea00720e651104f65e38cefc330557bb1c6691e15043771", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How to Use These Addresses\n\nTo read name resolution data directly, point your typed chain client at `DotnsContentResolver` using the standard PAPI descriptor for Polkadot Hub, resolving its address from `DotnsProtocolRegistry` rather than pinning it. The query is a standard contract call; the resolver returns the record fields you read against.\n\nFor tools or batch jobs that need to mutate state (a CI pipeline registering a name on every release, for example), use the [`@parity/dotns-cli`](/reference/apps/infrastructure/dotns/cli/) instead of building contract calls by hand. The CLI targets this deployment by default and handles the encoding, the PopRules pre-check, and the signing path consistently."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-mainnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/mainnet-contracts/#where-to-go-next", "page_title": "dotNS MainNet Contracts", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4548, "end_char": 5090, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0c181430f3d41ebbea00720e651104f65e38cefc330557bb1c6691e15043771", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **CLI**\n\n    ---\n\n    The command-line surface that targets these contracts by default.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/cli/)\n\n- <span class=\"badge learn\">Learn</span> **TestNet Contracts**\n\n    ---\n\n    The Paseo TestNet addresses, for building and testing before you register on MainNet.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/testnet-contracts/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-name-mechanism", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/name-mechanism/#introduction", "page_title": "The .dot Name Mechanism", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 30, "end_char": 708, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11ebfcf14394aa8ed57fc1d5014445135e3f70f1f6d558f6e630c465f893ddb3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA `.dot` name is the front door a user enters to reach a Polkadot Product. Behind that front door, four layers cooperate to turn the name a user typed into the bytes a Host loads into its sandbox:\n\n1. The dotNS registry on Polkadot Hub.\n2. A `namehash` derivation that turns the string name into a deterministic key.\n3. A `contenthash` record that points the `namehash` at a content reference.\n4. A delivery layer (IPFS gateway, or Bulletin Chain peer-to-peer) that turns the content reference into bytes.\n\nThis page documents each of those layers so a Product developer knows what each one is doing and where to look when something doesn't resolve correctly."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-name-mechanism", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/name-mechanism/#layer-1-the-registry-on-polkadot-hub", "page_title": "The .dot Name Mechanism", "index": 1, "depth": 2, "title": "Layer 1: The Registry on Polkadot Hub", "anchor": "layer-1-the-registry-on-polkadot-hub", "start_char": 708, "end_char": 1304, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11ebfcf14394aa8ed57fc1d5014445135e3f70f1f6d558f6e630c465f893ddb3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Layer 1: The Registry on Polkadot Hub\n\nThe registry of names (who owns `myproduct.dot`, when the registration was last updated, what record is attached right now) lives in contract state on Polkadot Hub, where it is implemented as a set of contracts (see [Architecture](/reference/apps/infrastructure/dotns/architecture/)).\n\nA registration creates a record; a transfer or update modifies it. A resolver reading the registry asks Polkadot Hub for the current state of a specific name and gets back the records associated with it, including the `contenthash` that points at the Product bundle."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-name-mechanism", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/name-mechanism/#layer-2-namehash-derivation", "page_title": "The .dot Name Mechanism", "index": 2, "depth": 2, "title": "Layer 2: Namehash Derivation", "anchor": "layer-2-namehash-derivation", "start_char": 1304, "end_char": 2455, "estimated_token_count": 273, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11ebfcf14394aa8ed57fc1d5014445135e3f70f1f6d558f6e630c465f893ddb3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Layer 2: Namehash Derivation\n\n`.dot` uses an ENS-compatible `namehash` scheme to derive a deterministic key from the dotted name. For example, the name `myproduct.dot` is hashed in a recursive way (hash of `dot`, then hash of `(parent_hash, label_hash)`, where `label_hash` is the keccak hash of the label `myproduct`). The result is a fixed-size hash that the registry uses internally as the lookup key.\n\nThis is the same scheme ENS uses for `.eth`, which is intentional — the derivation is well-understood, well-tooled, and lets dotNS interoperate with the existing `namehash` ecosystem.\n\nEvery name follows the recursive rule, including a device name. `joseph.42` is `joseph` registered beneath its numeric container `42`, so its node is `namehash(namehash(tldNode, \"42\"), \"joseph\")`: splitting the name on its dots is exactly how the key derives. Reading `isPopIssued(label)` on the PoP controller (keyed by the full text, `joseph.42`) tells you whether the personhood gateway issued the name; it says nothing about hashing, which is the same for every name. See [PopRules and Pricing](/reference/apps/infrastructure/dotns/poprules-pricing/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-name-mechanism", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/name-mechanism/#layer-3-contenthash-cid", "page_title": "The .dot Name Mechanism", "index": 3, "depth": 2, "title": "Layer 3: `contenthash` → CID", "anchor": "layer-3-contenthash-cid", "start_char": 2455, "end_char": 3106, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11ebfcf14394aa8ed57fc1d5014445135e3f70f1f6d558f6e630c465f893ddb3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Layer 3: `contenthash` → CID\n\nEach name's record carries a `contenthash` field that points at the Product bundle. The format follows the ENS `contenthash` codec, which can encode:\n\n- **An IPFS CID (with the appropriate codec prefix)**: The canonical pointer for content-addressed bundles.\n- **A Bulletin Chain CID**: Polkadot-native content references, used the same way.\n\nThe `contenthash` is what changes when a Product publishes a new version: the name stays the same, the `contenthash` updates to point at the new CID. Old `contenthash` references can be retained for rollback or audit, depending on how the operator manages the registration."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-name-mechanism", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/name-mechanism/#layer-4-delivery-ipfs-gateway-or-bulletin-peer-to-peer", "page_title": "The .dot Name Mechanism", "index": 4, "depth": 2, "title": "Layer 4: Delivery (IPFS Gateway or Bulletin Peer-to-Peer)", "anchor": "layer-4-delivery-ipfs-gateway-or-bulletin-peer-to-peer", "start_char": 3106, "end_char": 3897, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11ebfcf14394aa8ed57fc1d5014445135e3f70f1f6d558f6e630c465f893ddb3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Layer 4: Delivery (IPFS Gateway or Bulletin Peer-to-Peer)\n\nOnce a resolver has the CID, the bytes still need to actually be fetched and handed to the Host. Two delivery paths:\n\n- **IPFS gateway**: The CID is a standard IPFS reference; any IPFS gateway can serve it. Hosts can use a gateway integration for the fetch.\n- **Bulletin Chain peer-to-peer**: For Bulletin CIDs, the chain's collator network serves the bytes peer-to-peer without going through a centralized gateway. This is the Polkadot-native path.\n\nBoth paths produce the same bytes, because both are addressing the same content by the same hash. A Host can fall back from one to the other if one path fails, or prefer one for policy reasons (e.g. always Bulletin peer-to-peer when available, to avoid a third-party gateway)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-name-mechanism", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/name-mechanism/#end-to-end-resolution", "page_title": "The .dot Name Mechanism", "index": 5, "depth": 2, "title": "End-to-End Resolution", "anchor": "end-to-end-resolution", "start_char": 3897, "end_char": 4791, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11ebfcf14394aa8ed57fc1d5014445135e3f70f1f6d558f6e630c465f893ddb3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## End-to-End Resolution\n\nStitching the four layers together, a typical resolution looks like this:\n\n1. A user navigates to `myproduct.dot` in a Host (Polkadot Web at `dot.li`, or Polkadot Desktop's address bar).\n2. The Host computes the `namehash` of `myproduct.dot`.\n3. The Host reads the contract record for that `namehash` from Polkadot Hub and extracts the `contenthash`.\n4. The Host decodes the `contenthash` into a CID.\n5. The Host fetches the bytes for the CID via the configured delivery path.\n6. The Host validates the bytes against the CID (content-addressed verification) and loads them into the sandbox.\n\nA failure at any layer surfaces as a specific shield-state transition in the Host UI (see [Shield States](/reference/apps/hosts/polkadot-web/shield-states/)) — for example, a stale-cache CID that no longer matches the current `contenthash` will show as an out-of-sync state."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-name-mechanism", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/name-mechanism/#where-to-go-next", "page_title": "The .dot Name Mechanism", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4791, "end_char": 5601, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11ebfcf14394aa8ed57fc1d5014445135e3f70f1f6d558f6e630c465f893ddb3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Architecture**\n\n    ---\n\n    The contract architecture on Polkadot Hub that backs the registry layer above.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/architecture/)\n\n- <span class=\"badge learn\">Learn</span> **PopRules and Pricing**\n\n    ---\n\n    Who can register what name, and at what cost, before the resolution flow above ever runs.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/poprules-pricing/)\n\n- <span class=\"badge guide\">Guide</span> **Register and Publish**\n\n    ---\n\n    The Product-side how-to for creating a name record and attaching a `contenthash`.\n\n    [:octicons-arrow-right-24: Get Started](/apps/deploy-your-app/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-poprules-pricing", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/poprules-pricing/#introduction", "page_title": "PopRules and dotNS Pricing", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 737, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfcae61500de0ac4281a10b7c4dc5f4d38edee11a00918b75b8264a562ea80f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`PopRules` decides which length band a `.dot` name falls in, and with it who may register the name. Proof of Personhood (PoP) gates the shorter bands. It does not change the amount charged.\n\nThe amount comes from a separate cost model registered in the protocol registry. The deployed model charges one refundable deposit for every name it admits, whatever its length; the deposit is not a purchase price. The amount is fixed in the model contract rather than held as a settable value, so it changes only by registering a different model.\n\nThis page documents the bands, the two PoP tiers `PopRules` recognizes, and how device and personhood names differ from a name bought on the public path."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-poprules-pricing", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/poprules-pricing/#the-three-registration-paths", "page_title": "PopRules and dotNS Pricing", "index": 1, "depth": 2, "title": "The Three Registration Paths", "anchor": "the-three-registration-paths", "start_char": 737, "end_char": 1647, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfcae61500de0ac4281a10b7c4dc5f4d38edee11a00918b75b8264a562ea80f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Three Registration Paths\n\nA name reaches an owner by one of three routes, and most of the rules on this page apply to only one of them:\n\n- **The public path**: The commit-reveal route the CLI and the deploy flow use. It charges the deposit, applies the length bands, rejects any label carrying a separator, and refuses a label shorter than three characters.\n- **The personhood gateway**: The route that issues device and personhood names. It charges no deposit and refuses a stem of five characters or fewer. Gateway names cannot be transferred; see [Name Transfers](/reference/apps/infrastructure/dotns/transfer/).\n- **The reserved path**: The governance route that puts names of five characters or fewer into circulation. It mints an available label at no cost and skips the personhood check. It requires a governance-issued grant naming the label and the intended owner, or a Substrate Root origin."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-poprules-pricing", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/poprules-pricing/#the-two-proof-tiers", "page_title": "PopRules and dotNS Pricing", "index": 2, "depth": 2, "title": "The Two Proof Tiers", "anchor": "the-two-proof-tiers", "start_char": 1647, "end_char": 2478, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfcae61500de0ac4281a10b7c4dc5f4d38edee11a00918b75b8264a562ea80f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Two Proof Tiers\n\n`PopRules` recognizes two proof tiers, registered separately on the People Chain:\n\n- **Personhood**: Proven personhood. The user completes the biometric verification flow in the Polkadot App and their key joins the membership ring on the People Chain.\n- **Devicehood**: Attested proof of a unique device, registered on a separate ring with a governance-bounded supply.\n\n[Proof of Personhood in the Polkadot App](/reference/apps/hosts/polkadot-app/pop/) documents both mechanisms, where they are called PoP Full and PoP Lite.\n\n`PopRules` reads an account's tier from the personhood precompile on Polkadot Hub. It passes a dotNS-scoped context, so a person gets one stable identifier for dotNS that other applications cannot correlate. No tier is self-declared, and no contract holds a user-settable status."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-poprules-pricing", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/poprules-pricing/#length-bands-on-the-public-path", "page_title": "PopRules and dotNS Pricing", "index": 3, "depth": 2, "title": "Length Bands on the Public Path", "anchor": "length-bands-on-the-public-path", "start_char": 2478, "end_char": 4764, "estimated_token_count": 543, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfcae61500de0ac4281a10b7c4dc5f4d38edee11a00918b75b8264a562ea80f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Length Bands on the Public Path\n\nA name's band comes from its length, counted as written. Digits count like any other character, so `web3` is four characters and `hamilton01` is 10.\n\n| Length     | Who may register                                         | Deposit                 |\n|:-----------|:---------------------------------------------------------|:------------------------|\n| 5 or fewer | Nobody on the public path                                | Not sold                |\n| 6 to 8     | Closed by default; when open, an account with personhood | One deposit, refundable |\n| 9 or more  | Anyone                                                   | One deposit, refundable |\n\nThe six-to-eight band is closed on the public path by default. `PopRules` admits it only while `shortNamesEnabled` is set, and only a Root origin can set it: governance on MainNet, and the sudo pallet on TestNets. The switch is off on Paseo, so a public registration of six to eight characters fails with `Short names are not for sale`, whatever tier the account holds. The gateway and the reserved path do not consult the switch, so personhood and device names of that length are still issued.\n\nThe deposit is 10 units of the network's native token (10 PAS on Paseo), and it does not vary with the band. See [One Deployment per Network](/reference/apps/infrastructure/dotns/#one-deployment-per-network).\n\nOnly the public path charges it. A gateway-issued name carries no deposit, whatever its length, and holding personhood does not make a public registration free.\n\nDevicehood does not open the six-to-eight band, even while the switch is set. An ordinary label of that length requires personhood, because devicehood applies only to the dotted gateway shape. An account with devicehood can therefore be issued `joseph.42` but cannot register `joseph` or `joseph01` on the public path.\n\nTwo rules narrow the table:\n\n- **Names of five characters or fewer never reach the public path**: They enter circulation only through the reserved path.\n- **Nothing shorter than three characters reaches the public path or the gateway**: The public path rejects a shorter label outright. The gateway applies no length floor of its own, but a stem of five or fewer classifies as reserved, so it refuses one too."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-poprules-pricing", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/poprules-pricing/#device-and-personhood-names", "page_title": "PopRules and dotNS Pricing", "index": 4, "depth": 2, "title": "Device and Personhood Names", "anchor": "device-and-personhood-names", "start_char": 4764, "end_char": 5758, "estimated_token_count": 221, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfcae61500de0ac4281a10b7c4dc5f4d38edee11a00918b75b8264a562ea80f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Device and Personhood Names\n\nA gateway name is earned rather than bought, so it carries no deposit. Proving personhood earns a personhood name; proving a unique device (devicehood) earns a device name. The two shapes are distinct:\n\n- **Device name**: A stem of lowercase ASCII letters, one separator, then exactly two digits, as in `joseph.42`. The stem is the part the person chose; the gateway allocates the digits so people who chose the same stem get separate names. It is banded on the stem alone rather than on the whole name.\n- **Personhood name**: Lowercase ASCII letters only, as in `joseph`. No digits and no hyphens.\n\nNeither shape can be bought. A label with digits but no separator, like `joseph42`, is an ordinary public name.\n\nThe shape alone does not prove personhood: provenance is not written into the characters. A client reads it from `isPopIssued(label)` on the PoP controller; see [Name Mechanism and Resolution](/reference/apps/infrastructure/dotns/name-mechanism/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-poprules-pricing", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/poprules-pricing/#migrating-a-device-name-to-a-personhood-name", "page_title": "PopRules and dotNS Pricing", "index": 5, "depth": 2, "title": "Migrating a Device Name to a Personhood Name", "anchor": "migrating-a-device-name-to-a-personhood-name", "start_char": 5758, "end_char": 6772, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfcae61500de0ac4281a10b7c4dc5f4d38edee11a00918b75b8264a562ea80f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Migrating a Device Name to a Personhood Name\n\nA device-name issuance can reserve the matching stem for the same person to claim later as a personhood name, so that moving from devicehood to personhood does not cost them the name they are known by.\n\nThe reservation is not automatic on a public registration, which reserves no stem at all. It is attached by the gateway, which names the base label to reserve alongside the device name it is issuing. A holder of `joseph.42` can therefore have `joseph` held for them, and claim it once they prove personhood. Claiming it from the device name carries the device name's chat key over and records a public link between the two names, so anyone can see that `joseph` and `joseph.42` belong together.\n\nTwo clocks limit the reservation. `PopRules` holds the slot for at most 12 weeks, and the queue on the PoP controller applies its own duration, which governance can configure. Once either lapses, the stem becomes available again on whatever path its length allows."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-poprules-pricing", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/poprules-pricing/#where-to-go-next", "page_title": "PopRules and dotNS Pricing", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6772, "end_char": 7377, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfcae61500de0ac4281a10b7c4dc5f4d38edee11a00918b75b8264a562ea80f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Proof of Personhood**\n\n    ---\n\n    Where the `PopRules` contract reads the PoP tier from — the App-side mechanism that produces Full and Lite registrations.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/pop/)\n\n- <span class=\"badge guide\">Guide</span> **Register and Publish**\n\n    ---\n\n    The Product-side how-to that consumes the PopRules check: registering a `.dot` name and paying its deposit.\n\n    [:octicons-arrow-right-24: Get Started](/apps/deploy-your-app/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-testnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/testnet-contracts/#introduction", "page_title": "dotNS TestNet Contracts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 979, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:55d0d6186919c8a3baaf1fe0bdbf86b7bdbc211b768597c5cd7d9e3653de570f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Introduction\n\nThis page tracks the current TestNet contract addresses for the dotNS deployment on Paseo. A Product or tool that wants to interact with the registry directly on TestNet needs these addresses; the higher-level CLI and Polkadot Product SDK surfaces resolve them internally, but anyone integrating below those layers can look up what to call here.\n\n!!! note \"Resolve addresses rather than pinning them\"\n    The [CLI](/reference/apps/infrastructure/dotns/cli/) and the [Register and Publish](/apps/deploy-your-app/) flow resolve these addresses automatically, and most developers should rely on those rather than calling contracts directly. An integration that does call contracts should hold only the protocol registry address and resolve the rest from it.\n\n!!! note \"Products Devnet\"\n    This page uses Paseo Next v2 (`paseo` preset). For the PCF Products Devnet (`devnet` preset), see [Addresses & registries](/apps/reference/addresses/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-testnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/testnet-contracts/#contract-address-table", "page_title": "dotNS TestNet Contracts", "index": 1, "depth": 2, "title": "Contract Address Table", "anchor": "contract-address-table", "start_char": 979, "end_char": 4559, "estimated_token_count": 701, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:55d0d6186919c8a3baaf1fe0bdbf86b7bdbc211b768597c5cd7d9e3653de570f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Contract Address Table\n\n| Contract                   | Responsibility                                                                       | Paseo TestNet Address |\n|:---------------------------|:------------------------------------------------------------------------------------|:---------------------------------------------|\n| `DotnsProtocolRegistry`    | Keyed address book every other contract resolves its siblings through.               | `0xD19e3D0C97CF501125a04A97405e3e6592fa846E` |\n| `DotnsRegistry`            | Holds `(namehash → record)` mappings, subnodes, and resolver pointers.               | `0xf34054fd76BbF85f216cf9908226D5f0A72E50CA` |\n| `DotnsRegistrar`           | The ERC-721 for public and personhood names. A device name has no token.             | `0x4f06E818Ba3d987704fd91cf3d868E4b019106Ab` |\n| `DotnsRegistrarController` | The public commit-reveal registration path.                                          | `0xBdaA01bD1bA67d709F2b1fF286Da0d854977EA30` |\n| `DotnsPopController`       | The personhood gateway path, and the `isPopIssued` provenance record.                | `0xCC932348606cc1f3318cADeC5A5Cd2CA447f8a4b` |\n| `DotnsPopLens`             | Listing surface for a person's names, gated on `isPopIssued`.                        | `0x309C5ff21f9082A53211500c6f33cA2a21024Ae4` |\n| `PopRules`                 | Classification and eligibility: which band a label falls in and who may register it. | `0x747B456bE03aec0b42bd85C51513730FBD45DA31` |\n| `DotnsCostModelRegistry`   | Names the cost model in force; that model is where the deposit amount lives.         | `0x8bfd1f0957e73716732e725802f13830B5682da4` |\n| `DotnsFlatPricing`         | The registered model itself: one deposit for every band.                             | `0xD839B281dF72Df44fF275305E72cAEEc0fDAA648` |\n| `DotnsNameEscrow`          | Holds deposits and runs the release, redeem, withdraw, and reclaim lifecycle.        | `0x4881Afb78e7C908cAe818168B926229D93376520` |\n| `DotnsNameWhitelist`       | Per-name grants for reserved registration.                                           | `0x420166cD67Ca0233094E492a4BbA67045eD7C38C` |\n| `DotnsContentResolver`     | The `contenthash` record a Product resolves through.                                 | `0x7F74D7CD50f5a834270E2ad395a01b01891AB37d` |\n| `StoreFactory`             | Deploys the per-user label store that maps a node back to its text.                  | `0x99605a926FcB40aB520F659c6505E5ff862771f6` |\n\nThese addresses come from the `paseo-assethub` deployment, on chain ID `420420417`, which runs dotNS `1.0.0`. TestNets are upgraded in place from one release to the next. Upgradeable contracts keep their addresses across an upgrade, but a contract that cannot be upgraded in place is redeployed at a new address when a release changes it. This is why TestNet addresses can differ from the `deployments.json` asset published with each [dotNS release](https://github.com/paritytech/dotns/releases), which records the addresses at release time. The protocol registry is the authoritative source: `get(key)` returns the address each key points at now.\n\nOnly `DotnsProtocolRegistry` needs to be configured by hand. Every other address is resolved from it at call time, so an integration that holds the registry address can find the rest without pinning them.\n\nAddresses are derived from a CREATE3 factory and a fixed salt namespace, so redeploying to the same network reproduces them. An unchanged address is not evidence of an unchanged interface: regenerate the ABIs you build against on every release."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-testnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/testnet-contracts/#how-to-use-these-addresses", "page_title": "dotNS TestNet Contracts", "index": 2, "depth": 2, "title": "How to Use These Addresses", "anchor": "how-to-use-these-addresses", "start_char": 4559, "end_char": 5344, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:55d0d6186919c8a3baaf1fe0bdbf86b7bdbc211b768597c5cd7d9e3653de570f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## How to Use These Addresses\n\nFor Products that need to read name resolution data directly (most don't: the chain client surface and the resolution code in each Host handle this), point your typed chain client at `DotnsContentResolver` using the standard PAPI descriptor for Polkadot Hub, resolving its address from `DotnsProtocolRegistry` rather than pinning it. The query is a standard contract call; the resolver returns the record fields you read against.\n\nFor tools or batch jobs that need to mutate state (a CI pipeline registering a name on every release, for example), use the [`@parity/dotns-cli`](/reference/apps/infrastructure/dotns/cli/) instead of building contract calls by hand. The CLI handles the encoding, the PopRules pre-check, and the signing path consistently."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-testnet-contracts", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/testnet-contracts/#where-to-go-next", "page_title": "dotNS TestNet Contracts", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5344, "end_char": 5874, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:55d0d6186919c8a3baaf1fe0bdbf86b7bdbc211b768597c5cd7d9e3653de570f", "last_updated": "2026-11-11T12:33:14+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **CLI**\n\n    ---\n\n    The command-line surface that targets these contracts automatically.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/cli/)\n\n- <span class=\"badge learn\">Learn</span> **Architecture**\n\n    ---\n\n    What each contract in the table above is responsible for and how they cooperate.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/architecture/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-transfer", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/transfer/#introduction", "page_title": "Name Transfers", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 1291, "estimated_token_count": 267, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8de699d0bef1ebd0e3f7e606d0d5ba44172b3f8942d5cbd30f84d9b84331b2f2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA `.dot` name is owned by an account on Polkadot Hub. A transfer changes _who controls the name's record_: who can update where it points (its `contenthash`), sell it on, or set administrative fields. The name itself and what it resolves to stay the same.\n\nNot every name can move. dotNS hands out names by two routes, the paid public path and the personhood gateway (see [PopRules and Pricing](/reference/apps/infrastructure/dotns/poprules-pricing/)). A name registered on the public path is transferable. A gateway-issued name is permanently non-transferable: it identifies the person or device that earned it, and it stays with them. Read `isSoulbound(tokenId)` on the registrar before offering a transfer; a device name has no `tokenId`, so for a dotted shape ask `isPopIssued(label)` on the PoP controller instead.\n\nThis page documents the conceptual transfer flow and the rules dotNS enforces on it.\n\n!!! warning \"Provisional\"\n    The exact dispatch path for a name transfer (which contract call, the precise parameter shape) and the acceptance or rejection mechanics on the receiving side are still being finalized. This page documents the conceptual model and the rules the contracts enforce; the per-call reference will be added once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-transfer", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/transfer/#what-changes-on-transfer", "page_title": "Name Transfers", "index": 1, "depth": 2, "title": "What Changes on Transfer", "anchor": "what-changes-on-transfer", "start_char": 1291, "end_char": 2287, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8de699d0bef1ebd0e3f7e606d0d5ba44172b3f8942d5cbd30f84d9b84331b2f2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Changes on Transfer\n\nA transfer modifies one field of the name's record: the _owner_. Specifically:\n\n- The new owner becomes the account that can sign updates to the name's record (changing the `contenthash`, transferring again, setting fields).\n- The name itself — the dotted string the user sees — does not change.\n- The attached `contenthash` does not change. Users navigating to the name continue to see the same Product bundle they saw before, unless and until the new owner updates it.\n- The PoP tier the original owner used to qualify for the name does _not_ transfer with the name. The new owner inherits the name regardless of their own PoP tier, and any later `PopRules`-evaluated operation is checked against the new owner's status.\n- The deposit follows the name rather than the account that paid it. The escrow rebinds the refund recipient to the new holder, and nothing is refunded at transfer time. See [Escrow and Deposits](/reference/apps/infrastructure/dotns/escrow/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-transfer", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/transfer/#the-transfer-fee", "page_title": "Name Transfers", "index": 2, "depth": 2, "title": "The Transfer Fee", "anchor": "the-transfer-fee", "start_char": 2287, "end_char": 3590, "estimated_token_count": 265, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8de699d0bef1ebd0e3f7e606d0d5ba44172b3f8942d5cbd30f84d9b84331b2f2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Transfer Fee\n\nMost transfers are free. A charge applies only when one of two independent conditions holds, and it is assessed against the name itself rather than against what the sender paid:\n\n- **The recipient cannot clear the name's band**: Moving a name from a band the recipient could not have registered in, such as a six-character name going to an account without personhood.\n- **The move is a personhood downgrade**: If the recipient holds a lower tier than the sender, the charge applies even when both could have registered a name of that length. Passing a nine-character name from an account with personhood to one with only devicehood is charged for this reason alone.\n\nThe fee is the name's own price under the registered cost model; the two conditions never add up. Because the deployed model charges one amount for every band, that is the same figure a fresh registration pays. Two moves are always exempt: a transfer to the same address, and any transfer into or out of escrow. The escrow exemption is why releasing and reclaiming a name costs nothing beyond gas.\n\nThe registrar quotes the amount through `quoteTransferFee(tokenId, to)`. Quote it before submitting: the same call reverts for a soulbound name, which is the cheapest way to learn that a tokenised name cannot move."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-transfer", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/transfer/#reservations-do-not-transfer", "page_title": "Name Transfers", "index": 3, "depth": 2, "title": "Reservations Do Not Transfer", "anchor": "reservations-do-not-transfer", "start_char": 3590, "end_char": 4012, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8de699d0bef1ebd0e3f7e606d0d5ba44172b3f8942d5cbd30f84d9b84331b2f2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Reservations Do Not Transfer\n\nA stem reserved for a device-name holder to claim later as a personhood name is tied to the _account_ the gateway named, not to the name's record. Reservations cannot be transferred on their own. The account the gateway named either claims the stem or lets the reservation lapse.\n\nA device name cannot be transferred at all, so the reservation question never arises from the name itself."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-transfer", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/transfer/#what-a-product-should-know", "page_title": "Name Transfers", "index": 4, "depth": 2, "title": "What a Product Should Know", "anchor": "what-a-product-should-know", "start_char": 4012, "end_char": 4816, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8de699d0bef1ebd0e3f7e606d0d5ba44172b3f8942d5cbd30f84d9b84331b2f2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Product Should Know\n\nA Product reading a name's record from chain state should treat the owner field as _mutable_. A name pointing at the Product today may be transferred to a new owner tomorrow; the new owner may update the `contenthash` to a different Product. Products that depend on a specific name (linking to it, referencing it from on-chain state) should verify the `contenthash` at use, not cache the assumption that \"name X points at this Product forever.\"\n\nA bare ERC-721 `transferFrom` does not route through the registry, so a name bought outside the registration path arrives still pointing at the seller's resolver. Registration and reclaim from escrow both reset that pointer; a private sale does not. Overwrite the records you care about rather than assuming they start clean."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-dotns-transfer", "url": "https://developer.polkadot.com/reference/apps/infrastructure/dotns/transfer/#where-to-go-next", "page_title": "Name Transfers", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4816, "end_char": 5444, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8de699d0bef1ebd0e3f7e606d0d5ba44172b3f8942d5cbd30f84d9b84331b2f2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Name Mechanism**\n\n    ---\n\n    The resolution flow that turns a name into bytes — what a Host actually does between the user typing a `.dot` and a Product loading.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/name-mechanism/)\n\n- <span class=\"badge learn\">Learn</span> **Architecture**\n\n    ---\n\n    The contract responsibilities split, including which contract handles the transfer dispatch.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/dotns/architecture/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-how-it-works", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/how-it-works/#introduction", "page_title": "How HOP Works", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 882, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:915ea9540bf846a640aaa29e61b20efdf60c558c9fd87b935b6de14698b80101", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA HOP transfer is built from a sequence of single-chain hops, each one taking the transfer one step closer to its destination. The protocol's job is to make a sequence of single-chain hops behave like a single coherent operation — atomic enough for the sender to reason about, with proofs that the intermediate state was correctly cleared as the transfer moved through.\n\nThis page documents the conceptual model: what a hop is, how multi-hop routing is constructed, and how the verifier model works at a high level.\n\n!!! warning \"Provisional\"\n    The exact wire format of a HOP message, the runtime extrinsics that initiate and consume hops, the verifier interface, and the per-chain integration surface are still being finalized. This page covers the conceptual model only; the protocol-level reference will be added once the surface stabilizes."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-how-it-works", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/how-it-works/#what-a-single-hop-is", "page_title": "How HOP Works", "index": 1, "depth": 2, "title": "What a Single Hop Is", "anchor": "what-a-single-hop-is", "start_char": 882, "end_char": 1527, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:915ea9540bf846a640aaa29e61b20efdf60c558c9fd87b935b6de14698b80101", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Single Hop Is\n\nA single hop moves a transfer from one chain to one adjacent chain. The hop carries:\n\n- **The payload**: The asset and amount, or the message being moved.\n- **A proof**: Evidence that the source chain has authorized the hop (typically a signed XCM-style message from the source chain's account holding the funds).\n- **Routing information**: Where the hop should land next, plus any constraints or fees the next hop should respect.\n\nThe receiving chain on the other side of a hop validates the proof, accepts the payload, and either holds the funds locally (if it is the destination) or constructs the next hop forward."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-how-it-works", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/how-it-works/#how-multi-hop-routing-is-constructed", "page_title": "How HOP Works", "index": 2, "depth": 2, "title": "How Multi-Hop Routing Is Constructed", "anchor": "how-multi-hop-routing-is-constructed", "start_char": 1527, "end_char": 2227, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:915ea9540bf846a640aaa29e61b20efdf60c558c9fd87b935b6de14698b80101", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Multi-Hop Routing Is Constructed\n\nA multi-hop transfer is a chain of single hops — chain A → chain B → chain C, for example, where A is the sender's chain, C is the destination, and B is an intermediate routing chain.\n\nThe routing can be:\n\n- **Sender-specified**: The sender constructs the full hop sequence at dispatch time and signs the whole thing.\n- **Router-determined**: The sender specifies only the destination, and intermediate chains determine the next-hop routing dynamically.\n\nIn both modes, each hop carries enough proof for the receiving chain to validate the previous hop independently, so the chain doesn't need to trust the routing chain's word about what happened upstream."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-how-it-works", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/how-it-works/#the-verifier-model", "page_title": "How HOP Works", "index": 3, "depth": 2, "title": "The Verifier Model", "anchor": "the-verifier-model", "start_char": 2227, "end_char": 2968, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:915ea9540bf846a640aaa29e61b20efdf60c558c9fd87b935b6de14698b80101", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Verifier Model\n\nThe verifier is the component that checks the cryptographic correctness of each incoming hop. It receives the payload, the proof, and the routing context, and produces either an \"accept\" or \"reject\" outcome. The chain's HOP integration calls into the verifier for every incoming hop; only accepted hops modify chain state.\n\nThe verifier abstracts the cryptography from the chain's HOP integration, so different verifier implementations can plug in without rewriting the per-chain integration code. The current `NoopVerifier` is a development stand-in that always accepts — useful for testing the protocol flow without the cryptographic overhead, but not suitable for production. A production verifier is forthcoming."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-how-it-works", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/how-it-works/#what-a-product-sees", "page_title": "How HOP Works", "index": 4, "depth": 2, "title": "What a Product Sees", "anchor": "what-a-product-sees", "start_char": 2968, "end_char": 3461, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:915ea9540bf846a640aaa29e61b20efdf60c558c9fd87b935b6de14698b80101", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Product Sees\n\nA Product dispatching a HOP transfer through a higher-level surface (Coinage, or a future payment-routing primitive that uses HOP underneath) sees a single `signAndSubmit`-style call that resolves when the transfer completes — or fails — at the destination. The multi-hop machinery underneath is not directly exposed to the Product code; it is the chain's HOP integration that orchestrates the hops, and the Product's UI shows the result the destination reports back."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-how-it-works", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/how-it-works/#where-to-go-next", "page_title": "How HOP Works", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3461, "end_char": 4034, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:915ea9540bf846a640aaa29e61b20efdf60c558c9fd87b935b6de14698b80101", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Sender Journey**\n\n    ---\n\n    What a participant sending a HOP transfer sees — dispatch, tracking, and finalization on the destination.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/sender/)\n\n- <span class=\"badge learn\">Learn</span> **Recipient Journey**\n\n    ---\n\n    What a participant receiving a HOP transfer sees on the destination chain.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/recipient/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/#introduction", "page_title": "HOP Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 8, "end_char": 1528, "estimated_token_count": 303, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:abe11daff7929b228d417d0fac5c1c33bfad82bf2479090450deebbbb24c5e89", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nHOP is Polkadot's cross-chain hop protocol — a mechanism for moving assets and messages between chains in the Polkadot ecosystem with more flexibility than a plain XCM transfer. The use case is *\"hop a transfer through one or more intermediate chains to reach its destination,\"* with HOP handling the per-hop routing, proofs, and cleanup of intermediate state.\n\nFor most Product developers, HOP is not something you will reach for in day-one flows. The standard payment patterns — `Balances.transfer_keep_alive` for merchant flows, [Coinage](/reference/apps/infrastructure/pop/pallet-coinage/) for personhood-aware payments — cover the common cases without needing HOP. HOP becomes relevant when a Product crosses chain boundaries in a way standard XCM does not cleanly handle.\n\n!!! warning \"Current state caveats\"\n    HOP is being actively built and three caveats apply to integrations against the current code:\n\n    - **`NoopVerifier` is not production-ready**: The current verifier implementation is a development stand-in. Production-grade verification is forthcoming.\n    - **The repository README is out of date**: Where the README and this reference disagree, this reference reflects the intended direction; the README will be updated separately.\n    - **`pallet-hop-promotion` status is evolving**: The promotion pallet that pairs with HOP for certain flows is in flux; integrations should not depend on its current shape.\n\n    These notes will be removed from this page as each item resolves."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/#where-hop-fits", "page_title": "HOP Reference", "index": 1, "depth": 2, "title": "Where HOP Fits", "anchor": "where-hop-fits", "start_char": 1528, "end_char": 2336, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:abe11daff7929b228d417d0fac5c1c33bfad82bf2479090450deebbbb24c5e89", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where HOP Fits\n\nThree places HOP shows up in a Product context:\n\n- **As a building block under cross-chain payments**: Coinage and other payment flows can route through HOP underneath when the sender and recipient are on different chains. The Product surface (Coinage, `Balances.transfer_keep_alive`) is what a Product calls; HOP is the layer beneath that makes the cross-chain part work.\n- **As a primitive for cross-chain messaging beyond payments**: Moving non-asset payloads (state references, capability handles) across chain boundaries in flows that need more flexibility than plain XCM.\n- **As a target for node-operator and runtime-developer work**: Running a HOP-enabled node, integrating HOP into a new Substrate chain. These node-operator and SDK-integration paths are forthcoming separately."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/#where-to-go-next", "page_title": "HOP Reference", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2336, "end_char": 3178, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:abe11daff7929b228d417d0fac5c1c33bfad82bf2479090450deebbbb24c5e89", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **How It Works**\n\n    ---\n\n    The conceptual protocol — what a \"hop\" is, how multi-hop routing is constructed, and the verifier model.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/how-it-works/)\n\n- <span class=\"badge learn\">Learn</span> **Sender Journey**\n\n    ---\n\n    The sender side of a HOP transfer: building, dispatching, and tracking a multi-hop send.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/sender/)\n\n- <span class=\"badge learn\">Learn</span> **Recipient Journey**\n\n    ---\n\n    The recipient side: receiving a HOP transfer that landed on a chain via one or more hops.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/recipient/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-recipient", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/recipient/#introduction", "page_title": "HOP Recipient Journey", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 857, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dd9b9e3a0447d103be782bdb0699dae11d20221da4ec3b3f9f3338daa9bebfd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis page documents the recipient side of a HOP transfer: what a participant or chain receiving the final hop sees, how the destination chain validates the incoming proof, and what settles when the validation passes.\n\nFor the protocol mechanics underneath, see [How It Works](/reference/apps/infrastructure/hop/how-it-works/). For the sender's view, see [Sender Journey](/reference/apps/infrastructure/hop/sender/).\n\n!!! warning \"Provisional\"\n    The exact recipient-side event surface (what events the destination emits when a HOP transfer lands, the subscription primitive for those events, the state-change semantics), and any accept-or-decline mechanics on the recipient's side are still being finalized. This page documents the conceptual flow; the per-event reference will be added once the surface stabilizes."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-recipient", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/recipient/#the-flow-at-a-glance", "page_title": "HOP Recipient Journey", "index": 1, "depth": 2, "title": "The Flow at a Glance", "anchor": "the-flow-at-a-glance", "start_char": 857, "end_char": 1862, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dd9b9e3a0447d103be782bdb0699dae11d20221da4ec3b3f9f3338daa9bebfd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Flow at a Glance\n\nFrom the recipient's perspective:\n\n1. **An incoming hop lands**: The destination chain receives the final hop with its payload and proof.\n2. **The verifier validates**: The chain's HOP integration calls the configured verifier; only an accepted proof proceeds to settlement.\n3. **State settles**: The destination chain applies the payload's effect — crediting the recipient's account for an asset transfer, recording the message for a message-passing flow, or whatever the payload prescribed.\n4. **The destination emits a finalization event**: The event is what tells the sender (and the recipient's UI, if any) that the transfer completed.\n\nImportantly, the recipient does _not_ typically have to explicitly accept the transfer — settlement happens automatically when the verifier accepts. Where two-sided acceptance is needed (a Coinage-style flow where the recipient can decline), that semantics is layered on top of HOP by the higher-level pallet, not built into HOP itself."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-recipient", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/recipient/#what-the-recipients-product-sees", "page_title": "HOP Recipient Journey", "index": 2, "depth": 2, "title": "What the Recipient's Product Sees", "anchor": "what-the-recipients-product-sees", "start_char": 1862, "end_char": 2439, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dd9b9e3a0447d103be782bdb0699dae11d20221da4ec3b3f9f3338daa9bebfd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the Recipient's Product Sees\n\nIf the recipient is a user of a Polkadot Product, the Product subscribes to the relevant chain state on the destination chain. When the HOP transfer settles:\n\n- The user's balance (or other state) updates as the destination chain's storage changes.\n- The Product UI surfaces the change to the user — typically as an arrived transfer or an updated state value.\n\nFor asynchronous receive flows, the Product builds against the destination chain's chain-client surface — see [Read Chain State](/apps/build/read-chain-state/) for the pattern."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-recipient", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/recipient/#where-to-go-next", "page_title": "HOP Recipient Journey", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2439, "end_char": 3051, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3dd9b9e3a0447d103be782bdb0699dae11d20221da4ec3b3f9f3338daa9bebfd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **How It Works**\n\n    ---\n\n    The protocol mechanics — single hops, multi-hop routing, the verifier model that gates settlement.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/how-it-works/)\n\n- <span class=\"badge guide\">Guide</span> **Read Chain State**\n\n    ---\n\n    The Product-side how-to for subscribing to chain state — the surface a recipient's Product uses to observe HOP-driven state changes.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/read-chain-state/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-sender", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/sender/#introduction", "page_title": "HOP Sender Journey", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 742, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:461e63f4c647de669070895176e57fa79b02624684a6750732fd6539921c354a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis page documents the sender side of a HOP transfer: what a participant who initiates the send does, what they see as it routes, and how they observe whether it landed.\n\nFor the protocol mechanics underneath, see [How It Works](/reference/apps/infrastructure/hop/how-it-works/). For the recipient's view, see [Recipient Journey](/reference/apps/infrastructure/hop/recipient/).\n\n!!! warning \"Provisional\"\n    The exact sender-side dispatch extrinsics, the tracking surface (events emitted at each hop, subscribable status), and the finalization signal a sender observes are still being finalized. This page documents the conceptual flow; the per-call reference will be added once the surface stabilizes."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-sender", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/sender/#the-flow-at-a-glance", "page_title": "HOP Sender Journey", "index": 1, "depth": 2, "title": "The Flow at a Glance", "anchor": "the-flow-at-a-glance", "start_char": 742, "end_char": 1653, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:461e63f4c647de669070895176e57fa79b02624684a6750732fd6539921c354a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Flow at a Glance\n\nFrom the sender's perspective:\n\n1. **Build the hop sequence**: Either specify the full route (sender-specified routing) or specify only the destination and let routing chains determine the intermediate hops dynamically.\n2. **Sign and dispatch**: A single signed transaction on the sender's chain initiates the send. The signing uses the standard mediated-signing flow — the user approves on the paired App per the usual model.\n3. **Watch the hops progress**: Each hop emits an event on the chain it landed on; the sender's UI (or backend, if the sender is a service) can subscribe to those events to track progress.\n4. **Observe finalization**: When the transfer lands on the destination chain, the destination emits a finalization event. The sender's flow can resolve at that point — typically by updating UI, posting a confirmation, or triggering the next step in a larger workflow."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-sender", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/sender/#what-can-go-wrong", "page_title": "HOP Sender Journey", "index": 2, "depth": 2, "title": "What Can Go Wrong", "anchor": "what-can-go-wrong", "start_char": 1653, "end_char": 2390, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:461e63f4c647de669070895176e57fa79b02624684a6750732fd6539921c354a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Can Go Wrong\n\nThe two common failure modes a sender's UI should handle:\n\n- **Mid-route rejection**: A hop fails verification on an intermediate or destination chain (the verifier rejects the proof, the receiving chain refuses for policy reasons, fees are insufficient). The funds typically remain reclaimable on the chain where the failure occurred; the sender's UI should make recovery visible.\n- **Timeout / loss of tracking**: A hop succeeds but the sender's monitoring loses visibility (the sender's node was offline during the relevant events). The funds are still where the chain says they are; the sender's UI should recover by reading the destination's state directly rather than assuming the worst from missing events."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-hop-sender", "url": "https://developer.polkadot.com/reference/apps/infrastructure/hop/sender/#where-to-go-next", "page_title": "HOP Sender Journey", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2390, "end_char": 2928, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:461e63f4c647de669070895176e57fa79b02624684a6750732fd6539921c354a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **How It Works**\n\n    ---\n\n    The protocol mechanics underneath the sender flow — single hops, multi-hop routing, the verifier model.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/how-it-works/)\n\n- <span class=\"badge learn\">Learn</span> **Recipient Journey**\n\n    ---\n\n    The receiving side of a HOP transfer.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/hop/recipient/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/#introduction", "page_title": "Proof of Personhood Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 24, "end_char": 1398, "estimated_token_count": 293, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1864632543a453779a91f62e30e03987e5eab1ea83cd87e2909581caf8f80cf3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nProof of Personhood (PoP) is Polkadot's privacy-preserving way to confirm a user is a real human, without exposing _which_ human. A user completes PoP once (in the [Polkadot App](/reference/apps/hosts/polkadot-app/)); from then on, a single proof unlocks personhood-gated features — the TestNet faucet, short `.dot` names, alias-gated checks inside a Polkadot Product, and on-chain payments routed through personhood-aware pallets.\n\nFor a Product developer, PoP shows up in two places:\n\n- **As a primitive your Product calls into**: Through the Product SDK your Product requests an alias for the current user, has the user prove control of that alias against a challenge, and gates features on the result. The Polkadot App is where the proving happens; your Product never sees the underlying biometric or the user's identity record.\n- **As a runtime origin your Product dispatches under**: Polkadot's PoP pallets accept calls under the `under_alias` origin, so your Product can submit on-chain operations that resolve to the user's alias inside the called pallet — pallet state stays unlinkable to the underlying account.\n\nThis reference is organized into two halves: the mechanism (Ring-VRF, aliases, the unlinkability property, how `under_alias` works) on its own page, and per-pallet reference for the pallets a Product is most likely to dispatch into."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/#the-mechanism", "page_title": "Proof of Personhood Reference", "index": 1, "depth": 2, "title": "The Mechanism", "anchor": "the-mechanism", "start_char": 1398, "end_char": 1688, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1864632543a453779a91f62e30e03987e5eab1ea83cd87e2909581caf8f80cf3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Mechanism\n\n[Ring-VRF and Aliases](/reference/apps/infrastructure/pop/ring-vrf-and-aliases/) is the conceptual deep dive: how the PoP cryptography produces unlinkable per-Product aliases, what `under_alias` is at the runtime layer, and the privacy property the whole stack delivers."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/#the-pallets", "page_title": "Proof of Personhood Reference", "index": 2, "depth": 2, "title": "The Pallets", "anchor": "the-pallets", "start_char": 1688, "end_char": 3409, "estimated_token_count": 464, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1864632543a453779a91f62e30e03987e5eab1ea83cd87e2909581caf8f80cf3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Pallets\n\n| Pallet                                                                   | What It Covers                                                                                                                        |\n|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|\n| [`pallet-people`](/reference/apps/infrastructure/pop/pallet-people/)     | Personhood registration, alias-issuing, and the `under_alias` runtime origin. The foundational pallet the rest of the set depends on. |\n| [`pallet-game`](/reference/apps/infrastructure/pop/pallet-game/)         | Personhood-gated on-chain games and randomized selection flows.                                                                       |\n| [`pallet-score`](/reference/apps/infrastructure/pop/pallet-score/)       | Personhood-anchored reputation and scoring primitives.                                                                                |\n| [`pallet-identity`](/reference/apps/infrastructure/pop/pallet-identity/) | The identity record on People Chain associated with a PoP account.                                                                    |\n| [`pallet-ubc`](/reference/apps/infrastructure/pop/pallet-ubc/)           | Universal Basic Capacity — the per-person on-chain capacity primitives.                                                               |\n| [`pallet-coinage`](/reference/apps/infrastructure/pop/pallet-coinage/)   | The personhood-aware peer-to-peer payment surface behind the App's Coinage feature.                                                   |"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/#where-to-go-next", "page_title": "Proof of Personhood Reference", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3409, "end_char": 4094, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1864632543a453779a91f62e30e03987e5eab1ea83cd87e2909581caf8f80cf3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Ring-VRF and Aliases**\n\n    ---\n\n    The cryptographic and runtime mechanism — how PoP produces unlinkable per-Product aliases, what `under_alias` is, and the privacy property the whole stack delivers.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/ring-vrf-and-aliases/)\n\n- <span class=\"badge learn\">Learn</span> **pallet-people**\n\n    ---\n\n    The foundational pallet of the PoP set — registration, alias-issuing, and the `under_alias` runtime origin.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/pallet-people/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-coinage", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-coinage/#introduction", "page_title": "pallet-coinage Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 1737, "estimated_token_count": 335, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5c68f6ce5e850c555daac81d984c7751e08b6ec8cb52892772b0fc561937178b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`pallet-coinage` is the on-chain pallet behind the [Polkadot App's Coinage feature](/reference/apps/hosts/polkadot-app/coinage/) — the peer-to-peer payment surface that lets a user send funds to another verified person, with privacy properties beyond what a standard `Balances.transfer_keep_alive` provides.\n\nTwo properties differentiate Coinage from a standard transfer at the pallet level:\n\n- **Personhood-aware addressing**: Sends can target a recipient identified by their personhood identity rather than by their account address; the pallet resolves the address from the personhood claim.\n- **Privacy-preserving by default**: Where appropriate, the pallet routes the transfer through alias / Ring-VRF surfaces so the on-chain trail does not directly link the sender's account to the recipient's account in the same way a public `Balances.transfer_keep_alive` does.\n\n!!! info \"Underlying asset: HOLLAR today, pUSD later\"\n    `pallet-coinage` is backed by a stablecoin on Asset Hub (configured via `UnderlyingAssetId`). Today that asset is HOLLAR; the system is designed to migrate to pUSD when pUSD lands. The pallet itself works today against HOLLAR — the underlying asset is loaded into recyclers via `load_recycler_with_external_asset` and unloaded via the corresponding `unload_recycler_into_external_asset` variants. The dispatch surface stays the same across the HOLLAR → pUSD transition.\n\n!!! warning \"Provisional\"\n    The complete enumeration of the `pallet-coinage` dispatch surface (every extrinsic, parameter shape, event, and error) is still being finalized. This page documents the conceptual model and the operation families; per-extrinsic specifics will be added once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-coinage", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-coinage/#conceptual-surface", "page_title": "pallet-coinage Reference", "index": 1, "depth": 2, "title": "Conceptual Surface", "anchor": "conceptual-surface", "start_char": 1737, "end_char": 3027, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5c68f6ce5e850c555daac81d984c7751e08b6ec8cb52892772b0fc561937178b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Surface\n\nThe pallet's operations cluster into four families:\n\n- **Transfer**: A two-step \"pull\" mechanic. The sender shares the private key of the coin(s) being sent over an off-chain channel (typically the Polkadot App's encrypted chat). The receiver derives a fresh key from their own mnemonic and calls `transfer(to)` to move each coin to that new key. The coin's age increments by 1. Transfer is always free.\n- **Split**: A user splits one coin into any combination of smaller coins whose values sum to the original. All output coins inherit `originalAge + 1`. Split is always free.\n- **Recycle (load / unload)**: The privacy core. A user loads a coin (or equivalent stablecoin) into a recycler ring, waits for other entries to join, then unloads with a Ring-VRF proof — minting a fresh coin or withdrawing the backing stablecoin, with no on-chain link to the deposit. Loading is free; unloading is the only charged operation in the system.\n- **Onboard / offboard**: Conversion between coins and the backing stablecoin. Onboarding loads stablecoin into a recycler and unloads anonymously into fresh coins. Offboarding does the reverse. A `direct_offboard_coin_into_external_asset` fast path skips the recycler for freshly-minted (age-0) coins that do not need anonymity."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-coinage", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-coinage/#relationship-to-coinage-in-the-app", "page_title": "pallet-coinage Reference", "index": 2, "depth": 2, "title": "Relationship to Coinage in the App", "anchor": "relationship-to-coinage-in-the-app", "start_char": 3027, "end_char": 3524, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5c68f6ce5e850c555daac81d984c7751e08b6ec8cb52892772b0fc561937178b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Relationship to Coinage in the App\n\nThe App's Coinage feature is the user-facing surface; `pallet-coinage` is the on-chain pallet that surface dispatches into. A Product developer who wants Coinage-style payments in their own Product invokes `pallet-coinage` via the standard signing surface (with the user approving each transaction on their App, as with all signed actions).\n\nFor the App-side feature reference see [Coinage in the Polkadot App](/reference/apps/hosts/polkadot-app/coinage/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-coinage", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-coinage/#pallet-surface", "page_title": "pallet-coinage Reference", "index": 3, "depth": 2, "title": "Pallet Surface", "anchor": "pallet-surface", "start_char": 3524, "end_char": 8512, "estimated_token_count": 661, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5c68f6ce5e850c555daac81d984c7751e08b6ec8cb52892772b0fc561937178b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Pallet Surface\n\nThe transfer, split, load, and unload extrinsics, the coin storage, and the recycler ring data are enumerated here.\n\n!!! warning \"Provisional\"\n    Parameter shapes, event names, and error variants are pending Parity confirmation. The operation set below reflects the design as documented in the briefing.\n\n| Symbol                                                                                                                          | Kind        | Notes                                                                     |\n|:--------------------------------------------------------------------------------------------------------------------------------|:------------|:--------------------------------------------------------------------------|\n| `transfer`                                                                                                                      | Extrinsic   | Free; pull-mechanic — receiver moves the coin                             |\n| `split`                                                                                                                         | Extrinsic   | Free; one coin into many summing to its value                             |\n| `load_recycler_with_coin`                                                                                                       | Extrinsic   | Free; coin origin; deposits a coin into the recycler ring                 |\n| `load_recycler_with_external_asset`                                                                                             | Extrinsic   | Free; signed origin; deposits backing stablecoin                          |\n| `unload_recycler_into_coin`                                                                                                     | Extrinsic   | Ring-VRF proof; mint a fresh age-0 coin                                   |\n| `unload_recycler_into_external_asset`                                                                                           | Extrinsic   | Ring-VRF proof; withdraw backing stablecoin                               |\n| `unload_recycler_into_coins`                                                                                                    | Extrinsic   | Unload + split in one op; lifts power-of-two restriction                  |\n| `unload_recycler_into_external_asset_non_anonymous`                                                                             | Extrinsic   | Signer pays fee directly; identity visible                                |\n| `direct_offboard_coin_into_external_asset`                                                                                      | Extrinsic   | Fast path for age-0 coins; bypasses the recycler                          |\n| `pay_for_recycler_unload_fee_token_with_coin`                                                                                   | Extrinsic   | Paid path for users out of free unload tokens                             |\n| `pay_for_recycler_unload_fee_token_with_native`                                                                                 | Extrinsic   | Paid path; DOT                                                            |\n| `pay_for_recycler_unload_fee_token_with_stable`                                                                                 | Extrinsic   | Paid path; stablecoin                                                     |\n| `clean_recycler` / `clean_consumed_free_token` / `clean_paid_unload_token_ring` / `delete_expired_paid_unload_token_collection` | Extrinsic   | Offchain-worker-authorised cleanup                                        |\n| `CoinsByOwner`                                                                                                                  | Storage map | Per-public-key coin record (storage is one entry per key)                 |\n| `UnderlyingAssetId` / `UnderlyingAssetUnit`                                                                                     | Constant    | The backing stablecoin id and base unit ($0.01); HOLLAR today, pUSD later |\n| `MinimumExponent` / `MaximumExponent`                                                                                           | Constant    | Valid coin denomination range (0–14 = $0.01–$163.84)                      |\n| `MaximumAge` / `MinimumAgeForRecycling`                                                                                         | Constant    | Coin age limits before mandatory recycling                                |\n| `UnloadTokenAllowancePerTimePeriodForPeople` / `…ForLitePeople`                                                                 | Constant    | Free unload-token budget per period                                       |\n| `RecyclerExpirationTime`                                                                                                        | Constant    | Lifetime of a full recycler ring before cleanup                           |"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-coinage", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-coinage/#where-to-go-next", "page_title": "pallet-coinage Reference", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 8512, "end_char": 8842, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5c68f6ce5e850c555daac81d984c7751e08b6ec8cb52892772b0fc561937178b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Coinage in the Polkadot App**\n\n    ---\n\n    The App-side feature reference — the user-visible surface that dispatches into this pallet.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/coinage/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-game", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-game/#introduction", "page_title": "pallet-game Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 955, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ffcbf52d5504f23c0d23c5bf69afda8003a65881e783fe6b08be0c31e483b4a0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`pallet-game` is the Proof of Personhood pallet for personhood-gated on-chain games and randomized selection flows. Its core property is _fair participation_: when the pallet selects from a set of entrants, it can guarantee each real person has exactly one entry, regardless of how many accounts they control — because the entrants are scoped by alias, not by account address.\n\nTypical use cases include lottery-style draws, raffles, one-person-one-entry contests, randomized airdrops, and any flow where \"one entry per real human\" is part of the fairness contract.\n\n!!! warning \"Provisional\"\n    The exact dispatch surface of `pallet-game` — extrinsics, parameter shapes, storage layout, supported game types, and its integration with the forthcoming `pallet-airdrop` — is still being finalized. This page documents the conceptual responsibilities; the per-extrinsic reference will be added once the surface confirms."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-game", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-game/#what-the-pallet-guarantees", "page_title": "pallet-game Reference", "index": 1, "depth": 2, "title": "What the Pallet Guarantees", "anchor": "what-the-pallet-guarantees", "start_char": 955, "end_char": 1777, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ffcbf52d5504f23c0d23c5bf69afda8003a65881e783fe6b08be0c31e483b4a0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the Pallet Guarantees\n\nThree properties the pallet enforces:\n\n- **One entry per alias**: When a user enters under their per-game alias (resolved via `under_alias`), the pallet stores the alias. A second entry from the same user produces the same alias and is rejected or replaces the first, depending on the game's mode.\n- **Verifiable randomness for selection**: When the pallet selects a winner (or a set of winners), the randomness is sourced from a verifiable source — a block hash, a VRF output, a beacon — that an external party can later check. The selection is not chosen by a privileged operator after the fact.\n- **Account unlinkability for state**: The pallet's storage maps from alias to game-side state. The state cannot be linked back to a specific user account without that user's own cooperation."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-game", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-game/#what-a-product-uses-it-for", "page_title": "pallet-game Reference", "index": 2, "depth": 2, "title": "What a Product Uses It For", "anchor": "what-a-product-uses-it-for", "start_char": 1777, "end_char": 2325, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ffcbf52d5504f23c0d23c5bf69afda8003a65881e783fe6b08be0c31e483b4a0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Product Uses It For\n\nA Product can dispatch into `pallet-game` to:\n\n- Register entries in a game on behalf of the current user — a call wrapped in `under_alias` so the pallet sees the alias.\n- Read game state — current entrant count, current prize pool, outcome of a completed draw — through the standard chain client surface.\n- Subscribe to outcomes when a game completes, so the Product UI can react in real time.\n\nA Product does _not_ run the game itself; the pallet does. The Product is the UI that lets users enter and see results."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-game", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-game/#where-to-go-next", "page_title": "pallet-game Reference", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2325, "end_char": 2867, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ffcbf52d5504f23c0d23c5bf69afda8003a65881e783fe6b08be0c31e483b4a0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **pallet-people**\n\n    ---\n\n    The foundational pallet that issues the aliases this pallet keys on.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/pallet-people/)\n\n- <span class=\"badge learn\">Learn</span> **TrUAPI Entropy**\n\n    ---\n\n    The verifiable-randomness primitives that pair with `pallet-game` when a Product also wants its own randomness on the same chain state. *(Reference page forthcoming.)*\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-identity", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-identity/#introduction", "page_title": "pallet-identity Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 1084, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:934e262920e9ad72ceec5541f3d9780432feb35b18df57115249e9acfa9acfe2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`pallet-identity` is the People Chain pallet that holds the on-chain identity record associated with an account. It is not part of the alias machinery (aliases live in `pallet-people`); it is the place where a verified account's _direct_ identity — the fields associated with the account itself, not its per-context pseudonyms — lives.\n\nFor Product developers, the distinction matters: most personhood-gated flows reach for aliases (`under_alias`, `getAnonymousAlias`) because aliases preserve unlinkability. `pallet-identity` is the relevant pallet when the Product genuinely needs to read or write the user's _direct_ identity record — for example, to display a username the user has explicitly set on their account.\n\n!!! warning \"Provisional\"\n    The exact dispatch surface of `pallet-identity` on the current build — the supported identity fields, the extrinsics that set them, and the verification rules — is still being finalized. This page documents the conceptual responsibilities; per-extrinsic specifics will be added once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-identity", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-identity/#what-the-pallet-records", "page_title": "pallet-identity Reference", "index": 1, "depth": 2, "title": "What the Pallet Records", "anchor": "what-the-pallet-records", "start_char": 1084, "end_char": 1748, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:934e262920e9ad72ceec5541f3d9780432feb35b18df57115249e9acfa9acfe2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the Pallet Records\n\nAn identity record typically contains:\n\n- **A username**: The human-readable name the user has set on their account, useful for display in cases where the user has opted in to a public-facing handle.\n- **Display fields**: Additional administrative or display-oriented fields the user has chosen to associate with their account on-chain.\n- **Verification metadata**: Markers indicating which of the fields have been verified by an authorized verifier, if applicable.\n\nThe fields are public — anyone reading chain state can see them. The user is the only party that can write to their own record (subject to the standard signing model)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-identity", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-identity/#identity-vs-aliases", "page_title": "pallet-identity Reference", "index": 2, "depth": 2, "title": "Identity vs. Aliases", "anchor": "identity-vs-aliases", "start_char": 1748, "end_char": 3070, "estimated_token_count": 314, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:934e262920e9ad72ceec5541f3d9780432feb35b18df57115249e9acfa9acfe2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Identity vs. Aliases\n\nA useful framing for picking the right pallet:\n\n| You need to…                                                                    | Use…                                                                  |\n|:--------------------------------------------------------------------------------|:----------------------------------------------------------------------|\n| Recognize \"the same real person\" in your Product without revealing who they are | An _alias_ from `pallet-people`                                       |\n| Display a username the user has chosen publicly                                 | `pallet-identity`'s username field                                    |\n| Check whether a user is a verified person (yes/no, not who)                     | A Ring-VRF proof from `pallet-people`                                 |\n| Display the user's verified display name in a public context                    | `pallet-identity` fields                                              |\n| Gate access on personhood                                                       | `under_alias` against a PoP pallet                                    |\n| Gate access on the specific user behind an alias                                | This is what aliases _cannot_ do — that link is intentionally severed |"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-identity", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-identity/#when-to-use-from-a-product", "page_title": "pallet-identity Reference", "index": 3, "depth": 2, "title": "When to Use From a Product", "anchor": "when-to-use-from-a-product", "start_char": 3070, "end_char": 3634, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:934e262920e9ad72ceec5541f3d9780432feb35b18df57115249e9acfa9acfe2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Use From a Product\n\nA Product reaches for `pallet-identity` rarely. Most Products preserve unlinkability and never touch the user's direct identity. The pallet is the right tool when:\n\n- The user has opted in to a public-facing presence in your Product context (a profile name, a public display name, a verified-handle badge), and you want to read or set that.\n- Your Product bridges to off-chain identity systems that need the user's direct identity rather than a per-Product alias.\n\nWhen in doubt, prefer aliases — they preserve the privacy default."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-identity", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-identity/#where-to-go-next", "page_title": "pallet-identity Reference", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3634, "end_char": 4277, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:934e262920e9ad72ceec5541f3d9780432feb35b18df57115249e9acfa9acfe2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **pallet-people**\n\n    ---\n\n    The pallet that issues aliases — the unlinkable alternative to direct identity that most Products should prefer.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/pallet-people/)\n\n- <span class=\"badge learn\">Learn</span> **Ring-VRF and Aliases**\n\n    ---\n\n    The mechanism that makes aliases unlinkable and why most Product use cases prefer aliases over direct identity reads.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/ring-vrf-and-aliases/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-people", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-people/#introduction", "page_title": "pallet-people Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 1418, "estimated_token_count": 300, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bdb9d68cfc6cfb35abda80b893d6d9e07c20ce25607f4b48c1be727ba44791cf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`pallet-people` is the foundation of [Polkadot's Proof of Personhood](/reference/apps/infrastructure/pop/) on the People Chain. It's the pallet that records who has completed personhood verification, issues the aliases other Products gate on, and exposes the `under_alias` runtime origin every other PoP pallet (game, score, identity, ubc, coinage) builds on top of.\n\nIts responsibilities cluster into three:\n\n- **Maintaining the membership rings**: The full personhood ring (PoP Full) and the lite-people ring (PoP Lite) are this pallet's storage. Joining a ring means an entry is added; the ring's root is what subsequent Ring-VRF proofs are checked against.\n- **Issuing aliases**: When a Product (via the App) requests an alias for a specific context, `pallet-people` is the runtime side that produces the alias and registers it as valid against the ring.\n- **Implementing the `under_alias` origin**: When a runtime call comes in wrapped in `under_alias`, this is the pallet whose verification logic the runtime runs to decide whether to admit the call.\n\n!!! warning \"Provisional\"\n    The exact dispatch surface of `pallet-people` — the precise extrinsics, their parameter shapes, the storage map names, and the events emitted — is still being finalized. This page documents the conceptual responsibilities; the per-extrinsic reference will be added once the surface confirms."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-people", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-people/#ring-membership", "page_title": "pallet-people Reference", "index": 1, "depth": 2, "title": "Ring Membership", "anchor": "ring-membership", "start_char": 1418, "end_char": 2109, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bdb9d68cfc6cfb35abda80b893d6d9e07c20ce25607f4b48c1be727ba44791cf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ring Membership\n\nTwo storage structures on `pallet-people` hold the rings:\n\n- **The full personhood ring**: Holds the public keys of accounts that completed biometric PoP. Joining requires the App-side verification flow; the result is an extrinsic that adds the key.\n- **The lite-people ring**: Holds accounts registered via a governance-authorized attestation. Attestations are submitted by approved attesters; the pallet validates and records the registration.\n\nEach ring exposes a _ring root_ — the cryptographic commitment used to verify Ring-VRF proofs. The root updates when membership changes; consumers of proofs read the current root from this pallet's storage when validating."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-people", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-people/#alias-issuance", "page_title": "pallet-people Reference", "index": 2, "depth": 2, "title": "Alias Issuance", "anchor": "alias-issuance", "start_char": 2109, "end_char": 2659, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bdb9d68cfc6cfb35abda80b893d6d9e07c20ce25607f4b48c1be727ba44791cf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Alias Issuance\n\n`pallet-people` is the issuing authority for aliases. When the App produces a Ring-VRF proof for a specific context (a `.dot` domain), the proof is generated against the pallet's ring root and the context. The alias the verifier sees is deterministic for *(user, context)* — same user, same context, same alias every time.\n\nFor cross-domain aliases — a Product requesting an alias scoped to another Product's `.dot` — the pallet has additional checks to ensure the request was user-consented and the destination context is valid."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-people", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-people/#under_alias-dispatch", "page_title": "pallet-people Reference", "index": 3, "depth": 2, "title": "`under_alias` Dispatch", "anchor": "under_alias-dispatch", "start_char": 2659, "end_char": 3261, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bdb9d68cfc6cfb35abda80b893d6d9e07c20ce25607f4b48c1be727ba44791cf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## `under_alias` Dispatch\n\nWhen the runtime sees a call wrapped in `under_alias`, the validator path is:\n\n1. Read the relevant ring root from `pallet-people`'s storage.\n2. Verify the included Ring-VRF proof against the ring root and the dispatched context.\n3. On valid proof, dispatch the inner call with the origin resolved to the user's alias for that context.\n4. The receiving pallet sees the alias, not the underlying account.\n\nThis is the property that lets downstream pallets (game, score, identity, ubc) gate their logic on alias identity while keeping their state unlinkable to user accounts."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-people", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-people/#pallets-that-depend-on-this-one", "page_title": "pallet-people Reference", "index": 4, "depth": 2, "title": "Pallets That Depend on This One", "anchor": "pallets-that-depend-on-this-one", "start_char": 3261, "end_char": 3670, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bdb9d68cfc6cfb35abda80b893d6d9e07c20ce25607f4b48c1be727ba44791cf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Pallets That Depend on This One\n\nEvery other pallet in the PoP set ultimately reads `pallet-people`'s ring root or accepts `under_alias` calls validated against it. The downstream pallets are listed in the [Proof of Personhood overview](/reference/apps/infrastructure/pop/); the foundational guarantee they all rely on is that this pallet's rings represent the current set of real persons on the network."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-people", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-people/#where-to-go-next", "page_title": "pallet-people Reference", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3670, "end_char": 4061, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bdb9d68cfc6cfb35abda80b893d6d9e07c20ce25607f4b48c1be727ba44791cf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Ring-VRF and Aliases**\n\n    ---\n\n    The cryptographic and runtime mechanism this pallet implements — what Ring-VRF is, what an alias is, how `under_alias` works at the runtime layer.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/ring-vrf-and-aliases/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-score", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-score/#introduction", "page_title": "pallet-score Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 872, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:920b80125d7ee34ca0ecf48536ae6cf735e04d7836e56294eb054e14f064d7af", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`pallet-score` is the Proof of Personhood pallet for personhood-anchored reputation and scoring. It records per-alias scores that accumulate from on-chain activity, providing a primitive that a Product (or another pallet) can read to make decisions: \"has this real person built up enough reputation in this context to be trusted with X?\"\n\nThe pallet's storage is keyed by alias, so two scores belonging to the same user across different Products do not link to each other or to the user's account.\n\n!!! warning \"Provisional\"\n    The exact dispatch surface of `pallet-score` — what extrinsics adjust scores, what events cause automatic adjustments, the scoring rules, the storage shape — is still being finalized. This page documents the conceptual responsibilities; the per-extrinsic reference will be added once the surface confirms."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-score", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-score/#what-the-pallet-records", "page_title": "pallet-score Reference", "index": 1, "depth": 2, "title": "What the Pallet Records", "anchor": "what-the-pallet-records", "start_char": 872, "end_char": 1484, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:920b80125d7ee34ca0ecf48536ae6cf735e04d7836e56294eb054e14f064d7af", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the Pallet Records\n\nThe conceptual storage is (alias, context) → score:\n\n- A user's _alias_ in a specific context — typically a Product's `.dot` domain — has a per-context score.\n- The same user has different aliases in different contexts, so their scores in different contexts are stored under different keys and cannot be linked.\n- Scores can be positive (reputation earned) or negative (penalties), depending on the rules the context defines.\n\nThe pallet does not impose a single scoring rule; it provides the storage and the alias-scoped key. Other pallets and Products configure how scores adjust."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-score", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-score/#read-and-write-paths", "page_title": "pallet-score Reference", "index": 2, "depth": 2, "title": "Read and Write Paths", "anchor": "read-and-write-paths", "start_char": 1484, "end_char": 2091, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:920b80125d7ee34ca0ecf48536ae6cf735e04d7836e56294eb054e14f064d7af", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Read and Write Paths\n\nTwo paths interact with `pallet-score`:\n\n- **Adjustment dispatch**: A call (typically under `under_alias`, but other patterns are possible) increments or decrements the score for the calling alias. Whether a Product can adjust scores directly, or whether adjustments are gated to specific privileged callers, depends on the context's configuration.\n- **Read access**: Anyone can read scores from chain state. The score is associated with an alias, so a reader cannot trivially identify the underlying user — but the alias is, by design, observable to anyone who knows the context."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-score", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-score/#use-cases", "page_title": "pallet-score Reference", "index": 3, "depth": 2, "title": "Use Cases", "anchor": "use-cases", "start_char": 2091, "end_char": 2624, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:920b80125d7ee34ca0ecf48536ae6cf735e04d7836e56294eb054e14f064d7af", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use Cases\n\nTwo common patterns:\n\n- **Sybil-resistant reputation**: A reputation system that needs \"real-person reputation\" rather than \"account reputation\" reads from `pallet-score` to confirm the entity it is evaluating is a verified person and to retrieve their cumulative score.\n- **Gating with thresholds**: A Product gates a premium feature on a score threshold (\"you need at least N reputation in this context to do X\"); the threshold check reads from the pallet and the Product's UI only unlocks the feature if it passes."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-score", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-score/#where-to-go-next", "page_title": "pallet-score Reference", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2624, "end_char": 3218, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:920b80125d7ee34ca0ecf48536ae6cf735e04d7836e56294eb054e14f064d7af", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **pallet-people**\n\n    ---\n\n    The foundational pallet that issues the aliases this pallet keys on.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/pallet-people/)\n\n- <span class=\"badge learn\">Learn</span> **Ring-VRF and Aliases**\n\n    ---\n\n    The mechanism that makes the alias-scoping property work — why scores under different contexts cannot be linked.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/ring-vrf-and-aliases/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-ubc", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-ubc/#introduction", "page_title": "pallet-ubc Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 1025, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b184640f98142c6cd553d3cae573b1c2380f29836ddabeb7d01db2aff37c1c45", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`pallet-ubc` is the Universal Basic Capacity pallet. Its job is to give every verified person a periodic on-chain _capacity allotment_ — most notably, a quota of fee-free transactions per period. The motivating use case is the \"first interaction is free\" pattern: a new user can sign and submit one or more transactions without first acquiring DOT, removing the cold-start friction that gates Web3 onboarding.\n\nFor a Product developer, `pallet-ubc` is the mechanism that lets your Product be the first thing a new user touches without forcing them to fund their account before they can do anything.\n\n!!! warning \"Provisional\"\n    The exact dispatch surface, the per-period quota amount, the period length, and the precise eligibility rules of `pallet-ubc` on the current build are still being finalized. The \"Q11\" open question on `pallet-ubc` stable flows is one of the items being firmed up. This page documents the conceptual model; per-extrinsic specifics will be added once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-ubc", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-ubc/#what-the-pallet-provides", "page_title": "pallet-ubc Reference", "index": 1, "depth": 2, "title": "What the Pallet Provides", "anchor": "what-the-pallet-provides", "start_char": 1025, "end_char": 1766, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b184640f98142c6cd553d3cae573b1c2380f29836ddabeb7d01db2aff37c1c45", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the Pallet Provides\n\nThree primitives, organized around the per-period capacity model:\n\n- **The capacity allotment**: Each verified person receives a quota per period (the period length and quota amount are runtime parameters). Within the quota, the user can perform certain operations without paying transaction fees.\n- **Consumption tracking**: The pallet records each person's consumption against their current period's quota so subsequent operations correctly account for what is remaining.\n- **Eligibility checks**: Operations that _can_ be performed under UBC have their eligibility verified at dispatch — a non-verified account, or an account that has already exhausted the period's quota, falls back to the normal fee path."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-ubc", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-ubc/#when-a-product-reaches-for-ubc", "page_title": "pallet-ubc Reference", "index": 2, "depth": 2, "title": "When a Product Reaches for UBC", "anchor": "when-a-product-reaches-for-ubc", "start_char": 1766, "end_char": 2603, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b184640f98142c6cd553d3cae573b1c2380f29836ddabeb7d01db2aff37c1c45", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When a Product Reaches for UBC\n\nThe canonical pattern is the first-interaction onboarding flow:\n\n1. A new user opens a Polkadot Product.\n2. The Product has the user complete (or confirm) PoP via the App.\n3. The Product invokes a UBC-eligible action — typically a small initial setup transaction, a \"welcome\" claim, a vote, or an action that establishes the user's presence in your Product.\n4. The action goes through under the user's UBC quota; the user has not yet acquired any DOT and is still able to participate.\n5. After the UBC quota is exhausted (within the period), subsequent transactions follow the normal fee path; by then the user has had a chance to fund their account through the normal channels.\n\nThe pallet's value is largely UX: removing the requirement to acquire and hold DOT before doing anything in the Product."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-ubc", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-ubc/#eligibility-constraints", "page_title": "pallet-ubc Reference", "index": 3, "depth": 2, "title": "Eligibility Constraints", "anchor": "eligibility-constraints", "start_char": 2603, "end_char": 3108, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b184640f98142c6cd553d3cae573b1c2380f29836ddabeb7d01db2aff37c1c45", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Eligibility Constraints\n\nNot every transaction is eligible to consume UBC quota. Typical constraints:\n\n- The user must be a verified person — accounts without PoP cannot consume.\n- The operation must be one the runtime has declared UBC-eligible — this is a runtime configuration, not an arbitrary application choice.\n- The user must have remaining quota in the current period.\n\nWhen any of these fail, the transaction does not silently fail — it follows the normal fee path, and the user pays in DOT."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-pallet-ubc", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/pallet-ubc/#where-to-go-next", "page_title": "pallet-ubc Reference", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3108, "end_char": 3637, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b184640f98142c6cd553d3cae573b1c2380f29836ddabeb7d01db2aff37c1c45", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **pallet-people**\n\n    ---\n\n    The pallet that records PoP status — the eligibility input UBC checks against.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/pallet-people/)\n\n- <span class=\"badge guide\">Guide</span> **Verify Your Identity**\n\n    ---\n\n    The setup step that produces the PoP status UBC requires.\n\n    [:octicons-arrow-right-24: Get Started](/reference/apps/infrastructure/pop/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-ring-vrf-and-aliases", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/ring-vrf-and-aliases/#introduction", "page_title": "Ring-VRF and Aliases", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 675, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13a3ba97642a4e47367dfd4a621e02051af41984d48d34ca3b0026e4d4c1ce82", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot's Proof of Personhood delivers a key privacy guarantee: _two Products cannot correlate that they share a user without an explicit cross-domain grant from that user_. That guarantee rests on two pieces of machinery — _Ring-VRF_, the cryptographic primitive that produces context-specific pseudonyms (aliases), and the _`under_alias` runtime origin_, the mechanism that lets pallets gate logic on those pseudonyms instead of on raw accounts.\n\nThis page is the conceptual deep dive on both. The App-side reference for _where_ PoP runs is the [Polkadot App's Proof of Personhood](/reference/apps/hosts/polkadot-app/pop/) page."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-ring-vrf-and-aliases", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/ring-vrf-and-aliases/#what-pop-produces", "page_title": "Ring-VRF and Aliases", "index": 1, "depth": 2, "title": "What PoP Produces", "anchor": "what-pop-produces", "start_char": 675, "end_char": 1401, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13a3ba97642a4e47367dfd4a621e02051af41984d48d34ca3b0026e4d4c1ce82", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What PoP Produces\n\nWhen a user completes Proof of Personhood in the Polkadot App, the result is membership in a ring on the People Chain. A \"ring\" here is the cryptographic group of all currently-verified persons; being in the ring is what makes the user's later proofs valid.\n\nTwo rings coexist on the People Chain:\n\n- **The full personhood ring**: Accounts that completed the biometric PoP flow (PoP Full). Membership requires the full verification ceremony.\n- **The lite-people ring**: Accounts that received a governance-authorized attestation (PoP Lite). A separate ring; supply is bounded by governance.\n\nBoth rings produce Ring-VRF proofs; what differs is the strength of the membership claim each ring represents."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-ring-vrf-and-aliases", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/ring-vrf-and-aliases/#what-an-alias-is", "page_title": "Ring-VRF and Aliases", "index": 2, "depth": 2, "title": "What an Alias Is", "anchor": "what-an-alias-is", "start_char": 1401, "end_char": 2563, "estimated_token_count": 252, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13a3ba97642a4e47367dfd4a621e02051af41984d48d34ca3b0026e4d4c1ce82", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What an Alias Is\n\nAn _alias_ is a context-specific pseudonym derived from the user's ring membership. Three properties define it:\n\n- **Anchored in personhood**: A valid Ring-VRF proof over an alias is also a valid proof of personhood for the user behind it — the alias _is_ the personhood claim, scoped to the specific context.\n- **Scoped to a context**: The context is typically a Product's `.dot` domain. The same user produces a consistent alias every time they return to the same Product, but a different alias when they use any other Product.\n- **Verifiable without revealing the account**: A verifier confirms \"this alias belongs to a real person in the ring\" using a Ring-VRF proof. The verifier learns the alias, not the account behind it.\n\nThat last property is the load-bearing one for privacy: aliases are unlinkable across Products by design. If two Products could compare their alias lists, every Product would turn into a tracking surface. The alias model makes that combination impossible by default — and the cross-domain alias path (where Product A asks for an alias scoped to Product B's `.dot`) is gated by an explicit user-consent modal."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-ring-vrf-and-aliases", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/ring-vrf-and-aliases/#the-under_alias-runtime-origin", "page_title": "Ring-VRF and Aliases", "index": 3, "depth": 2, "title": "The `under_alias` Runtime Origin", "anchor": "the-under_alias-runtime-origin", "start_char": 2563, "end_char": 3728, "estimated_token_count": 246, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13a3ba97642a4e47367dfd4a621e02051af41984d48d34ca3b0026e4d4c1ce82", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The `under_alias` Runtime Origin\n\nFor on-chain operations, Polkadot's runtime exposes the `under_alias` dispatchable origin. A user dispatches a call wrapped in `under_alias` and the runtime verifies the underlying Ring-VRF proof before letting the inner call execute. Inside the called pallet, the origin resolves to the user's alias — not the user's account — so the pallet's state stays unlinkable to the account that triggered it.\n\nTwo kinds of pallets consume `under_alias` differently:\n\n- Alias-gated pallets key on the alias value itself. The pallet's storage maps from alias to some per-alias state (a vote, a score, a balance, a registration). Two visits from the same user produce the same alias, so the pallet recognizes \"the same person came back,\" but the pallet's storage carries no link back to the user's account.\n- Personhood-gated pallets key on the proof itself, not the alias value. The pallet only needs to know that _some_ verified person performed the action; the alias is discarded after the proof check. Useful for \"any verified person gets a fee allowance\" patterns.\n\nBoth shapes are documented per-pallet in the rest of this section."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-ring-vrf-and-aliases", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/ring-vrf-and-aliases/#cross-product-aliases", "page_title": "Ring-VRF and Aliases", "index": 4, "depth": 2, "title": "Cross-Product Aliases", "anchor": "cross-product-aliases", "start_char": 3728, "end_char": 4104, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13a3ba97642a4e47367dfd4a621e02051af41984d48d34ca3b0026e4d4c1ce82", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Cross-Product Aliases\n\nA Product can request an alias scoped to another Product's `.dot` domain. This is the only path by which two Products can cryptographically confirm they share a user. The request triggers a user-consent modal — the user has to explicitly grant the cross-domain alias before the request succeeds. Without that grant, the unlinkability default holds."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-pop-ring-vrf-and-aliases", "url": "https://developer.polkadot.com/reference/apps/infrastructure/pop/ring-vrf-and-aliases/#where-to-go-next", "page_title": "Ring-VRF and Aliases", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4104, "end_char": 4734, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:13a3ba97642a4e47367dfd4a621e02051af41984d48d34ca3b0026e4d4c1ce82", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **pallet-people**\n\n    ---\n\n    The pallet that issues aliases and implements the `under_alias` origin — the foundation of the PoP pallet set.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/pop/pallet-people/)\n    \n- <span class=\"badge learn\">Learn</span> **Proof of Personhood in the Polkadot App**\n\n    ---\n\n    The App-side reference for _where_ PoP verification happens, including the Full and Lite tier model.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/pop/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-allowance", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/allowance/#introduction", "page_title": "Statement Store Allowance", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 691, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf48ae3e54ab89aa25b75fa07d94aff3cd1fdce86032e3b2c8578ee4d7e266da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nSubmissions to the Statement Store are _not_ priced by transaction fees. The People Chain doesn't charge per statement; instead, every account that wants to publish needs an on-chain allowance record that caps how many live statements it may have at once and how many bytes those statements may total.\n\nThe allowance is the spam-resistance mechanism. Without it, a misbehaving account could flood the network's gossip layer with valid (and validly signed) statements that no fee model would meaningfully limit. With it, the network has a deterministic upper bound on per-account traffic that subscribers don't have to defend against at the application layer."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-allowance", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/allowance/#what-an-allowance-records", "page_title": "Statement Store Allowance", "index": 1, "depth": 2, "title": "What an Allowance Records", "anchor": "what-an-allowance-records", "start_char": 691, "end_char": 1452, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf48ae3e54ab89aa25b75fa07d94aff3cd1fdce86032e3b2c8578ee4d7e266da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What an Allowance Records\n\n`pallet-statement-store` stores a per-account `StatementAllowance` record with two limits:\n\n- **`max_count`**: The maximum number of statements the account may have live in the pool at once. As statements expire (TTL elapses, channel replacement evicts an older value), they free up count for new submissions.\n- **`max_size`**: The maximum total bytes across the account's currently-live statements. Each submission's payload counts against this; as statements expire, their bytes free up.\n\nBoth limits are checked at validation (step 2 of the [lifecycle](/reference/apps/infrastructure/statement-store/lifecycle/)). A submission that would exceed either is rejected at the pallet boundary before it ever enters the gossip layer."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-allowance", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/allowance/#how-the-limits-interact", "page_title": "Statement Store Allowance", "index": 2, "depth": 2, "title": "How the Limits Interact", "anchor": "how-the-limits-interact", "start_char": 1452, "end_char": 2433, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf48ae3e54ab89aa25b75fa07d94aff3cd1fdce86032e3b2c8578ee4d7e266da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How the Limits Interact\n\nA typical Product hits the _count_ limit before the size limit if it publishes many small messages, and the _size_ limit before the count limit if it publishes fewer but larger payloads. Two practical consequences:\n\n- A chat-like Product (lots of small statements) should budget primarily against `max_count`. Each message stays live until its TTL elapses, so a chatty user can occupy several `max_count` slots simultaneously.\n- A Product that publishes occasional large payloads (configuration blobs, large status updates) should budget primarily against `max_size`. The size limit is total-across-live, not per-statement, so a few big payloads can saturate the quota even if `max_count` is far from full.\n\nA Product can lower its size pressure by moving content to the Bulletin Chain and publishing only a small statement carrying the resulting CID. The CID is short; the bytes live on Bulletin and don't count against the Statement Store allowance."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-allowance", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/allowance/#per-statement-size-limit", "page_title": "Statement Store Allowance", "index": 3, "depth": 2, "title": "Per-Statement Size Limit", "anchor": "per-statement-size-limit", "start_char": 2433, "end_char": 2773, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf48ae3e54ab89aa25b75fa07d94aff3cd1fdce86032e3b2c8578ee4d7e266da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Per-Statement Size Limit\n\nIndependent of the per-account allowance, each statement payload has a hard 512-byte limit (after JSON encoding) enforced by the SDK. Larger payloads throw `StatementDataTooLargeError` before submission. For content bigger than 512 bytes, the recommended pattern is the Bulletin Chain + CID composition above."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-allowance", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/allowance/#provisioning-on-testnet", "page_title": "Statement Store Allowance", "index": 4, "depth": 2, "title": "Provisioning on TestNet", "anchor": "provisioning-on-testnet", "start_char": 2773, "end_char": 3224, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf48ae3e54ab89aa25b75fa07d94aff3cd1fdce86032e3b2c8578ee4d7e266da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Provisioning on TestNet\n\n!!! warning \"Provisional\"\n    The process for obtaining a Statement Store allowance on TestNet is still being defined. The [Get TestNet Tokens](/apps/get-started/get-testnet-tokens/) guide is the source of truth as the provisioning flow stabilizes.\n\nOn TestNet today, allowances are provisioned by calling the `increase_allowance_by` extrinsic — typically through a governance or sudo route, since the call is privileged."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-allowance", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/allowance/#where-to-go-next", "page_title": "Statement Store Allowance", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3224, "end_char": 3773, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf48ae3e54ab89aa25b75fa07d94aff3cd1fdce86032e3b2c8578ee4d7e266da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Lifecycle**\n\n    ---\n\n    Where allowance validation sits in the statement lifecycle (step 2 — before gossip propagation).\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/lifecycle/)\n\n- <span class=\"badge guide\">Guide</span> **Get TestNet Funds**\n\n    ---\n\n    The setup step where TestNet allowances are provisioned.\n\n    [:octicons-arrow-right-24: Get Started](/apps/get-started/get-testnet-tokens/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-channels", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/channels/#introduction", "page_title": "Statement Store Channels", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 818, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b603bfc5dc74a661457b05aa85bdfa9fdedbf6e462a9bf5c00e79fc8faac3e9a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n`pallet-statement-store` supports an optional channel field on every statement. When a new submission carries the same `channel` as an existing live statement from the same account, the pallet replaces the older one in the node's pool — and the replacement propagates to subscribed peers, who drop the old statement in favor of the new one.\n\nThe result is a last-write-wins primitive on top of the standard pub/sub: each channel name, scoped per-account, maps to a single live value at any moment.\n\nThe Product SDK abstracts this as `ChannelStore<T>` in `@parity/product-sdk-statement-store`. The underlying storage primitive is the same — every channel value is still a statement going through the same lifecycle — but the read surface looks like a key-value map keyed by channel name."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-channels", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/channels/#when-to-reach-for-channels", "page_title": "Statement Store Channels", "index": 1, "depth": 2, "title": "When to Reach for Channels", "anchor": "when-to-reach-for-channels", "start_char": 818, "end_char": 1602, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b603bfc5dc74a661457b05aa85bdfa9fdedbf6e462a9bf5c00e79fc8faac3e9a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## When to Reach for Channels\n\nThree patterns are the canonical fit:\n\n- **Presence indicators**: _\"Alice is online.\"_ Only the latest value matters; older states should be replaced as the user goes idle and active again.\n- **Multiplayer cursors and other live UI state**: The user has moved their cursor to position N; the previous position is no longer relevant.\n- **\"Now playing\" / live status**: Only the current track matters, not the history of what was playing earlier in the session.\n\nFor append-only events — chat messages, action logs, social-feed posts — channels are the wrong primitive. Each event needs to live independently; using a channel would erase the previous message every time the user sent a new one. For those use cases, keep using `client.publish` directly."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-channels", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/channels/#scope-and-replacement-rules", "page_title": "Statement Store Channels", "index": 2, "depth": 2, "title": "Scope and Replacement Rules", "anchor": "scope-and-replacement-rules", "start_char": 1602, "end_char": 2197, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b603bfc5dc74a661457b05aa85bdfa9fdedbf6e462a9bf5c00e79fc8faac3e9a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Scope and Replacement Rules\n\nChannels are scoped per-account. The pallet's replacement rule only matches statements from the same signer — one user cannot overwrite another user's channel value. Two users posting on the same channel name produce two independent live values, one per account.\n\nThe replacement is atomic from a subscriber's perspective: the older statement is evicted from the pool and the newer one inserted in the same step. A subscriber sees the new value; the old value, if it was in flight to the subscriber's node, is dropped before it reaches the application callback."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-channels", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/channels/#the-channel-store-api", "page_title": "Statement Store Channels", "index": 3, "depth": 2, "title": "The Channel-Store API", "anchor": "the-channel-store-api", "start_char": 2197, "end_char": 3135, "estimated_token_count": 224, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b603bfc5dc74a661457b05aa85bdfa9fdedbf6e462a9bf5c00e79fc8faac3e9a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Channel-Store API\n\nThe SDK's `ChannelStore<T>` exposes the standard surface:\n\n- **`channels.write(name, value)`**: Publish a new value on the named channel. The SDK hashes the channel name with Blake2b-256, attaches the per-account scoping, and submits as a statement.\n- **`channels.read(name)`**: Return the latest value seen on that channel locally.\n- **`channels.readAll()`**: Return the full map of `(channel name → latest value)` the local node has seen.\n- **`channels.onChange(callback)`**: Fire on every transition (a new write replacing an older value).\n\n`ChannelStore` automatically timestamps the value if your `T` omits a timestamp, so consumers can reason about ordering when needed.\n\n!!! warning \"Provisional\"\n    The maximum number of live channels per account, the interaction between channels and the per-account `max_count` allowance limit, and any cross-account aggregation primitives are still being finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-channels", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/channels/#where-to-go-next", "page_title": "Statement Store Channels", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3135, "end_char": 3729, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b603bfc5dc74a661457b05aa85bdfa9fdedbf6e462a9bf5c00e79fc8faac3e9a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Subscriptions**\n\n    ---\n\n    The subscription surface that delivers channel transitions to subscribers, including the per-channel dedup behavior.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/subscriptions/)\n\n- <span class=\"badge guide\">Guide</span> **Exchange Ephemeral Messages**\n\n    ---\n\n    The Product-side how-to including the `ChannelStore` walkthrough.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/pub-sub-off-chain-data/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/#introduction", "page_title": "Statement Store Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 1011, "estimated_token_count": 209, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b6b1e8043338ef04fcae067b290c9166f23623b1392d00654ee794a3881ba908", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Statement Store is Polkadot's publish/subscribe layer for short-lived, signed messages between Product users. A Product publishes a small statement; the People Chain validates it; the network gossips it out to anyone subscribed to a matching topic. Statements never enter the chain's block storage — they live briefly in nodes' local pools and decay after a short TTL.\n\nThe split is the point: pallet rules on chain, payloads in gossip. The chain enforces who can publish and how much; the gossip layer carries the data. That is what makes the Statement Store the right tool for _real-time signaling between users_ (chat messages, presence, multiplayer cursors, typing indicators, \"now playing\" status), and for anything else that has to propagate fast and does not need to be permanent.\n\nFor when to reach for this versus the [Bulletin Chain](/reference/apps/infrastructure/bulletin-chain/) or local storage, see [Where to Store Data](/apps/concepts/data-placement/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/#how-a-statement-reaches-subscribers", "page_title": "Statement Store Reference", "index": 1, "depth": 2, "title": "How a Statement Reaches Subscribers", "anchor": "how-a-statement-reaches-subscribers", "start_char": 1011, "end_char": 2144, "estimated_token_count": 248, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b6b1e8043338ef04fcae067b290c9166f23623b1392d00654ee794a3881ba908", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How a Statement Reaches Subscribers\n\nThree properties define the path from a publish call to a subscriber's callback firing:\n\n- **Signed at the source**: Every submission carries an authentication proof (Sr25519 by default). The Host requests the proof through the App; the Product never handles keys.\n- **Allowance-gated by the pallet**: The People Chain's `pallet-statement-store` enforces a per-account quota — `max_count` live statements and `max_size` total bytes. Submissions exceeding the quota are rejected at the pallet boundary, so spam does not reach subscribers. See [Allowance](/reference/apps/infrastructure/statement-store/allowance/).\n- **Gossiped, not block-stored**: Once accepted into the node's statement pool, the submission propagates peer-to-peer through the People Chain network's gossip layer. Subscribers see it via their node's filtered statement subscription. See [Subscriptions](/reference/apps/infrastructure/statement-store/subscriptions/).\n\nFor the full statement lifecycle (validation, propagation, expiry, maintenance) see [Lifecycle](/reference/apps/infrastructure/statement-store/lifecycle/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/#delivery-semantics", "page_title": "Statement Store Reference", "index": 2, "depth": 2, "title": "Delivery Semantics", "anchor": "delivery-semantics", "start_char": 2144, "end_char": 2838, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b6b1e8043338ef04fcae067b290c9166f23623b1392d00654ee794a3881ba908", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Delivery Semantics\n\nThe Statement Store does not retry, acknowledge, or guarantee ordering — those are network-layer guarantees the gossip protocol does not provide. Delivery is best-effort. If your Product needs to know a message reached a peer, the peer publishes an acknowledgment statement; reliability is composed at the application layer, not at the protocol.\n\nIf the content needs to outlive the TTL, store it on the Bulletin Chain and publish a CID as the statement payload. The composition — Statement Store for the live signal, Bulletin Chain for content that has to be there later — is documented in the Polkadot App's [Chat reference](/reference/apps/hosts/polkadot-app/chat/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/#where-to-go-next", "page_title": "Statement Store Reference", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2838, "end_char": 4377, "estimated_token_count": 397, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b6b1e8043338ef04fcae067b290c9166f23623b1392d00654ee794a3881ba908", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Lifecycle**\n\n    ---\n\n    How a statement progresses from submission through validation, gossip, TTL, and eviction — and what each step guarantees.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/lifecycle/)\n\n- <span class=\"badge learn\">Learn</span> **Subscriptions**\n\n    ---\n\n    How a subscriber registers a topic filter, what `topic2` adds, and the dedup behavior on the receiving side.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/subscriptions/)\n\n- <span class=\"badge learn\">Learn</span> **Channels**\n\n    ---\n\n    The last-write-wins primitive built on top of statements — useful for soft state like presence indicators where only the latest version matters.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/channels/)\n\n- <span class=\"badge learn\">Learn</span> **Allowance**\n\n    ---\n\n    The allowance model that gates submissions — `max_count`, `max_size`, and how a Product budgets traffic against an account's quota.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/allowance/)\n\n- <span class=\"badge guide\">Guide</span> **Exchange Ephemeral Messages**\n\n    ---\n\n    The Product-side how-to: setting up the client, subscribing, publishing typed statements, using channels.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/pub-sub-off-chain-data/)\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-lifecycle", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/lifecycle/#introduction", "page_title": "Statement Lifecycle", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 347, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b3e5d5b48615db8c5488b871da3409599fb548e5ee4ad4c1334d1fff9df0bc7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA Statement Store submission passes through five recognizable steps between a `publish` call and being dropped from the network. Knowing where in that lifecycle a given statement is helps you reason about delivery: some failure modes can only happen at one step, and some guarantees only exist between two of them."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-lifecycle", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/lifecycle/#the-five-steps", "page_title": "Statement Lifecycle", "index": 1, "depth": 2, "title": "The Five Steps", "anchor": "the-five-steps", "start_char": 347, "end_char": 1997, "estimated_token_count": 361, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b3e5d5b48615db8c5488b871da3409599fb548e5ee4ad4c1334d1fff9df0bc7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Five Steps\n\n1. **Submission**: The Product calls `publish` on its Statement Store client (or the equivalent TrUAPI call). The Host obtains an authentication proof from the paired App and forwards the request to the People Chain node's `statement_submit` JSON-RPC.\n\n2. **Validation**: `pallet-statement-store` checks the submission against the per-account allowance (see [Allowance](/reference/apps/infrastructure/statement-store/allowance/)). If `max_count` or `max_size` would be exceeded, or the authentication proof is invalid, the submission is _rejected_ at this step and never reaches any subscriber. The publish call returns `false` (statement was rejected) rather than throwing.\n\n3. **Acceptance into the pool**: A validated submission enters the local node's statement pool, the in-memory data structure that holds live statements. The publish call returns `true` at this point — the statement is now live on this node.\n\n4. **Gossip propagation**: The node propagates accepted statements to peers that have registered a matching topic filter. Each peer's node decides whether the statement matches and forwards or drops accordingly. This is best-effort: peers may not be listening, may drop the statement under load, or may have already seen a duplicate.\n\n5. **Expiry and eviction**: Each statement carries a TTL (default 30 seconds, configurable per submission up to the pallet-enforced cap). When the TTL elapses, the statement is evicted from each node's pool. After eviction, subscribers who join late will not see it — there is no \"fetch by hash\" recovery for an expired statement, and there is no chain block to look it up in."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-lifecycle", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/lifecycle/#what-each-step-guarantees", "page_title": "Statement Lifecycle", "index": 2, "depth": 2, "title": "What Each Step Guarantees", "anchor": "what-each-step-guarantees", "start_char": 1997, "end_char": 2832, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b3e5d5b48615db8c5488b871da3409599fb548e5ee4ad4c1334d1fff9df0bc7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Each Step Guarantees\n\nA few load-bearing facts that fall out of the lifecycle:\n\n- **Between submission and acceptance, the chain enforces validity**: A spam-flood attempt against your Product's topic does not reach subscribers because invalid or quota-exceeding submissions are rejected at step 2.\n- **Between acceptance and expiry, propagation is best-effort**: A subscriber connected to the same node *will* see an accepted statement; a subscriber connected to a different node may or may not, depending on the gossip path.\n- **After expiry there is no recovery**: If your Product needs the bytes to be retrievable later, the canonical pattern is to write them to the Bulletin Chain and publish the resulting CID as the statement payload. The statement carries the live signal; the Bulletin Chain holds the durable content."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-lifecycle", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/lifecycle/#on-chain-trigger-forthcoming", "page_title": "Statement Lifecycle", "index": 3, "depth": 2, "title": "On-Chain Trigger (Forthcoming)", "anchor": "on-chain-trigger-forthcoming", "start_char": 2832, "end_char": 3134, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b3e5d5b48615db8c5488b871da3409599fb548e5ee4ad4c1334d1fff9df0bc7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## On-Chain Trigger (Forthcoming)\n\n!!! warning \"Forthcoming\"\n    On-chain-triggered statements — submissions originated by an OCW (off-chain worker) rather than a Product — are a forthcoming surface for runtime developers, not Product developers. The reference for this path will be added separately."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-lifecycle", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/lifecycle/#where-to-go-next", "page_title": "Statement Lifecycle", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3134, "end_char": 3729, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b3e5d5b48615db8c5488b871da3409599fb548e5ee4ad4c1334d1fff9df0bc7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Allowance**\n\n    ---\n\n    The validation step's quota mechanism — what gets rejected at step 2 and why.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/allowance/)\n\n- <span class=\"badge learn\">Learn</span> **Subscriptions**\n\n    ---\n\n    How a subscriber attaches to the gossip stream at step 4 and the dedup behavior on the receiving side.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/subscriptions/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-subscriptions", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/subscriptions/#introduction", "page_title": "Statement Store Subscriptions", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 717, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:65b34cc1ec61f0e7040dd774adb1af8c69385b82619a90ff7a1a1ff16bcb0174", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA Product subscribes to the Statement Store by registering a topic filter with a People Chain node. The node forwards only the statements matching that filter to the Product's callback; everything else on the gossip stream is dropped before it reaches the Product. The filter is the Product's lever — pick it correctly and the Product sees exactly the traffic it wants.\n\nThe Product SDK wraps this as `client.subscribe<T>(callback, options?)` in `@parity/product-sdk-statement-store`. Underneath, it calls the node's `statement_subscribeStatement` JSON-RPC with the appropriate filter, decodes payloads into the typed `T`, and dedupes by content hash before invoking the callback."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-subscriptions", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/subscriptions/#how-topics-filter", "page_title": "Statement Store Subscriptions", "index": 1, "depth": 2, "title": "How Topics Filter", "anchor": "how-topics-filter", "start_char": 717, "end_char": 1736, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:65b34cc1ec61f0e7040dd774adb1af8c69385b82619a90ff7a1a1ff16bcb0174", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Topics Filter\n\nTwo topics shape every subscription:\n\n- **The primary topic**: The Product's identity on the gossip layer. The SDK derives it as `blake2b(appName)` and tags every submission your Product publishes with that primary topic. Subscribers from _other_ Products on the same network see only their own traffic, and your subscribers see only yours — the node filters traffic from other Products at the boundary before it reaches your callback.\n- **The optional `topic2`**: Scopes a subscription further within your Product's primary topic. Pass it as a room id, a document id, or any other secondary key. The SDK hashes it with Blake2b-256 and adds it to the filter; only statements that match both topics are forwarded.\n\nA Product subscribing without `topic2` sees every statement published anywhere in your Product. With `topic2`, it sees only the slice that matches the secondary key. Both shapes are routinely useful — global Product chat needs the full stream; a specific room needs the scoped one."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-subscriptions", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/subscriptions/#what-the-callback-receives", "page_title": "Statement Store Subscriptions", "index": 2, "depth": 2, "title": "What the Callback Receives", "anchor": "what-the-callback-receives", "start_char": 1736, "end_char": 2208, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:65b34cc1ec61f0e7040dd774adb1af8c69385b82619a90ff7a1a1ff16bcb0174", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What the Callback Receives\n\nThe subscription delivers each matching statement to your callback decoded into your typed `T` and deduped by channel and content hash. The dedup means:\n\n- A statement that propagates to the Product's node via multiple gossip paths fires the callback only once.\n- A statement replaced on the same channel by a newer one (see [Channels](/reference/apps/infrastructure/statement-store/channels/)) fires the callback for the newer value only."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-subscriptions", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/subscriptions/#subscription-lifecycle", "page_title": "Statement Store Subscriptions", "index": 3, "depth": 2, "title": "Subscription Lifecycle", "anchor": "subscription-lifecycle", "start_char": 2208, "end_char": 2600, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:65b34cc1ec61f0e7040dd774adb1af8c69385b82619a90ff7a1a1ff16bcb0174", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Subscription Lifecycle\n\n`client.subscribe` returns an `Unsubscribable` whose `unsubscribe()` method tears down the JSON-RPC subscription on the node and stops the callback from receiving further events. Tear subscriptions down when the Product no longer needs them — typically on view unmount or process shutdown — so the node doesn't hold open a filter your Product has stopped reading."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-subscriptions", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/subscriptions/#initial-state-behavior", "page_title": "Statement Store Subscriptions", "index": 4, "depth": 2, "title": "Initial-State Behavior", "anchor": "initial-state-behavior", "start_char": 2600, "end_char": 3251, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:65b34cc1ec61f0e7040dd774adb1af8c69385b82619a90ff7a1a1ff16bcb0174", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initial-State Behavior\n\nSome `subscribe` implementations return the current statement pool matching the filter (a backfill of statements that haven't expired yet) plus an ongoing stream of new matches; some return only the ongoing stream. The Product SDK's default returns the current pool plus the ongoing stream, so a subscriber that joins late still sees recently published statements that haven't aged out.\n\n!!! warning \"Provisional\"\n    The exact backfill behavior, the per-node pool size limits visible to subscribers, and the reconnection / missed-events semantics when a Product's node loses gossip connectivity are still being finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-infrastructure-statement-store-subscriptions", "url": "https://developer.polkadot.com/reference/apps/infrastructure/statement-store/subscriptions/#where-to-go-next", "page_title": "Statement Store Subscriptions", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3251, "end_char": 3909, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:65b34cc1ec61f0e7040dd774adb1af8c69385b82619a90ff7a1a1ff16bcb0174", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Channels**\n\n    ---\n\n    The last-write-wins primitive built on the same gossip layer — `topic2` filters by scope; channels filter by replacement semantics.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/channels/)\n\n- <span class=\"badge learn\">Learn</span> **Lifecycle**\n\n    ---\n\n    Where in the lifecycle a subscription attaches (step 4: gossip propagation) and what the dedup behavior protects against.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/infrastructure/statement-store/lifecycle/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-account-management", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/account-management/#introduction", "page_title": "Account Management Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 710, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:054cde7dcd1fda0d72fb09c0fbd7dd9ef734883b2672e8b0699bd5a099757bfd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Account Management method group lets a Product discover which account it should operate against. A Polkadot Product never sees the user's root identity; it sees a per-Product sub-account derived from the user's identity and the Product's `.dot` domain. See [Sandbox and Sub-Accounts](/reference/apps/protocol/truapi/sandbox/) for the derivation model. This method group is the surface that resolves that sub-account, exposes its address, and returns related state.\n\nThe Product SDK wraps this surface as `SignerManager.getProductAccount(dotNsIdentifier, derivationIndex)` in [`@parity/product-sdk-signer`](https://www.npmjs.com/package/@parity/product-sdk-signer)."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-account-management", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/account-management/#conceptual-contract", "page_title": "Account Management Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 710, "end_char": 1857, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:054cde7dcd1fda0d72fb09c0fbd7dd9ef734883b2672e8b0699bd5a099757bfd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group covers:\n\n- **Resolving a Product-scoped account**: Given the Product's dotNS identifier and a derivation index (`0` is the conventional default), the Host returns a `SignerAccount` with the SS58-formatted address, the raw public key, and an optional display name.\n- **Listing accounts available to the Product**: The Host enumerates the sub-accounts the user has approved for this Product to see.\n- **Selecting an active account**: Before the Product invokes any signing operation, it tells the Host which account it intends to use for the rest of the session or until it switches accounts.\n\nAccount resolution is local and instantaneous. The Host computes the derived address without needing to round-trip to the paired App. The private key never leaves the App; the address derivation uses public information only.\n\n!!! warning \"Provisional\"\n    Multi-account scenarios (a Product asking for several sub-accounts at non-default indexes for distinct flows), cross-domain account requests (alias-scoped accounts spanning multiple `.dot` domains), and the precise list-accounts surface are still being finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-account-management", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/account-management/#where-to-go-next", "page_title": "Account Management Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 1857, "end_char": 2444, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:054cde7dcd1fda0d72fb09c0fbd7dd9ef734883b2672e8b0699bd5a099757bfd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Sandbox and Sub-Accounts**\n\n    ---\n\n    The conceptual model for why a Product gets a derived sub-account in the first place, and how isolation works.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/sandbox/)\n\n- <span class=\"badge guide\">Guide</span> **Accounts and Signing**\n\n    ---\n\n    The Product-side how-to: getting an account, building a transaction, and submitting it.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/sign-and-submit/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-calls", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/calls/#introduction", "page_title": "TrUAPI Calls Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 1008, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2015b50e45bd48a9eb2e55e9ffab00b129ed5f726ad547b5fd2803e93ba71bc2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe TrUAPI Calls method group is the lifecycle handshake between a Product and its Host. When a Product loads, it identifies itself to the Host; the Host responds with the TrUAPI surface the Product is allowed to use. Every other method group sits on top of this one — a Product cannot invoke any capability until the handshake completes.\n\nFor Product developers, this is mostly implicit. The [`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk) core handles the handshake in `createApp()` and exposes the resulting `App` object that the rest of the SDK relies on. For Host developers, this is the entry point that every Host implementation has to honor.\n\n!!! warning \"Provisional\"\n    The exact set of lifecycle calls in this group, their names, parameters, and the precise sequencing the Host enforces during Product load are still being finalized. The conceptual contract below is stable; per-call signatures will be added as the surface confirms."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-calls", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/calls/#conceptual-contract", "page_title": "TrUAPI Calls Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 1008, "end_char": 1935, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2015b50e45bd48a9eb2e55e9ffab00b129ed5f726ad547b5fd2803e93ba71bc2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThree things have to happen between a Product loading and that Product being able to use the rest of TrUAPI:\n\n- **Product identifies itself**: The Product declares its identity, typically its `.dot` name, so the Host can scope sub-accounts, storage, and topic filters consistently.\n- **Host advertises capabilities**: The Host responds with the TrUAPI version it implements and the set of method groups available. A Product can branch on the returned capabilities if it needs to support multiple Hosts with different capability sets.\n- **Product completes setup-time configuration**: The Product configures session-level objects, such as the chain client, storage handle, and signer, against the Host context the lifecycle call returned.\n\nAfter the lifecycle handshake completes, the Product is in steady state: every other call (signing, storage, chat, chain reads) goes through its own method group."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-calls", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/calls/#where-to-go-next", "page_title": "TrUAPI Calls Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 1935, "end_char": 2312, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2015b50e45bd48a9eb2e55e9ffab00b129ed5f726ad547b5fd2803e93ba71bc2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Permissions**\n\n    ---\n\n    The next layer after the lifecycle handshake: what capabilities the Host will let the Product actually invoke, based on declared and granted permissions.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/permissions/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-chain-interaction", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/chain-interaction/#introduction", "page_title": "Chain Interaction Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 753, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d2e6850892250fa921d5cededd7dfeb955e49b051bc47ee141548360ab68880f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Chain Interaction method group lets a Product read on-chain state, including account balances, storage items, and runtime constants, and subscribe to changes on those values. It is the foundation most Products build on. Reading state is usually the first thing a Product does after lifecycle setup.\n\nThe Product SDK wraps this surface as [`@parity/product-sdk-chain-client`](https://www.npmjs.com/package/@parity/product-sdk-chain-client), which gives the Product a typed PAPI client per connected chain. The same code works whether the Product runs inside a Host, where calls route through the Host's chain client, or outside one in development, where the client falls back to a direct WebSocket connection."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-chain-interaction", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/chain-interaction/#conceptual-contract", "page_title": "Chain Interaction Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 753, "end_char": 2254, "estimated_token_count": 322, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d2e6850892250fa921d5cededd7dfeb955e49b051bc47ee141548360ab68880f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group exposes the chain-client surface a Product expects, with the Host handling the routing:\n\n- **Connecting to one or more chains**: A preset path (`getChainAPI(env)`) returns a ready-to-use client for a known environment. A Bring Your Own Descriptors path (`createChainClient`) lets the Product compose any set of chains. Both paths produce the same client shape.\n- **Reading storage**: Every connected chain exposes a typed `.query` surface for storage items and a `.constants` surface for runtime constants via PAPI's typed descriptors.\n- **Subscribing to changes**: The underlying PAPI client exposes `watchValue(address)` and similar primitives for live subscriptions. The Host mediates the connection but the subscription surface is the standard PAPI one.\n- **Reading multiple chains in parallel**: Independent connections per chain let reads compose with `Promise.all`.\n- **Dropping to the raw PAPI client**: `.raw` exposes the underlying `PolkadotClient` for advanced flows the typed surface does not cover, such as custom remote procedure call methods, low-level submissions, and raw storage subscriptions.\n\nFor the conceptual model and the Product-side how-to, see [Read Chain State](/apps/build/read-chain-state/).\n\n!!! warning \"Provisional\"\n    Subscription error semantics (reconnection, missed-events recovery), per-Host differences in how the underlying connection is routed, and the precise set of presets shipped with the SDK are still being finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-chain-interaction", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/chain-interaction/#where-to-go-next", "page_title": "Chain Interaction Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2254, "end_char": 2851, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d2e6850892250fa921d5cededd7dfeb955e49b051bc47ee141548360ab68880f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Read Chain State**\n\n    ---\n\n    The Product-side how-to: preset and BYOD connection paths, reading storage / constants / account state, multi-chain reads.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/read-chain-state/)\n\n- <span class=\"badge learn\">Learn</span> **Signing**\n\n    ---\n\n    The signing method group that complements chain reads and lets a Product react to state changes on-chain.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/signing/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-chat", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/chat/#introduction", "page_title": "Chat Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 9, "end_char": 669, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1af1e04a9944eac5374ac59e01a48850a913152ad5241c7df273a290ecb05bb4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Chat method group lets a Product participate in the Polkadot App's chat surface by registering as a bot in a room, publishing typed messages, and rendering custom message types that the App displays inline. The underlying transport composes the Statement Store for signaling with the Bulletin Chain for content that has to outlive the gossip time to live (TTL). The Chat group exposes a higher-level surface on top of that pattern.\n\nFor the conceptual model of how Chat composes the two layers, see the [Chat in the Polkadot App](/reference/apps/hosts/polkadot-app/chat/) reference. This page documents the TrUAPI surface that powers it."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-chat", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/chat/#conceptual-contract", "page_title": "Chat Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 669, "end_char": 1969, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1af1e04a9944eac5374ac59e01a48850a913152ad5241c7df273a290ecb05bb4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nMethods in this group fall into three families:\n\n- **Room and bot registration**: A Product registers as a bot inside a room and creates simple group chats via `host_chat_create_simple_group`, introduced in `v0.2`. The registration call is gated by the standard Permissions surface.\n- **Publishing typed messages**: The Host accepts `Text`, `RichText`, `Actions`, `File`, `Reaction`, and `Custom` message types. It handles encoding, attaches the per-Product account context, and dispatches to the Statement Store and Bulletin Chain underneath.\n- **Custom-message rendering (reverse subscription)**: `product_chat_custom_message_render_subscribe` lets the App ask the Product to render its own `Custom` message types in place. The Host opens a subscription against the Product, and the Product responds with rendered output for each message it owns.\n\nMessages a Product submits before bot registration completes are queued automatically. The Product does not need to track registration state.\n\n!!! warning \"Provisional\"\n    Lifecycle semantics around room membership, the precise shape of typed-message payloads, and the rendering-subscription contract are still being finalized. The capabilities above are stable; per-method signatures will be added as the surface confirms."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-chat", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/chat/#where-to-go-next", "page_title": "Chat Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 1969, "end_char": 2319, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1af1e04a9944eac5374ac59e01a48850a913152ad5241c7df273a290ecb05bb4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Chat in the Polkadot App**\n\n    ---\n\n    The conceptual reference for how Chat composes Statement Store and Bulletin Chain, and what each message type is for.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-app/chat/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-entropy", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/entropy/#introduction", "page_title": "Entropy Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 1690, "estimated_token_count": 361, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea41fe3c2220379ea8a486e2140ddc34d963a0dfe9cd3dd0745859bbe8ef27f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Entropy method group lets a Product obtain a stable secret derived from the user's root key, scoped to that Product. A Product uses it to seed key material it needs to hold itself — an encryption key for local data, a deterministic identifier, a seed for a Product-side keypair — without ever touching the user's root entropy or asking the user to manage a separate secret.\n\nThe value is deterministic: it is derived from the user's root [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) entropy through a three-layer BLAKE2b-256 keyed-hashing scheme, so the same input always produces the same output. A Product that asks for the same derivation context tomorrow, or on another device the user has restored, gets the same 32 bytes back. This is what makes it useful for seeding: the Product can re-derive its key material instead of storing it.\n\n!!! danger \"Not a randomness source\"\n    Host-derived entropy is deterministic and pre-computable — it is key-derivation, not randomness. Do **not** use it for lottery draws, fair-shuffle games, randomized selection, or any flow where a value must be unpredictable to the parties involved. Anyone who can reproduce the derivation can predict the output. For unpredictable values, use the browser's `crypto.getRandomValues`; for randomness that an external party must be able to verify against the chain, use an on-chain VRF or beacon directly, not this group.\n\nThis is the same `entropy = randomness` confusion behind the RFC-7 bug, where a Host minted a random `rootAccountSecret` instead of deriving it. The point of this group is the opposite of randomness: reproducible derivation."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-entropy", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/entropy/#conceptual-contract", "page_title": "Entropy Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 1690, "end_char": 2546, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea41fe3c2220379ea8a486e2140ddc34d963a0dfe9cd3dd0745859bbe8ef27f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group exposes a single derivation primitive:\n\n- **Deriving entropy for a context**: The Product requests 32 bytes of entropy derived from the user's root entropy and bound to a derivation context. The same context always yields the same bytes; two different contexts yield independent values, so a Product cannot accidentally reuse one secret where it meant to use another.\n\nThere is no subscription, no per-block or per-epoch update, and no randomness beacon. The group is one `host_derive_entropy` request and its deterministic response.\n\n!!! warning \"Provisional\"\n    The exact derivation-context surface (how a Product names and scopes a derivation) and the SDK wrapper around `host_derive_entropy` are still being finalized. The deterministic-derivation contract described here matches the TrUAPI v0.2 spec and is stable."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-entropy", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/entropy/#where-to-go-next", "page_title": "Entropy Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2546, "end_char": 2933, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea41fe3c2220379ea8a486e2140ddc34d963a0dfe9cd3dd0745859bbe8ef27f3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Sandbox and Sub-Accounts**\n\n    ---\n\n    Why a Product is scoped to derived material rather than the user's root identity — the same derivation principle this group exposes for arbitrary secrets.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/sandbox/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/#introduction", "page_title": "TrUAPI Reference", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 11, "end_char": 2454, "estimated_token_count": 569, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:312436cd0444095ce634f80565544ff13c40b8271c87ae567178ced127606622", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nTrUAPI is the protocol every Polkadot Product uses to talk to the Host running it. It is the _only_ interface a Product has to the rest of the world. Every chain interaction, storage write, outbound request, signing operation, and Proof of Personhood proof crosses this boundary, and the Host on the other side enforces the sandbox.\n\nIn the Polkadot Triangle, three Hosts run Products. TrUAPI is the contract by which a Product talks to whichever Host is loading it. Most Product developers will never call TrUAPI directly. The [Product SDK](/reference/glossary/#polkadot-sdk) (the `@parity/product-sdk` family of packages) wraps it in typed methods. The methods you call still go through TrUAPI, and the Host validates and routes everything.\n\n!!! note \"TrUAPI and its packages\"\n    TrUAPI is the name of the protocol specification maintained at [`paritytech/truapi`](https://github.com/paritytech/truapi). It ships as two layers of packages: [`@parity/truapi`](https://www.npmjs.com/package/@parity/truapi) is the low-level generated protocol client (the wire), and the [`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk) family is the higher-level SDK most Products use. This reference uses \"TrUAPI\" for the protocol surface and names the `@parity/product-sdk-*` package in the [Packages](/reference/apps/protocol/truapi/packages/) table that wraps each group.\n\nThis reference documents the protocol surface in three layers:\n\n1. **Conceptual model**: Why the Host-Product boundary exists, what derived sub-accounts mean, and how the sandbox enforces isolation. See [Sandbox and Sub-Accounts](/reference/apps/protocol/truapi/sandbox/).\n2. **Operational properties**: The protocol's versioning model and the packages that implement it. See [Versioning](/reference/apps/protocol/truapi/versioning/) and [Packages](/reference/apps/protocol/truapi/packages/).\n3. **Method groups**: Eleven groups covering the capabilities a Product reaches for. One page per group is linked in [The Eleven Method Groups](#the-eleven-method-groups). A few host-lifecycle methods sit outside these groups; see the note below.\n\n!!! warning \"Provisional\"\n    The complete per-method reference for TrUAPI remains provisional. The method-group pages below cover what each group is for and the conceptual contract; the exhaustive per-method signatures, parameter shapes, and return types will be added as the surface stabilizes."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/#two-audiences", "page_title": "TrUAPI Reference", "index": 1, "depth": 2, "title": "Two Audiences", "anchor": "two-audiences", "start_char": 2454, "end_char": 3281, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:312436cd0444095ce634f80565544ff13c40b8271c87ae567178ced127606622", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Two Audiences\n\nTrUAPI has two distinct readerships, and the per-method pages are written to serve both at once:\n\n- **Product developers**: You build Products that call the TrUAPI surface. You need to know what each method does, what permissions gate it, what it returns, and how the Product SDK wraps it.\n- **Host developers**: You build Hosts that implement the TrUAPI surface. You need to know what each method must guarantee, how to validate the Product's call, and how to enforce the sandbox at every entry point.\n\nA Product developer can usually rely on the Product SDK (the [`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk) family of packages) and never call TrUAPI directly. A Host developer is reading the same pages to know what the SDK calls underneath, and what their Host has to honor."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/#the-eleven-method-groups", "page_title": "TrUAPI Reference", "index": 2, "depth": 2, "title": "The Eleven Method Groups", "anchor": "the-eleven-method-groups", "start_char": 3281, "end_char": 6776, "estimated_token_count": 808, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:312436cd0444095ce634f80565544ff13c40b8271c87ae567178ced127606622", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Eleven Method Groups\n\n| Group                                                                                     | Covers                                                                                               |\n|:-----------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------:|\n| [TrUAPI Calls](/reference/apps/protocol/truapi/calls/)                    | The lifecycle calls Products use to identify themselves and the Host uses to introduce capabilities. |\n| [Permissions](/reference/apps/protocol/truapi/permissions/)               | Declaring, querying, and gating on Product capabilities.                                             |\n| [Local Storage](/reference/apps/protocol/truapi/local-storage/)           | The `KvStore` API for per-Product, per-device key-value persistence.                                 |\n| [Account Management](/reference/apps/protocol/truapi/account-management/) | Resolving per-Product sub-accounts and reading their state.                                          |\n| [Signing](/reference/apps/protocol/truapi/signing/)                       | The mediated signing flow for building transactions and dispatching them through the paired App.     |\n| [Chat](/reference/apps/protocol/truapi/chat/)                             | Room and bot registration, typed message publishing, custom message rendering.                       |\n| [Statement Store](/reference/apps/protocol/truapi/statement-store/)       | Publishing and subscribing to gossip-distributed signed statements on People Chain.                  |\n| [Preimage](/reference/apps/protocol/truapi/preimage/)                     | Off-chain content addressed by hash for on-chain operations to dereference.                          |\n| [Chain Interaction](/reference/apps/protocol/truapi/chain-interaction/)   | Reading chain state and subscribing to changes through the Host.                                     |\n| [Payment](/reference/apps/protocol/truapi/payment/)                       | Payment-flow primitives (general `Balances` transfers and the Pocket flow).                          |\n| [Entropy](/reference/apps/protocol/truapi/entropy/)                       | Deterministic per-Product entropy derived from the user's root key (key-derivation, not randomness). |\n\n!!! note \"Methods outside the eleven groups\"\n    A small number of host-lifecycle methods in the TrUAPI v0.2 spec are not part of any of the eleven groups above — `host_navigate_to`, `host_push_notification`, and `host_feature_supported`. They are Host-environment hooks rather than Product capabilities, and are documented per-Host rather than in this protocol surface.\n\n!!! warning \"Cross-Host conformance is the target, not yet the guarantee\"\n    TrUAPI is specified as a single canonical surface, and the intent is that a Product runs unchanged across every Host. Today that holds between Polkadot Web and Polkadot Desktop, which share the TypeScript host-container (SCALE, `host_*` calls). The mobile Polkadot App — the canonical signer for transactions — currently exposes a hand-written JSON bridge whose method names differ from the spec and, in places, between iOS and Android. Treat \"the same surface on every Host\" as the conformance goal the spec defines, not a settled property of every shipping Host. See the cross-host conformance tracking in the SDK team's work."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/#high-level-diagram", "page_title": "TrUAPI Reference", "index": 3, "depth": 2, "title": "High-Level Diagram", "anchor": "high-level-diagram", "start_char": 6776, "end_char": 7085, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:312436cd0444095ce634f80565544ff13c40b8271c87ae567178ced127606622", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## High-Level Diagram\n\n!!! warning \"Provisional\"\n    The canonical TrUAPI architecture diagram showing the Host, the Product, the SDK layers in between, and the eleven method groups as a single map — is still being finalized. It will be embedded here and referenced from the section overview once confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/#where-to-go-next", "page_title": "TrUAPI Reference", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 7085, "end_char": 7969, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:312436cd0444095ce634f80565544ff13c40b8271c87ae567178ced127606622", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Sandbox and Sub-Accounts**\n\n    ---\n\n    Why a Product gets a derived sub-account rather than the user's root identity, and why the Host API is the only egress.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/sandbox/)\n\n- <span class=\"badge learn\">Learn</span> **Versioning**\n\n    ---\n\n    How TrUAPI versions evolve and what compatibility a Product can rely on across them.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/versioning/)\n\n- <span class=\"badge learn\">Learn</span> **Packages**\n\n    ---\n\n    The package map: which SDK package wraps which TrUAPI method group, and where the boundary between Product code and Host code lives.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/packages/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-local-storage", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/local-storage/#introduction", "page_title": "Local Storage Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 941, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dc11d991801ccee9c406b46bd0dcefc69573865aa1fe9bd1aeea957a0e98f4a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Local Storage method group exposes the per-Product, per-device key-value store a Product uses to remember values between sessions, such as user preferences, drafts, and cached values. The Product SDK wraps this group as a `KvStore` in the [`@parity/product-sdk-local-storage`](https://www.npmjs.com/package/@parity/product-sdk-local-storage) package.\n\nTwo properties matter for how this group is shaped:\n\n- **Per-Product namespacing**: The Host prepends every key with a prefix derived from the Product's `.dot` domain. A Product cannot accidentally read or write another Product's keys; the boundary is at the Host, not in the Product's code.\n- **Host-dependent backend**: Inside Polkadot Desktop, reads and writes go to the Host's on-device storage. Inside Polkadot Web, the Host backs them with browser-managed storage. The SDK abstracts the difference; the Product's code is identical either way."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-local-storage", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/local-storage/#conceptual-contract", "page_title": "Local Storage Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 941, "end_char": 1845, "estimated_token_count": 218, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dc11d991801ccee9c406b46bd0dcefc69573865aa1fe9bd1aeea957a0e98f4a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group exposes the standard key-value surface plus a few helpers:\n\n- **`get(key)`, `set(key, value)`, and `remove(key)`**: Read, write, and delete a string-valued key.\n- **`getJSON(key)` and `setJSON(key, value)`**: Read and write JSON-serializable values, with the Host handling encoding.\n- **Prefixed-namespace creation**: A Product can carve out further sub-namespaces inside its own per-Product space, useful when multiple Product features share the store and want to avoid collisions.\n\nReads return `null` for absent keys; deletes are idempotent (no error on missing keys).\n\n!!! warning \"Provisional\"\n    Quota policy (per-Product byte caps, eviction rules), the exact per-Host backend behavior (especially around Web's browser-managed storage), and any subscription-style key-change notifications are still being finalized. The basic key-value contract above is stable."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-local-storage", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/local-storage/#where-to-go-next", "page_title": "Local Storage Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 1845, "end_char": 2180, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dc11d991801ccee9c406b46bd0dcefc69573865aa1fe9bd1aeea957a0e98f4a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Persist Data Locally**\n\n    ---\n\n    The Product-side how-to: initializing the store, reading and writing values, prefix namespaces, error handling.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/persist-data-locally/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-packages", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/packages/#introduction", "page_title": "TrUAPI Packages", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 617, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c5e6edc3f9389cf83fcc825477f3da158ce8bb91ad2274d1f5c079f85cc016b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA Product developer rarely calls TrUAPI directly. The [`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk) family of packages is the typed wrapper, and most Products will install one of them per capability they consume. This page maps which package wraps which TrUAPI method group, and which Product-side how-to guide demonstrates each.\n\n!!! warning \"Provisional\"\n    Package names and version pins remain provisional while the SDK matures. This page documents known packages and boundaries; exact versions and future package splits are outside the current scope."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-packages", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/packages/#package-map", "page_title": "TrUAPI Packages", "index": 1, "depth": 2, "title": "Package Map", "anchor": "package-map", "start_char": 617, "end_char": 5093, "estimated_token_count": 1111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c5e6edc3f9389cf83fcc825477f3da158ce8bb91ad2274d1f5c079f85cc016b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Package Map\n\n|                            TrUAPI Method Group                            |                                                                                      SDK Package                                                                                      |                              Product-Side How-To                               |\n|:-------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------:|\n|          [TrUAPI Calls](/reference/apps/protocol/truapi/calls/)           |                                                                             `@parity/product-sdk` (core)                                                                              |                           N/A (lifecycle, implicit)                            |\n|        [Permissions](/reference/apps/protocol/truapi/permissions/)        |                                                                             `@parity/product-sdk` (core)                                                                              |                                      N/A                                       |\n|      [Local Storage](/reference/apps/protocol/truapi/local-storage/)      |                                        [`@parity/product-sdk-local-storage`](https://www.npmjs.com/package/@parity/product-sdk-local-storage)                                         |           [Persist Data Locally](/apps/build/persist-data-locally/)            |\n| [Account Management](/reference/apps/protocol/truapi/account-management/) | [`@parity/product-sdk-signer`](https://www.npmjs.com/package/@parity/product-sdk-signer) / [`@parity/product-sdk-address`](https://www.npmjs.com/package/@parity/product-sdk-address) |          [Sign and Submit Transactions](/apps/build/sign-and-submit/)          |\n|            [Signing](/reference/apps/protocol/truapi/signing/)            |                                    `@parity/product-sdk-signer` / [`@parity/product-sdk-tx`](https://www.npmjs.com/package/@parity/product-sdk-tx)                                    |          [Sign and Submit Transactions](/apps/build/sign-and-submit/)          |\n|               [Chat](/reference/apps/protocol/truapi/chat/)               |                                                                            `@parity/product-sdk` chat APIs                                                                            |                                      N/A                                       |\n|    [Statement Store](/reference/apps/protocol/truapi/statement-store/)    |                                      [`@parity/product-sdk-statement-store`](https://www.npmjs.com/package/@parity/product-sdk-statement-store)                                       | [Publish and Subscribe to Off-Chain Data](/apps/build/pub-sub-off-chain-data/) |\n|           [Preimage](/reference/apps/protocol/truapi/preimage/)           |                                        [`@parity/product-sdk-host`](https://www.npmjs.com/package/@parity/product-sdk-host) (Preimage manager)                                        |                       (covered in Bulletin Chain how-to)                       |\n|  [Chain Interaction](/reference/apps/protocol/truapi/chain-interaction/)  |     [`@parity/product-sdk-chain-client`](https://www.npmjs.com/package/@parity/product-sdk-chain-client) and [`polkadot-api`](https://www.npmjs.com/package/polkadot-api) (PAPI)      |               [Read Chain State](/apps/build/read-chain-state/)                |\n|            [Payment](/reference/apps/protocol/truapi/payment/)            |                                  `@parity/product-sdk-tx` and [`@parity/product-sdk-utils`](https://www.npmjs.com/package/@parity/product-sdk-utils)                                  |                                      N/A                                       |\n|            [Entropy](/reference/apps/protocol/truapi/entropy/)            |                                                               `@parity/product-sdk` (deterministic entropy derivation)                                                                |                               n/a (forthcoming)                                |"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-packages", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/packages/#the-boundary-between-product-code-and-host-code", "page_title": "TrUAPI Packages", "index": 2, "depth": 2, "title": "The Boundary Between Product Code and Host Code", "anchor": "the-boundary-between-product-code-and-host-code", "start_char": 5093, "end_char": 5975, "estimated_token_count": 209, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c5e6edc3f9389cf83fcc825477f3da158ce8bb91ad2274d1f5c079f85cc016b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Boundary Between Product Code and Host Code\n\nA useful way to read the package map is by where the package executes:\n\n- **Pure Product packages**: Packages such as `@parity/product-sdk-local-storage`, `@parity/product-sdk-signer`, `@parity/product-sdk-chain-client`, and `@parity/product-sdk-tx` execute inside the Product sandbox. They are typed wrappers that build a TrUAPI call and dispatch it through the Host API. Your Product depends on them at compile time.\n- **Product-SDK umbrella**: `@parity/product-sdk` ties them together at the top of a Product and wires up the App / chain / storage surfaces with consistent defaults.\n- **Host implementations of TrUAPI**: Host implementations live in the Hosts themselves, not in any Product-side package. A Product does not depend on Host code at compile time; it depends on the Host honoring the TrUAPI contract at run time."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-packages", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/packages/#where-to-go-next", "page_title": "TrUAPI Packages", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5975, "end_char": 6250, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c5e6edc3f9389cf83fcc825477f3da158ce8bb91ad2274d1f5c079f85cc016b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Versioning**\n\n    ---\n\n    How package versions map to TrUAPI protocol versions.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/versioning/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-payment", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/payment/#introduction", "page_title": "Payment Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 561, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2602e4ab028e3bb040ca09abe92d85ae6b327c7b7b4cf4999d1a819b6b3a0216", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Payment method group lets a Product accept or initiate payments. Payments are signed transactions like any other transaction, but this group collects the two payment shapes a Product is most likely to need, the standard `Balances.transfer_keep_alive` flow and the personhood-aware Pocket flow.\n\nFor most Product use cases, this group is consumed through `@parity/product-sdk-tx` and helpers in `@parity/product-sdk-utils` (formatting, validation), with the same `signAndSubmit` round trip every other signed call goes through."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-payment", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/payment/#conceptual-contract", "page_title": "Payment Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 561, "end_char": 2126, "estimated_token_count": 328, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2602e4ab028e3bb040ca09abe92d85ae6b327c7b7b4cf4999d1a819b6b3a0216", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group covers:\n\n- **Building a payment request**: The Product encodes what a merchant is asking for, including recipient, amount, and optional memo, into a payload the payer's Product can parse and pre-fill into a transfer form. No on-chain interaction happens at request-build time; the request is an application-layer payload.\n- **Constructing a transfer extrinsic**: Given a validated recipient and a planck-denominated amount, building a `Balances.transfer_keep_alive` (or `transfer_allow_death` when the sender intends to drain the account) ready to sign.\n- **Submitting and watching the payment**: The Product passes the extrinsic through the standard Signing surface and observes status transitions of `signing`, `broadcasting`, `in-block`, and `finalized`.\n- **Pocket variant**: Pocket is personhood-aware and two-sided. The sender acts on Desktop, the receiver acts on the App, and the receiver explicitly accepts or declines. See [Pocket on Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/pocket/) for the conceptual model.\n\nThe Payment group does not introduce new signing semantics. Every payment-side transaction still routes through the per-transaction approval flow on the paired App.\n\n!!! warning \"Provisional\"\n    The Pocket-specific TrUAPI methods (whether and how a Product can initiate a Pocket transfer programmatically versus relying on Host UI), payment-request URL formats as a canonical wire format, and any asset-aware extensions (multi-asset transfers, pUSD-specific calls) are still being finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-payment", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/payment/#where-to-go-next", "page_title": "Payment Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2126, "end_char": 2457, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2602e4ab028e3bb040ca09abe92d85ae6b327c7b7b4cf4999d1a819b6b3a0216", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Pocket on Polkadot Desktop**\n\n    ---\n\n    The Pocket send flow's conceptual model and how it pairs with the App-side recipient view.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/pocket/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-permissions", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/permissions/#introduction", "page_title": "Permissions Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 16, "end_char": 748, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3727e0711fa047731cd4f354fa7cf1190b2fdcd32a9826c0ceaa731b369019fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Permissions method group is the gate every other method group implicitly passes through. Before a Product can sign a transaction, make an outbound request, or access the microphone, the Host checks two things: did the Product declare the required permission, and did the user grant it? This method group is how a Product reads its own permission state, and how the Host enforces it.\n\nMost Products do not call these methods explicitly. Declarations live in the Product's manifest, and gating happens at the boundary of the methods that actually need a permission, such as signing, network, and media. The Permissions method group exposes the runtime query surface for checking whether a permission is granted."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-permissions", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/permissions/#conceptual-contract", "page_title": "Permissions Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 748, "end_char": 2405, "estimated_token_count": 338, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3727e0711fa047731cd4f354fa7cf1190b2fdcd32a9826c0ceaa731b369019fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThree things sit in this group:\n\n- **Permission queries**: A Product can check whether a given capability is granted, such as with `isGranted(\"ChainSubmit\")`. The shape lets a Product branch on permission state without trying the capability and catching `PermissionDenied`.\n- **Permission grants and re-prompts**: The Host can expose runtime prompts for capabilities the user can elect at runtime rather than at install. The set of runtime-elective permissions versus install-time-only permissions is part of the Host's policy.\n- **Permission-denied error reporting**: Every capability-gated method group bubbles up consistently, so a Product can treat `PermissionDenied` as a uniform failure mode wherever it happens.\n\n!!! note \"Permission names: spec vs. Host-side aliases\"\n    Some permission names in this documentation are Host-side normalizations, not the literal identifiers in the TrUAPI v0.2 spec. In particular, `ExternalRequest` (outbound network access) is a Polkadot Desktop alias; the protocol-level construct is `RemotePermission::Remote(Vec<String>)`, which carries the list of permitted hosts. A Host implementer reading the spec should map the friendly names used here to their spec enum variants.\n\nFor the conceptual model, see the [Polkadot Desktop Permissions](/reference/apps/hosts/polkadot-desktop/permissions/) reference.\n\n!!! warning \"Provisional\"\n    The exhaustive permission taxonomy and the exact runtime-query surface (method names, parameter shapes, return values) are still being finalized. This page documents the conceptual contract; the per-method specifics will be added as the surface confirms."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-permissions", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/permissions/#where-to-go-next", "page_title": "Permissions Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2405, "end_char": 2734, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3727e0711fa047731cd4f354fa7cf1190b2fdcd32a9826c0ceaa731b369019fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Polkadot Desktop Permissions**\n\n    ---\n\n    Host-side enforcement: capability types, manifest declaration, and the denial UX.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/permissions/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-preimage", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/preimage/#introduction", "page_title": "Preimage Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 674, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0610f5d0d6bc8b60517919e71798d918316ab0ba3a3ddcbeeeaded4d031b04", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Preimage method group lets a Product submit off-chain content that on-chain operations dereference by hash. A typical use case is a governance proposal, where the on-chain referendum points at a hash, the preimage is the bytes of the proposal call, and the bytes must be available when the referendum executes.\n\nThe Statement Store and Preimage surfaces look superficially similar because both submit bytes, return a hash, and let on-chain logic reference that hash. They are not interchangeable. See the [Statement vs Preimage](/reference/apps/hosts/polkadot-desktop/preimage/#statement-vs-preimage) decision table for which to use when."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-preimage", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/preimage/#conceptual-contract", "page_title": "Preimage Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 674, "end_char": 1649, "estimated_token_count": 192, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0610f5d0d6bc8b60517919e71798d918316ab0ba3a3ddcbeeeaded4d031b04", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group covers:\n\n- **Submitting a preimage**: The Product submits bytes for an on-chain operation that will reference them. The Host signs the submission with the user's per-Product account, subject to the standard signing model, the `ChainSubmit` permission, and per-transaction approval on the paired App.\n- **Hosting the bytes**: The preimage layer hosts the referenced bytes so the on-chain operation can dereference them when it executes. In practice, the Host often routes storage through Bulletin Chain.\n- **Lifecycle management**: Preimages are durable until the referenced operation completes or until they are explicitly cleaned up, unlike statements, which expire after their time to live (TTL).\n\n!!! warning \"Provisional\"\n    The exact set of host calls in this group, supported preimage size limits, the relationship with Bulletin Chain storage, and any preimage-availability hooks for runtime introspection are still being finalized."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-preimage", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/preimage/#where-to-go-next", "page_title": "Preimage Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 1649, "end_char": 2236, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fb0610f5d0d6bc8b60517919e71798d918316ab0ba3a3ddcbeeeaded4d031b04", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Preimage on Polkadot Desktop**\n\n    ---\n\n    The Host-side reference including the Statement-vs-Preimage decision table.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/preimage/)\n\n- <span class=\"badge guide\">Guide</span> **Store Data on Chain**\n\n    ---\n\n    The Product-side how-to for Bulletin Chain storage that the preimage surface often delegates to underneath.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/store-data-on-chain/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-sandbox", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/sandbox/#introduction", "page_title": "Sandbox and Sub-Accounts in TrUAPI", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 641, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfb95c3bfeacbfecf94e487f17cf8c2071e48a43ca3bc771d40666ba82db9f0a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA Polkadot Product runs inside a sandbox enforced by the Host. The sandbox is what makes the platform meaningfully different from \"run third-party code in a browser tab\" — three deliberate constraints, none of which a Product can bypass:\n\n- A Product gets a derived sub-account, not the user's root identity.\n- The Host API is the only egress, meaning the only way a Product can reach the world outside its sandbox.\n- Permissions selectively relax isolation for the capabilities the user has explicitly granted.\n\nThis page is the deep dive on what each constraint means and how it is enforced."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-sandbox", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/sandbox/#why-derived-sub-accounts-not-root-identity", "page_title": "Sandbox and Sub-Accounts in TrUAPI", "index": 1, "depth": 2, "title": "Why Derived Sub-Accounts, Not Root Identity", "anchor": "why-derived-sub-accounts-not-root-identity", "start_char": 641, "end_char": 1810, "estimated_token_count": 264, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfb95c3bfeacbfecf94e487f17cf8c2071e48a43ca3bc771d40666ba82db9f0a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why Derived Sub-Accounts, Not Root Identity\n\nA user has one root identity on the People Chain. If a Product could ask the Host for the user's root key, or for a single account that represents the user across everything, every Product would see the same user, and every Product would be a tracking surface.\n\nInstead, each Product gets a per-domain sub-account, derived deterministically from the user's identity and the Product's `.dot` domain:\n\n- The same user opening `app-a.dot` and `app-b.dot` sees a different account in each Product.\n- The two Products cannot link those accounts back to a shared user without an explicit cross-domain permission grant.\n- The derivation is local (no round trip to the paired App is needed to compute the address), so getting an account is instantaneous from the Product's perspective.\n\nThe trade-off is that the Product cannot accumulate \"the user's full identity.\" It can only see the user's behavior in this Product. Cross-Product correlation is a permission the user grants explicitly, not a default.\n\nFor the Product-side how-to that consumes this surface, see [Sign and Submit Transactions](/apps/build/sign-and-submit/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-sandbox", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/sandbox/#why-the-host-api-is-the-only-egress", "page_title": "Sandbox and Sub-Accounts in TrUAPI", "index": 2, "depth": 2, "title": "Why the Host API Is the Only Egress", "anchor": "why-the-host-api-is-the-only-egress", "start_char": 1810, "end_char": 2770, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfb95c3bfeacbfecf94e487f17cf8c2071e48a43ca3bc771d40666ba82db9f0a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why the Host API Is the Only Egress\n\nA Product running inside a Host has no other way to reach the world. The browser-level network stack, the chain-client, the storage backend, and the signing primitive are all behind the Host API. The Product asks the Host, and the Host decides.\n\nThis matters for two reasons:\n\n- **Consistent sandbox boundary**: Any capability a Product attempts to use crosses TrUAPI. The Host applies permission checks, account scoping, and policy enforcement at that single point. There is no side channel to leak data through.\n- **Backend substitution**: A Product calling `app.wallet.getAnonymousAlias()` gets the same answer whether the Host fetches it from a local cache, a paired phone, or a future Host implementation that resolves it some other way. The Product targets the API, not the implementation.\n\nThe corollary: a Product that wants to do anything not exposed through TrUAPI cannot. There is no escape hatch by design."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-sandbox", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/sandbox/#how-permissions-selectively-relax-isolation", "page_title": "Sandbox and Sub-Accounts in TrUAPI", "index": 3, "depth": 2, "title": "How Permissions Selectively Relax Isolation", "anchor": "how-permissions-selectively-relax-isolation", "start_char": 2770, "end_char": 3650, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfb95c3bfeacbfecf94e487f17cf8c2071e48a43ca3bc771d40666ba82db9f0a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Permissions Selectively Relax Isolation\n\nIsolation is the _default_, not the only mode. The user can grant permissions that selectively widen what a Product can do:\n\n- A Product can request a cross-domain alias, which is an alias scoped to another Product's `.dot` domain. The user sees a consent modal and explicitly approves or denies.\n- A Product can declare an `ExternalRequest` permission with a URL pattern, opening a specific outbound network path the sandbox would otherwise block.\n- A Product can request `ChainSubmit` for the ability to ask the Host to present a signing prompt to the user. The grant covers only the ability to ask; per-transaction approval is still required.\n\nEvery permission is a narrow, declared widening, not a broad \"trust this Product\" toggle. Full isolation is the default when the user installs a new Product without granting anything."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-sandbox", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/sandbox/#where-to-go-next", "page_title": "Sandbox and Sub-Accounts in TrUAPI", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3650, "end_char": 4325, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dfb95c3bfeacbfecf94e487f17cf8c2071e48a43ca3bc771d40666ba82db9f0a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Accounts and Signing**\n\n    ---\n\n    The Product-side how-to that consumes the sub-account surface: setting up the signer, building transactions, and submitting them through the Host.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/sign-and-submit/)\n\n- <span class=\"badge learn\">Learn</span> **Signing in Polkadot Desktop**\n\n    ---\n\n    How the `ChainSubmit` permission grants ability-to-request without granting auto-sign, and how Desktop enforces that distinction.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/signing/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-signing", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/signing/#introduction", "page_title": "Signing Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 643, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4c85105f2c428dc5d6a716e2525561c0986db57ffeeda24a5637a01d23b1d85", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Signing method group lets a Product submit a signed transaction. The Host on the other side does not sign. It mediates by rendering the signing modal, forwarding the payload to the paired Polkadot App, waiting for the user's approval on their phone, and returning the result as a signature, rejection, or timeout.\n\nThe Product SDK wraps this as `tx.signAndSubmit(signer)` on a Polkadot API (PAPI) transaction object plus a signer returned by `SignerManager.getSigner()`. From the Product's perspective, it is a single awaited promise. Underneath, it is a TrUAPI dispatch and a round trip to the user's phone."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-signing", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/signing/#conceptual-contract", "page_title": "Signing Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 643, "end_char": 1647, "estimated_token_count": 211, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4c85105f2c428dc5d6a716e2525561c0986db57ffeeda24a5637a01d23b1d85", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group covers:\n\n- **Submitting a payload for signing**: The Product hands the Host a pre-built, account-bound transaction. The Host renders the signing modal and forwards the payload to the paired App.\n- **Watching the result**: The Host returns the outcome — signature obtained (Host then broadcasts), explicit user rejection (`HostRejectedError`), or session timeout (`TimeoutError`).\n- **Surfacing status transitions**: Through PAPI's `submitAndWatch` companion surface, the Product sees status events (`signing`, `broadcasting`, `in-block`, and `finalized`) as the transaction progresses.\n\nThe default contract is the one that makes the model trustworthy: every transaction requires a per-request approval on the phone, with no session-scoped consent and no path for a Product to obtain a signature without the user approving the specific payload they were shown. This per-request flow is what a Product gets unless an Auto-Signing resource has been explicitly allocated."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-signing", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/signing/#auto-signing", "page_title": "Signing Method Group", "index": 2, "depth": 3, "title": "Auto-Signing", "anchor": "auto-signing", "start_char": 1647, "end_char": 3310, "estimated_token_count": 367, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4c85105f2c428dc5d6a716e2525561c0986db57ffeeda24a5637a01d23b1d85", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Auto-Signing\n\nThe shipping [`@parity/truapi`](https://www.npmjs.com/package/@parity/truapi) wire carries an **Auto-Signing** capability on top of the per-request default. A Product requests it as an allocatable resource through `host_request_resource_allocation`; the user must explicitly grant the allocation, and the Host scopes what it covers. Polkadot Desktop ships this as `signing-bot-autopair`, which pairs a signing bot so that allocated transactions are signed without a per-transaction prompt. Auto-Signing is opt-in, user-granted, and bounded — it does not remove the approval requirement for ordinary signing; it replaces it, within the allocated scope, with an up-front consent the user can revoke.\n\n!!! note \"Newer than the v0.2 method-group surface\"\n    Auto-Signing is carried by the `@parity/truapi` wire but is not part of the v0.2 method-group surface documented in these pages, so it is a place where the shipping protocol is ahead of the documented groups. A Host implementer working only from the v0.2 method groups will not find it there; a Product running on today's Desktop can use it.\n\nFor the full mediated-signing flow (the three-actor model, the `ChainSubmit` permission, failure-mode UX), see the [Signing in Polkadot Desktop](/reference/apps/hosts/polkadot-desktop/signing/) reference.\n\n!!! warning \"Provisional\"\n    Edge cases still being defined include multi-signature flows that aggregate across multiple Hosts, batched transactions that present as a single user prompt, and custom signing policies (delegation, time-windowed allowances). The single-transaction, single-prompt contract described in this section is stable."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-signing", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/signing/#where-to-go-next", "page_title": "Signing Method Group", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3310, "end_char": 3943, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4c85105f2c428dc5d6a716e2525561c0986db57ffeeda24a5637a01d23b1d85", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Signing in Polkadot Desktop**\n\n    ---\n\n    The mediated-signing flow in detail: how the Host renders the modal, forwards to the paired App, and surfaces timeouts and rejections.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/signing/)\n\n- <span class=\"badge guide\">Guide</span> **Accounts and Signing**\n\n    ---\n\n    The Product-side how-to with the `try`/`catch` patterns for `HostRejectedError` and `TimeoutError`.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/sign-and-submit/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-statement-store", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/statement-store/#introduction", "page_title": "Statement Store Method Group", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 771, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77b2851e17c54b987a9ebcc78b3de4c80f1a7fead29cb7289d973779b289832f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Statement Store method group lets a Product publish and subscribe to signed, gossip-distributed statements on the People Chain. The Statement Store itself, including the pallet, gossip layer, lifecycle, and validation rules, is a network-layer pub/sub primitive. It is short-lived, allowance-gated, and propagated peer-to-peer. This TrUAPI group is how a Product reaches it through the Host.\n\nThe Product SDK wraps this surface as `StatementStoreClient` from [`@parity/product-sdk-statement-store`](https://www.npmjs.com/package/@parity/product-sdk-statement-store). For the conceptual model of what statements are good for (versus the Bulletin Chain or local storage), see [Where to Store Data](/apps/concepts/data-placement/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-statement-store", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/statement-store/#conceptual-contract", "page_title": "Statement Store Method Group", "index": 1, "depth": 2, "title": "Conceptual Contract", "anchor": "conceptual-contract", "start_char": 771, "end_char": 2347, "estimated_token_count": 334, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77b2851e17c54b987a9ebcc78b3de4c80f1a7fead29cb7289d973779b289832f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conceptual Contract\n\nThe group exposes the standard pub/sub surface with the Host filling in the parts a Product cannot do safely on its own:\n\n- **Publishing a statement**: The Product hands the Host a payload (under the per-statement 512-byte limit), a topic, a channel, a time to live (TTL), and any options. The Host requests an authentication proof from the paired App, attaches the per-Product account context and primary topic (`blake2b(appName)`), and submits to the People Chain node's `statement_submit` JSON-RPC.\n- **Subscribing to a topic filter**: The Product registers a callback for statements matching its primary topic plus any secondary `topic2`. The Host opens the underlying `statement_subscribeStatement` JSON-RPC, decodes payloads, and deduplicates by content hash before invoking the callback.\n- **Channel-based last-write-wins**: When a statement carries a `channel`, the pallet replaces older statements from the same account on the same channel. The SDK abstracts this as `ChannelStore<T>` on top of the underlying method group.\n\nDelivery is best-effort gossip, with no retry, acknowledgment, or ordering guarantee. Reliability is composed at the application layer. For example, if a recipient needs to confirm receipt, they publish an acknowledgment statement back.\n\nFor the Desktop-side mediation perspective, see [Statement Store via Host API](/reference/apps/hosts/polkadot-desktop/statement-store/).\n\n!!! warning \"Provisional\"\n    Detailed error taxonomy, allowance-management primitives, and any direct topic-walking API remain provisional."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-statement-store", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/statement-store/#where-to-go-next", "page_title": "Statement Store Method Group", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2347, "end_char": 3018, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77b2851e17c54b987a9ebcc78b3de4c80f1a7fead29cb7289d973779b289832f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **Exchange Ephemeral Messages**\n\n    ---\n\n    The Product-side how-to: setting up the client, subscribing, publishing typed statements, and using channels.\n\n    [:octicons-arrow-right-24: Get Started](/apps/build/pub-sub-off-chain-data/)\n\n- <span class=\"badge learn\">Learn</span> **Statement Store via Host API**\n\n    ---\n\n    What Polkadot Desktop adds when mediating Statement Store traffic, including proof routing, account context, and per-Product topic scoping.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/hosts/polkadot-desktop/statement-store/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-versioning", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/versioning/#introduction", "page_title": "TrUAPI Versioning", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 15, "end_char": 689, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77e8cea104cb931e9b69704f9778ade59477f143f3bd392d8a900897b59cfe9c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nTrUAPI is versioned. A Host implements a specific version of the protocol; a Product is built against a specific version range; the SDK abstracts most version differences but cannot bridge across breaking changes. This page documents the versioning model so a Product developer knows what to declare and what to expect.\n\n!!! warning \"Provisional\"\n    The detailed compatibility rules between TrUAPI versions, the canonical version number a Product manifest declares, and the deprecation policy for older versions are still being finalized. This page documents the conceptual model; the operational reference will be added once those details are confirmed."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-versioning", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/versioning/#what-a-version-number-identifies", "page_title": "TrUAPI Versioning", "index": 1, "depth": 2, "title": "What a Version Number Identifies", "anchor": "what-a-version-number-identifies", "start_char": 689, "end_char": 1602, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77e8cea104cb931e9b69704f9778ade59477f143f3bd392d8a900897b59cfe9c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Version Number Identifies\n\nA TrUAPI version identifies the set of method groups, their signatures, and their semantics as a single coherent surface. Two Hosts running the same version of TrUAPI must accept the same calls with the same parameters and return values with the same shape; a Product targeting that version can rely on consistent behavior across them.\n\nA change between two versions can be:\n\n- **Additive**: New methods or new optional parameters. A Product targeting the older version still works against a Host on the newer version.\n- **Behavioral**: Same signature, different behavior. This is surfaced as a version bump with a documented behavior change; a Product targeting the older version may need to retest.\n- **Breaking**: Removed or renamed methods, changed parameter shapes. A Product targeting an incompatible older version will not run on a Host that has dropped that version."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-versioning", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/versioning/#what-a-product-targets", "page_title": "TrUAPI Versioning", "index": 2, "depth": 2, "title": "What a Product Targets", "anchor": "what-a-product-targets", "start_char": 1602, "end_char": 2149, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77e8cea104cb931e9b69704f9778ade59477f143f3bd392d8a900897b59cfe9c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What a Product Targets\n\nA Product declares the TrUAPI version range it requires. The Host inspects the declaration on load and either runs the Product (compatibility OK) or refuses to load it (compatibility mismatch, with a user-visible explanation).\n\nMost Products will target a single version line and let the SDK abstract the per-call wrapping. Reaching directly into TrUAPI in code that bypasses the SDK is the most common reason a Product breaks across a version change, because the SDK is the layer that smooths over compatible changes."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-versioning", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/versioning/#how-the-sdk-maps-to-versions", "page_title": "TrUAPI Versioning", "index": 3, "depth": 2, "title": "How the SDK Maps to Versions", "anchor": "how-the-sdk-maps-to-versions", "start_char": 2149, "end_char": 3202, "estimated_token_count": 234, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77e8cea104cb931e9b69704f9778ade59477f143f3bd392d8a900897b59cfe9c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How the SDK Maps to Versions\n\n!!! warning \"Roadmap\"\n    The version-range model and SDK-to-protocol mapping described in this section are the intended design, not what ships today. The shipping protocol is a single version line (`v1`); manifest version-ranges and lockstep SDK versioning are not yet implemented. This section describes where versioning is headed.\n\nThe intent is for the [`@parity/product-sdk`](https://www.npmjs.com/package/@parity/product-sdk) family of packages to be versioned in lockstep with the TrUAPI versions they wrap, so that a given SDK version targets a specific TrUAPI version line and pinning your SDK pins your TrUAPI surface implicitly.\n\nUnder that model, when TrUAPI introduces a behavioral change the SDK would absorb it where it can; where it cannot (a removed method, an incompatible parameter), it would bump a major version, and a Product's upgrade path would be to update the SDK pin and re-test against the new TrUAPI surface.\n\nFor the package map, see [Packages](/reference/apps/protocol/truapi/packages/)."}
{"source": "polkadot-docs", "page_id": "reference-apps-protocol-truapi-versioning", "url": "https://developer.polkadot.com/reference/apps/protocol/truapi/versioning/#where-to-go-next", "page_title": "TrUAPI Versioning", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3202, "end_char": 3515, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77e8cea104cb931e9b69704f9778ade59477f143f3bd392d8a900897b59cfe9c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Packages**\n\n    ---\n\n    Which SDK package wraps which TrUAPI method group, and how SDK versions map to TrUAPI versions.\n\n    [:octicons-arrow-right-24: Reference](/reference/apps/protocol/truapi/packages/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-apps-skills", "url": "https://developer.polkadot.com/reference/apps/skills/#introduction", "page_title": "Polkadot Product Skills", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 11, "end_char": 741, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e2d9d08088365accd2480537bb3dba0f720a8328fe20a35cb4a22b3aafe50a97", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nProduct Skills are small, modular instruction sets that teach an AI coding agent how to work effectively across specific parts of the Polkadot Products stack. A skill bundles together what the agent needs to know about one slice of the surface (chain connections, Bulletin storage, contract interactions, and so on) so that when you ask it for help in that area, it has the right context loaded.\n\nIf you are working on a Polkadot Product with an AI coding agent, installing the relevant skills tilts the agent toward correct, idiomatic answers instead of generic boilerplate.\n\nThe skills live inside the [`paritytech/product-sdk`](https://github.com/paritytech/product-sdk) monorepo under `product-sdk/skills/`."}
{"source": "polkadot-docs", "page_id": "reference-apps-skills", "url": "https://developer.polkadot.com/reference/apps/skills/#skills-list", "page_title": "Polkadot Product Skills", "index": 1, "depth": 2, "title": "Skills List", "anchor": "skills-list", "start_char": 741, "end_char": 4809, "estimated_token_count": 1203, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e2d9d08088365accd2480537bb3dba0f720a8328fe20a35cb4a22b3aafe50a97", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Skills List\n\n| Skill                                                                                                                       | What It Covers                                                                                                                                                                                                          |\n|:---------------------------------------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|\n| [`product-sdk-app-builder`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-app-builder) | End-to-end scaffolding and implementation of Polkadot apps using `@parity/product-sdk` packages. Foundational orchestrator skill — reach for this when starting a new project or scaffolding chain interactions.        |\n| [`product-sdk-cloud-storage`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-cloud-storage)             | Upload and retrieve data on the Polkadot Bulletin Chain. Covers CID-based content-addressed storage, the `CloudStorageClient` SDK, chunked uploads, CID computation, and the authorization pre-flight. Reads are container-only — the SDK does not fall back to a public IPFS gateway.                                 |\n| [`product-sdk-chain-connection`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-chain-connection) | Typed access to Polkadot chains via `@parity/product-sdk-chain-client` and `@parity/product-sdk-descriptors`. Covers preset and BYOD (bring-your-own-descriptors) paths, state queries, and storage subscriptions. |\n| [`product-sdk-contracts`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-contracts)           | Smart contract interaction (PolkaVM / Solidity) on Asset Hub. Covers `ContractManager` with `cdm.json` manifests, ad-hoc `createContract`, `ContractRuntime`, and contract type codegen.                                |\n| [`product-sdk-statement-store`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-statement-store) | Publish and subscribe to ephemeral messages on the Polkadot Statement Store. Covers `StatementStoreClient` lifecycle, host and local connection modes, channels with last-write-wins semantics, and the 512-byte size limit. |\n| [`product-sdk-transactions`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-transactions)     | Submit transactions, manage signers, and derive keys. Covers `@parity/product-sdk-tx`, `@parity/product-sdk-signer`, and `@parity/product-sdk-keys` — multi-provider wallet accounts, Host API signing (Desktop/Mobile), and dev signers for testnet. |\n| [`product-sdk-utilities`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-utilities)           | Foundational utilities — SS58/H160 address encoding, AES/ChaCha/NaCl crypto, HKDF key derivation, byte encoding, token (planck) formatting, key-value storage, and structured logging.                                  |\n| [`product-sdk-individuality`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/product-sdk-individuality) | Personhood and membership standing on the Individuality chain. Covers `readPersonhoodState` from a username or an account, `lookupUsername`, the seven-state `PersonhoodState` union, and `withAsPerson` for dispatching under a person origin. |\n| [`migrating-to-product-sdk`](https://github.com/paritytech/product-sdk/tree/main/product-sdk/skills/migrating-to-product-sdk) | Migrating an existing codebase onto `@parity/product-sdk`. Detects legacy stacks (`polkadot-apps`, `novasamatech`, hand-rolled crypto or IPFS, `polkadot-api` 1.x) and writes a per-repo migration spec. Discovery and planning only — it does not edit code. |"}
{"source": "polkadot-docs", "page_id": "reference-apps-skills", "url": "https://developer.polkadot.com/reference/apps/skills/#how-to-install", "page_title": "Polkadot Product Skills", "index": 2, "depth": 2, "title": "How to Install", "anchor": "how-to-install", "start_char": 4809, "end_char": 4828, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e2d9d08088365accd2480537bb3dba0f720a8328fe20a35cb4a22b3aafe50a97", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How to Install"}
{"source": "polkadot-docs", "page_id": "reference-apps-skills", "url": "https://developer.polkadot.com/reference/apps/skills/#claude-code", "page_title": "Polkadot Product Skills", "index": 3, "depth": 3, "title": "Claude Code", "anchor": "claude-code", "start_char": 4828, "end_char": 5119, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e2d9d08088365accd2480537bb3dba0f720a8328fe20a35cb4a22b3aafe50a97", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Claude Code\n\nThe repo ships a plugin marketplace, so no clone is needed. Add the marketplace, then install the plugin:\n\n```text\n/plugin marketplace add paritytech/product-sdk\n```\n\n```text\n/plugin install product-sdk@paritytech\n```\n\nThat installs every skill in the table above at once."}
{"source": "polkadot-docs", "page_id": "reference-apps-skills", "url": "https://developer.polkadot.com/reference/apps/skills/#other-agents", "page_title": "Polkadot Product Skills", "index": 4, "depth": 3, "title": "Other Agents", "anchor": "other-agents", "start_char": 5119, "end_char": 5945, "estimated_token_count": 188, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e2d9d08088365accd2480537bb3dba0f720a8328fe20a35cb4a22b3aafe50a97", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Other Agents\n\nFor Cursor, Codex, Cline, Windsurf, or a custom harness, clone the repo:\n\n```bash\ngit clone https://github.com/paritytech/product-sdk.git\n```\n\nSkills live under `product-sdk/skills/<skill-name>/` in the cloned directory. Register whichever skills are relevant with your agent using that agent's skill or context-loading mechanism.\n\nSkills trigger based on context. You can also invoke a skill directly by name before asking a question. For example, before asking the agent for help chunking a large upload to the Bulletin Chain, load the relevant context up front:\n\n```text\n/product-sdk-cloud-storage how do I chunk a 50 MB file across multiple transactions?\n```\n\nThe agent now has the SDK's API patterns and best practices loaded before it answers, instead of falling back on generic JavaScript knowledge."}
{"source": "polkadot-docs", "page_id": "reference-apps-skills", "url": "https://developer.polkadot.com/reference/apps/skills/#updating", "page_title": "Polkadot Product Skills", "index": 5, "depth": 2, "title": "Updating", "anchor": "updating", "start_char": 5945, "end_char": 6403, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e2d9d08088365accd2480537bb3dba0f720a8328fe20a35cb4a22b3aafe50a97", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Updating\n\n!!! tip \"Keep skills current\"\n    Polkadot Products surfaces are in active development. A skill that has not been refreshed for a while will teach the agent stale API patterns, which is worse than no skill at all. Refresh after major releases.\n\nIn Claude Code, update the plugin:\n\n```text\n/plugin update product-sdk@paritytech\n```\n\nFrom a clone, pull the latest changes and re-register any updated skills with your agent:\n\n```bash\ngit pull\n```"}
{"source": "polkadot-docs", "page_id": "reference-apps-skills", "url": "https://developer.polkadot.com/reference/apps/skills/#where-to-go-next", "page_title": "Polkadot Product Skills", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6403, "end_char": 6969, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e2d9d08088365accd2480537bb3dba0f720a8328fe20a35cb4a22b3aafe50a97", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge guide\">Guide</span> **App Development How-To**\n\n    ---\n\n    The how-to guides themselves, the same conceptual content the skills above index into.\n\n    [:octicons-arrow-right-24: Get Started](/apps/get-started/)\n\n- <span class=\"badge external\">External</span> **product-sdk repo**\n\n    ---\n\n    The source of truth for the skills documented above, including per-skill README files and updates.\n\n    [:octicons-arrow-right-24: Visit Repo](https://github.com/paritytech/product-sdk)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#alias", "page_title": "Glossary", "index": 0, "depth": 2, "title": "Alias", "anchor": "alias", "start_char": 370, "end_char": 688, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Alias\n\nA context-specific pseudonym derived from a user's [PoP](#proof-of-personhood-pop) identity via [Ring-VRF](#ring-vrf). Unlinkable across `.dot` domains by default. The same user produces a consistent alias every time they return to the same [Product](#product), but a different alias for any other Product."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#allowance", "page_title": "Glossary", "index": 1, "depth": 2, "title": "Allowance", "anchor": "allowance", "start_char": 688, "end_char": 1212, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Allowance\n\nAn on-chain access-control grant. The chain-level permission that gates publishing or storing data. `pallet-statement-store` records per-account `StatementAllowance` entries (a `max_count` cap on live statements and a `max_size` cap on total bytes). [Bulletin Chain](#bulletin-chain) consumes per-account quotas of transactions and bytes for storage. [Coinage](#coinage) issues periodic free-token allowances to persons. Spam resistance comes from the allowance ceiling rather than from per-transaction fees."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#asset-hub", "page_title": "Glossary", "index": 2, "depth": 2, "title": "Asset Hub", "anchor": "asset-hub", "start_char": 1212, "end_char": 1417, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Asset Hub\n\n[Polkadot](#polkadot)'s system chain for assets, swaps, smart contracts, and EVM-compatible contracts. Hosts the [dotNS](#dotns) contracts, where [`.dot`](#dot-address) names actually live."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#authority", "page_title": "Glossary", "index": 3, "depth": 2, "title": "Authority", "anchor": "authority", "start_char": 1417, "end_char": 1955, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Authority\n\nThe role in a blockchain that can participate in consensus mechanisms. \n\n- **[GRANDPA](#ghost-based-recursive-ancestor-deriving-prefix-agreement-grandpa)**: The authorities vote on chains they consider final.\n- **[Blind Assignment of Blockchain Extension](#blind-assignment-of-blockchain-extension-babe) (BABE)**: The authorities are also [block authors](#block-author).\n\nAuthority sets can be used as a basis for consensus mechanisms such as the [Nominated Proof of Stake (NPoS)](#nominated-proof-of-stake-npos) protocol."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#authority-round-aura", "page_title": "Glossary", "index": 4, "depth": 2, "title": "Authority Round (Aura)", "anchor": "authority-round-aura", "start_char": 1955, "end_char": 2515, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Authority Round (Aura)\n\nA deterministic [consensus](#consensus) protocol where block production is limited to a rotating list of [authorities](#authority) that take turns creating blocks. In authority round (Aura) consensus, most online authorities are assumed to be honest. It is often used in combination with [GRANDPA](#ghost-based-recursive-ancestor-deriving-prefix-agreement-grandpa) as a [hybrid consensus](#hybrid-consensus) protocol.\n\nLearn more by reading the official [Aura consensus algorithm](https://openethereum.github.io/Aura) wiki article."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#blake2b-256", "page_title": "Glossary", "index": 5, "depth": 2, "title": "Blake2b-256", "anchor": "blake2b-256", "start_char": 2515, "end_char": 2710, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Blake2b-256\n\nThe cryptographic hash function used pervasively in [Polkadot](#polkadot), for [CIDs](#content-identifier-cid), [statement](#statement)-topic derivation, and content addressing."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#blind-assignment-of-blockchain-extension-babe", "page_title": "Glossary", "index": 6, "depth": 2, "title": "Blind Assignment of Blockchain Extension (BABE)", "anchor": "blind-assignment-of-blockchain-extension-babe", "start_char": 2710, "end_char": 3168, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Blind Assignment of Blockchain Extension (BABE)\n\nA [block authoring](#block-author) protocol similar to [Aura](#authority-round-aura), except [authorities](#authority) win [slots](#slot) based on a Verifiable Random Function (VRF) instead of the round-robin selection method. The winning authority can select a chain and submit a new block.\n\nLearn more by reading the Polkadot Wiki page on [BABE](../wiki/learn/learn-consensus.md#block-production-babe)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#block-author", "page_title": "Glossary", "index": 7, "depth": 2, "title": "Block Author", "anchor": "block-author", "start_char": 3168, "end_char": 3337, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Block Author\n\nThe node responsible for the creation of a block, also called _block producers_. In a Proof of Work (PoW) blockchain, these nodes are called _miners_."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#browse", "page_title": "Glossary", "index": 8, "depth": 2, "title": "Browse", "anchor": "browse", "start_char": 3337, "end_char": 3605, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Browse\n\nThe Polkadot-native channel through which users find published [Products](#product). A curated catalogue surfaced inside the [Hosts](#host) (App and Desktop dashboards), and the destination a developer publishes a Product to once it's ready for end users."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#bulletin-chain", "page_title": "Glossary", "index": 9, "depth": 2, "title": "Bulletin Chain", "anchor": "bulletin-chain", "start_char": 3605, "end_char": 3942, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bulletin Chain\n\n[Polkadot](#polkadot)'s content-addressed storage [parachain](#parachain). Writes are gated by an explicit on-chain authorization (no token balance for storage). Content is retained ~2 weeks by default and renewable. Powers [Product](#product) bundles, encrypted [chat](#chat) content, profile media, and app assets."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#byzantine-fault-tolerance-bft", "page_title": "Glossary", "index": 10, "depth": 2, "title": "Byzantine Fault Tolerance (BFT)", "anchor": "byzantine-fault-tolerance-bft", "start_char": 3942, "end_char": 4370, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Byzantine Fault Tolerance (BFT)\n\nThe ability of a distributed computer network to remain operational if a certain proportion of its nodes or [authorities](#authority) are defective or behaving maliciously. A distributed network is typically considered Byzantine fault tolerant if it can remain functional, with up to one-third of nodes assumed to be defective, offline, actively malicious, and part of a coordinated attack."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#byzantine-failure", "page_title": "Glossary", "index": 11, "depth": 3, "title": "Byzantine Failure", "anchor": "byzantine-failure", "start_char": 4370, "end_char": 4510, "estimated_token_count": 26, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Byzantine Failure\n\nThe loss of a network service due to node failures that exceed the proportion of nodes required to reach consensus."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#practical-byzantine-fault-tolerance-pbft", "page_title": "Glossary", "index": 12, "depth": 3, "title": "Practical Byzantine Fault Tolerance (pBFT)", "anchor": "practical-byzantine-fault-tolerance-pbft", "start_char": 4510, "end_char": 4850, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Practical Byzantine Fault Tolerance (pBFT)\n\nAn early approach to Byzantine fault tolerance (BFT), practical Byzantine fault tolerance (pBFT) systems tolerate Byzantine behavior from up to one-third of participants.\n\nThe communication overhead for such systems is `O(n²)`, where `n` is the number of nodes (participants) in the system."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#call", "page_title": "Glossary", "index": 13, "depth": 2, "title": "Call", "anchor": "call", "start_char": 4850, "end_char": 5127, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Call\n\nIn the context of pallets containing functions to be dispatched to the runtime, `Call` is an enumeration data type that describes the functions that can be dispatched with one variant per pallet. A `Call` represents a [dispatch](#dispatchable) data structure object."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#chain-specification", "page_title": "Glossary", "index": 14, "depth": 2, "title": "Chain Specification", "anchor": "chain-specification", "start_char": 5127, "end_char": 5580, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Chain Specification \n\nA chain specification file defines the properties required to run a node in an active or new Polkadot SDK-built network. It often contains the initial genesis runtime code, network properties (such as the network's name), the initial state for some pallets, and the boot node list. The chain specification file makes it easy to use a single Polkadot SDK codebase as the foundation for multiple independently configured chains."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#chain-state", "page_title": "Glossary", "index": 15, "depth": 2, "title": "Chain State", "anchor": "chain-state", "start_char": 5580, "end_char": 5849, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Chain State\n\nChain state (also referred to as on-chain state) is the complete set of data stored in a Polkadot SDK-based blockchain's key-value database at any given point in time. It represents everything the runtime currently knows and manages about the network."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#chat", "page_title": "Glossary", "index": 16, "depth": 2, "title": "Chat", "anchor": "chat", "start_char": 5849, "end_char": 6160, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Chat\n\nThe [Polkadot App](#polkadot-app)'s in-App messaging surface. Composes the [Statement Store](#statement-store) (signaling, who's online, message arrival) with the [Bulletin Chain](#bulletin-chain) (encrypted message content). Supports DMs, group chats, file attachments, voice calls, and video calls."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#coin-in-coinage", "page_title": "Glossary", "index": 17, "depth": 2, "title": "Coin (in Coinage)", "anchor": "coin-in-coinage", "start_char": 6160, "end_char": 6439, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Coin (in Coinage)\n\nA discrete bearer token object with a power-of-two USD value (denominations from $0.01 to $163.84) and an age counter that increments on every transfer or split. Not a balance. One public key holds at most one coin. Backed 1:1 by an underlying stablecoin."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#coinage", "page_title": "Glossary", "index": 18, "depth": 2, "title": "Coinage", "anchor": "coinage", "start_char": 6439, "end_char": 6795, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Coinage\n\n[Polkadot](#polkadot)'s privacy-preserving payment layer (`pallet-coinage`). Replaces public balances with an anonymous coin system denominated in USD. When Alice sends funds to Bob, the only information revealed is that Alice had enough to cover the transfer. [Products](#product) interact with Coinage only through the abstract Payment API."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#collator", "page_title": "Glossary", "index": 19, "depth": 2, "title": "Collator", "anchor": "collator", "start_char": 6795, "end_char": 7102, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Collator\n\nAn [author](#block-author) of a [parachain](#parachain) network.\nThey aren't [authorities](#authority) in themselves, as they require a [relay chain](#relay-chain) to coordinate [consensus](#consensus).\n\nMore details are found on the [Polkadot Collator Wiki](../wiki/learn/learn-collator.md)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#collective", "page_title": "Glossary", "index": 20, "depth": 2, "title": "Collective", "anchor": "collective", "start_char": 7102, "end_char": 7342, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Collective\n\nMost often used to refer to an instance of the Collective pallet on Polkadot SDK-based networks such as [Kusama](#kusama) or [Polkadot](#polkadot) if the Collective pallet is part of the FRAME-based runtime for the network."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#consensus", "page_title": "Glossary", "index": 21, "depth": 2, "title": "Consensus", "anchor": "consensus", "start_char": 7342, "end_char": 7733, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus\n\nConsensus is the process blockchain nodes use to agree on a chain's canonical fork. It is composed of [authorship](#block-author), finality, and [fork-choice rule](#fork-choice-rulestrategy). In the Polkadot ecosystem, these three components are usually separate and the term consensus often refers specifically to authorship.\n\nSee also [hybrid consensus](#hybrid-consensus)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#consensus-algorithm", "page_title": "Glossary", "index": 22, "depth": 2, "title": "Consensus Algorithm", "anchor": "consensus-algorithm", "start_char": 7733, "end_char": 8297, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus Algorithm\n\nEnsures a set of [actors](#authority), who don't necessarily trust each other, can reach an agreement about the state as the result of some computation. Most consensus algorithms assume that up to one-third of the actors or nodes can be [Byzantine fault tolerant](#byzantine-fault-tolerance-bft).\n\nConsensus algorithms are generally concerned with ensuring two properties:\n\n- **Safety**: Indicating that all honest nodes eventually agreed on the state of the chain.\n- **Liveness**: Indicating the ability of the chain to keep progressing."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#consensus-engine", "page_title": "Glossary", "index": 23, "depth": 2, "title": "Consensus Engine", "anchor": "consensus-engine", "start_char": 8297, "end_char": 8620, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus Engine\n\nThe node subsystem responsible for consensus tasks.\n\nFor detailed information about the consensus strategies of the [Polkadot](#polkadot) network, see the [Polkadot Consensus](/reference/polkadot-hub/consensus-and-security/pos-consensus/) blog series.\n\nSee also [hybrid consensus](#hybrid-consensus)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#content-identifier-cid", "page_title": "Glossary", "index": 24, "depth": 2, "title": "Content Identifier (CID)", "anchor": "content-identifier-cid", "start_char": 8620, "end_char": 8849, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Content Identifier (CID)\n\nAn IPFS-compatible identifier derived from the content (multihash + codec). [Bulletin Chain](#bulletin-chain) defaults to Blake2b-256 with the Raw codec. Two identical payloads produce the same CID."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#coretime", "page_title": "Glossary", "index": 25, "depth": 2, "title": "Coretime", "anchor": "coretime", "start_char": 8849, "end_char": 9633, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Coretime\n\nThe time allocated for utilizing a core, measured in relay chain blocks. There are two types of coretime: *on-demand* and *bulk*.\n\nOn-demand coretime refers to coretime acquired through bidding in near real-time for the validation of a single parachain block on one of the cores reserved specifically for on-demand orders. They are available as an on-demand coretime pool. Set of cores that are available on-demand. Cores reserved through bulk coretime could also be made available in the on-demand coretime pool, in parts or in entirety.\n\nBulk coretime is a fixed duration of continuous coretime represented by an NFT that can be split, shared, or resold. It is managed by the [Broker pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_broker/index.html)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#cross-consensus-messaging-xcm", "page_title": "Glossary", "index": 26, "depth": 2, "title": "Cross-Consensus Messaging (XCM)", "anchor": "cross-consensus-messaging-xcm", "start_char": 9633, "end_char": 9848, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Cross-Consensus Messaging (XCM)\n\n[Polkadot](#polkadot)'s standard for moving messages and assets between chains. Used by the members ring system to distribute ring roots to subscribing [parachains](#parachain)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#dag-pb", "page_title": "Glossary", "index": 27, "depth": 2, "title": "DAG-PB", "anchor": "dag-pb", "start_char": 9848, "end_char": 10320, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## DAG-PB\n\nA manifest format used to stitch together the chunks of a large file uploaded to the [Bulletin Chain](#bulletin-chain). When a file is bigger than Bulletin's single-transaction size limit, the SDK splits it into chunks and uploads each one separately, then publishes a DAG-PB manifest that records the order and [CIDs](#content-identifier-cid) of every chunk. Readers fetch the manifest first, then pull the chunks in parallel and reassemble the file locally."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#derived-sub-account", "page_title": "Glossary", "index": 28, "depth": 2, "title": "Derived Sub-Account", "anchor": "derived-sub-account", "start_char": 10320, "end_char": 10793, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Derived Sub-Account\n\nA per-[Product](#product) account deterministically derived from the user's identity and the Product's [`.dot`](#dot-address) domain. Each Product sees its own sub-account for the same user, so activity in `app-a.dot` is unlinkable to activity in `app-b.dot` without an explicit cross-domain permission grant. Derivation is computed locally by the [Host](#host), so no round trip to the paired [App](#polkadot-app) is needed to obtain the account."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#development-phrase", "page_title": "Glossary", "index": 29, "depth": 2, "title": "Development Phrase", "anchor": "development-phrase", "start_char": 10793, "end_char": 11417, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Development Phrase\n\nA [mnemonic phrase](https://en.wikipedia.org/wiki/Mnemonic#For_numerical_sequences_and_mathematical_operations) that is intentionally made public.\n\nWell-known development accounts, such as Alice, Bob, Charlie, Dave, Eve, and Ferdie, are generated from the same secret phrase:\n\n```\nbottom drive obey lake curtain smoke basket hold race lonely fit walk\n```\n\nMany tools in the Polkadot SDK ecosystem, such as [`subkey`](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/substrate/bin/utils/subkey), allow you to implicitly specify an account using a derivation path such as `//Alice`."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#digest", "page_title": "Glossary", "index": 30, "depth": 2, "title": "Digest", "anchor": "digest", "start_char": 11417, "end_char": 11729, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Digest\n\nAn extensible field of the [block header](#header) that encodes information needed by several actors in a blockchain network, including:\n\n- [Light clients](#light-client) for chain synchronization.\n- Consensus engines for block verification.\n- The runtime itself, in the case of pre-runtime digests."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#dimension-of-individuality-measurement-dim", "page_title": "Glossary", "index": 31, "depth": 2, "title": "Dimension of Individuality Measurement (DIM)", "anchor": "dimension-of-individuality-measurement-dim", "start_char": 11729, "end_char": 12055, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Dimension of Individuality Measurement (DIM)\n\nA way of demonstrating that you're a real, unique person. Each DIM is a separate mechanism a user can complete to build up their personhood score. The PoP Game is the primary DIM in use today. Tattoo verification and in-person meetups have been discussed as future additions."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#dispatchable", "page_title": "Glossary", "index": 32, "depth": 2, "title": "Dispatchable", "anchor": "dispatchable", "start_char": 12055, "end_char": 12353, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Dispatchable\n\nFunction objects that act as the entry points in FRAME [pallets](#pallet). Internal or external entities can call them to interact with the blockchain’s state. They are a core aspect of the runtime logic, handling [transactions](#transaction) and other state-changing operations."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#dot", "page_title": "Glossary", "index": 33, "depth": 2, "title": "DOT", "anchor": "dot", "start_char": 12353, "end_char": 12485, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## DOT\n\n[Polkadot](#polkadot)'s native mainnet token. Used for [transaction](#transaction) fees, staking, and governance deposits."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#dot-address", "page_title": "Glossary", "index": 34, "depth": 2, "title": "dot Address", "anchor": "dot-address", "start_char": 12485, "end_char": 12861, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## dot Address\n\nA human-readable name in the [dotNS](#dotns) registry on [Asset Hub](#asset-hub), of the form `something.dot`. Resolves to a content reference ([CID](#content-identifier-cid)) pointing at a published [Product](#product) bundle on [Bulletin Chain](#bulletin-chain) (or via an [IPFS](#interplanetary-file-system-ipfs) gateway), plus a wallet address for users."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#dotns", "page_title": "Glossary", "index": 35, "depth": 2, "title": "dotNS", "anchor": "dotns", "start_char": 12861, "end_char": 13204, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## dotNS\n\n[Polkadot](#polkadot)'s name service. A suite of smart contracts on [Asset Hub](#asset-hub) that map `.dot` names to on-chain resources, including wallet addresses for users and [CIDs](#content-identifier-cid) for [Products](#product). Architecturally derived from ENS (Ethereum Name Service) and uses the same name-hashing scheme."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#entropy", "page_title": "Glossary", "index": 36, "depth": 2, "title": "Entropy", "anchor": "entropy", "start_char": 13204, "end_char": 13527, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Entropy\n\nVerifiable randomness sourced from chain state, such as block hashes, VRF outputs, or randomness beacons. Useful when fairness has to be checkable by an external party after the fact (lotteries, fair-shuffle games, randomized airdrops), and stronger than a [Product](#product)'s local CSPRNG for that purpose."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#ephemeral", "page_title": "Glossary", "index": 37, "depth": 2, "title": "Ephemeral", "anchor": "ephemeral", "start_char": 13527, "end_char": 13870, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Ephemeral\n\nShort-lived data that exists outside chain blocks and decays after a defined window. [Statements](#statement) ([Statement Store](#statement-store)), [HOP](#handoff-protocol-hop) entries, and [chat](#chat) messages are all ephemeral. They propagate peer-to-peer, expire after a TTL, and never durably commit to the chain itself."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#events", "page_title": "Glossary", "index": 38, "depth": 2, "title": "Events", "anchor": "events", "start_char": 13870, "end_char": 14314, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Events\n\nA means of recording that some particular [chain state](#chain-state) transition happened.\n\nIn the context of [FRAME](#framework-for-runtime-aggregation-of-modularized-entities-frame), events are composable data types that each [pallet](#pallet) can individually define. Events in FRAME are implemented as a set of transient storage items inspected immediately after a block has been executed and reset during block initialization."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#executor", "page_title": "Glossary", "index": 39, "depth": 2, "title": "Executor", "anchor": "executor", "start_char": 14314, "end_char": 14962, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Executor\n\nA means of executing a function call in a given [runtime](#runtime) with a set of dependencies.\nThere are two orchestration engines in Polkadot SDK, _WebAssembly_ and _native_.\n\n- The _native executor_ uses a natively compiled runtime embedded in the node to execute calls. This is a performance optimization available to up-to-date nodes.\n\n- The _WebAssembly executor_ uses a [Wasm](#webassembly-wasm) binary and a Wasm interpreter to execute calls. The binary is guaranteed to be up-to-date regardless of the version of the blockchain node because it is persisted in the [chain state](#chain-state) of the Polkadot SDK-based chain."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#existential-deposit", "page_title": "Glossary", "index": 40, "depth": 2, "title": "Existential Deposit", "anchor": "existential-deposit", "start_char": 14962, "end_char": 15654, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Existential Deposit\n\nThe minimum balance an account is allowed to have in the [Balances pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_balances/index.html). Accounts cannot be created with a balance less than the existential deposit amount. \n\nIf an account balance drops below this amount, the Balances pallet uses [a FRAME System API](https://paritytech.github.io/substrate/master/frame_system/pallet/struct.Pallet.html#method.dec_ref) to drop its references to that account.\n\nIf the Balances pallet reference to an account is dropped, the account can be [reaped](https://paritytech.github.io/substrate/master/frame_system/pallet/struct.Pallet.html#method.allow_death)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#extrinsic", "page_title": "Glossary", "index": 41, "depth": 2, "title": "Extrinsic", "anchor": "extrinsic", "start_char": 15654, "end_char": 16155, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Extrinsic\n\nA general term for data that originates outside the runtime, is included in a block, and leads to some action. This includes user-initiated transactions and inherent transactions placed into the block by the block builder.\n\nIt is a SCALE-encoded array typically consisting of a version number, signature, and varying data types indicating the resulting runtime function to be called. Extrinsics can take two forms: [inherents](#inherent-transactions) and [transactions](#transaction)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#fork-choice-rulestrategy", "page_title": "Glossary", "index": 42, "depth": 2, "title": "Fork Choice Rule/Strategy", "anchor": "fork-choice-rulestrategy", "start_char": 16155, "end_char": 16485, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Fork Choice Rule/Strategy\n\nA fork choice rule or strategy helps determine which chain is valid when reconciling several network forks. A common fork choice rule is the [longest chain](https://paritytech.github.io/polkadot-sdk/master/sc_consensus/struct.LongestChain.html), in which the chain with the most blocks is selected."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#framework-for-runtime-aggregation-of-modularized-entities-frame", "page_title": "Glossary", "index": 43, "depth": 2, "title": "Framework for Runtime Aggregation of Modularized Entities (FRAME)", "anchor": "framework-for-runtime-aggregation-of-modularized-entities-frame", "start_char": 16485, "end_char": 16915, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Framework for Runtime Aggregation of Modularized Entities (FRAME)\n\nEnables developers to create blockchain [runtime](#runtime) environments from a modular set of components called [pallets](#pallet). It utilizes a set of procedural macros to construct runtimes.\n\n[Visit the Polkadot SDK docs for more details on FRAME.](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/frame_runtime/index.html)"}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#full-node", "page_title": "Glossary", "index": 44, "depth": 2, "title": "Full Node", "anchor": "full-node", "start_char": 16915, "end_char": 17194, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Full Node\n\nA node that prunes historical states, keeping only recently finalized block states to reduce storage needs. Full nodes provide current chain state access and allow direct submission and validation of [extrinsics](#extrinsic), maintaining network decentralization."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#genesis-configuration", "page_title": "Glossary", "index": 45, "depth": 2, "title": "Genesis Configuration", "anchor": "genesis-configuration", "start_char": 17194, "end_char": 17529, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Genesis Configuration\n\nA mechanism for specifying the initial state of a blockchain. By convention, this initial state or first block is commonly referred to as the genesis state or genesis block. The genesis configuration for Polkadot SDK-based chains is accomplished by way of a [chain specification](#chain-specification) file."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#ghost-based-recursive-ancestor-deriving-prefix-agreement-grandpa", "page_title": "Glossary", "index": 46, "depth": 2, "title": "GHOST-based Recursive Ancestor Deriving Prefix Agreement (GRANDPA)", "anchor": "ghost-based-recursive-ancestor-deriving-prefix-agreement-grandpa", "start_char": 17529, "end_char": 17892, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## GHOST-based Recursive Ancestor Deriving Prefix Agreement (GRANDPA)\n\nA deterministic finality mechanism for blockchains that is implemented in the [Rust](https://rust-lang.org/) programming language.\n\nThe [formal specification](https://github.com/w3f/consensus/blob/master/pdf/grandpa-old.pdf) is maintained by the [Web3 Foundation](https://web3.foundation/)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#handoff-protocol-hop", "page_title": "Glossary", "index": 47, "depth": 2, "title": "Handoff Protocol (HOP)", "anchor": "handoff-protocol-hop", "start_char": 17892, "end_char": 18204, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Handoff Protocol (HOP)\n\nA [Substrate](#substrate) node service for [ephemeral](#ephemeral), addressed, peer-to-peer data delivery between users. Like a dead-drop with an expiry timer. A sender deposits data for named recipients, recipients collect, and the data self-destructs after collection or ~24 hours."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#header", "page_title": "Glossary", "index": 48, "depth": 2, "title": "Header", "anchor": "header", "start_char": 18204, "end_char": 18444, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Header\n\nA structure that aggregates the information used to summarize a block. Primarily, it consists of cryptographic information used by [light clients](#light-client) to get minimally secure but very efficient chain synchronization."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#hollar", "page_title": "Glossary", "index": 49, "depth": 2, "title": "HOLLAR", "anchor": "hollar", "start_char": 18444, "end_char": 18580, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## HOLLAR\n\nThe placeholder stablecoin currently backing [Coinage](#coinage). Will be replaced by [pUSD](#pusd) once pUSD is available."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#host", "page_title": "Glossary", "index": 50, "depth": 2, "title": "Host", "anchor": "host", "start_char": 18580, "end_char": 18892, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Host\n\nOne of the three Polkadot applications ([App](#polkadot-app), [Desktop](#polkadot-desktop), [Web](#polkadot-web)) that load Polkadot [Products](#product) in a [sandboxed](#sandbox) container and mediate every capability the Product uses, including chain calls, storage, signing, and outbound requests."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#host-api", "page_title": "Glossary", "index": 51, "depth": 2, "title": "Host API", "anchor": "host-api", "start_char": 18892, "end_char": 19178, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Host API\n\nThe set of methods a [Host](#host) exposes to the [Products](#product) running inside it. Often used interchangeably with [TrUAPI](#triangle-user-agent-programming-interface-truapi). \"Host API\" emphasizes the consumer side, \"TrUAPI\" emphasizes the protocol specification."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#hybrid-consensus", "page_title": "Glossary", "index": 52, "depth": 2, "title": "Hybrid Consensus", "anchor": "hybrid-consensus", "start_char": 19178, "end_char": 19649, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Hybrid Consensus\n\nA blockchain consensus protocol that consists of independent or loosely coupled mechanisms for [block production](#block-author) and finality.\n\nHybrid consensus allows the chain to grow as fast as probabilistic consensus protocols, such as [Aura](#authority-round-aura), while maintaining the same level of security as deterministic finality consensus protocols, such as [GRANDPA](#ghost-based-recursive-ancestor-deriving-prefix-agreement-grandpa)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#inherent-transactions", "page_title": "Glossary", "index": 53, "depth": 2, "title": "Inherent Transactions", "anchor": "inherent-transactions", "start_char": 19649, "end_char": 20115, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Inherent Transactions\n\nA special type of unsigned transaction, referred to as _inherents_, that enables a block authoring node to insert information that doesn't require validation directly into a block.\n\nOnly the block-authoring node that calls the inherent transaction function can insert data into its block. In general, validators assume the data inserted using an inherent transaction is valid and reasonable even if it can't be deterministically verified."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#interplanetary-file-system-ipfs", "page_title": "Glossary", "index": 54, "depth": 2, "title": "InterPlanetary File System (IPFS)", "anchor": "interplanetary-file-system-ipfs", "start_char": 20115, "end_char": 20397, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## InterPlanetary File System (IPFS)\n\nThe content-addressed delivery layer [Polkadot Web](#polkadot-web)'s host shell can use to fetch a [Product](#product) bundle by [CID](#content-identifier-cid), as an alternative to direct [Bulletin Chain](#bulletin-chain) peer-to-peer fetch."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#json-rpc", "page_title": "Glossary", "index": 55, "depth": 2, "title": "JSON-RPC", "anchor": "json-rpc", "start_char": 20397, "end_char": 20722, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## JSON-RPC\n\nA stateless, lightweight remote procedure call protocol encoded in JavaScript Object Notation (JSON). JSON-RPC provides a standard way to call functions on a remote system by using JSON.\n\nFor Polkadot SDK, this protocol is implemented through the [Parity JSON-RPC](https://github.com/paritytech/jsonrpc) crate."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#keystore", "page_title": "Glossary", "index": 56, "depth": 2, "title": "Keystore", "anchor": "keystore", "start_char": 20722, "end_char": 20807, "estimated_token_count": 16, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Keystore\n\nA subsystem for managing keys for the purpose of producing new blocks."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#kusama", "page_title": "Glossary", "index": 57, "depth": 2, "title": "Kusama", "anchor": "kusama", "start_char": 20807, "end_char": 21437, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Kusama\n\n[Kusama](https://kusama.network/) is a Polkadot SDK-based blockchain that implements a design similar to the [Polkadot](#polkadot) network.\n\nKusama is a [canary](https://en.wiktionary.org/wiki/canary_in_a_coal_mine) network and is referred to as [Polkadot's \"wild cousin.\"](../wiki/learn/learn-comparisons-kusama.md).\n\nAs a canary network, Kusama is expected to be more stable than a test network like [Westend](#westend) but less stable than a production network like [Polkadot](#polkadot). Kusama is controlled by its network participants and is intended to be stable enough to encourage meaningful experimentation."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#libp2p", "page_title": "Glossary", "index": 58, "depth": 2, "title": "libp2p", "anchor": "libp2p", "start_char": 21437, "end_char": 21697, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## libp2p\n\nA peer-to-peer networking stack that allows the use of many transport mechanisms, including WebSockets (usable in a web browser).\n\nPolkadot SDK uses the [Rust implementation](https://github.com/libp2p/rust-libp2p) of the `libp2p` networking stack."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#light-client", "page_title": "Glossary", "index": 59, "depth": 2, "title": "Light Client", "anchor": "light-client", "start_char": 21697, "end_char": 22025, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Light Client\n\nA type of blockchain node that doesn't store the [chain state](#chain-state) or produce blocks.\n\nA light client can verify cryptographic primitives and provides a [remote procedure call (RPC)](https://en.wikipedia.org/wiki/Remote_procedure_call) server, enabling blockchain users to interact with the network."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#manifest", "page_title": "Glossary", "index": 60, "depth": 2, "title": "Manifest", "anchor": "manifest", "start_char": 22025, "end_char": 22331, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Manifest\n\nA JSON file packaged with a [Product](#product)'s bundle that declares the permissions it needs and (for [Polkadot Web](#polkadot-web) Products) the routes and [CIDs](#content-identifier-cid) the [Host](#host) loads. Permissions are declared in the manifest, not requested ad-hoc at runtime."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#metadata", "page_title": "Glossary", "index": 61, "depth": 2, "title": "Metadata", "anchor": "metadata", "start_char": 22331, "end_char": 22527, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Metadata\n\nData that provides information about one or more aspects of a system.\nThe metadata that exposes information about a Polkadot SDK blockchain enables you to interact with that system."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#nominated-proof-of-stake-npos", "page_title": "Glossary", "index": 62, "depth": 2, "title": "Nominated Proof of Stake (NPoS)", "anchor": "nominated-proof-of-stake-npos", "start_char": 22527, "end_char": 22754, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominated Proof of Stake (NPoS)\n\nA method for determining [validators](#validator) or _[authorities](#authority)_ based on a willingness to commit their stake to the proper functioning of one or more block-producing nodes."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#oracle", "page_title": "Glossary", "index": 63, "depth": 2, "title": "Oracle", "anchor": "oracle", "start_char": 22754, "end_char": 22991, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Oracle\n\nAn entity that connects a blockchain to a non-blockchain data source. Oracles enable the blockchain to access and act upon information from existing data sources and incorporate data from non-blockchain systems and services."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#origin", "page_title": "Glossary", "index": 64, "depth": 2, "title": "Origin", "anchor": "origin", "start_char": 22991, "end_char": 23465, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Origin\n\nA [FRAME](#framework-for-runtime-aggregation-of-modularized-entities-frame) primitive that identifies the source of a [dispatched](#dispatchable) function call into the [runtime](#runtime). The FRAME System pallet defines three built-in [origins](#origin). As a [pallet](#pallet) developer, you can also define custom origins, such as those defined by the [Collective pallet](https://paritytech.github.io/substrate/master/pallet_collective/enum.RawOrigin.html)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pairing", "page_title": "Glossary", "index": 65, "depth": 2, "title": "Pairing", "anchor": "pairing", "start_char": 23465, "end_char": 23775, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pairing\n\nThe one-time cryptographic handshake between [Polkadot Desktop](#polkadot-desktop) and the user's mobile [App](#polkadot-app). Desktop displays a QR code, the App scans it and returns a derived [session public key](#session-public-key) that Desktop stores. The private key never leaves the phone."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pallet", "page_title": "Glossary", "index": 66, "depth": 2, "title": "Pallet", "anchor": "pallet", "start_char": 23775, "end_char": 24066, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pallet\n\nA module that can be used to extend the capabilities of a [FRAME](#framework-for-runtime-aggregation-of-modularized-entities-frame)-based [runtime](#runtime).\nPallets bundle domain-specific logic with runtime primitives like [events](#events) and [storage items](#storage-item)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#papi", "page_title": "Glossary", "index": 67, "depth": 2, "title": "PAPI", "anchor": "papi", "start_char": 24066, "end_char": 24291, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## PAPI\n\n`polkadot-api`. The standard typed TypeScript library for interacting with [Polkadot](#polkadot) chains. The [Product](#product) SDK's chain-client wraps PAPI, so Products use familiar PAPI patterns under the hood."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#parachain", "page_title": "Glossary", "index": 68, "depth": 2, "title": "Parachain", "anchor": "parachain", "start_char": 24291, "end_char": 24515, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachain\n\nA parachain is a blockchain that derives shared infrastructure and security from a _[relay chain](#relay-chain)_.\nYou can learn more about parachains on the [Polkadot Wiki](../wiki/learn/learn-parachains.md)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pas", "page_title": "Glossary", "index": 69, "depth": 2, "title": "PAS", "anchor": "pas", "start_char": 24515, "end_char": 24679, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## PAS\n\nThe native token of the [Paseo TestNet](#paseo-testnet). The test-network counterpart to [DOT](#dot). Distributed via the Polkadot Faucet for development."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#paseo-testnet", "page_title": "Glossary", "index": 70, "depth": 2, "title": "Paseo TestNet", "anchor": "paseo-testnet", "start_char": 24679, "end_char": 25324, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Paseo TestNet\n\nThe [Polkadot](#polkadot) ecosystem test network. Provisions testing on Polkadot's \"production\" runtime, which means less chance of feature or code mismatch when developing [parachain](#parachain) apps. After the [Polkadot Technical fellowship](../wiki/learn/learn-polkadot-technical-fellowship.md) proposes a runtime upgrade for Polkadot, this TestNet is updated, giving a period where the TestNet is ahead of Polkadot to allow for testing. The network that lives behind the [Polkadot Desktop](#polkadot-desktop) environment called `paseo-next`. Accounts, balances, and identities on Paseo TestNet are isolated from mainnet."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#people-chain", "page_title": "Glossary", "index": 71, "depth": 2, "title": "People Chain", "anchor": "people-chain", "start_char": 25324, "end_char": 25717, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## People Chain\n\n[Polkadot](#polkadot)'s system [parachain](#parachain) for identity, usernames, and [Proof of Personhood](#proof-of-personhood-pop). Hosts the PoP pallet set (`pallet-people`, `pallet-game`, `pallet-score`, `pallet-identity`, `pallet-ubc`, `pallet-airdrop`, `pallet-members`), the [Statement Store](#statement-store) [allowance](#allowance) records, and [Coinage](#coinage)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pocket", "page_title": "Glossary", "index": 72, "depth": 2, "title": "Pocket", "anchor": "pocket", "start_char": 25717, "end_char": 26083, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pocket\n\n[Polkadot Desktop](#polkadot-desktop)'s peer-to-peer send flow. Two distinguishing properties. First, [personhood](#proof-of-personhood-pop)-aware addressing (the sender can address a recipient by their personhood, not just an account address). Second, two-sided confirmation (the recipient explicitly accepts or declines on their [App](#polkadot-app))."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot", "page_title": "Glossary", "index": 73, "depth": 2, "title": "Polkadot", "anchor": "polkadot", "start_char": 26083, "end_char": 26368, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot\n\nThe [Polkadot network](https://polkadot.com/) is a blockchain that serves as the central hub of a heterogeneous blockchain network. It serves the role of the [relay chain](#relay-chain) and provides shared infrastructure and security to support [parachains](#parachain)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot-app", "page_title": "Glossary", "index": 74, "depth": 2, "title": "Polkadot App", "anchor": "polkadot-app", "start_char": 26368, "end_char": 26668, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot App\n\nThe mobile [Host](#host) in the [Triangle](#triangle). Runs on the user's phone, holds the user's private key, performs [Proof of Personhood](#proof-of-personhood-pop) verification, and signs every [transaction](#transaction) a [Product](#product) submits anywhere in the Triangle."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot-cloud", "page_title": "Glossary", "index": 75, "depth": 2, "title": "Polkadot Cloud", "anchor": "polkadot-cloud", "start_char": 26668, "end_char": 27306, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Cloud\n\nPolkadot Cloud is a platform for deploying resilient, customizable and scalable Web3 applications through Polkadot's functionality. It encompasses the wider Polkadot network infrastructure and security layer where parachains operate. The platform enables users to launch Ethereum-compatible chains, build specialized blockchains, and flexibly manage computing resources through on-demand or bulk coretime purchases. Initially launched with basic parachain functionality, Polkadot Cloud has evolved to offer enhanced flexibility with features like coretime, elastic scaling, and async backing for improved performance."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot-desktop", "page_title": "Glossary", "index": 76, "depth": 2, "title": "Polkadot Desktop", "anchor": "polkadot-desktop", "start_char": 27306, "end_char": 27597, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Desktop\n\nThe desktop [Host](#host) in the [Triangle](#triangle). A specialized browser that loads Polkadot [Products](#product) by their `.dot` names inside a [sandbox](#sandbox). Never holds private keys. Routes every signing request to the paired mobile [App](#polkadot-app)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot-hub", "page_title": "Glossary", "index": 77, "depth": 2, "title": "Polkadot Hub", "anchor": "polkadot-hub", "start_char": 27597, "end_char": 28005, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Hub\n\nPolkadot Hub is a Layer 1 platform that serves as the primary entry point to the Polkadot ecosystem, providing essential functionality without requiring parachain deployment. It offers core services including smart contracts, identity management, staking, governance, and interoperability with other ecosystems, making it simple and fast for both builders and users to get started in Web3."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot-sdk", "page_title": "Glossary", "index": 78, "depth": 2, "title": "Polkadot SDK", "anchor": "polkadot-sdk", "start_char": 28005, "end_char": 28502, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot SDK\n\nThe umbrella project that contains [Substrate](#substrate) (the blockchain framework), Cumulus (the [parachain](#parachain) integration layer that lets a Substrate chain plug into [Polkadot](#polkadot)'s [relay chain](#relay-chain) as a parachain), and the Polkadot node implementation itself, all in one monorepo. Most teams building on Polkadot depend on the Polkadot SDK rather than on Substrate alone, because Cumulus is what makes a Substrate chain a parachain of Polkadot."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot-virtual-machine-pvm", "page_title": "Glossary", "index": 79, "depth": 2, "title": "Polkadot Virtual Machine (PVM)", "anchor": "polkadot-virtual-machine-pvm", "start_char": 28502, "end_char": 28791, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Virtual Machine (PVM)\n\nA custom virtual machine optimized for performance, leveraging a RISC-V-based architecture to support Solidity and any language that compiles to RISC-V. Specifically designed for the Polkadot ecosystem, enabling smart contract deployment and execution."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#polkadot-web", "page_title": "Glossary", "index": 80, "depth": 2, "title": "Polkadot Web", "anchor": "polkadot-web", "start_char": 28791, "end_char": 29077, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Web\n\nThe browser-based [Host](#host) in the [Triangle](#triangle), served at `dot.li`. Loads Polkadot [Products](#product) by their `.dot` names inside a [sandboxed](#sandbox) iframe. Pairs with the user's mobile [App](#polkadot-app) for signing. No installation required."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pop-full", "page_title": "Glossary", "index": 81, "depth": 2, "title": "PoP Full", "anchor": "pop-full", "start_char": 29077, "end_char": 29398, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## PoP Full\n\nThe destination [personhood](#proof-of-personhood-pop) tier. Cryptographically proven via the biometric verification flow in the official [Polkadot App](#polkadot-app). PoP Full holders join the active membership ring on the [People Chain](#people-chain) and can generate full [Ring-VRF](#ring-vrf) proofs."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pop-lite", "page_title": "Glossary", "index": 82, "depth": 2, "title": "PoP Lite", "anchor": "pop-lite", "start_char": 29398, "end_char": 29710, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## PoP Lite\n\nThe on-ramp [personhood](#proof-of-personhood-pop) tier. Third-party attestation registered in a separate lite-people ring. Supply is governance-bounded for spam resistance. Lite holders can produce lite-ring [Ring-VRF](#ring-vrf) proofs but do not yet hold membership in the full personhood ring."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pop-tier", "page_title": "Glossary", "index": 83, "depth": 2, "title": "PoP Tier", "anchor": "pop-tier", "start_char": 29710, "end_char": 30147, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## PoP Tier\n\nA user's level of [Proof of Personhood](#proof-of-personhood-pop). Currently one of three options: Full (cryptographically proven via biometric verification), Lite (third-party attested, governance-bounded supply), or none. The tier determines which features unlock, including short `.dot` names, UBI eligibility, and free unload tokens. Checked through [Ring-VRF](#ring-vrf) proofs against the corresponding members ring."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#preimage", "page_title": "Glossary", "index": 84, "depth": 2, "title": "Preimage", "anchor": "preimage", "start_char": 30147, "end_char": 30758, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Preimage\n\nA preimage is the data that is input into a hash function to calculate a hash. Since a hash function is a [one-way function](https://en.wikipedia.org/wiki/One-way_function), the output (the hash) cannot be used to reveal the input (the preimage). Another way to define it is as off-chain content addressed by hash that an on-chain operation will dereference, for example the bytes of a governance proposal that a referendum points at. This differs from a [Statement](#statement). A preimage is durable (it lives until the referencing operation completes), where a Statement is short-lived gossip."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#product", "page_title": "Glossary", "index": 85, "depth": 2, "title": "Product", "anchor": "product", "start_char": 30758, "end_char": 31034, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Product\n\nA third-party single-page application that runs inside a [Host](#host), addressed by a `.dot` domain, reachable from the outside world only through the [Host API](#host-api). Products cannot hold keys, make arbitrary network requests, or talk to chains directly."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#proof-of-personhood-pop", "page_title": "Glossary", "index": 86, "depth": 2, "title": "Proof of Personhood (PoP)", "anchor": "proof-of-personhood-pop", "start_char": 31034, "end_char": 31404, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Proof of Personhood (PoP)\n\n[Polkadot](#polkadot)'s privacy-preserving \"real human\" check on the [People Chain](#people-chain). Verified once via an in-App video interaction (the PoP Game). The result is registered in `pallet-people`'s membership ring and unlocks personhood-gated features such as TestNet funds, short `.dot` names, and [alias](#alias)-gated checks."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#pusd", "page_title": "Glossary", "index": 87, "depth": 2, "title": "pUSD", "anchor": "pusd", "start_char": 31404, "end_char": 31611, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## pUSD\n\n[Polkadot](#polkadot)'s planned native stablecoin on [Asset Hub](#asset-hub). Will eventually back [Coinage](#coinage). Until pUSD is live on TestNet, [HOLLAR](#hollar) is the placeholder backing."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#recycler", "page_title": "Glossary", "index": 88, "depth": 2, "title": "Recycler", "anchor": "recycler", "start_char": 31611, "end_char": 31935, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Recycler\n\nA mixing pool built on [Ring-VRF](#ring-vrf) that breaks the on-chain link between a [coin](#coin-in-coinage)'s deposit and withdrawal. Users load a coin into the recycler, wait for other users to load too (a larger set makes deposits harder to link to withdrawals), then unload anonymously into a fresh coin."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#relay-chain", "page_title": "Glossary", "index": 89, "depth": 2, "title": "Relay Chain", "anchor": "relay-chain", "start_char": 31935, "end_char": 32251, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Relay Chain\n\nRelay chains are blockchains that provide shared infrastructure and security to the [parachains](#parachain) in the network. In addition to providing [consensus](#consensus) capabilities, relay chains allow parachains to communicate and exchange digital assets without needing to trust one another."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#ring-vrf", "page_title": "Glossary", "index": 90, "depth": 2, "title": "Ring-VRF", "anchor": "ring-vrf", "start_char": 32251, "end_char": 32531, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Ring-VRF\n\nThe cryptographic primitive at the heart of [PoP](#proof-of-personhood-pop). Lets a verified person prove \"I'm one of the recognized persons in this set\" without revealing which one. The privacy foundation under [aliases](#alias), [Coinage](#coinage), and airdrops."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#rococo", "page_title": "Glossary", "index": 91, "depth": 2, "title": "Rococo", "anchor": "rococo", "start_char": 32531, "end_char": 32783, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Rococo\n\nA [parachain](#parachain) test network for the Polkadot network. The [Rococo](#rococo) network is a Polkadot SDK-based blockchain with an October 14, 2024 deprecation date. Development teams are encouraged to use the Paseo TestNet instead."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#runtime", "page_title": "Glossary", "index": 92, "depth": 2, "title": "Runtime", "anchor": "runtime", "start_char": 32783, "end_char": 33120, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Runtime\n\nThe runtime represents the [state transition function](#state-transition-function-stf) for a blockchain. In Polkadot SDK, the runtime is stored as a [Wasm](#webassembly-wasm) binary in the chain state. The Runtime is stored under a unique state key and can be modified during the execution of the state transition function."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#sandbox", "page_title": "Glossary", "index": 93, "depth": 2, "title": "Sandbox", "anchor": "sandbox", "start_char": 33120, "end_char": 33458, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Sandbox\n\nThe [Host](#host)-governed environment a [Product](#product) runs in. Products see [derived sub-accounts](#derived-sub-account) (not the user's root identity), reach the outside world only through the [Host API](#host-api), and are isolated from one another by default. Declared permissions selectively relax this isolation."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#session-public-key", "page_title": "Glossary", "index": 94, "depth": 2, "title": "Session Public Key", "anchor": "session-public-key", "start_char": 33458, "end_char": 33832, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Session Public Key\n\nThe derived public key [Desktop](#polkadot-desktop) receives from the mobile [App](#polkadot-app) during [pairing](#pairing). Lets Desktop identify the user and construct per-[Product](#product) sub-accounts, but is never enough to sign on its own. A dev-pairing artifact, unrelated to [validator](#validator) session keys used for block production."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#shield-states", "page_title": "Glossary", "index": 95, "depth": 2, "title": "Shield States", "anchor": "shield-states", "start_char": 33832, "end_char": 34115, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Shield States\n\nThe security-indicator UI in [Polkadot Web](#polkadot-web). Yellow while verifying. Green when confirmed. Orange when content was served via a gateway fallback rather than peer-to-peer. Red when the on-chain record has changed since the cached version was loaded."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#sign-in-with-polkadot", "page_title": "Glossary", "index": 96, "depth": 2, "title": "Sign In with Polkadot", "anchor": "sign-in-with-polkadot", "start_char": 34115, "end_char": 34536, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Sign In with Polkadot\n\nThe [Host](#host)-level authentication handshake between [Polkadot Desktop](#polkadot-desktop) (or [Web](#polkadot-web)) and the paired [Polkadot App](#polkadot-app). Establishes session identity so the Host can construct per-[Product](#product) sub-accounts. Distinct from per-[transaction](#transaction) signing. Sign In runs once at the start of a session, and signing runs per-transaction."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#signing-model", "page_title": "Glossary", "index": 97, "depth": 2, "title": "Signing Model", "anchor": "signing-model", "start_char": 34536, "end_char": 34921, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Signing Model\n\nMobile is the signer. [Desktop](#polkadot-desktop) is the mediator. Every [transaction](#transaction) routes from the [Product](#product) through Desktop's signing modal to the paired [App](#polkadot-app), where the user explicitly approves on their phone. The Chain Submit permission gates the ability to request a signing prompt. It never authorizes auto-signing."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#simple-concatenated-aggregate-little-endian-scale", "page_title": "Glossary", "index": 98, "depth": 2, "title": "Simple Concatenated Aggregate Little-Endian (SCALE)", "anchor": "simple-concatenated-aggregate-little-endian-scale", "start_char": 34921, "end_char": 35188, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Simple Concatenated Aggregate Little-Endian (SCALE)\n\nThe compact binary codec used by [Polkadot SDK](#polkadot-sdk) for on-chain data, RPC messages, and inter-chain payloads. [TrUAPI](#triangle-user-agent-programming-interface-truapi) messages are SCALE-encoded."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#slot", "page_title": "Glossary", "index": 99, "depth": 2, "title": "Slot", "anchor": "slot", "start_char": 35188, "end_char": 35468, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Slot\n\nA fixed, equal interval of time used by consensus engines such as [Aura](#authority-round-aura) and [BABE](#blind-assignment-of-blockchain-extension-babe). In each slot, a subset of [authorities](#authority) is permitted, or obliged, to [author](#block-author) a block."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#smoldot", "page_title": "Glossary", "index": 100, "depth": 2, "title": "Smoldot", "anchor": "smoldot", "start_char": 35468, "end_char": 35752, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Smoldot\n\nThe [Polkadot](#polkadot) [light client](#light-client). Used by [Polkadot Web](#polkadot-web)'s host shell to verify chain state in-browser without running a [full node](#full-node). Planned for direct [Statement Store](#statement-store) participation by end-user apps."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#soulbound", "page_title": "Glossary", "index": 101, "depth": 2, "title": "Soulbound", "anchor": "soulbound", "start_char": 35752, "end_char": 36207, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Soulbound\n\nPermanently bound to the account that received it and non-transferable by design. In [dotNS](#dotns), a personhood name issued through the personhood gateway is soulbound, because it identifies a person rather than naming content; a name registered on the public path is transferable. A device name cannot move either, but not through this flag: it has no token at all. See [Name Transfers](/reference/apps/infrastructure/dotns/transfer/)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#sovereign-account", "page_title": "Glossary", "index": 102, "depth": 2, "title": "Sovereign Account", "anchor": "sovereign-account", "start_char": 36207, "end_char": 36709, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Sovereign Account\n\nThe unique account identifier for each chain in the relay chain ecosystem. It is often used in cross-consensus (XCM) interactions to sign XCM messages sent to the relay chain or other chains in the ecosystem.\n\nThe sovereign account for each chain is a root-level account that can only be accessed using the Sudo pallet or through governance. The account identifier is calculated by concatenating the Blake2 hash of a specific text string and the registered parachain identifier."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#sr25519", "page_title": "Glossary", "index": 103, "depth": 2, "title": "Sr25519", "anchor": "sr25519", "start_char": 36709, "end_char": 36944, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Sr25519\n\nThe default cryptographic signature scheme used across [Polkadot](#polkadot). Schnorr signatures over Ristretto. Used for [transactions](#transaction), [statements](#statement), and [PoP](#proof-of-personhood-pop) proofs."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#ss58-address-format", "page_title": "Glossary", "index": 104, "depth": 2, "title": "SS58 Address Format", "anchor": "ss58-address-format", "start_char": 36944, "end_char": 37465, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## SS58 Address Format\n\nA public key address based on the Bitcoin [`Base-58-check`](https://en.bitcoin.it/wiki/Base58Check_encoding) encoding. Each Polkadot SDK SS58 address uses a `base-58` encoded value to identify a specific account on a specific Polkadot SDK-based chain\n\nThe [canonical `ss58-registry`](https://github.com/paritytech/ss58-registry) provides additional details about the address format used by different Polkadot SDK-based chains, including the network prefix and website used for different networks"}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#state-transition-function-stf", "page_title": "Glossary", "index": 105, "depth": 2, "title": "State Transition Function (STF)", "anchor": "state-transition-function-stf", "start_char": 37465, "end_char": 37694, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## State Transition Function (STF)\n\nThe logic of a blockchain that determines how the state changes when a block is processed. In Polkadot SDK, the state transition function is effectively equivalent to the [runtime](#runtime)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#statement", "page_title": "Glossary", "index": 106, "depth": 2, "title": "Statement", "anchor": "statement", "start_char": 37694, "end_char": 37986, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Statement\n\nAn [ephemeral](#ephemeral), signed data blob in the [Statement Store](#statement-store). Lives in the node's local pool, not in chain blocks. Carries a payload (up to ~1 MB), one or more topics, an optional channel for last-write-wins replacement, and an authentication proof."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#statement-store", "page_title": "Glossary", "index": 107, "depth": 2, "title": "Statement Store", "anchor": "statement-store", "start_char": 37986, "end_char": 38246, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Statement Store\n\nA network-layer pub/sub primitive on the [People Chain](#people-chain), not a chain in its own right. [Statements](#statement) are signed, [allowance](#allowance)-gated, propagated peer-to-peer through gossip, and decay after a short TTL."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#storage-item", "page_title": "Glossary", "index": 108, "depth": 2, "title": "Storage Item", "anchor": "storage-item", "start_char": 38246, "end_char": 38593, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Storage Item\n\n[FRAME](#framework-for-runtime-aggregation-of-modularized-entities-frame) primitives that provide type-safe data persistence capabilities to the [runtime](#runtime).\nLearn more in the [storage items](https://paritytech.github.io/polkadot-sdk/master/frame_support/storage/types/index.html) reference document in the Polkadot SDK."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#substrate", "page_title": "Glossary", "index": 109, "depth": 2, "title": "Substrate", "anchor": "substrate", "start_char": 38593, "end_char": 39040, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Substrate\n\nThe modular [Rust](https://rust-lang.org/) blockchain framework Polkadot is built on, and now one component of the Polkadot SDK. A Substrate runtime is composed of pallets (reusable modules implementing chain logic — balances, staking, governance, etc.) and uses the SCALE codec for encoding. Substrate is the framework; Polkadot is one chain built with it. Substrate is maintained by [Parity Technologies](https://www.parity.io/)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#transaction", "page_title": "Glossary", "index": 110, "depth": 2, "title": "Transaction", "anchor": "transaction", "start_char": 39040, "end_char": 39315, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transaction\n\nAn [extrinsic](#extrinsic) that includes a signature that can be used to verify the account authorizing it inherently or via [signed extensions](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/signed_extensions/index.html)."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#transaction-era", "page_title": "Glossary", "index": 111, "depth": 2, "title": "Transaction Era", "anchor": "transaction-era", "start_char": 39315, "end_char": 39594, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transaction Era\n\nA definable period expressed as a range of block numbers during which a transaction can be included in a block.\nTransaction eras are used to protect against transaction replay attacks if an account is reaped and its replay-protecting nonce is reset to zero."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#triangle", "page_title": "Glossary", "index": 112, "depth": 2, "title": "Triangle", "anchor": "triangle", "start_char": 39594, "end_char": 40000, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Triangle\n\nThree Polkadot [Hosts](#host) (the [Polkadot App](#polkadot-app) on mobile, [Polkadot Desktop](#polkadot-desktop), and [Polkadot Web](#polkadot-web)) together with the [Products](#product) that run inside them and the [TrUAPI](#triangle-user-agent-programming-interface-truapi) protocol that connects them. The mobile App is always the key custodian. Desktop and Web never hold private keys."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#triangle-user-agent-programming-interface-truapi", "page_title": "Glossary", "index": 113, "depth": 2, "title": "Triangle User-Agent Programming Interface (TrUAPI)", "anchor": "triangle-user-agent-programming-interface-truapi", "start_char": 40000, "end_char": 40278, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Triangle User-Agent Programming Interface (TrUAPI)\n\nThe protocol that mediates all communication between [Hosts](#host) and [Products](#product). Always capitalized this way. Eleven method groups cover signing, chain interaction, storage, [chat](#chat), payments, and more."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#trie-patricia-merkle-tree", "page_title": "Glossary", "index": 114, "depth": 2, "title": "Trie (Patricia Merkle Tree)", "anchor": "trie-patricia-merkle-tree", "start_char": 40278, "end_char": 41024, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Trie (Patricia Merkle Tree)\n\nA data structure used to represent sets of key-value pairs and enables the items in the data set to be stored and retrieved using a cryptographic hash. Because incremental changes to the data set result in a new hash, retrieving data is efficient even if the data set is very large. With this data structure, you can also prove whether the data set includes any particular key-value pair without access to the entire data set.\n\nIn Polkadot SDK-based blockchains, state is stored in a trie data structure that supports the efficient creation of incremental digests. This trie is exposed to the [runtime](#runtime) as [a simple key/value map](#storage-item) where both keys and values can be arbitrary byte arrays."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#validator", "page_title": "Glossary", "index": 115, "depth": 2, "title": "Validator", "anchor": "validator", "start_char": 41024, "end_char": 41227, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Validator\n\nA validator is a node that participates in the consensus mechanism of the network. Its roles include block production, transaction validation, network integrity, and security maintenance."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#webassembly-wasm", "page_title": "Glossary", "index": 116, "depth": 2, "title": "WebAssembly (Wasm)", "anchor": "webassembly-wasm", "start_char": 41227, "end_char": 41654, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## WebAssembly (Wasm)\n\nAn execution architecture that allows for the efficient, platform-neutral expression of\ndeterministic, machine-executable logic.\n\n[Wasm](https://webassembly.org/) can be compiled from many languages, including\nthe [Rust](https://rust-lang.org/) programming language. Polkadot SDK-based chains use a Wasm binary to provide portable [runtimes](#runtime) that can be included as part of the chain's state."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#weight", "page_title": "Glossary", "index": 117, "depth": 2, "title": "Weight", "anchor": "weight", "start_char": 41654, "end_char": 42380, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Weight\n\nA convention used in Polkadot SDK-based blockchains to measure and manage the time it takes to validate a block.\nPolkadot SDK defines one unit of weight as one picosecond of execution time on reference hardware.\n\nThe maximum block weight should be equivalent to one-third of the target block time with an allocation of one-third each for:\n\n- Block construction\n- Network propagation\n- Import and verification\n\nBy defining weights, you can trade-off the number of transactions per second and the hardware required to maintain the target block time appropriate for your use case. Weights are defined in the runtime, meaning you can tune them using runtime updates to keep up with hardware and software improvements."}
{"source": "polkadot-docs", "page_id": "reference-glossary", "url": "https://developer.polkadot.com/reference/glossary/#westend", "page_title": "Glossary", "index": 118, "depth": 2, "title": "Westend", "anchor": "westend", "start_char": 42380, "end_char": 42522, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a81feca3782dbcd62ec29fd8e08edc3fa80d360c208b4db97696910f505f7bdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Westend\n\nWestend is a Parity-maintained, Polkadot SDK-based blockchain that serves as a test network for the [Polkadot](#polkadot) network."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#introduction", "page_title": "On-Chain Governance Overview", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 853, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nPolkadot’s governance system exemplifies decentralized decision-making, empowering its community of stakeholders to shape the network’s future through active participation. The latest evolution, OpenGov, builds on Polkadot’s foundation by providing a more inclusive and efficient governance model.\n\nThis guide will explain the principles and structure of OpenGov and walk you through its key components, such as Origins, Tracks, and Delegation. You will learn about improvements over earlier governance systems, including streamlined voting processes and enhanced stakeholder participation.\n\nWith OpenGov, Polkadot achieves a flexible, scalable, and democratic governance framework that allows multiple proposals to proceed simultaneously, ensuring the network evolves in alignment with its community's needs."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#governance-evolution", "page_title": "On-Chain Governance Overview", "index": 1, "depth": 2, "title": "Governance Evolution", "anchor": "governance-evolution", "start_char": 853, "end_char": 1759, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Governance Evolution\n\nPolkadot’s governance journey began with [Governance V1](../../wiki/learn/learn-polkadot-opengov.md#governance-summary), a system that proved effective in managing treasury funds and protocol upgrades. However, it faced limitations, such as:\n\n- Slow voting cycles, causing delays in decision-making.\n- Inflexibility in handling multiple referendums, restricting scalability.\n\nTo address these challenges, Polkadot introduced OpenGov, a governance model designed for greater inclusivity, efficiency, and scalability. OpenGov replaces the centralized structures of Governance V1, such as the Council and Technical Committee, with a fully decentralized and dynamic framework.\n\nFor a full comparison of the historic and current governance models, visit the [Gov1 vs. Polkadot OpenGov](../../wiki/learn/learn-polkadot-opengov.md#gov1-vs-polkadot-opengov) section of the Polkadot Wiki."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#opengov-key-features", "page_title": "On-Chain Governance Overview", "index": 2, "depth": 2, "title": "OpenGov Key Features", "anchor": "opengov-key-features", "start_char": 1759, "end_char": 2517, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## OpenGov Key Features\n\nOpenGov transforms Polkadot’s governance into a decentralized, stakeholder-driven model, eliminating centralized decision-making bodies like the Council. Key enhancements include:\n\n- **Decentralization**: Shifts all decision-making power to the public, ensuring a more democratic process.\n- **Enhanced delegation**: Allows users to delegate their votes to trusted experts across specific governance tracks.\n- **Simultaneous referendums**: Multiple proposals can progress at once, enabling faster decision-making.\n- **Polkadot Technical Fellowship**: A broad, community-driven group replacing the centralized Technical Committee.\n\nThis new system ensures Polkadot governance remains agile and inclusive, even as the ecosystem grows."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#origins-and-tracks", "page_title": "On-Chain Governance Overview", "index": 3, "depth": 2, "title": "Origins and Tracks", "anchor": "origins-and-tracks", "start_char": 2517, "end_char": 3510, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Origins and Tracks\n\nIn OpenGov, origins and tracks are central to managing proposals and votes.\n\n- **Origin**: Determines the authority level of a proposal (e.g., Treasury, Root) which decides the track of all referendums from that origin.\n- **Track**: Define the procedural flow of a proposal, such as voting duration, approval thresholds, and enactment timelines.\n\nDevelopers must be aware that referendums from different origins and tracks will take varying amounts of time to reach approval and enactment. The [Polkadot Technical Fellowship](../../wiki/learn/learn-polkadot-technical-fellowship.md) has the option to shorten this timeline by whitelisting a proposal and allowing it to be enacted through the [Whitelist Caller](../../wiki/learn/learn-polkadot-opengov-origins.md#whitelisted-caller) origin.\n\nVisit [Origins and Tracks Info](../../wiki/learn/learn-polkadot-opengov.md#origins-and-tracks) for details on current origins and tracks, associated terminology, and parameters."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#referendums", "page_title": "On-Chain Governance Overview", "index": 4, "depth": 2, "title": "Referendums", "anchor": "referendums", "start_char": 3510, "end_char": 4332, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Referendums\n\nIn OpenGov, anyone can submit a referendum, fostering an open and participatory system. The timeline for a referendum depends on the privilege level of the origin with more significant changes offering more time for community voting and participation before enactment. \n\nThe timeline for an individual referendum includes four distinct periods:\n\n- **Lead-in**: A minimum amount of time to allow for community participation, available room in the origin, and payment of the decision deposit. Voting is open during this period.\n- **Decision**: Voting continues.\n- **Confirmation**: Referendum must meet [approval and support](../../wiki/learn/learn-polkadot-opengov.md#approval-and-support) criteria during entire period to avoid rejection.\n- **Enactment**: Changes approved by the referendum are executed."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#vote-on-referendums", "page_title": "On-Chain Governance Overview", "index": 5, "depth": 3, "title": "Vote on Referendums", "anchor": "vote-on-referendums", "start_char": 4332, "end_char": 4944, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Vote on Referendums\n\nVoters can vote with their tokens on each referendum. Polkadot uses a voluntary token locking mechanism, called conviction voting, as a way for voters to increase their voting power. A token holder signals they have a stronger preference for approving a proposal based upon their willingness to lock up tokens. Longer voluntary token locks are seen as a signal of continual approval and translate to increased voting weight.\n\nSee [Voting on a Referendum](../../wiki/learn/learn-polkadot-opengov.md#voting-on-a-referendum) for a deeper look at conviction voting and related token locks."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#delegate-voting-power", "page_title": "On-Chain Governance Overview", "index": 6, "depth": 3, "title": "Delegate Voting Power", "anchor": "delegate-voting-power", "start_char": 4944, "end_char": 5669, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Delegate Voting Power\n\nThe OpenGov system also supports multi-role delegations, allowing token holders to assign their voting power on different tracks to entities with expertise in those areas. \n\nFor example, if a token holder lacks the technical knowledge to evaluate proposals on the [Root track](../../wiki/learn/learn-polkadot-opengov-origins.md#root), they can delegate their voting power for that track to an expert they trust to vote in the best interest of the network. This ensures informed decision-making across tracks while maintaining flexibility for token holders.\n\nVisit [Multirole Delegation](../../wiki/learn/learn-polkadot-opengov.md#multirole-delegation) for more details on delegating voting power."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#cancel-a-referendum", "page_title": "On-Chain Governance Overview", "index": 7, "depth": 3, "title": "Cancel a Referendum", "anchor": "cancel-a-referendum", "start_char": 5669, "end_char": 6355, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Cancel a Referendum\n\nPolkadot OpenGov has two origins for rejecting ongoing referendums: \n\n- [**Referendum Canceller**](../../wiki/learn/learn-polkadot-opengov-origins.md#referendum-canceller): Cancels an active referendum when non-malicious errors occur and refunds the deposits to the originators.\n- [**Referendum Killer**](../../wiki/learn/learn-polkadot-opengov-origins.md#referendum-killer): Used for urgent, malicious cases this origin instantly terminates an active referendum and slashes deposits.\n\nSee [Cancelling, Killing, and Blacklisting](../../wiki/learn/learn-polkadot-opengov.md#cancelling-killing--blacklisting) for additional information on rejecting referendums."}
{"source": "polkadot-docs", "page_id": "reference-governance", "url": "https://developer.polkadot.com/reference/governance/#additional-resources", "page_title": "On-Chain Governance Overview", "index": 8, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 6355, "end_char": 7063, "estimated_token_count": 198, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f27b3dd93babb2376cbbfa9b40021ace1f56d46f5dfc14f368e7a0c066fd0436", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Additional Resources\n\n- **[Democracy pallet](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/substrate/frame/democracy/src)**: Handles administration of general stakeholder voting.\n- **[Gov2: Polkadot’s Next Generation of Decentralised Governance](https://medium.com/polkadot-network/gov2-polkadots-next-generation-of-decentralised-governance-4d9ef657d11b)**: Medium article by Gavin Wood.\n- **[Polkadot Direction](https://matrix.to/#/#Polkadot-Direction:parity.io)**: Matrix Element client.\n- **[Polkassembly](https://polkadot.polkassembly.io/)**: OpenGov dashboard and UI.\n- **[Polkadot.js Apps Governance](https://polkadot.js.org/apps/#/referenda)**: Overview of active referendums."}
{"source": "polkadot-docs", "page_id": "reference-governance-origins-tracks", "url": "https://developer.polkadot.com/reference/governance/origins-tracks/#introduction", "page_title": "Origins and Tracks", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 834, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1246c0c604f6b7bccacfe051dcc14614a40360c54af5c3174281e867a8c1e6ee", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nPolkadot's OpenGov system empowers decentralized decision-making and active community participation by tailoring the governance process to the impact of proposed changes. Through a system of origins and tracks, OpenGov ensures that every referendum receives the appropriate scrutiny, balancing security, inclusivity, and efficiency.\n\nThis guide will help you understand the role of origins in classifying proposals by privilege and priority. You will learn how tracks guide proposals through tailored stages like voting, confirmation, and enactment and how to select the correct origin for your referendum to align with community expectations and network governance.\n\nOrigins and tracks are vital in streamlining the governance workflow and maintaining Polkadot's resilience and adaptability."}
{"source": "polkadot-docs", "page_id": "reference-governance-origins-tracks", "url": "https://developer.polkadot.com/reference/governance/origins-tracks/#origins", "page_title": "Origins and Tracks", "index": 1, "depth": 2, "title": "Origins", "anchor": "origins", "start_char": 834, "end_char": 1858, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1246c0c604f6b7bccacfe051dcc14614a40360c54af5c3174281e867a8c1e6ee", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Origins\n\nOrigins are the foundation of Polkadot's OpenGov governance system. They categorize proposals by privilege and define their decision-making rules. Each origin corresponds to a specific level of importance and risk, guiding how referendums progress through the governance process.\n\n- High-privilege origins like Root Origin govern critical network changes, such as core software upgrades.\n- Lower-privilege origins like Small Spender handle minor requests, such as community project funding under 10,000 DOT.\n\nProposers select an origin based on the nature of their referendum. Origins determine parameters like approval thresholds, required deposits, and timeframes for voting and confirmation. Each origin is paired with a track, which acts as a roadmap for the proposal's lifecycle, including preparation, voting, and enactment.\n\nFor a detailed list of origins and their associated parameters, see the [Polkadot OpenGov Origins](../../wiki/learn/learn-polkadot-opengov-origins.md) entry in the Polkadot Wiki."}
{"source": "polkadot-docs", "page_id": "reference-governance-origins-tracks", "url": "https://developer.polkadot.com/reference/governance/origins-tracks/#tracks", "page_title": "Origins and Tracks", "index": 2, "depth": 2, "title": "Tracks", "anchor": "tracks", "start_char": 1858, "end_char": 2808, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1246c0c604f6b7bccacfe051dcc14614a40360c54af5c3174281e867a8c1e6ee", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Tracks\n\nTracks define a referendum's journey from submission to enactment, tailoring governance parameters to the impact of proposed changes. Each track operates independently and includes several key stages:\n\n- **Preparation**: Time for community discussion before voting begins.\n- **Voting**: Period for token holders to cast their votes.\n- **Decision**: Finalization of results and determination of the proposal's outcome.\n- **Confirmation**: Period to verify sustained community support before enactment.\n- **Enactment**: Final waiting period before the proposal takes effect.\n\nTracks customize these stages with parameters like decision deposit requirements, voting durations, and approval thresholds, ensuring proposals from each origin receive the required scrutiny and process. For example, a runtime upgrade in the Root Origin track will have longer timeframes and stricter thresholds than a treasury request in the Small Spender track."}
{"source": "polkadot-docs", "page_id": "reference-governance-origins-tracks", "url": "https://developer.polkadot.com/reference/governance/origins-tracks/#additional-resources", "page_title": "Origins and Tracks", "index": 3, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 2808, "end_char": 3246, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1246c0c604f6b7bccacfe051dcc14614a40360c54af5c3174281e867a8c1e6ee", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Additional Resources\n\n- For a list of origins and tracks for Polkadot and Kusama, including associated parameters, see the [Origins and Tracks Info](../../wiki/learn/learn-polkadot-opengov-origins.md#origins-and-tracks-info) entry in the Polkadot Wiki.\n\n- For a deeper dive into the approval and support system, see the [Approval and Support](../../wiki/learn/learn-polkadot-opengov.md#approval-and-support) entry of the Polkadot Wiki."}
{"source": "polkadot-docs", "page_id": "reference", "url": "https://developer.polkadot.com/reference/#introduction", "page_title": "Technical Reference Overview", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 1, "end_char": 932, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9738734dfa86e4d98aae22631c0c96d4b2af17df3eb610f8cd0e58a52638b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Technical Reference section provides comprehensive documentation of Polkadot's architecture, core concepts, and development tooling. Whether you're exploring how Polkadot's relay chain coordinates parachains, understanding governance mechanisms, or building applications on the network, this reference covers the technical foundations you need.\n\nPolkadot is a multi-chain network that enables diverse, interconnected blockchains to share security and communicate seamlessly. Understanding how these components interact from the Relay Chain that validates parachains to the Governance mechanisms that evolve the protocol is essential for developers, validators, and network participants.\n\nThis guide organizes technical documentation across five core areas: Polkadot Hub, Parachains, On-Chain Governance, Glossary, and Tools, each providing detailed information on different aspects of the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "reference", "url": "https://developer.polkadot.com/reference/#polkadot-hub", "page_title": "Technical Reference Overview", "index": 1, "depth": 2, "title": "Polkadot Hub", "anchor": "polkadot-hub", "start_char": 932, "end_char": 2213, "estimated_token_count": 242, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9738734dfa86e4d98aae22631c0c96d4b2af17df3eb610f8cd0e58a52638b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot Hub\n\n[Polkadot Hub](/reference/polkadot-hub/) is the entry point to Polkadot for all users and application developers. It provides access to essential Web3 services including smart contracts, asset management, staking, governance, identity management, and cross-ecosystem interoperability—without requiring you to deploy or manage a parachain.\n\nThe Hub encompasses a set of core functionality that enables developers and users to build and interact with applications on Polkadot. Key capabilities include:\n\n- **Smart contracts**: Deploy Ethereum-compatible smart contracts and build decentralized applications.\n- **Asset management**: Create, manage, and transfer fungible tokens and NFTs across the ecosystem.\n- **Staking**: Participate in network security and earn rewards by staking DOT.\n- **Governance**: Vote on proposals and participate in Polkadot's decentralized decision-making through OpenGov.\n- **Identity services**: Register and manage on-chain identities, enabling access to governance roles and network opportunities.\n- **Cross-chain interoperability**: Leverage XCM messaging to interact securely with other chains in the Polkadot ecosystem.\n- **Collectives and DAOs**: Participate in governance collectives and decentralized autonomous organizations."}
{"source": "polkadot-docs", "page_id": "reference", "url": "https://developer.polkadot.com/reference/#parachains", "page_title": "Technical Reference Overview", "index": 2, "depth": 2, "title": "Parachains", "anchor": "parachains", "start_char": 2213, "end_char": 3484, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9738734dfa86e4d98aae22631c0c96d4b2af17df3eb610f8cd0e58a52638b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Parachains\n\n[Parachains](/reference/parachains/) are specialized blockchains that connect to the Polkadot relay chain, inheriting its security while maintaining their own application-specific logic. The parachains documentation covers:\n\n- **Accounts**: Deep dive into account types, storage, and management on parachains.\n- **Blocks, transactions and fees**: Understand block production, transaction inclusion, and fee mechanisms.\n- **Consensus**: Learn how parachain blocks are validated and finalized through the relay chain's consensus.\n- **Chain data**: Explore data structures, storage layouts, and state management.\n- **Cryptography**: Study cryptographic primitives used in Polkadot SDK-based chains.\n- **Data encoding**: Understand how data is encoded and decoded for blockchain compatibility.\n- **Networks**: Learn about networking protocols and peer-to-peer communication.\n- **Interoperability**: Discover [Cross-Consensus Messaging (XCM)](/parachains/interoperability/get-started/), the standard for cross-chain communication.\n- **Randomness**: Understand how randomness is generated and used in Polkadot chains.\n- **Node and runtime**: Learn about parachain nodes, runtime environments, and the [Polkadot SDK](https://github.com/paritytech/polkadot-sdk)."}
{"source": "polkadot-docs", "page_id": "reference", "url": "https://developer.polkadot.com/reference/#on-chain-governance", "page_title": "Technical Reference Overview", "index": 3, "depth": 2, "title": "On-Chain Governance", "anchor": "on-chain-governance", "start_char": 3484, "end_char": 4348, "estimated_token_count": 164, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9738734dfa86e4d98aae22631c0c96d4b2af17df3eb610f8cd0e58a52638b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## On-Chain Governance\n\n[On-Chain governance](/reference/governance/) is the decentralized decision-making mechanism for the Polkadot network. It manages the evolution and modification of the network's runtime logic, enabling community oversight and approval for proposed changes. The governance documentation details:\n\n- **OpenGov framework**: Understand Polkadot's next-generation governance system with enhanced delegation, flexible tracks, and simultaneous referendums.\n- **Origins and tracks**: Learn how governance proposals are categorized, prioritized, and executed based on their privilege level and complexity.\n- **Voting and delegation**: Explore conviction voting, vote delegation, and how token holders participate in governance.\n- **Governance evolution**: See how Polkadot's governance has evolved from Governance V1 to the current OpenGov system."}
{"source": "polkadot-docs", "page_id": "reference", "url": "https://developer.polkadot.com/reference/#glossary", "page_title": "Technical Reference Overview", "index": 4, "depth": 2, "title": "Glossary", "anchor": "glossary", "start_char": 4348, "end_char": 4773, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9738734dfa86e4d98aae22631c0c96d4b2af17df3eb610f8cd0e58a52638b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Glossary\n\nThe [Glossary](/reference/glossary/) provides quick-reference definitions for Polkadot-specific terminology. Essential terms include:\n\n- Blockchain concepts (blocks, transactions, state)\n- Consensus mechanisms (validators, collators, finality)\n- Polkadot-specific terms (relay chain, parachain, XCM, FRAME)\n- Network components (nodes, runtimes, storage)\n- Governance terminology (origins, tracks, referendums)"}
{"source": "polkadot-docs", "page_id": "reference", "url": "https://developer.polkadot.com/reference/#tools", "page_title": "Technical Reference Overview", "index": 5, "depth": 2, "title": "Tools", "anchor": "tools", "start_char": 4773, "end_char": 5874, "estimated_token_count": 285, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9738734dfa86e4d98aae22631c0c96d4b2af17df3eb610f8cd0e58a52638b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Tools\n\nThe [Tools](/reference/tools/zombienet/) section documents essential development and interaction tools for the Polkadot ecosystem:\n\n- **Light clients**: Lightweight solutions for interacting with the network without running full nodes.\n- **JavaScript/TypeScript tools**: Libraries like [Polkadot.js API](/reference/tools/polkadot-js-api/) and [PAPI](/reference/tools/papi/) for building applications.\n- **Rust tools**: [Polkadart](/reference/tools/polkadart/) and other Rust-based libraries for SDK development.\n- **Python tools**: [py-substrate-interface](/reference/tools/py-substrate-interface/) for Python developers.\n- **Testing and development**: Tools like [Moonwall](/reference/tools/moonwall/), [Chopsticks](/reference/tools/chopsticks/), and [Omninode](/reference/tools/omninode/) for smart contract and parachain testing.\n- **Indexing and monitoring**: [Sidecar](/reference/tools/sidecar/) for data indexing and [Dedot](/reference/tools/dedot/) for substrate interaction.\n- **Cross-chain tools**: [ParaSpell](/reference/tools/paraspell/) for XCM integration and asset transfers."}
{"source": "polkadot-docs", "page_id": "reference", "url": "https://developer.polkadot.com/reference/#where-to-go-next", "page_title": "Technical Reference Overview", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5874, "end_char": 7246, "estimated_token_count": 336, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9738734dfa86e4d98aae22631c0c96d4b2af17df3eb610f8cd0e58a52638b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nFor detailed exploration of specific areas, proceed to any of the main sections:\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Polkadot Hub**\n\n    ---\n\n    Understand the relay chain's role in coordinating parachains, providing shared security, and enabling governance.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/)\n\n- <span class=\"badge learn\">Learn</span> **Parachains**\n\n    ---\n\n    Deep dive into parachain architecture, consensus, data structures, and building application-specific blockchains.\n\n    [:octicons-arrow-right-24: Reference](/reference/parachains/)\n\n- <span class=\"badge learn\">Learn</span> **On-Chain Governance**\n\n    ---\n\n    Explore Polkadot's decentralized governance framework and how to participate in network decision-making.\n\n    [:octicons-arrow-right-24: Reference](/reference/governance/)\n\n- <span class=\"badge guide\">Guide</span> **Glossary**\n\n    ---\n\n    Quick reference for Polkadot-specific terminology and concepts used throughout the documentation.\n\n    [:octicons-arrow-right-24: Reference](/reference/glossary/)\n\n- <span class=\"badge guide\">Guide</span> **Tools**\n\n    ---\n\n    Discover development tools, libraries, and frameworks for building and interacting with Polkadot.\n\n    [:octicons-arrow-right-24: Reference](/reference/tools/zombienet/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#introduction", "page_title": "Polkadot SDK Accounts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 598, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nAccounts are essential for managing identity, transactions, and governance on the network in the Polkadot SDK. Understanding these components is critical for seamless development and operation on the network, whether you're building or interacting with Polkadot-based chains.\n\nThis page will guide you through the essential aspects of accounts, including their data structure, balance types, reference counters, and address formats. You’ll learn how accounts are managed within the runtime, how balances are categorized, and how addresses are encoded and validated."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#account-data-structure", "page_title": "Polkadot SDK Accounts", "index": 1, "depth": 2, "title": "Account Data Structure", "anchor": "account-data-structure", "start_char": 598, "end_char": 863, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Account Data Structure\n\nAccounts are foundational to any blockchain, and the Polkadot SDK provides a flexible management system. This section explains how the Polkadot SDK defines accounts and manages their lifecycle through data structures within the runtime."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#account", "page_title": "Polkadot SDK Accounts", "index": 2, "depth": 3, "title": "Account", "anchor": "account", "start_char": 863, "end_char": 3106, "estimated_token_count": 551, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account\n\nThe [`Account` data type](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/type.Account.html) is a storage map within the [System pallet](https://paritytech.github.io/polkadot-sdk/master/src/frame_system/lib.rs.html) that links an account ID to its corresponding data. This structure is fundamental for mapping account-related information within the chain.\n\nThe code snippet below shows how accounts are defined:\n\n```rs\n /// The full account information for a particular account ID.\n #[pallet::storage]\n #[pallet::getter(fn account)]\n pub type Account<T: Config> = StorageMap<\n \t_,\n \tBlake2_128Concat,\n \tT::AccountId,\n \tAccountInfo<T::Nonce, T::AccountData>,\n \tValueQuery,\n >;\n```\n\nThe preceding code block defines a storage map named `Account`. The `StorageMap` is a type of on-chain storage that maps keys to values. In the `Account` map, the key is an account ID, and the value is the account's information. Here, `T` represents the generic parameter for the runtime configuration, which is defined by the pallet's configuration trait (`Config`).\n\nThe `StorageMap` consists of the following parameters:\n\n- **`_`**: Used in macro expansion and acts as a placeholder for the storage prefix type. Tells the macro to insert the default prefix during expansion.\n- **`Blake2_128Concat`**: The hashing function applied to keys in the storage map.\n- **`T: :AccountId`**: Represents the key type, which corresponds to the account’s unique ID.\n- **`AccountInfo<T: :Nonce, T::AccountData>`**: The value type stored in the map. For each account ID, the map stores an `AccountInfo` struct containing:\n\n    - **`T::Nonce`**: A nonce for the account, which is incremented with each transaction to ensure transaction uniqueness.\n    - **`T: :AccountData`**: Custom account data defined by the runtime configuration, which could include balances, locked funds, or other relevant information.\n    \n- **`ValueQuery`**: Defines how queries to the storage map behave when no value is found; returns a default value instead of `None`.\n\nFor a detailed explanation of storage maps, see the [`StorageMap`](https://paritytech.github.io/polkadot-sdk/master/frame_support/storage/types/struct.StorageMap.html) entry in the Rust docs."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#account-info", "page_title": "Polkadot SDK Accounts", "index": 3, "depth": 3, "title": "Account Info", "anchor": "account-info", "start_char": 3106, "end_char": 5721, "estimated_token_count": 599, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account Info\n\nThe `AccountInfo` structure is another key element within the [System pallet](https://paritytech.github.io/polkadot-sdk/master/src/frame_system/lib.rs.html), providing more granular details about each account's state. This structure tracks vital data, such as the number of transactions and the account’s relationships with other modules.\n\n```rs\n/// Information of an account.\n#[derive(Clone, Eq, PartialEq, Default, RuntimeDebug, Encode, Decode, TypeInfo, MaxEncodedLen)]\npub struct AccountInfo<Nonce, AccountData> {\n\t/// The number of transactions this account has sent.\n\tpub nonce: Nonce,\n\t/// The number of other modules that currently depend on this account's existence. The account\n\t/// cannot be reaped until this is zero.\n\tpub consumers: RefCount,\n\t/// The number of other modules that allow this account to exist. The account may not be reaped\n\t/// until this and `sufficients` are both zero.\n\tpub providers: RefCount,\n\t/// The number of modules that allow this account to exist for their own purposes only. The\n\t/// account may not be reaped until this and `providers` are both zero.\n\tpub sufficients: RefCount,\n\t/// The additional data that belongs to this account. Used to store the balance(s) in a lot of\n\t/// chains.\n\tpub data: AccountData,\n}\n```\n\nThe `AccountInfo` structure includes the following components:\n\n- **`nonce`**: Tracks the number of transactions initiated by the account, which ensures transaction uniqueness and prevents replay attacks.\n- **`consumers`**: Counts how many other modules or pallets rely on this account’s existence. The account cannot be removed from the chain (reaped) until this count reaches zero.\n- **`providers`**: Tracks how many modules permit this account’s existence. An account can only be reaped once both `providers` and `sufficients` are zero.\n- **`sufficients`**: Represents the number of modules that allow the account to exist for internal purposes, independent of any other modules.\n- **`AccountData`**: A flexible data structure that can be customized in the runtime configuration, usually containing balances or other user-specific data.\n\nThis structure helps manage an account's state and prevents its premature removal while it is still referenced by other on-chain data or modules. The [`AccountInfo`](https://paritytech.github.io/polkadot-sdk/master/frame_system/struct.AccountInfo.html) structure can vary as long as it satisfies the trait bounds defined by the `AccountData` associated type in the [`frame-system::pallet::Config`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/trait.Config.html) trait."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#account-reference-counters", "page_title": "Polkadot SDK Accounts", "index": 4, "depth": 3, "title": "Account Reference Counters", "anchor": "account-reference-counters", "start_char": 5721, "end_char": 10734, "estimated_token_count": 1010, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account Reference Counters\n\nPolkadot SDK uses reference counters to track an account’s dependencies across different runtime modules. These counters ensure that accounts remain active while data is associated with them.\n\nThe reference counters include:\n\n- **`consumers`**: Prevents account removal while other pallets still rely on the account.\n- **`providers`**: Ensures an account is active before other pallets store data related to it.\n- **`sufficients`**: Indicates the account’s independence, ensuring it can exist even without a native token balance, such as when holding sufficient alternative assets.\n\n#### Providers Reference Counters\n\nThe `providers` counter ensures that an account is ready to be depended upon by other runtime modules. For example, it is incremented when an account has a balance above the existential deposit, which marks the account as active.\n\nThe system requires this reference counter to be greater than zero for the `consumers` counter to be incremented, ensuring the account is stable before any dependencies are added.\n\n#### Consumers Reference Counters\n\nThe `consumers` counter ensures that the account cannot be reaped until all references to it across the runtime have been removed. This check prevents the accidental deletion of accounts that still have active on-chain data.\n\nIt is the user’s responsibility to clear out any data from other runtime modules if they wish to remove their account and reclaim their existential deposit.\n\n#### Sufficients Reference Counter\n\nThe `sufficients` counter tracks accounts that can exist independently without relying on a native account balance. This is useful for accounts holding other types of assets, like tokens, without needing a minimum balance in the native token.\n\nFor instance, the [Assets pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_assets/index.html), may increment this counter for an account holding sufficient tokens.\n\n#### Account Deactivation\n\nIn Polkadot SDK-based chains, an account is deactivated when its reference counters (such as `providers`, `consumers`, and `sufficient`) reach zero. These counters ensure the account remains active as long as other runtime modules or pallets reference it.\n\nWhen all dependencies are cleared and the counters drop to zero, the account becomes deactivated and may be removed from the chain (reaped). This is particularly important in Polkadot SDK-based blockchains, where accounts with balances below the existential deposit threshold are pruned from storage to conserve state resources.\n\nEach pallet that references an account has cleanup functions that decrement these counters when the pallet no longer depends on the account. Once these counters reach zero, the account is marked for deactivation.\n\n#### Updating Counters\n\nThe Polkadot SDK provides runtime developers with various methods to manage account lifecycle events, such as deactivation or incrementing reference counters. These methods ensure that accounts cannot be reaped while still in use.\n\nThe following helper functions manage these counters:\n\n- **`inc_consumers()`**: Increments the `consumer` reference counter for an account, signaling that another pallet depends on it.\n- **`dec_consumers()`**: Decrements the `consumer` reference counter, signaling that a pallet no longer relies on the account.\n- **`inc_providers()`**: Increments the `provider` reference counter, ensuring the account remains active.\n- **`dec_providers()`**: Decrements the `provider` reference counter, allowing for account deactivation when no longer in use.\n- **`inc_sufficients()`**: Increments the `sufficient` reference counter for accounts that hold sufficient assets.\n- **`dec_sufficients()`**: Decrements the `sufficient` reference counter.\n\nTo ensure proper account cleanup and lifecycle management, a corresponding decrement should be made for each increment action.\n\nThe `System` pallet offers three query functions to assist developers in tracking account states:\n\n- **[`can_inc_consumer()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.can_inc_consumer)**: Checks if the account can safely increment the consumer reference.\n- **[`can_dec_provider()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.can_dec_provider)**: Ensures that no consumers exist before allowing the decrement of the provider counter.\n- **[`is_provider_required()`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.is_provider_required)**: Verifies whether the account still has any active consumer references.\n\nThis modular and flexible system of reference counters tightly controls the lifecycle of accounts in Polkadot SDK-based blockchains, preventing the accidental removal or retention of unneeded accounts. You can refer to the [System pallet Rust docs](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html) for more details."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#account-balance-types", "page_title": "Polkadot SDK Accounts", "index": 5, "depth": 2, "title": "Account Balance Types", "anchor": "account-balance-types", "start_char": 10734, "end_char": 12558, "estimated_token_count": 429, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Account Balance Types\n\nIn the Polkadot ecosystem, account balances are categorized into different types based on how the funds are utilized and their availability. These balance types determine the actions that can be performed, such as transferring tokens, paying transaction fees, or participating in governance activities. Understanding these balance types helps developers manage user accounts and implement balance-dependent logic.\n\n!!! note \"A more efficient distribution of account balance types is in development\"\n    Soon, pallets in the Polkadot SDK will implement the [`Fungible` trait](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/tokens/fungible/index.html) (see the [tracking issue](https://github.com/paritytech/polkadot-sdk/issues/226) for more details). For example, the [`transaction-storage`](https://paritytech.github.io/polkadot-sdk/master/pallet_transaction_storage/index.html) pallet changed the implementation of the [`Currency`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/tokens/currency/index.html) trait (see the [Refactor transaction storage pallet to use fungible traits](https://github.com/paritytech/polkadot-sdk/pull/1800) PR for further details):\n\n    ```rust\n    type BalanceOf<T> = <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;\n    ```\n    \n    To the [`Fungible`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/tokens/fungible/index.html) trait:\n\n    ```rust\n    type BalanceOf<T> = <<T as Config>::Currency as FnInspect<<T as frame_system::Config>::AccountId>>::Balance;\n    ```\n    \n    This update will enable more efficient use of account balances, allowing the free balance to be utilized for on-chain activities such as setting proxies and managing identities."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#balance-types", "page_title": "Polkadot SDK Accounts", "index": 6, "depth": 3, "title": "Balance Types", "anchor": "balance-types", "start_char": 12558, "end_char": 14830, "estimated_token_count": 552, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Balance Types\n\nThe five main balance types are:\n\n- **Free balance**: Represents the total tokens available to the account for any on-chain activity, including staking, governance, and voting. However, it may not be fully spendable or transferrable if portions of it are locked or reserved.\n- **Locked balance**: Portions of the free balance that cannot be spent or transferred because they are tied up in specific activities like [staking](../../wiki/learn/learn-staking.md#nominating-validators), [vesting](../../wiki/learn/learn-guides-transfers.md#vested-transfers-with-the-polkadot-js-ui), or participating in [governance](../../wiki/learn/learn-polkadot-opengov.md#voting-on-a-referendum). While the tokens remain part of the free balance, they are non-transferable for the duration of the lock.\n- **Reserved balance**: Funds locked by specific system actions, such as setting up an [identity](../../wiki/learn/learn-identity.md), creating [proxies](../../wiki/learn/learn-proxies.md), or submitting [deposits for governance proposals](../../wiki/learn/learn-guides-polkadot-opengov.md#claiming-opengov-deposits). These tokens are not part of the free balance and cannot be spent unless they are unreserved.\n- **Spendable balance**: The portion of the free balance that is available for immediate spending or transfers. It is calculated by subtracting the maximum of locked or reserved amounts from the free balance, ensuring that existential deposit limits are met.\n- **Untouchable balance**: Funds that cannot be directly spent or transferred but may still be utilized for on-chain activities, such as governance participation or staking. These tokens are typically tied to certain actions or locked for a specific period.\n\nThe spendable balance is calculated as follows:\n\n```text\nspendable = free - max(locked - reserved, ED)\n```\n\nHere, `free`, `locked`, and `reserved` are defined above. The `ED` represents the [existential deposit](../../wiki/learn/learn-accounts.md#existential-deposit-and-reaping), the minimum balance required to keep an account active and prevent it from being reaped. You may find you can't see all balance types when looking at your account via a wallet. Wallet providers often display only spendable, locked, and reserved balances."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#locks", "page_title": "Polkadot SDK Accounts", "index": 7, "depth": 3, "title": "Locks", "anchor": "locks", "start_char": 14830, "end_char": 16991, "estimated_token_count": 452, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Locks\n\nLocks are applied to an account's free balance, preventing that portion from being spent or transferred. Locks are automatically placed when an account participates in specific on-chain activities, such as staking or governance. Although multiple locks may be applied simultaneously, they do not stack. Instead, the largest lock determines the total amount of locked tokens.\n\nLocks follow these basic rules:\n\n- If different locks apply to varying amounts, the largest lock amount takes precedence.\n- If multiple locks apply to the same amount, the lock with the longest duration governs when the balance can be unlocked.\n\n#### Locks Example\n\nConsider an example where an account has 80 DOT locked for both staking and governance purposes like so:\n\n- 80 DOT is staked with a 28-day lock period.\n- 24 DOT is locked for governance with a 1x conviction and a 7-day lock period.\n- 4 DOT is locked for governance with a 6x conviction and a 224-day lock period.\n\nIn this case, the total locked amount is 80 DOT because only the largest lock (80 DOT from staking) governs the locked balance. These 80 DOT will be released at different times based on the lock durations. In this example, the 24 DOT locked for governance will be released first since the shortest lock period is seven days. The 80 DOT stake with a 28-day lock period is released next. Now, all that remains locked is the 4 DOT for governance. After 224 days, all 80 DOT (minus the existential deposit) will be free and transferable.\n\n![Illustration of Lock Example](/images/reference/parachains/accounts/accounts-01.webp)\n\n#### Edge Cases for Locks\n\nIn scenarios where multiple convictions and lock periods are active, the lock duration and amount are determined by the longest period and largest amount. For example, if you delegate with different convictions and attempt to undelegate during an active lock period, the lock may be extended for the full amount of tokens. For a detailed discussion on edge case lock behavior, see this [Stack Exchange post](https://substrate.stackexchange.com/questions/5067/delegating-and-undelegating-during-the-lock-period-extends-it-for-the-initial-am)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#balance-types-on-polkadotjs", "page_title": "Polkadot SDK Accounts", "index": 8, "depth": 3, "title": "Balance Types on Polkadot.js", "anchor": "balance-types-on-polkadotjs", "start_char": 16991, "end_char": 20030, "estimated_token_count": 603, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Balance Types on Polkadot.js\n\nPolkadot.js provides a user-friendly interface for managing and visualizing various account balances on Polkadot and Kusama networks. When interacting with Polkadot.js, you will encounter multiple balance types that are critical for understanding how your funds are distributed and restricted. This section explains how different balances are displayed in the Polkadot.js UI and what each type represents.\n\n![](/images/reference/parachains/accounts/accounts-02.webp)\n\nThe most common balance types displayed on Polkadot.js are:\n\n- **Total balance**: The total number of tokens available in the account. This includes all tokens, whether they are transferable, locked, reserved, or vested. However, the total balance does not always reflect what can be spent immediately. In this example, the total balance is 0.6274 KSM.\n\n- **Transferable balance**: Shows how many tokens are immediately available for transfer. It is calculated by subtracting the locked and reserved balances from the total balance. For example, if an account has a total balance of 0.6274 KSM and a transferable balance of 0.0106 KSM, only the latter amount can be sent or spent freely.\n\n- **Vested balance**: Tokens that allocated to the account but released according to a specific schedule. Vested tokens remain locked and cannot be transferred until fully vested. For example, an account with a vested balance of 0.2500 KSM means that this amount is owned but not yet transferable.\n\n- **Locked balance**: Tokens that are temporarily restricted from being transferred or spent. These locks typically result from participating in staking, governance, or vested transfers. In Polkadot.js, locked balances do not stack—only the largest lock is applied. For instance, if an account has 0.5500 KSM locked for governance and staking, the locked balance would display 0.5500 KSM, not the sum of all locked amounts.\n\n- **Reserved balance**: Refers to tokens locked for specific on-chain actions, such as setting an identity, creating a proxy, or making governance deposits. Reserved tokens are not part of the free balance, but can be freed by performing certain actions. For example, removing an identity would unreserve those funds.\n\n- **Bonded balance**: The tokens locked for staking purposes. Bonded tokens are not transferable until they are unbonded after the unbonding period.\n\n- **Redeemable balance**: The number of tokens that have completed the unbonding period and are ready to be unlocked and transferred again. For example, if an account has a redeemable balance of 0.1000 KSM, those tokens are now available for spending.\n\n- **Democracy balance**: Reflects the number of tokens locked for governance activities, such as voting on referenda. These tokens are locked for the duration of the governance action and are only released after the lock period ends.\n\nBy understanding these balance types and their implications, developers and users can better manage their funds and engage with on-chain activities more effectively."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#address-formats", "page_title": "Polkadot SDK Accounts", "index": 9, "depth": 2, "title": "Address Formats", "anchor": "address-formats", "start_char": 20030, "end_char": 20489, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Address Formats\n\nThe SS58 address format is a core component of the Polkadot SDK that enables accounts to be uniquely identified across Polkadot-based networks. This format is a modified version of Bitcoin's Base58Check encoding, specifically designed to accommodate the multi-chain nature of the Polkadot ecosystem. SS58 encoding allows each chain to define its own set of addresses while maintaining compatibility and checksum validation for security."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#basic-format", "page_title": "Polkadot SDK Accounts", "index": 10, "depth": 3, "title": "Basic Format", "anchor": "basic-format", "start_char": 20489, "end_char": 21699, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Basic Format\n\nSS58 addresses consist of three main components:\n\n```text\nbase58encode(concat(<address-type>, <address>, <checksum>))\n```\n\n- **Address type**: A byte or set of bytes that define the network (or chain) for which the address is intended. This ensures that addresses are unique across different Polkadot SDK-based chains.\n- **Address**: The public key of the account encoded as bytes.\n- **Checksum**: A hash-based checksum which ensures that addresses are valid and unaltered. The checksum is derived from the concatenated address type and address components, ensuring integrity.\n\nThe encoding process transforms the concatenated components into a Base58 string, providing a compact and human-readable format that avoids easily confused characters (e.g., zero '0', capital 'O', lowercase 'l'). This encoding function ([`encode`](https://docs.rs/bs58/latest/bs58/fn.encode.html)) is implemented exactly as defined in Bitcoin and IPFS specifications, using the same alphabet as both implementations.\n\nFor more details about the SS58 address format implementation, see the [`Ss58Codec`](https://paritytech.github.io/polkadot-sdk/master/sp_core/crypto/trait.Ss58Codec.html) trait in the Rust Docs."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#address-type", "page_title": "Polkadot SDK Accounts", "index": 11, "depth": 3, "title": "Address Type", "anchor": "address-type", "start_char": 21699, "end_char": 22618, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Address Type\n\nThe address type defines how an address is interpreted and to which network it belongs. Polkadot SDK uses different prefixes to distinguish between various chains and address formats:\n\n- **Address types `0-63`**: Simple addresses, commonly used for network identifiers.\n- **Address types `64-127`**: Full addresses that support a wider range of network identifiers.\n- **Address types `128-255`**: Reserved for future address format extensions.\n\nFor example, Polkadot’s main network uses an address type of 0, while Kusama uses 2. This ensures that addresses can be used without confusion between networks.\n\nThe address type is always encoded as part of the SS58 address, making it easy to quickly identify the network. Refer to the [SS58 registry](https://github.com/paritytech/ss58-registry) for the canonical listing of all address type identifiers and how they map to Polkadot SDK-based networks."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#address-length", "page_title": "Polkadot SDK Accounts", "index": 12, "depth": 3, "title": "Address Length", "anchor": "address-length", "start_char": 22618, "end_char": 23812, "estimated_token_count": 268, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Address Length\n\nSS58 addresses can have different lengths depending on the specific format. Address lengths range from as short as 3 to 35 bytes, depending on the complexity of the address and network requirements. This flexibility allows SS58 addresses to adapt to different chains while providing a secure encoding mechanism.\n\n| Total | Type | Raw account | Checksum |\n|-------|------|-------------|----------|\n| 3     | 1    | 1           | 1        |\n| 4     | 1    | 2           | 1        |\n| 5     | 1    | 2           | 2        |\n| 6     | 1    | 4           | 1        |\n| 7     | 1    | 4           | 2        |\n| 8     | 1    | 4           | 3        |\n| 9     | 1    | 4           | 4        |\n| 10    | 1    | 8           | 1        |\n| 11    | 1    | 8           | 2        |\n| 12    | 1    | 8           | 3        |\n| 13    | 1    | 8           | 4        |\n| 14    | 1    | 8           | 5        |\n| 15    | 1    | 8           | 6        |\n| 16    | 1    | 8           | 7        |\n| 17    | 1    | 8           | 8        |\n| 35    | 1    | 32          | 2        |\n\nSS58 addresses also support different payload sizes, allowing a flexible range of account identifiers."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#checksum-types", "page_title": "Polkadot SDK Accounts", "index": 13, "depth": 3, "title": "Checksum Types", "anchor": "checksum-types", "start_char": 23812, "end_char": 24277, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Checksum Types\n\nA checksum is applied to validate SS58 addresses. Polkadot SDK uses a Blake2b-512 hash function to calculate the checksum, which is appended to the address before encoding. The checksum length can vary depending on the address format (e.g., 1-byte, 2-byte, or longer), providing varying levels of validation strength.\n\nThe checksum ensures that an address is not modified or corrupted, adding an extra layer of security for account management."}
{"source": "polkadot-docs", "page_id": "reference-parachains-accounts", "url": "https://developer.polkadot.com/reference/parachains/accounts/#validating-addresses", "page_title": "Polkadot SDK Accounts", "index": 14, "depth": 3, "title": "Validating Addresses", "anchor": "validating-addresses", "start_char": 24277, "end_char": 28962, "estimated_token_count": 1038, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5d2332c067f9be58e78a8834030c315469f805fdd50e9ec7388afc696f1fa884", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Validating Addresses\n\nSS58 addresses can be validated using the subkey command-line interface or the Polkadot.js API. These tools help ensure an address is correctly formatted and valid for the intended network. The following sections will provide an overview of how validation works with these tools.\n\n#### Using Subkey\n\n[Subkey](https://paritytech.github.io/polkadot-sdk/master/subkey/index.html) is a CLI tool provided by Polkadot SDK for generating and managing keys. It can inspect and validate SS58 addresses.\n\nThe `inspect` command gets a public key and an SS58 address from the provided secret URI. The basic syntax for the `subkey inspect` command is:\n\n```bash\nsubkey inspect [flags] [options] uri\n```\n\nFor the `uri` command-line argument, you can specify the secret seed phrase, a hex-encoded private key, or an SS58 address. If the input is a valid address, the `subkey` program displays the corresponding hex-encoded public key, account identifier, and SS58 addresses.\n\nFor example, to inspect the public keys derived from a secret seed phrase, you can run a command similar to the following:\n\n```bash\nsubkey inspect \"caution juice atom organ advance problem want pledge someone senior holiday very\"\n```\n\nThe command displays output similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>subkey inspect \"caution juice atom organ advance problem want pledge someone senior holiday very\"</span>\n  <span data-ty>Secret phrase `caution juice atom organ advance problem want pledge someone senior holiday very` is account:</span>\n  <span data-ty> Secret seed: 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849</span>\n  <span data-ty> Public key (hex): 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746</span>\n  <span data-ty> Public key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR</span>\n  <span data-ty> Account ID: 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746</span>\n  <span data-ty> SS58 Address: 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR</span>\n</div>\n\n\nThe `subkey` program assumes an address is based on a public/private key pair. If you inspect an address, the command returns the 32-byte account identifier.\n\nHowever, not all addresses in Polkadot SDK-based networks are based on keys.\n\nDepending on the command-line options you specify and the input you provided, the command output might also display the network for which the address has been encoded. For example:\n\n```bash\nsubkey inspect \"12bzRJfh7arnnfPPUZHeJUaE62QLEwhK48QnH9LXeK2m1iZU\"\n```\n\nThe command displays output similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>subkey inspect \"12bzRJfh7arnnfPPUZHeJUaE62QLEwhK48QnH9LXeK2m1iZU\"</span>\n  <span data-ty>Public Key URI `12bzRJfh7arnnfPPUZHeJUaE62QLEwhK48QnH9LXeK2m1iZU` is account:</span>\n  <span data-ty> Network ID/Version: polkadot</span>\n  <span data-ty> Public key (hex): 0x46ebddef8cd9bb167dc30878d7113b7e168e6f0646beffd77d69d39bad76b47a</span>\n  <span data-ty> Account ID: 0x46ebddef8cd9bb167dc30878d7113b7e168e6f0646beffd77d69d39bad76b47a</span>\n  <span data-ty> Public key (SS58): 12bzRJfh7arnnfPPUZHeJUaE62QLEwhK48QnH9LXeK2m1iZU</span>\n  <span data-ty> SS58 Address: 12bzRJfh7arnnfPPUZHeJUaE62QLEwhK48QnH9LXeK2m1iZU</span>\n</div>\n\n\n#### Using Polkadot.js API\n\nTo verify an address in JavaScript or TypeScript projects, you can use the functions built into the [Polkadot.js API](https://polkadot.js.org/docs/). For example:\n\n```js\n// Import Polkadot.js API dependencies\nconst { decodeAddress, encodeAddress } = require('@polkadot/keyring');\nconst { hexToU8a, isHex } = require('@polkadot/util');\n\n// Specify an address to test.\nconst address = 'INSERT_ADDRESS_TO_TEST';\n\n// Check address\nconst isValidSubstrateAddress = () => {\n  try {\n    encodeAddress(isHex(address) ? hexToU8a(address) : decodeAddress(address));\n\n    return true;\n  } catch (error) {\n    return false;\n  }\n};\n\n// Query result\nconst isValid = isValidSubstrateAddress();\nconsole.log(isValid);\n\n```\n\nIf the function returns `true`, the specified address is a valid address.\n\n#### Other SS58 Implementations\n\nSupport for encoding and decoding Polkadot SDK SS58 addresses has been implemented in several other languages and libraries.\n\n- **Crystal**: [`wyhaines/base58.cr`](https://github.com/wyhaines/base58.cr)\n- **Go**: [`itering/subscan-plugin`](https://github.com/itering/subscan-plugin)\n- **Python**: [`polkascan/py-scale-codec`](https://github.com/polkascan/py-scale-codec)\n- **TypeScript**: [`subsquid/squid-sdk`](https://github.com/subsquid/squid-sdk)"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#introduction", "page_title": "Blocks", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 11, "end_char": 678, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nIn the Polkadot SDK, blocks are fundamental to the functioning of the blockchain, serving as containers for [transactions](/reference/parachains/blocks-transactions-fees/transactions/) and changes to the chain's state. Blocks consist of headers and an array of transactions, ensuring the integrity and validity of operations on the network. This guide explores the essential components of a block, the process of block production, and how blocks are validated and imported across the network. By understanding these concepts, developers can better grasp how blockchains maintain security, consistency, and performance within the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#what-is-a-block", "page_title": "Blocks", "index": 1, "depth": 2, "title": "What is a Block?", "anchor": "what-is-a-block", "start_char": 678, "end_char": 1815, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is a Block?\n\nIn the Polkadot SDK, a block is a fundamental unit that encapsulates both the header and an array of transactions. The block header includes critical metadata to ensure the integrity and sequence of the blockchain. Here's a breakdown of its components:\n\n- **Block height**: Indicates the number of blocks created in the chain so far.\n- **Parent hash**: The hash of the previous block, providing a link to maintain the blockchain's immutability.\n- **Transaction root**: Cryptographic digest summarizing all transactions in the block.\n- **State root**: A cryptographic digest representing the post-execution state.\n- **Digest**: Additional information that can be attached to a block, such as consensus-related messages.\n\nEach transaction is part of a series that is executed according to the runtime's rules. The transaction root is a cryptographic digest of this series, which prevents alterations and enables succinct verification by light clients. This verification process allows light clients to confirm whether a transaction exists in a block with only the block header, avoiding downloading the entire block."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#block-production", "page_title": "Blocks", "index": 2, "depth": 2, "title": "Block Production", "anchor": "block-production", "start_char": 1815, "end_char": 2139, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Block Production\n\nWhen an authoring node is authorized to create a new block, it selects transactions from the transaction queue based on priority. This step, known as block production, relies heavily on the executive module to manage the initialization and finalization of blocks. The process is summarized as follows:"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#initialize-block", "page_title": "Blocks", "index": 3, "depth": 3, "title": "Initialize Block", "anchor": "initialize-block", "start_char": 2139, "end_char": 2976, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Initialize Block\n\nThe block initialization process begins with a series of function calls that prepare the block for transaction execution:\n\n1. **Call `on_initialize`**: The executive module calls the [`on_initialize`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.on_initialize) hook from the system pallet and other runtime pallets to prepare for the block's transactions.\n2. **Coordinate runtime calls**: Coordinates function calls in the order defined by the transaction queue.\n3. **Verify information**: Once [`on_initialize`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.on_initialize) functions are executed, the executive module checks the parent hash in the block header and the trie root to verify information is consistent."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#finalize-block", "page_title": "Blocks", "index": 4, "depth": 3, "title": "Finalize Block", "anchor": "finalize-block", "start_char": 2976, "end_char": 3818, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Finalize Block\n\nOnce transactions are processed, the block must be finalized before being broadcast to the network. The finalization steps are as follows:\n\n1. **Call `on_finalize`**: The executive module calls the [`on_finalize`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.on_finalize) hooks in each pallet to ensure any remaining state updates or checks are completed before the block is sealed and published.\n2. **Verify information**: The block's digest and storage root in the header are checked against the initialized block to ensure consistency.\n3. **Call `on_idle`**: The [`on_idle`](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/trait.Hooks.html#method.on_idle) hook is triggered to process any remaining tasks using the leftover weight from the block."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#block-authoring-and-import", "page_title": "Blocks", "index": 5, "depth": 2, "title": "Block Authoring and Import", "anchor": "block-authoring-and-import", "start_char": 3818, "end_char": 4320, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Block Authoring and Import\n\nOnce the block is finalized, it is gossiped to other nodes in the network. Nodes follow this procedure:\n\n1. **Receive transactions**: The authoring node collects transactions from the network.\n2. **Validate**: Transactions are checked for validity.\n3. **Queue**: Valid transactions are placed in the transaction pool for execution.\n4. **Execute**: State changes are made as the transactions are executed.\n5. **Publish**: The finalized block is broadcast to the network."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#block-import-queue", "page_title": "Blocks", "index": 6, "depth": 3, "title": "Block Import Queue", "anchor": "block-import-queue", "start_char": 4320, "end_char": 5846, "estimated_token_count": 371, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Block Import Queue\n\nAfter a block is published, other nodes on the network can import it into their chain state. The block import queue is part of the outer node in every Polkadot SDK-based node and ensures incoming blocks are valid before adding them to the node's state.\n\nIn most cases, you don't need to know details about how transactions are gossiped or how other nodes on the network import blocks. The following traits are relevant, however, if you plan to write any custom consensus logic or want a deeper dive into the block import queue:\n\n- **[`ImportQueue`](https://paritytech.github.io/polkadot-sdk/master/sc_consensus/import_queue/trait.ImportQueue.html)**: The trait that defines the block import queue.\n- **[`Link`](https://paritytech.github.io/polkadot-sdk/master/sc_consensus/import_queue/trait.Link.html)**: The trait that defines the link between the block import queue and the network.\n- **[`BasicQueue`](https://paritytech.github.io/polkadot-sdk/master/sc_consensus/import_queue/struct.BasicQueue.html)**: A basic implementation of the block import queue.\n- **[`Verifier`](https://paritytech.github.io/polkadot-sdk/master/sc_consensus/import_queue/trait.Verifier.html)**: The trait that defines the block verifier.\n- **[`BlockImport`](https://paritytech.github.io/polkadot-sdk/master/sc_consensus/block_import/trait.BlockImport.html)**: The trait that defines the block import process.\n\nThese traits govern how blocks are validated and imported across the network, ensuring consistency and security."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-blocks", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/blocks/#additional-resources", "page_title": "Blocks", "index": 7, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 5846, "end_char": 6076, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c3b9fffdf00c20a5c4e668de591c914407b9747cb90233698da3ed8a54ce0b9b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Additional Resources\n\nTo learn more about the block structure in the Polkadot SDK runtime, see the [`Block` reference](https://paritytech.github.io/polkadot-sdk/master/sp_runtime/traits/trait.Block.html) entry in the Rust Docs."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#introductions", "page_title": "Transactions Weights and Fees", "index": 0, "depth": 2, "title": "Introductions", "anchor": "introductions", "start_char": 34, "end_char": 2205, "estimated_token_count": 385, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introductions\n\nWhen transactions are executed, or data is stored on-chain, the activity changes the chain's state and consumes blockchain resources. Because the resources available to a blockchain are limited, managing how operations on-chain consume them is important. In addition to being limited in practical terms, such as storage capacity, blockchain resources represent a potential attack vector for malicious users. For example, a malicious user might attempt to overload the network with messages to stop the network from producing new blocks. To protect blockchain resources from being drained or overloaded, you need to manage how they are made available and how they are consumed. The resources to be aware of include:\n\n- Memory usage\n- Storage input and output\n- Computation\n- Transaction and block size\n- State database size\n\nThe Polkadot SDK provides block authors with several ways to manage access to resources and to prevent individual components of the chain from consuming too much of any single resource. Two of the most important mechanisms available to block authors are weights and transaction fees.\n\nWeights manage the time it takes to validate a block and characterize the time it takes to execute the calls in the block's body. By controlling the execution time a block can consume, weights set limits on storage input, output, and computation.\n\nSome of the weight allowed for a block is consumed as part of the block's initialization and finalization. The weight might also be used to execute mandatory inherent extrinsic calls. To help ensure blocks don’t consume too much execution time and prevent malicious users from overloading the system with unnecessary calls, weights are combined with transaction fees.\n\n[Transaction fees](/reference/parachains/blocks-transactions-fees/transactions/#transaction-fees) provide an economic incentive to limit execution time, computation, and the number of calls required to perform operations. Transaction fees are also used to make the blockchain economically sustainable because they are typically applied to transactions initiated by users and deducted before a transaction request is executed."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#how-fees-are-calculated", "page_title": "Transactions Weights and Fees", "index": 1, "depth": 2, "title": "How Fees are Calculated", "anchor": "how-fees-are-calculated", "start_char": 2205, "end_char": 3514, "estimated_token_count": 281, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How Fees are Calculated\n\nThe final fee for a transaction is calculated using the following parameters:\n\n- **`base fee`**: This is the minimum amount a user pays for a transaction. It is declared a base weight in the runtime and converted to a fee using the [`WeightToFee`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/trait.Config.html#associatedtype.WeightToFee) conversion.\n- **`weight fee`**: A fee proportional to the execution time (input and output and computation) that a transaction consumes.\n- **`length fee`**: A fee proportional to the encoded length of the transaction.\n- **`tip`**: An optional tip to increase the transaction’s priority, giving it a higher chance to be included in the transaction queue.\n\nThe base fee and proportional weight and length fees constitute the inclusion fee. The inclusion fee is the minimum fee that must be available for a transaction to be included in a block.\n\n```text\ninclusion fee = base fee + weight fee + length fee\n```\n\nTransaction fees are withdrawn before the transaction is executed. After the transaction is executed, the weight can be adjusted to reflect the resources used. If a transaction uses fewer resources than expected, the transaction fee is corrected, and the adjusted transaction fee is deposited."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#using-the-transaction-payment-pallet", "page_title": "Transactions Weights and Fees", "index": 2, "depth": 2, "title": "Using the Transaction Payment Pallet", "anchor": "using-the-transaction-payment-pallet", "start_char": 3514, "end_char": 4771, "estimated_token_count": 277, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Using the Transaction Payment Pallet\n\nThe [Transaction Payment pallet](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/substrate/frame/transaction-payment) provides the basic logic for calculating the inclusion fee. You can also use the Transaction Payment pallet to:\n\n- Convert a weight value into a deductible fee based on a currency type using [`Config::WeightToFee`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/trait.Config.html#associatedtype.WeightToFee).\n- Update the fee for the next block by defining a multiplier based on the chain’s final state at the end of the previous block using [`Config::FeeMultiplierUpdate`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/trait.Config.html#associatedtype.FeeMultiplierUpdate).\n- Manage the withdrawal, refund, and deposit of transaction fees using [`Config::OnChargeTransaction`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/trait.Config.html#associatedtype.OnChargeTransaction).\n\nYou can learn more about these configuration traits in the [Transaction Payment documentation](https://paritytech.github.io/polkadot-sdk/master/pallet_transaction_payment/index.html)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#understanding-the-inclusion-fee", "page_title": "Transactions Weights and Fees", "index": 3, "depth": 3, "title": "Understanding the Inclusion Fee", "anchor": "understanding-the-inclusion-fee", "start_char": 4771, "end_char": 6079, "estimated_token_count": 272, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Understanding the Inclusion Fee\n\nThe formula for calculating the inclusion fee is as follows:\n\n```text\ninclusion_fee = base_fee + length_fee + [targeted_fee_adjustment * weight_fee]\n```\n\nAnd then, for calculating the final fee:\n\n```text\nfinal_fee = inclusion_fee + tip\n```\n\nIn the first formula, the `targeted_fee_adjustment` is a multiplier that can tune the final fee based on the network’s congestion.\n\n- The `base_fee` derived from the base weight covers inclusion overhead like signature verification.\n- The `length_fee` is a per-byte fee that is multiplied by the length of the encoded extrinsic.\n- The `weight_fee` fee is calculated using two parameters:\n  - The `ExtrinsicBaseWeight` that is declared in the runtime and applies to all extrinsics.\n  - The `#[pallet::weight]` annotation that accounts for an extrinsic's complexity.\n\nTo convert the weight to `Currency`, the runtime must define a `WeightToFee` struct that implements a conversion function, [`Convert<Weight,Balance>`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/struct.Pallet.html#method.weight_to_fee).\n\nNote that the extrinsic sender is charged the inclusion fee before the extrinsic is invoked. The fee is deducted from the sender's balance even if the transaction fails upon execution."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#accounts-with-an-insufficient-balance", "page_title": "Transactions Weights and Fees", "index": 4, "depth": 3, "title": "Accounts with an Insufficient Balance", "anchor": "accounts-with-an-insufficient-balance", "start_char": 6079, "end_char": 6640, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Accounts with an Insufficient Balance\n\nIf an account does not have a sufficient balance to pay the inclusion fee and remain alive—that is, enough to pay the inclusion fee and maintain the minimum existential deposit—then you should ensure the transaction is canceled so that no fee is deducted and the transaction does not begin execution.\n\nThe Polkadot SDK doesn't enforce this rollback behavior. However, this scenario would be rare because the transaction queue and block-making logic perform checks to prevent it before adding an extrinsic to a block."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#fee-multipliers", "page_title": "Transactions Weights and Fees", "index": 5, "depth": 3, "title": "Fee Multipliers", "anchor": "fee-multipliers", "start_char": 6640, "end_char": 7733, "estimated_token_count": 228, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Fee Multipliers\n\nThe inclusion fee formula always results in the same fee for the same input. However, weight can be dynamic and—based on how [`WeightToFee`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/trait.Config.html#associatedtype.WeightToFee) is defined—the final fee can include some degree of variability.\nThe Transaction Payment pallet provides the [`FeeMultiplierUpdate`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/trait.Config.html#associatedtype.FeeMultiplierUpdate) configurable parameter to account for this variability.\n\nThe Polkadot network inspires the default update function and implements a targeted adjustment in which a target saturation level of block weight is defined. If the previous block is more saturated, the fees increase slightly. Similarly, if the last block has fewer transactions than the target, fees are decreased by a small amount. For more information about fee multiplier adjustments, see the [Polkadot wiki](../../../wiki/learn/learn-transactions.md#fee-multiplier)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#transactions-with-special-requirements", "page_title": "Transactions Weights and Fees", "index": 6, "depth": 2, "title": "Transactions with Special Requirements", "anchor": "transactions-with-special-requirements", "start_char": 7733, "end_char": 9127, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transactions with Special Requirements\n\nInclusion fees must be computable before execution and can only represent fixed logic. Some transactions warrant limiting resources with other strategies. For example:\n\n- Bonds are a type of fee that might be returned or slashed after some on-chain event. For example, you might want to require users to place a bond to participate in a vote. The bond might then be returned at the end of the referendum or slashed if the voter attempted malicious behavior.\n- Deposits are fees that might be returned later. For example, you might require users to pay a deposit to execute an operation that uses storage. The user’s deposit could be returned if a subsequent operation frees up storage.\n- Burn operations are used to pay for a transaction based on its internal logic. For example, a transaction might burn funds from the sender if the transaction creates new storage items to pay for the increased state size.\n- Limits enable you to enforce constant or configurable limits on specific operations. For example, the default [Staking pallet](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/substrate/frame/staking) only allows nominators to nominate 16 validators to limit the complexity of the validator election process.\n\nIt is important to note that if you query the chain for a transaction fee, it only returns the inclusion fee."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#default-weight-annotations", "page_title": "Transactions Weights and Fees", "index": 7, "depth": 2, "title": "Default Weight Annotations", "anchor": "default-weight-annotations", "start_char": 9127, "end_char": 9769, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Default Weight Annotations\n\nAll dispatchable functions in the Polkadot SDK must specify a weight. The way of doing that is using the annotation-based system that lets you combine fixed values for database read/write weight and/or fixed values based on benchmarks. The most basic example would look like this:\n\n```rust\n#[pallet::weight(100_000)]\nfn my_dispatchable() {\n    // ...\n}\n```\n\nNote that the [`ExtrinsicBaseWeight`](https://crates.parity.io/frame_support/weights/constants/struct.ExtrinsicBaseWeight.html) is automatically added to the declared weight to account for the costs of simply including an empty extrinsic into a block."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#weights-and-database-readwrite-operations", "page_title": "Transactions Weights and Fees", "index": 8, "depth": 3, "title": "Weights and Database Read/Write Operations", "anchor": "weights-and-database-readwrite-operations", "start_char": 9769, "end_char": 10893, "estimated_token_count": 258, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Weights and Database Read/Write Operations\n\nTo make weight annotations independent of the deployed database backend, they are defined as a constant and then used in the annotations when expressing database accesses performed by the dispatchable:\n\n```rust\n#[pallet::weight(T::DbWeight::get().reads_writes(1, 2) + 20_000)]\nfn my_dispatchable() {\n    // ...\n}\n```\n\nThis dispatchable allows one database to read and two to write, in addition to other things that add the additional 20,000. Database access is generally every time a value declared inside the [`#[pallet::storage]`](https://paritytech.github.io/polkadot-sdk/master/frame_support/pallet_macros/attr.storage.html) block is accessed. However, unique accesses are counted because after a value is accessed, it is cached, and reaccessing it does not result in a database operation. That is:\n\n- Multiple reads of the exact value count as one read.\n- Multiple writes of the exact value count as one write.\n- Multiple reads of the same value, followed by a write to that value, count as one read and one write.\n- A write followed by a read-only counts as one write."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#dispatch-classes", "page_title": "Transactions Weights and Fees", "index": 9, "depth": 3, "title": "Dispatch Classes", "anchor": "dispatch-classes", "start_char": 10893, "end_char": 13583, "estimated_token_count": 553, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Dispatch Classes\n\nDispatches are broken into three classes:\n\n- Normal\n- Operational\n- Mandatory\n\nIf a dispatch is not defined as `Operational` or `Mandatory` in the weight annotation, the dispatch is identified as `Normal` by default. You can specify that the dispatchable uses another class like this:\n\n```rust\n#[pallet::dispatch((DispatchClass::Operational))]\nfn my_dispatchable() {\n    // ...\n}\n```\n\nThis tuple notation also allows you to specify a final argument determining whether the user is charged based on the annotated weight. If you don't specify otherwise, `Pays::Yes` is assumed:\n\n```rust\n#[pallet::dispatch(DispatchClass::Normal, Pays::No)]\nfn my_dispatchable() {\n    // ...\n}\n```\n\n#### Normal Dispatches\n\nDispatches in this class represent normal user-triggered transactions. These types of dispatches only consume a portion of a block's total weight limit. For information about the maximum portion of a block that can be consumed for normal dispatches, see [`AvailableBlockRatio`](https://paritytech.github.io/polkadot-sdk/master/frame_system/limits/struct.BlockLength.html). Normal dispatches are sent to the transaction pool.\n\n#### Operational Dispatches\n\nUnlike normal dispatches, which represent the usage of network capabilities, operational dispatches are those that provide network capabilities. Operational dispatches can consume the entire weight limit of a block. They are not bound by the [`AvailableBlockRatio`](https://paritytech.github.io/polkadot-sdk/master/frame_system/limits/struct.BlockLength.html). Dispatches in this class are given maximum priority and are exempt from paying the [`length_fee`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/).\n\n#### Mandatory Dispatches\n\nMandatory dispatches are included in a block even if they cause the block to surpass its weight limit. You can only use the mandatory dispatch class for inherent transactions that the block author submits. This dispatch class is intended to represent functions in the block validation process. Because these dispatches are always included in a block regardless of the function weight, the validation process must prevent malicious nodes from abusing the function to craft valid but impossibly heavy blocks. You can typically accomplish this by ensuring that:\n\n- The operation performed is always light.\n- The operation can only be included in a block once.\n\nTo make it more difficult for malicious nodes to abuse mandatory dispatches, they cannot be included in blocks that return errors. This dispatch class serves the assumption that it is better to allow an overweight block to be created than not to allow any block to be created at all."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#dynamic-weights", "page_title": "Transactions Weights and Fees", "index": 10, "depth": 3, "title": "Dynamic Weights", "anchor": "dynamic-weights", "start_char": 13583, "end_char": 14130, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Dynamic Weights\n\nIn addition to purely fixed weights and constants, the weight calculation can consider the input arguments of a dispatchable. The weight should be trivially computable from the input arguments with some basic arithmetic:\n\n```rust\nuse frame_support:: {\n    dispatch:: {\n        DispatchClass::Normal,\n        Pays::Yes,\n    },\n   weights::Weight,\n};\n\n#[pallet::weight(FunctionOf(\n  |args: (&Vec<User>,)| args.0.len().saturating_mul(10_000),\n  )\n]\nfn handle_users(origin, calls: Vec<User>) {\n    // Do something per user\n}\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#post-dispatch-weight-correction", "page_title": "Transactions Weights and Fees", "index": 11, "depth": 2, "title": "Post Dispatch Weight Correction", "anchor": "post-dispatch-weight-correction", "start_char": 14130, "end_char": 14754, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Post Dispatch Weight Correction\n\nDepending on the execution logic, a dispatchable function might consume less weight than was prescribed pre-dispatch. To correct weight, the function declares a different return type and returns its actual weight:\n\n```rust\n#[pallet::weight(10_000 + 500_000_000)]\nfn expensive_or_cheap(input: u64) -> DispatchResultWithPostInfo {\n    let was_heavy = do_calculation(input);\n\n    if (was_heavy) {\n        // None means \"no correction\" from the weight annotation.\n        Ok(None.into())\n    } else {\n        // Return the actual weight consumed.\n        Ok(Some(10_000).into())\n    }\n}\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#custom-fees", "page_title": "Transactions Weights and Fees", "index": 12, "depth": 2, "title": "Custom Fees", "anchor": "custom-fees", "start_char": 14754, "end_char": 14870, "estimated_token_count": 20, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Custom Fees\n\nYou can also define custom fee systems through custom weight functions or inclusion fee functions."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#custom-weights", "page_title": "Transactions Weights and Fees", "index": 13, "depth": 3, "title": "Custom Weights", "anchor": "custom-weights", "start_char": 14870, "end_char": 19318, "estimated_token_count": 1014, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Custom Weights\n\nInstead of using the default weight annotations, you can create a custom weight calculation type using the weights module. The custom weight calculation type must implement the following traits:\n\n- [`WeighData<T>`](https://crates.parity.io/frame_support/weights/trait.WeighData.html) to determine the weight of the dispatch.\n- [`ClassifyDispatch<T>`](https://crates.parity.io/frame_support/weights/trait.ClassifyDispatch.html) to determine the class of the dispatch.\n- [`PaysFee<T>`](https://crates.parity.io/frame_support/weights/trait.PaysFee.html) to determine whether the sender of the dispatch pays fees.\n \nThe Polkadot SDK then bundles the output information of the three traits into the [`DispatchInfo`](https://paritytech.github.io/polkadot-sdk/master/frame_support/dispatch/struct.DispatchInfo.html) struct and provides it by implementing the [`GetDispatchInfo`](https://docs.rs/frame-support/latest/frame_support/dispatch/trait.GetDispatchInfo.html) for all `Call` variants and opaque extrinsic types. This is used internally by the System and Executive modules.\n\n`ClassifyDispatch`, `WeighData`, and `PaysFee` are generic over T, which gets resolved into the tuple of all dispatch arguments except for the origin. The following example illustrates a struct that calculates the weight as `m * len(args)`, where `m` is a given multiplier and args is the concatenated tuple of all dispatch arguments. In this example, the dispatch class is `Operational` if the transaction has more than 100 bytes of length in arguments and will pay fees if the encoded length exceeds 10 bytes.\n\n```rust\nstruct LenWeight(u32);\nimpl<T> WeighData<T> for LenWeight {\n    fn weigh_data(&self, target: T) -> Weight {\n        let multiplier = self.0;\n        let encoded_len = target.encode().len() as u32;\n        multiplier * encoded_len\n    }\n}\n\nimpl<T> ClassifyDispatch<T> for LenWeight {\n    fn classify_dispatch(&self, target: T) -> DispatchClass {\n        let encoded_len = target.encode().len() as u32;\n        if encoded_len > 100 {\n            DispatchClass::Operational\n        } else {\n            DispatchClass::Normal\n        }\n    }\n}\n\nimpl<T> PaysFee<T> {\n    fn pays_fee(&self, target: T) -> Pays {\n        let encoded_len = target.encode().len() as u32;\n        if encoded_len > 10 {\n            Pays::Yes\n        } else {\n            Pays::No\n        }\n    }\n}\n```\n\nA weight calculator function can also be coerced to the final type of the argument instead of defining it as a vague type that can be encoded. The code would roughly look like this:\n\n```rust\nstruct CustomWeight;\nimpl WeighData<(&u32, &u64)> for CustomWeight {\n    fn weigh_data(&self, target: (&u32, &u64)) -> Weight {\n        ...\n    }\n}\n\n// given a dispatch:\n#[pallet::call]\nimpl<T: Config<I>, I: 'static> Pallet<T, I> {\n    #[pallet::weight(CustomWeight)]\n    fn foo(a: u32, b: u64) { ... }\n}\n```\n\nIn this example, the `CustomWeight` can only be used in conjunction with a dispatch with a particular signature `(u32, u64)`, as opposed to `LenWeight`, which can be used with anything because there aren't any assumptions about `<T>`.\n\n#### Custom Inclusion Fee\n\nThe following example illustrates how to customize your inclusion fee. You must configure the appropriate associated types in the respective module.\n\n```rust\n// Assume this is the balance type\ntype Balance = u64;\n\n// Assume we want all the weights to have a `100 + 2 * w` conversion to fees\nstruct CustomWeightToFee;\nimpl WeightToFee<Weight, Balance> for CustomWeightToFee {\n    fn convert(w: Weight) -> Balance {\n        let a = Balance::from(100);\n        let b = Balance::from(2);\n        let w = Balance::from(w);\n        a + b * w\n    }\n}\n\nparameter_types! {\n    pub const ExtrinsicBaseWeight: Weight = 10_000_000;\n}\n\nimpl frame_system::Config for Runtime {\n    type ExtrinsicBaseWeight = ExtrinsicBaseWeight;\n}\n\nparameter_types! {\n    pub const TransactionByteFee: Balance = 10;\n}\n\nimpl transaction_payment::Config {\n    type TransactionByteFee = TransactionByteFee;\n    type WeightToFee = CustomWeightToFee;\n    type FeeMultiplierUpdate = TargetedFeeAdjustment<TargetBlockFullness>;\n}\n\nstruct TargetedFeeAdjustment<T>(sp_std::marker::PhantomData<T>);\nimpl<T: Get<Perquintill>> WeightToFee<Fixed128, Fixed128> for TargetedFeeAdjustment<T> {\n    fn convert(multiplier: Fixed128) -> Fixed128 {\n        // Don't change anything. Put any fee update info here.\n        multiplier\n    }\n}\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-fees", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/fees/#additional-resources", "page_title": "Transactions Weights and Fees", "index": 14, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 19318, "end_char": 20187, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce219e81b73865cfa325cbc423b7fe19e4d443d719372ca71c8d343b3336e86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Additional Resources\n\nYou now know the weight system, how it affects transaction fee computation, and how to specify weights for your dispatchable calls. The next step is determining the correct weight for your dispatchable operations. You can use Substrate benchmarking functions and frame-benchmarking calls to test your functions with different parameters and empirically determine the proper weight in their worst-case scenarios.\n\n- [Benchmark](/parachains/customize-runtime/pallet-development/benchmark-pallet/)\n- [`SignedExtension`](https://paritytech.github.io/polkadot-sdk/master/sp_runtime/traits/trait.SignedExtension.html)\n- [Custom weights for the Example pallet](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/examples/basic/src/weights.rs)\n- [Polkadot wiki](../../../wiki/learn/learn-transactions.md#fee-multiplier)"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#introduction", "page_title": "Transactions", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 656, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nTransactions are essential components of blockchain networks, enabling state changes and the execution of key operations. In the Polkadot SDK, transactions, often called extrinsics, come in multiple forms, including signed, unsigned, and inherent transactions.\n\nThis guide walks you through the different transaction types and how they're formatted, validated, and processed within the Polkadot ecosystem. You'll also learn how to customize transaction formats and construct transactions for FRAME-based runtimes, ensuring a complete understanding of how transactions are built and executed in Polkadot SDK-based chains."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#what-is-a-transaction", "page_title": "Transactions", "index": 1, "depth": 2, "title": "What Is a Transaction?", "anchor": "what-is-a-transaction", "start_char": 656, "end_char": 1675, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What Is a Transaction?\n\nIn the Polkadot SDK, transactions represent operations that modify the chain's state, bundled into blocks for execution. The term extrinsic is often used to refer to any data that originates outside the runtime and is included in the chain. While other blockchain systems typically refer to these operations as \"transactions,\" the Polkadot SDK adopts the broader term \"extrinsic\" to capture the wide variety of data types that can be added to a block.\n\nThere are three primary types of transactions (extrinsics) in the Polkadot SDK:\n\n- **Signed transactions**: Signed by the submitting account, often carrying transaction fees.\n- **Unsigned transactions**: Submitted without a signature, often requiring custom validation logic.\n- **Inherent transactions**: Typically inserted directly into blocks by block authoring nodes, without gossiping between peers.\n\nEach type serves a distinct purpose, and understanding when and how to use each is key to efficiently working with the Polkadot SDK."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#signed-transactions", "page_title": "Transactions", "index": 2, "depth": 3, "title": "Signed Transactions", "anchor": "signed-transactions", "start_char": 1675, "end_char": 2823, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signed Transactions\n\nSigned transactions require an account's signature and typically involve submitting a request to execute a runtime call. The signature serves as a form of cryptographic proof that the sender has authorized the action, using their private key. These transactions often involve a transaction fee to cover the cost of execution and incentivize block producers.\n\nSigned transactions are the most common type of transaction and are integral to user-driven actions, such as token transfers. For instance, when you transfer tokens from one account to another, the sending account must sign the transaction to authorize the operation.\n\nFor example, the [`pallet_balances::Call::transfer_allow_death`](https://paritytech.github.io/polkadot-sdk/master/pallet_balances/pallet/struct.Pallet.html#method.transfer_allow_death) extrinsic in the Balances pallet allows you to transfer tokens. Since your account initiates this transaction, your account key is used to sign it. You'll also be responsible for paying the associated transaction fee, with the option to include an additional tip to incentivize faster inclusion in the block."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#unsigned-transactions", "page_title": "Transactions", "index": 3, "depth": 3, "title": "Unsigned Transactions", "anchor": "unsigned-transactions", "start_char": 2823, "end_char": 4060, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Unsigned Transactions\n\nUnsigned transactions do not require a signature or account-specific data from the sender. Unlike signed transactions, they do not come with any form of economic deterrent, such as fees, which makes them susceptible to spam or replay attacks. Custom validation logic must be implemented to mitigate these risks and ensure these transactions are secure.\n\nUnsigned transactions typically involve scenarios where including a fee or signature is unnecessary or counterproductive. However, due to the absence of fees, they require careful validation to protect the network. For example, [`pallet_im_online::Call::heartbeat`](https://paritytech.github.io/polkadot-sdk/master/pallet_im_online/pallet/struct.Pallet.html#method.heartbeat) extrinsic allows validators to send a heartbeat signal, indicating they are active. Since only validators can make this call, the logic embedded in the transaction ensures that the sender is a validator, making the need for a signature or fee redundant.\n\nUnsigned transactions are more resource-intensive than signed ones because custom validation is required, but they play a crucial role in certain operational scenarios, especially when regular user accounts aren't involved."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#inherent-transactions", "page_title": "Transactions", "index": 4, "depth": 3, "title": "Inherent Transactions", "anchor": "inherent-transactions", "start_char": 4060, "end_char": 5752, "estimated_token_count": 315, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Inherent Transactions\n\nInherent transactions are a specialized type of unsigned transaction that is used primarily for block authoring. Unlike signed or other unsigned transactions, inherent transactions are added directly by block producers and are not broadcasted to the network or stored in the transaction queue. They don't require signatures or the usual validation steps and are generally used to insert system-critical data directly into blocks.\n\nA key example of an inherent transaction is inserting a timestamp into each block. The [`pallet_timestamp::Call::now`](https://paritytech.github.io/polkadot-sdk/master/pallet_timestamp/pallet/struct.Pallet.html#method.now-1) extrinsic allows block authors to include the current time in the block they are producing. Since the block producer adds this information, there is no need for transaction validation, like signature verification. The validation in this case is done indirectly by the validators, who check whether the timestamp is within an acceptable range before finalizing the block.\n\nAnother example is the [`paras_inherent::Call::enter`](https://paritytech.github.io/polkadot-sdk/master/polkadot_runtime_parachains/paras_inherent/pallet/struct.Pallet.html#method.enter) extrinsic, which enables parachain collator nodes to send validation data to the relay chain. This inherent transaction ensures that the necessary parachain data is included in each block without the overhead of gossiped transactions.\n\nInherent transactions serve a critical role in block authoring by allowing important operational data to be added directly to the chain without needing the validation processes required for standard transactions."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#transaction-formats", "page_title": "Transactions", "index": 5, "depth": 2, "title": "Transaction Formats", "anchor": "transaction-formats", "start_char": 5752, "end_char": 6101, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Transaction Formats\n\nUnderstanding the structure of signed and unsigned transactions is crucial for developers building on Polkadot SDK-based chains. Whether you're optimizing transaction processing, customizing formats, or interacting with the transaction pool, knowing the format of extrinsics, Polkadot's term for transactions, is essential."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#types-of-transaction-formats", "page_title": "Transactions", "index": 6, "depth": 3, "title": "Types of Transaction Formats", "anchor": "types-of-transaction-formats", "start_char": 6101, "end_char": 6995, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Types of Transaction Formats\n\nIn Polkadot SDK-based chains, extrinsics can fall into three main categories:\n\n- **Unchecked extrinsics**: Typically used for signed transactions that require validation. They contain a signature and additional data, such as a nonce and information for fee calculation. Unchecked extrinsics are named as such because they require validation checks before being accepted into the transaction pool.\n- **Checked extrinsics**: Typically used for inherent extrinsics (unsigned transactions); these don't require signature verification. Instead, they carry information such as where the extrinsic originates and any additional data required for the block authoring process.\n- **Opaque extrinsics**: Used when the format of an extrinsic is not yet fully committed or finalized. They are still decodable, but their structure can be flexible depending on the context."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#signed-transaction-data-structure", "page_title": "Transactions", "index": 7, "depth": 3, "title": "Signed Transaction Data Structure", "anchor": "signed-transaction-data-structure", "start_char": 6995, "end_char": 7957, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signed Transaction Data Structure\n\nA signed transaction typically includes the following components:\n\n- **Signature**: Verifies the authenticity of the transaction sender.\n- **Call**: The actual function or method call the transaction is requesting (for example, transferring funds).\n- **Nonce**: Tracks the number of prior transactions sent from the account, helping to prevent replay attacks.\n- **Tip**: An optional incentive to prioritize the transaction in block inclusion.\n- **Additional data**: Includes details such as spec version, block hash, and genesis hash to ensure the transaction is valid within the correct runtime and chain context.\n\nHere's a simplified breakdown of how signed transactions are typically constructed in a Polkadot SDK runtime:\n\n``` code\n<signing account ID> + <signature> + <additional data>\n```\n\nEach part of the signed transaction has a purpose, ensuring the transaction's authenticity and context within the blockchain."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#signed-extensions", "page_title": "Transactions", "index": 8, "depth": 3, "title": "Signed Extensions", "anchor": "signed-extensions", "start_char": 7957, "end_char": 10463, "estimated_token_count": 562, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signed Extensions\n\nPolkadot SDK also provides the concept of [signed extensions](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/signed_extensions/index.html), which allow developers to extend extrinsics with additional data or validation logic before they are included in a block. The [`SignedExtension`](https://paritytech.github.io/try-runtime-cli/sp_runtime/traits/trait.SignedExtension.html) set helps enforce custom rules or protections, such as ensuring the transaction's validity or calculating priority.\n\nThe transaction queue regularly calls signed extensions to verify a transaction's validity before placing it in the ready queue. This safeguard ensures transactions won't fail in a block. Signed extensions are commonly used to enforce validation logic and protect the transaction pool from spam and replay attacks.\n\nIn FRAME, a signed extension can hold any of the following types by default:\n\n- **[`AccountId`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_frame/runtime/types_common/type.AccountId.html)**: To encode the sender's identity.\n- **[`Call`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_frame/traits/trait.SignedExtension.html#associatedtype.Call)**: To encode the pallet call to be dispatched. This data is used to calculate transaction fees.\n- **[`AdditionalSigned`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_frame/traits/trait.SignedExtension.html#associatedtype.AdditionalSigned)**: To handle any additional data to go into the signed payload allowing you to attach any custom logic prior to dispatching a transaction.\n- **[`Pre`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_frame/traits/trait.SignedExtension.html#associatedtype.Pre)**: To encode the information that can be passed from before a call is dispatched to after it gets dispatched.\n\nSigned extensions can enforce checks like:\n\n- **[`CheckSpecVersion`](https://paritytech.github.io/polkadot-sdk/master/src/frame_system/extensions/check_spec_version.rs.html)**: Ensures the transaction is compatible with the runtime's current version.\n- **[`CheckWeight`](https://paritytech.github.io/polkadot-sdk/master/frame_system/struct.CheckWeight.html)**: Calculates the weight (or computational cost) of the transaction, ensuring the block doesn't exceed the maximum allowed weight.\n\nThese extensions are critical in the transaction lifecycle, ensuring that only valid and prioritized transactions are processed."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#transaction-construction", "page_title": "Transactions", "index": 9, "depth": 2, "title": "Transaction Construction", "anchor": "transaction-construction", "start_char": 10463, "end_char": 10800, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Transaction Construction\n\nBuilding transactions in the Polkadot SDK involves constructing a payload that can be verified, signed, and submitted for inclusion in a block. Each runtime in the Polkadot SDK has its own rules for validating and executing transactions, but there are common patterns for constructing a signed transaction."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#construct-a-signed-transaction", "page_title": "Transactions", "index": 10, "depth": 3, "title": "Construct a Signed Transaction", "anchor": "construct-a-signed-transaction", "start_char": 10800, "end_char": 12709, "estimated_token_count": 404, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Construct a Signed Transaction\n\nA signed transaction in the Polkadot SDK includes various pieces of data to ensure security, prevent replay attacks, and prioritize processing. Here's an overview of how to construct one:\n\n1. **Construct the unsigned payload**: Gather the necessary information for the call, including:\n\n    - **Pallet index**: Identifies the pallet where the runtime function resides.\n    - **Function index**: Specifies the particular function to call in the pallet.\n    - **Parameters**: Any additional arguments required by the function call.\n\n2. **Create a signing payload**: Once the unsigned payload is ready, additional data must be included:\n\n    - **Transaction nonce**: Unique identifier to prevent replay attacks.\n    - **Era information**: Defines how long the transaction is valid before it's dropped from the pool.\n    - **Block hash**: Ensures the transaction doesn't execute on the wrong chain or fork.\n\n3. **Sign the payload**: Using the sender's private key, sign the payload to ensure that the transaction can only be executed by the account holder.\n4. **Serialize the signed payload**: Once signed, the transaction must be serialized into a binary format, ensuring the data is compact and easy to transmit over the network.\n5. **Submit the serialized transaction**: Finally, submit the serialized transaction to the network, where it will enter the transaction pool and wait for processing by an authoring node.\n\nThe following is an example of how a signed transaction might look:\n\n``` rust\nnode_runtime::UncheckedExtrinsic::new_signed(\n    function.clone(),                                      // some call\n    sp_runtime::AccountId32::from(sender.public()).into(), // some sending account\n    node_runtime::Signature::Sr25519(signature.clone()),   // the account's signature\n    extra.clone(),                                         // the signed extensions\n)\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#transaction-encoding", "page_title": "Transactions", "index": 11, "depth": 3, "title": "Transaction Encoding", "anchor": "transaction-encoding", "start_char": 12709, "end_char": 13691, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transaction Encoding\n\nBefore a transaction is sent to the network, it is serialized and encoded using a structured encoding process that ensures consistency and prevents tampering:\n\n- **`[1]`**: Compact encoded length in bytes of the entire transaction.\n- **`[2]`**: A u8 containing 1 byte to indicate whether the transaction is signed or unsigned (1 bit) and the encoded transaction version ID (7 bits).\n- **`[3]`**: If signed, this field contains an account ID, an SR25519 signature, and some extra data.\n- **`[4]`**: Encoded call data, including pallet and function indices and any required arguments.\n\nThis encoded format ensures consistency and efficiency in processing transactions across the network. By adhering to this format, applications can construct valid transactions and pass them to the network for execution.\n\nTo learn more about how compact encoding works using SCALE, see the [SCALE Codec](https://github.com/paritytech/parity-scale-codec) README on GitHub."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#customize-transaction-construction", "page_title": "Transactions", "index": 12, "depth": 3, "title": "Customize Transaction Construction", "anchor": "customize-transaction-construction", "start_char": 13691, "end_char": 14331, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Customize Transaction Construction\n\nAlthough the basic steps for constructing transactions are consistent across Polkadot SDK-based chains, developers can customize transaction formats and validation rules. For example:\n\n- **Custom pallets**: You can define new pallets with custom function calls, each with its own parameters and validation logic.\n- **Signed extensions**: Developers can implement custom extensions that modify how transactions are prioritized, validated, or included in blocks.\n\nBy leveraging Polkadot SDK's modular design, developers can create highly specialized transaction logic tailored to their chain's needs."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#lifecycle-of-a-transaction", "page_title": "Transactions", "index": 13, "depth": 2, "title": "Lifecycle of a Transaction", "anchor": "lifecycle-of-a-transaction", "start_char": 14331, "end_char": 14809, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Lifecycle of a Transaction\n\nIn the Polkadot SDK, transactions are often referred to as extrinsics because the data in transactions originates outside of the runtime. These transactions contain data that initiates changes to the chain state. The most common type of extrinsic is a signed transaction, which is cryptographically verified and typically incurs a fee. This section focuses on how signed transactions are processed, validated, and ultimately included in a block."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#define-transaction-properties", "page_title": "Transactions", "index": 14, "depth": 3, "title": "Define Transaction Properties", "anchor": "define-transaction-properties", "start_char": 14809, "end_char": 15540, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Define Transaction Properties\n\nThe Polkadot SDK runtime defines key transaction properties, such as:\n\n- **Transaction validity**: Ensures the transaction meets all runtime requirements.\n- **Signed or unsigned**: Identifies whether a transaction needs to be signed by an account.\n- **State changes**: Determines how the transaction modifies the state of the chain.\n\nPallets, which compose the runtime's logic, define the specific transactions that your chain supports. When a user submits a transaction, such as a token transfer, it becomes a signed transaction, verified by the user's account signature. If the account has enough funds to cover fees, the transaction is executed, and the chain's state is updated accordingly."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#process-on-a-block-authoring-node", "page_title": "Transactions", "index": 15, "depth": 3, "title": "Process on a Block Authoring Node", "anchor": "process-on-a-block-authoring-node", "start_char": 15540, "end_char": 16209, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Process on a Block Authoring Node\n\nIn Polkadot SDK-based networks, some nodes are authorized to author blocks. These nodes validate and process transactions. When a transaction is sent to a node that can produce blocks, it undergoes a lifecycle that involves several stages, including validation and execution. Non-authoring nodes gossip the transaction across the network until an authoring node receives it. The following diagram illustrates the lifecycle of a transaction that's submitted to a network and processed by an authoring node.\n\n![Transaction lifecycle diagram](/images/reference/parachains/blocks-transactions-fees/transactions/transactions-01.webp)"}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#validate-and-queue", "page_title": "Transactions", "index": 16, "depth": 3, "title": "Validate and Queue", "anchor": "validate-and-queue", "start_char": 16209, "end_char": 18437, "estimated_token_count": 430, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Validate and Queue\n\nOnce a transaction reaches an authoring node, it undergoes an initial validation process to ensure it meets specific conditions defined in the runtime. This validation includes checks for:\n\n- **Correct nonce**: Ensures the transaction is sequentially valid for the account.\n- **Sufficient funds**: Confirms the account can cover any associated transaction fees.\n- **Signature validity**: Verifies that the sender's signature matches the transaction data.\n\nAfter these checks, valid transactions are placed in the transaction pool, where they are queued for inclusion in a block. The transaction pool regularly re-validates queued transactions to ensure they remain valid before being processed. To reach consensus, two-thirds of the nodes must agree on the order of the transactions executed and the resulting state change. Transactions are validated and queued on the local node in a transaction pool to prepare for consensus.\n\n#### Transaction Pool\n\nThe transaction pool is responsible for managing valid transactions. It ensures that only transactions that pass initial validity checks are queued. Transactions that fail validation, expire, or become invalid for other reasons are removed from the pool.\n\nThe transaction pool organizes transactions into two queues:\n\n- **Ready queue**: Transactions that are valid and ready to be included in a block.\n- **Future queue**: Transactions that are not yet valid but could be in the future, such as transactions with a nonce too high for the current state.\n\nDetails on how the transaction pool validates transactions, including fee and signature handling, can be found in the [`validate_transaction`](https://paritytech.github.io/polkadot-sdk/master/sp_transaction_pool/runtime_api/trait.TaggedTransactionQueue.html#method.validate_transaction) method.\n\n#### Invalid Transactions\n\nIf a transaction is invalid, for example, due to an invalid signature or insufficient funds, it is rejected and won't be added to the block. Invalid transactions might be rejected for reasons such as:\n\n- The transaction has already been included in a block.\n- The transaction's signature does not match the sender.\n- The transaction is too large to fit in the current block."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#transaction-ordering-and-priority", "page_title": "Transactions", "index": 17, "depth": 3, "title": "Transaction Ordering and Priority", "anchor": "transaction-ordering-and-priority", "start_char": 18437, "end_char": 19075, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transaction Ordering and Priority\n\nWhen a node is selected as the next block author, it prioritizes transactions based on weight, length, and tip amount. The goal is to fill the block with high-priority transactions without exceeding its maximum size or computational limits. Transactions are ordered as follows:\n\n- **Inherents first**: Inherent transactions, such as block timestamp updates, are always placed first.\n- **Nonce-based ordering**: Transactions from the same account are ordered by their nonce.\n- **Fee-based ordering**: Among transactions with the same nonce or priority level, those with higher fees are prioritized."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#transaction-execution", "page_title": "Transactions", "index": 18, "depth": 3, "title": "Transaction Execution", "anchor": "transaction-execution", "start_char": 19075, "end_char": 19692, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transaction Execution\n\nOnce a block author selects transactions from the pool, the transactions are executed in priority order. As each transaction is processed, the state changes are written directly to the chain's storage. It's important to note that these changes are not cached, meaning a failed transaction won't revert earlier state changes, which could leave the block in an inconsistent state.\n\nEvents are also written to storage. Runtime logic should not emit an event before performing the associated actions. If the associated transaction fails after the event was emitted, the event will not revert."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#transaction-mortality", "page_title": "Transactions", "index": 19, "depth": 2, "title": "Transaction Mortality", "anchor": "transaction-mortality", "start_char": 19692, "end_char": 21223, "estimated_token_count": 279, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Transaction Mortality\n\nTransactions in the network can be configured as either mortal (with expiration) or immortal (without expiration). Every transaction payload contains a block checkpoint (reference block number and hash) and an era/validity period that determines how many blocks after the checkpoint the transaction remains valid.\n\nWhen a transaction is submitted, the network validates it against these parameters. If the transaction is not included in a block within the specified validity window, it is automatically removed from the transaction queue.\n\n- **Mortal transactions**: Have a finite lifespan and will expire after a specified number of blocks. For example, a transaction with a block checkpoint of 1000 and a validity period of 64 blocks will be valid from blocks 1000 to 1064.\n\n- **Immortal transactions**: Never expire and remain valid indefinitely. To create an immortal transaction, set the block checkpoint to 0 (genesis block), use the genesis hash as a reference, and set the validity period to 0.\n\nHowever, immortal transactions pose significant security risks through replay attacks. If an account is reaped (balance drops to zero, account removed) and later re-funded, malicious actors can replay old immortal transactions.\n\nThe blockchain maintains only a limited number of prior block hashes for reference validation, called `BlockHashCount`. If your validity period exceeds `BlockHashCount`, the effective validity period becomes the minimum of your specified period and the block hash count."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#unique-identifiers-for-extrinsics", "page_title": "Transactions", "index": 20, "depth": 2, "title": "Unique Identifiers for Extrinsics", "anchor": "unique-identifiers-for-extrinsics", "start_char": 21223, "end_char": 23119, "estimated_token_count": 427, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Unique Identifiers for Extrinsics\n\nTransaction hashes are **not unique identifiers** in Polkadot SDK-based chains.\n\nKey differences from traditional blockchains:\n\n- Transaction hashes serve only as fingerprints of transaction information.\n- Multiple valid transactions can share the same hash.\n- Hash uniqueness assumptions lead to serious issues.\n\nFor example, when an account is reaped (removed due to insufficient balance) and later recreated, it resets to nonce 0, allowing identical transactions to be valid at different points:\n\n| Block | Extrinsic Index | Hash | Origin    | Nonce | Call                | Result                        |\n|-------|----------------|------|-----------|-------|---------------------|-------------------------------|\n| 100   | 0              | 0x01 | Account A | 0     | Transfer 5 DOT to B | Account A reaped              |\n| 150   | 5              | 0x02 | Account B | 4     | Transfer 7 DOT to A | Account A created (nonce = 0) |\n| 200   | 2              | 0x01 | Account A | 0     | Transfer 5 DOT to B | Successful transaction        |\n\nNotice that blocks 100 and 200 contain transactions with identical hashes (0x01) but are completely different, valid operations occurring at different times.\n\nAdditional complexity comes from Polkadot SDK's origin abstraction. Origins can represent collectives, governance bodies, or other non-account entities that don't maintain nonces like regular accounts and might dispatch identical calls multiple times with the same hash values. Each execution occurs in different chain states with different results.\n\nThe correct way to uniquely identify an extrinsic on a Polkadot SDK-based chain is to use the block ID (height or hash) and the extrinsic index. Since the Polkadot SDK defines blocks as headers plus ordered arrays of extrinsics, the index position within a canonical block provides guaranteed uniqueness."}
{"source": "polkadot-docs", "page_id": "reference-parachains-blocks-transactions-fees-transactions", "url": "https://developer.polkadot.com/reference/parachains/blocks-transactions-fees/transactions/#additional-resources", "page_title": "Transactions", "index": 21, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 23119, "end_char": 23342, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a26019eac55a54981b92819c5ea1c7ed326033c03fd10aa5d10c893103127fbe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Additional Resources\n\nFor a video overview of the lifecycle of transactions and the types of transactions that exist, see the [Transaction lifecycle](https://www.youtube.com/watch?v=3pfM0GOp02c) seminar from Parity Tech."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#introduction", "page_title": "Chain Data", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 15, "end_char": 613, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nUnderstanding and leveraging on-chain data is a fundamental aspect of blockchain development. Whether you're building frontend applications or backend systems, accessing and decoding runtime metadata is vital to interacting with the blockchain. This guide introduces you to the tools and processes for generating and retrieving metadata, explains its role in application development, and outlines the additional APIs available for interacting with a Polkadot node. By mastering these components, you can ensure seamless communication between your applications and the blockchain."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#application-development", "page_title": "Chain Data", "index": 1, "depth": 2, "title": "Application Development", "anchor": "application-development", "start_char": 613, "end_char": 1675, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Application Development\n\nYou might not be directly involved in building frontend applications as a blockchain developer. However, most applications that run on a blockchain require some form of frontend or user-facing client to enable users or other programs to access and modify the data that the blockchain stores. For example, you might develop a browser-based, mobile, or desktop application that allows users to submit transactions, post articles, view their assets, or track previous activity. The backend for that application is configured in the runtime logic for your blockchain, but the frontend client makes the runtime features accessible to your users.\n\nFor your custom chain to be useful to others, you'll need to provide a client application that allows users to view, interact with, or update information that the blockchain keeps track of. In this article, you'll learn how to expose information about your runtime so that client applications can use it, see examples of the information exposed, and explore tools and libraries that use it."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#understand-metadata", "page_title": "Chain Data", "index": 2, "depth": 2, "title": "Understand Metadata", "anchor": "understand-metadata", "start_char": 1675, "end_char": 2259, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understand Metadata\n\nPolkadot SDK-based blockchain networks are designed to expose their runtime information, allowing developers to learn granular details regarding pallets, RPC calls, and runtime APIs. The metadata also exposes their related documentation. The chain's metadata is [SCALE-encoded](/reference/parachains/data-encoding/), allowing for the development of browser-based, mobile, or desktop applications to support the chain's runtime upgrades seamlessly. It is also possible to develop applications compatible with multiple Polkadot SDK-based chains simultaneously."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#expose-runtime-information-as-metadata", "page_title": "Chain Data", "index": 3, "depth": 2, "title": "Expose Runtime Information as Metadata", "anchor": "expose-runtime-information-as-metadata", "start_char": 2259, "end_char": 3858, "estimated_token_count": 282, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Expose Runtime Information as Metadata\n\nTo interact with a node or the state of the blockchain, you need to know how to connect to the chain and access the exposed runtime features. This interaction involves a Remote Procedure Call (RPC) through a node endpoint address, commonly through a secure web socket connection.\n\nAn application developer typically needs to know the contents of the runtime logic, including the following details:\n\n- Version of the runtime the application is connecting to.\n- Supported APIs.\n- Implemented pallets.\n- Defined functions and corresponding type signatures.\n- Defined custom types.\n- Exposed parameters users can set.\n\nAs the Polkadot SDK is modular and provides a composable framework for building blockchains, there are limitless opportunities to customize the schema of properties. Each runtime can be configured with its properties, including function calls and types, which can be changed over time with runtime upgrades.\n\nThe Polkadot SDK enables you to generate the runtime metadata schema to capture information unique to a runtime. The metadata for a runtime describes the pallets in use and types defined for a specific runtime version. The metadata includes information about each pallet's storage items, functions, events, errors, and constants. The metadata also provides type definitions for any custom types included in the runtime.\n\nMetadata provides a complete inventory of a chain's runtime. It is key to enabling client applications to interact with the node, parse responses, and correctly format message payloads sent back to that chain."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#generate-metadata", "page_title": "Chain Data", "index": 4, "depth": 2, "title": "Generate Metadata", "anchor": "generate-metadata", "start_char": 3858, "end_char": 5116, "estimated_token_count": 279, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Generate Metadata\n\nTo efficiently use the blockchain's networking resources and minimize the data transmitted over the network, the metadata schema is encoded using the [Parity SCALE Codec](https://github.com/paritytech/parity-scale-codec?tab=readme-ov-file#parity-scale-codec). This encoding is done automatically through the [`scale-info`](https://docs.rs/scale-info/latest/scale_info/)crate.\n\nAt a high level, generating the metadata involves the following steps:\n\n1. The pallets in the runtime logic expose callable functions, types, parameters, and documentation that need to be encoded in the metadata.\n2. The `scale-info` crate collects type information for the pallets in the runtime, builds a registry of the pallets that exist in a particular runtime, and the relevant types for each pallet in the registry. The type information is detailed enough to enable encoding and decoding for every type.\n3. The [`frame-metadata`](https://github.com/paritytech/frame-metadata) crate describes the structure of the runtime based on the registry provided by the `scale-info` crate.\n4. Nodes provide the RPC method `state_getMetadata` to return a complete description of all the types in the current runtime as a hex-encoded vector of SCALE-encoded bytes."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#retrieve-runtime-metadata", "page_title": "Chain Data", "index": 5, "depth": 2, "title": "Retrieve Runtime Metadata", "anchor": "retrieve-runtime-metadata", "start_char": 5116, "end_char": 5616, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Retrieve Runtime Metadata\n\nThe type information provided by the metadata enables applications to communicate with nodes using different runtime versions and across chains that expose different calls, events, types, and storage items. The metadata also allows libraries to generate a substantial portion of the code needed to communicate with a given node, enabling libraries like [`subxt`](https://github.com/paritytech/subxt) to generate frontend interfaces that are specific to a target chain."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#use-polkadotjs", "page_title": "Chain Data", "index": 6, "depth": 3, "title": "Use Polkadot.js", "anchor": "use-polkadotjs", "start_char": 5616, "end_char": 6051, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use Polkadot.js\n\nVisit the [Polkadot.js Portal](https://polkadot.js.org/apps/#/rpc) and select the **Developer** dropdown in the top banner. Select **RPC Calls** to make the call to request metadata. Follow these steps to make the RPC call:\n\n1. Select **state** as the endpoint to call.\n2. Select **`getMetadata(at)`** as the method to call.\n3. Click **Submit RPC call** to submit the call and return the metadata in JSON format."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#use-curl", "page_title": "Chain Data", "index": 7, "depth": 3, "title": "Use Curl", "anchor": "use-curl", "start_char": 6051, "end_char": 6365, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use Curl \n\nYou can fetch the metadata for the network by calling the node's RPC endpoint. This request returns the metadata in bytes rather than human-readable JSON:\n\n```sh\ncurl -H \"Content-Type: application/json\" \\\n-d '{\"id\":1, \"jsonrpc\":\"2.0\", \"method\": \"state_getMetadata\"}' \\\nhttps://rpc.polkadot.io\n\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#use-subxt", "page_title": "Chain Data", "index": 8, "depth": 3, "title": "Use Subxt", "anchor": "use-subxt", "start_char": 6365, "end_char": 6699, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use Subxt\n\n[`subxt`](https://github.com/paritytech/subxt) may also be used to fetch the metadata of any data in a human-readable JSON format: \n\n```sh\nsubxt metadata  --url wss://rpc.polkadot.io --format json > spec.json\n```\n\nAnother option is to use the [`subxt` explorer web UI](https://paritytech.github.io/subxt-explorer/#/)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#client-applications-and-metadata", "page_title": "Chain Data", "index": 9, "depth": 2, "title": "Client Applications and Metadata", "anchor": "client-applications-and-metadata", "start_char": 6699, "end_char": 7236, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Client Applications and Metadata\n\nThe metadata exposes the expected way to decode each type, meaning applications can send, retrieve, and process application information without manual encoding and decoding. Client applications must use the [SCALE codec library](https://github.com/paritytech/parity-scale-codec?tab=readme-ov-file#parity-scale-codec) to encode and decode RPC payloads to use the metadata. Client applications use the metadata to interact with the node, parse responses, and format message payloads sent to the node."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#metadata-format", "page_title": "Chain Data", "index": 10, "depth": 2, "title": "Metadata Format", "anchor": "metadata-format", "start_char": 7236, "end_char": 9370, "estimated_token_count": 448, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Metadata Format\n\nAlthough the SCALE-encoded bytes can be decoded using the `frame-metadata` and [`parity-scale-codec`](https://github.com/paritytech/parity-scale-codec) libraries, there are other tools, such as `subxt` and the Polkadot-JS API, that can convert the raw data to human-readable JSON format.\n\nThe types and type definitions included in the metadata returned by the `state_getMetadata` RPC call depend on the runtime's metadata version.\n\nIn general, the metadata includes the following information:\n\n- A constant identifying the file as containing metadata.\n- The version of the metadata format used in the runtime.\n- Type definitions for all types used in the runtime and generated by the `scale-info` crate.\n- Pallet information for the pallets included in the runtime in the order that they are defined in the `construct_runtime` macro.\n\n!!!tip \n    Depending on the frontend library used (such as the [Polkadot API](https://papi.how/)), they may format the metadata differently than the raw format shown.\n\nThe following example illustrates a condensed and annotated section of metadata decoded and converted to JSON:\n\n```json\n[\n    1635018093,\n    {\n        \"V14\": {\n            \"types\": {\n                \"types\": [{}]\n            },\n            \"pallets\": [{}],\n            \"extrinsic\": {\n                \"ty\": 126,\n                \"version\": 4,\n                \"signed_extensions\": [{}]\n            },\n            \"ty\": 141\n        }\n    }\n]\n\n```\n\nThe constant `1635018093` is a magic number that identifies the file as a metadata file. The rest of the metadata is divided into the `types`, `pallets`, and `extrinsic` sections:\n\n- The `types` section contains an index of the types and information about each type's type signature.\n- The `pallets` section contains information about each pallet in the runtime.\n- The `extrinsic` section describes the type identifier and transaction format version that the runtime uses.\n\nDifferent extrinsic versions can have varying formats, especially when considering [signed transactions](/reference/parachains/blocks-transactions-fees/transactions/#signed-transactions)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#pallets", "page_title": "Chain Data", "index": 11, "depth": 3, "title": "Pallets", "anchor": "pallets", "start_char": 9370, "end_char": 14874, "estimated_token_count": 980, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Pallets\n\nThe following is a condensed and annotated example of metadata for a single element in the `pallets` array (the [`sudo`](https://paritytech.github.io/polkadot-sdk/master/pallet_sudo/index.html) pallet):\n\n```json\n{\n    \"name\": \"Sudo\",\n    \"storage\": {\n        \"prefix\": \"Sudo\",\n        \"entries\": [\n            {\n                \"name\": \"Key\",\n                \"modifier\": \"Optional\",\n                \"ty\": {\n                    \"Plain\": 0\n                },\n                \"default\": [0],\n                \"docs\": [\"The `AccountId` of the sudo key.\"]\n            }\n        ]\n    },\n    \"calls\": {\n        \"ty\": 117\n    },\n    \"event\": {\n        \"ty\": 42\n    },\n    \"constants\": [],\n    \"error\": {\n        \"ty\": 124\n    },\n    \"index\": 8\n}\n\n```\n\nEvery element metadata contains the name of the pallet it represents and information about its storage, calls, events, and errors. You can look up details about the definition of the calls, events, and errors by viewing the type index identifier. The type index identifier is the `u32` integer used to access the type information for that item. For example, the type index identifier for calls in the Sudo pallet is 117. If you view information for that type identifier in the `types` section of the metadata, it provides information about the available calls, including the documentation for each call.\n\nFor example, the following is a condensed excerpt of the calls for the Sudo pallet:\n\n```json\n{\n    \"id\": 117,\n    \"type\": {\n        \"path\": [\"pallet_sudo\", \"pallet\", \"Call\"],\n        \"params\": [\n            {\n                \"name\": \"T\",\n                \"type\": null\n            }\n        ],\n        \"def\": {\n            \"variant\": {\n                \"variants\": [\n                    {\n                        \"name\": \"sudo\",\n                        \"fields\": [\n                            {\n                                \"name\": \"call\",\n                                \"type\": 114,\n                                \"typeName\": \"Box<<T as Config>::RuntimeCall>\"\n                            }\n                        ],\n                        \"index\": 0,\n                        \"docs\": [\n                            \"Authenticates sudo key, dispatches a function call with `Root` origin\"\n                        ]\n                    },\n                    {\n                        \"name\": \"sudo_unchecked_weight\",\n                        \"fields\": [\n                            {\n                                \"name\": \"call\",\n                                \"type\": 114,\n                                \"typeName\": \"Box<<T as Config>::RuntimeCall>\"\n                            },\n                            {\n                                \"name\": \"weight\",\n                                \"type\": 8,\n                                \"typeName\": \"Weight\"\n                            }\n                        ],\n                        \"index\": 1,\n                        \"docs\": [\n                            \"Authenticates sudo key, dispatches a function call with `Root` origin\"\n                        ]\n                    },\n                    {\n                        \"name\": \"set_key\",\n                        \"fields\": [\n                            {\n                                \"name\": \"new\",\n                                \"type\": 103,\n                                \"typeName\": \"AccountIdLookupOf<T>\"\n                            }\n                        ],\n                        \"index\": 2,\n                        \"docs\": [\n                            \"Authenticates current sudo key, sets the given AccountId (`new`) as the new sudo\"\n                        ]\n                    },\n                    {\n                        \"name\": \"sudo_as\",\n                        \"fields\": [\n                            {\n                                \"name\": \"who\",\n                                \"type\": 103,\n                                \"typeName\": \"AccountIdLookupOf<T>\"\n                            },\n                            {\n                                \"name\": \"call\",\n                                \"type\": 114,\n                                \"typeName\": \"Box<<T as Config>::RuntimeCall>\"\n                            }\n                        ],\n                        \"index\": 3,\n                        \"docs\": [\n                            \"Authenticates sudo key, dispatches a function call with `Signed` origin from a given account\"\n                        ]\n                    }\n                ]\n            }\n        }\n    }\n}\n\n```\n\nFor each field, you can access type information and metadata for the following:\n\n- **Storage metadata**: Provides the information required to enable applications to get information for specific storage items.\n- **Call metadata**: Includes information about the runtime calls defined by the `#[pallet]` macro including call names, arguments and documentation.\n- **Event metadata**: Provides the metadata generated by the `#[pallet::event]` macro, including the name, arguments, and documentation for each pallet event.\n- **Constants metadata**: Provides metadata generated by the `#[pallet::constant]` macro, including the name, type, and hex-encoded value of the constant.\n- **Error metadata**: Provides metadata generated by the `#[pallet::error]` macro, including the name and documentation for each pallet error.\n\n!!!tip\n    Type identifiers change from time to time, so you should avoid relying on specific type identifiers in your applications."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#extrinsic", "page_title": "Chain Data", "index": 12, "depth": 3, "title": "Extrinsic", "anchor": "extrinsic", "start_char": 14874, "end_char": 16982, "estimated_token_count": 378, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Extrinsic\n\nThe runtime generates extrinsic metadata and provides useful information about transaction format. When decoded, the metadata contains the transaction version and the list of signed extensions.\n\nFor example:\n\n```json\n{\n    \"extrinsic\": {\n        \"ty\": 126,\n        \"version\": 4,\n        \"signed_extensions\": [\n            {\n                \"identifier\": \"CheckNonZeroSender\",\n                \"ty\": 132,\n                \"additional_signed\": 41\n            },\n            {\n                \"identifier\": \"CheckSpecVersion\",\n                \"ty\": 133,\n                \"additional_signed\": 4\n            },\n            {\n                \"identifier\": \"CheckTxVersion\",\n                \"ty\": 134,\n                \"additional_signed\": 4\n            },\n            {\n                \"identifier\": \"CheckGenesis\",\n                \"ty\": 135,\n                \"additional_signed\": 11\n            },\n            {\n                \"identifier\": \"CheckMortality\",\n                \"ty\": 136,\n                \"additional_signed\": 11\n            },\n            {\n                \"identifier\": \"CheckNonce\",\n                \"ty\": 138,\n                \"additional_signed\": 41\n            },\n            {\n                \"identifier\": \"CheckWeight\",\n                \"ty\": 139,\n                \"additional_signed\": 41\n            },\n            {\n                \"identifier\": \"ChargeTransactionPayment\",\n                \"ty\": 140,\n                \"additional_signed\": 41\n            }\n        ]\n    },\n    \"ty\": 141\n}\n\n```\n\nThe type system is [composite](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/frame_runtime_types/index.html), meaning each type identifier contains a reference to a specific type or to another type identifier that provides information about the associated primitive types.\n\nFor example, you can encode the `BitVec<Order, Store>` type, but to decode it properly, you must know the types used for the `Order` and `Store` types. To find type information for `Order` and `Store`, you can use the path in the decoded JSON to locate their type identifiers."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#included-rpc-apis", "page_title": "Chain Data", "index": 13, "depth": 2, "title": "Included RPC APIs", "anchor": "included-rpc-apis", "start_char": 16982, "end_char": 18014, "estimated_token_count": 272, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Included RPC APIs\n\nA standard node comes with the following APIs to interact with a node:\n\n- **[`AuthorApiServer`](https://paritytech.github.io/polkadot-sdk/master/sc_rpc/author/trait.AuthorApiServer.html)**: Make calls into a full node, including authoring extrinsics and verifying session keys.\n- **[`ChainApiServer`](https://paritytech.github.io/polkadot-sdk/master/sc_rpc/chain/trait.ChainApiServer.html)**: Retrieve block header and finality information.\n- **[`OffchainApiServer`](https://paritytech.github.io/polkadot-sdk/master/sc_rpc/offchain/trait.OffchainApiServer.html)**: Make RPC calls for off-chain workers.\n- **[`StateApiServer`](https://paritytech.github.io/polkadot-sdk/master/sc_rpc/state/trait.StateApiServer.html)**: Query information about on-chain state such as runtime version, storage items, and proofs.\n- **[`SystemApiServer`](https://paritytech.github.io/polkadot-sdk/master/sc_rpc/system/trait.SystemApiServer.html)**: Retrieve information about network state, such as connected peers and node roles."}
{"source": "polkadot-docs", "page_id": "reference-parachains-chain-data", "url": "https://developer.polkadot.com/reference/parachains/chain-data/#additional-resources", "page_title": "Chain Data", "index": 14, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 18014, "end_char": 18298, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e280f7f14c27ddf669377dc70f521e0c648975671446d838d120f580b0ee6b10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Additional Resources\n\nThe following tools can help you locate and decode metadata:\n\n- [Subxt Explorer](https://paritytech.github.io/subxt-explorer/#/)\n- [Metadata Portal 🌗](https://github.com/paritytech/metadata-portal)\n- [De[code] Sub[strate]](https://github.com/paritytech/desub)"}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-async-backing", "url": "https://developer.polkadot.com/reference/parachains/consensus/async-backing/#introduction", "page_title": "Asynchronous Backing", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 25, "end_char": 1101, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5ba40e22ffab1d3716b7ff6a12e0340984aa115eb27527515b7ca5aeeee41250", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nAsynchronous backing often shortened to _Async Backing_ is a parachain protocol feature that significantly improves performance, enabling parachains to produce blocks twice as fast (every 6 seconds instead of every 12) and to provide 4x more execution time per block (2 seconds instead of 0.5). \n\nTechnically, async backing is a parachain [configuration](https://paritytech.github.io/polkadot-sdk/master/cumulus_primitives_core/relay_chain/struct.AsyncBackingParams.html) that allows collators and validators to build blocks ahead of the relay chain during the generation and backing stages of the [Inclusion Pipeline](/reference/parachains/consensus/inclusion-pipeline) by using unincluded segments, which are chains of parachain blocks that have not yet been fully included in the relay chain. This decouples parachain block production from relay chain inclusion, improves coretime efficiency, and enables the parallel processing required for parachains to further scale throughput using [Elastic Scaling](/reference/parachains/consensus/elastic-scaling)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-async-backing", "url": "https://developer.polkadot.com/reference/parachains/consensus/async-backing/#configurations", "page_title": "Asynchronous Backing", "index": 1, "depth": 2, "title": "Configurations", "anchor": "configurations", "start_char": 1101, "end_char": 1965, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5ba40e22ffab1d3716b7ff6a12e0340984aa115eb27527515b7ca5aeeee41250", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configurations\nThe following configurations can be set by on-chain governance, dictating how many blocks ahead of the relay chain a given parachain's collators can run:\n\n- [**`max_candidate_depth`**](https://paritytech.github.io/polkadot-sdk/master/cumulus_primitives_core/relay_chain/struct.AsyncBackingParams.html#structfield.max_candidate_depth): the number of parablocks a collator can produce that are not yet included in the relay chain. A value of `2` means that there can be a maximum of 3 unincluded parablocks at any given time.\n- [**`allowed_ancestry_len`**](https://paritytech.github.io/polkadot-sdk/master/cumulus_primitives_core/relay_chain/struct.AsyncBackingParams.html#structfield.allowed_ancestry_len): the oldest relay parent a parablock can be built on top of. A value of `1` means collators can start building blocks 6 seconds in advance."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-async-backing", "url": "https://developer.polkadot.com/reference/parachains/consensus/async-backing/#synchronous-vs-asynchronous-processing", "page_title": "Asynchronous Backing", "index": 2, "depth": 2, "title": "Synchronous VS. Asynchronous Processing", "anchor": "synchronous-vs-asynchronous-processing", "start_char": 1965, "end_char": 7999, "estimated_token_count": 1379, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5ba40e22ffab1d3716b7ff6a12e0340984aa115eb27527515b7ca5aeeee41250", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Synchronous VS. Asynchronous Processing\n\nThe Polkadot-parachain protocol originally operated in synchronous mode, where both collators and validators drew context exclusively from the relay parent of the prior parablock, which lives on the relay chain. This made the Backing and Generation steps tightly coupled to the prior parablock completing the entire inclusion pipeline. As a result, one parablock could only be processed every other relay block, with just 0.5 seconds assigned for execution.\n\n```mermaid\n---\n    displayMode: compact\n    config:\n        themeCSS: \"\n            #item1 { fill: #450693; stroke: #450693; } \\n\n            #item2 { fill: #8C00FF; stroke: #8C00FF; } \\n\n            #item3 { fill: #FFC400; stroke: #FFC400; } \\n\n            #r     { fill: #eb4172; stroke:none; font-size: 20px; } \\n\n            svg text { font-size: 20px !important; } \\n\n            svg .sectionTitle { font-size: 20px !important; } \\n    #p1padTop { display: none; } \\n\n\n            /* Hide ALL task labels by default */\n            text.taskText,\n            text.taskTextOutside,\n            [class*='taskText'] tspan { display: none !important; } \\n\n\n            /* Show labels for the 'r' group (inside or outside, incl. tspans) */\n            text.taskText[id^='r'],\n            text.taskTextOutside[id^='r'],\n            text[id^='r'] tspan { display: inline !important; font-size: 20px; fill: var(--white) !important; } \\n\n\n            /* Keep section titles styled */\n            .sectionTitle { fill: var(--md-default-fg-color) !important; font-weight: 700; font-size: 18px; } \\n\n\n            /* Hide the first two section titles (F1, F2). Change indexes if needed. */\n            .sectionTitle:nth-of-type(1),\n            .sectionTitle:nth-of-type(2) { display: none !important; } \\n\n\n            /* Also hide SPACING row labels on the left */\n            text.taskTextOutside[id^='p1padTop'] { display: none !important; } \\n\n\n            .grid .tick text { fill: var(--md-default-fg-color) !important; font-size: 20px !important; }\n\n        \"\n        themeVariables:\n            sectionBkgColor: '#fff'\n        gantt:\n            numberSectionStyles: 1\n            barHeight: 70\n            gridLineStartPadding: 100\n---\n%%{init: {\"gantt\": {\"barHeight\": 70 }}}%%\ngantt\n    dateFormat YYYY\n    axisFormat %y\n    tickInterval '10year'\n\n    section F1\n    R1 : r, 1905, 1907\n    R2 : r, 1911, 1913\n    R3 : r, 1917, 1919\n    R4 : r, 1923, 1925\n\n    section F2\n    SPACING : p1padTop, 1901, 1924\n\n    section P1\n    X          : item1, 1900, 1901\n    Backing    : item2, 1901, 1906\n    Inclusion  : item3, 1906, 1912\n\n    section P2\n    X          : item1, 1912, 1913\n    Backing    : item2, 1913, 1918\n    Inclusion  : item3, 1918, 1924\n    \n\n```\n\nThe modern protocol now uses asynchronous backing, where both collators and validators have access to [unincluded segments](/reference/parachains/consensus/inclusion-pipeline) as an additional context source. The Backing and Generation steps are no longer coupled to the prior block completing the full inclusion pipeline. Instead, the prior parablock only needs to complete the generation step and be added to the Unincluded Segments before the next parablock can begin the Backing and Generation steps.\n\nThis results in one parablock being processed every relay block (instead of every other relay block), and allows for more time to execute during the Generation step (0.5s → 2s).\n\n```mermaid\n---\n    displayMode: compact\n    config:\n        themeCSS: \"\n            #item1 { fill: #450693; stroke: #450693; } \\n\n            #item2 { fill: #8C00FF; stroke: #8C00FF; } \\n\n            #item3 { fill: #FFC400; stroke: #FFC400; } \\n\n            #r     { fill: #eb4172; stroke:none; font-size: 20px; } \\n\n            svg text { font-size: 20px !important; } \\n\n            svg .sectionTitle { font-size: 20px !important; } \\n    #p1padTop { display: none; } \\n\n\n            /* Hide ALL task labels by default */\n            text.taskText,\n            text.taskTextOutside,\n            [class*='taskText'] tspan { display: none !important; } \\n\n\n            /* Show labels for the 'r' group (inside or outside, incl. tspans) */\n            text.taskText[id^='r'],\n            text.taskTextOutside[id^='r'],\n            text[id^='r'] tspan { display: inline !important; font-size: 20px; color: var(--white) !important; } \\n\n\n            /* Keep section titles styled */\n            .sectionTitle { fill: var(--md-default-fg-color) !important; font-weight: 700; font-size: 18px; } \\n\n\n            /* Hide the first two section titles (F1, F2). Change indexes if needed. */\n            .sectionTitle:nth-of-type(1),\n            .sectionTitle:nth-of-type(2) { display: none !important; } \\n\n\n            /* Also hide SPACING row labels on the left */\n            text.taskTextOutside[id^='p1padTop'] { display: none !important; } \\n\n\n            .taskTextOutsideRight { fill: var(--md-default-fg-color) !important; font-size: 20px !important; }\n\n            .grid .tick text { fill: var(--md-default-fg-color) !important; font-size: 20px !important; }\n        \"\n        themeVariables:\n            sectionBkgColor: '#fff'\n        gantt:\n            numberSectionStyles: 1\n            barHeight: 70\n            gridLineStartPadding: 100\n---\n%%{init: {\"gantt\": {\"barHeight\": 70 }}}%%\ngantt\n    dateFormat YYYY\n    axisFormat %y\n    tickInterval '10year'\n\n    section F1\n    R1 : r, 1905, 1907\n    R2 : r, 1911, 1913\n    R3 : r, 1917, 1919\n    R4 : r, 1923, 1925\n    R5 : r, 1929, 1931\n\n    section F2\n    SPACING : p1padTop, 1901, 1930\n\n    section P1\n    X         : item1, 1900, 1902\n    Backing   : item2, 1902, 1912\n    Inclusion : item3, 1912, 1918\n\n    section P2\n    X         : item1, 1906, 1908\n    Backing   : item2, 1908, 1918\n    Inclusion : item3, 1918, 1924\n    \n    section P3\n    X         : item1, 1912, 1914\n    Backing   : item2, 1914, 1924f\n    Inclusion : item3, 1924, 1930\n\n    section P4\n    X         : item1, 1918, 1920\n    Backing   : item2, 1920, 1930\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#introduction", "page_title": "Elastic Scaling", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 828, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot's architecture delivers scalability and security through its shared security model, where the relay chain coordinates and validates multiple parallel chains. \n\nElastic scaling enhances this architecture by allowing parachains to utilize multiple computational cores simultaneously, breaking the previous 1:1 relationship between parachain and relay chain blocks.\n\nThis technical advancement enables parachains to process multiple blocks within a single relay chain block, significantly increasing throughput capabilities. By leveraging [Agile Coretime](/reference/polkadot-hub/consensus-and-security/agile-coretime/), parachains can dynamically adjust their processing capacity based on demand, creating an efficient and responsive infrastructure for high-throughput applications."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#how-elastic-scaling-works", "page_title": "Elastic Scaling", "index": 1, "depth": 2, "title": "How Elastic Scaling Works", "anchor": "how-elastic-scaling-works", "start_char": 828, "end_char": 4198, "estimated_token_count": 710, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Elastic Scaling Works\n\nElastic scaling enables parachains to process multiple blocks in parallel by utilizing additional cores on the relay chain. This section provides a technical analysis of the performance advantages and details of the implementation.\n\nConsider a parachain that needs to process four consecutive parablocks. With traditional single-core allocation, the validation process follows a strictly sequential pattern. Each parablock undergoes a two-phase process on the relay chain:\n\n1. **Backing phase**: Validators create and distribute validity statements.\n2. **Inclusion phase**: The parablock is included in the relay chain after availability verification.\n\nThroughout the following diagrams, specific notation is used to represent different components of the system:\n\n- **R1, R2, ...**: Relay chain blocks (produced at ~6-second intervals).\n- **P1, P2, ...**: Parachain blocks that need validation and inclusion.\n- **C1, C2, ...**: Cores on the relay chain.\n\nIn the single-core scenario (assuming a 6-second relay chain block time), processing four parablocks requires approximately 30 seconds:\n\n```mermaid\nsequenceDiagram\n    participant R1 as R1\n    participant R2 as R2\n    participant R3 as R3\n    participant R4 as R4\n    participant R5 as R5\n    \n    Note over R1,R5: Single Core Scenario\n    \n    rect rgb(200, 220, 240)\n    Note right of R1: Core C1\n    R1->>R1: Back P1\n    R2->>R2: Include P1\n    R2->>R2: Back P2\n    R3->>R3: Include P2\n    R3->>R3: Back P3\n    R4->>R4: Include P3\n    R4->>R4: Back P4\n    R5->>R5: Include P4\n    end\n```\n\nWith elastic scaling utilizing two cores simultaneously, the same four parablocks can be processed in approximately 18 seconds:\n\n```mermaid\nsequenceDiagram\n    participant R1 as R1\n    participant R2 as R2\n    participant R3 as R3\n    participant R4 as R4\n    participant R5 as R5\n    \n    Note over R1,R3: Multi-Core Scenario\n    \n    rect rgb(200, 220, 240)\n    Note right of R1: Core C1\n    R1->>R1: Back P1\n    R2->>R2: Include P1\n    R2->>R2: Back P2\n    R3->>R3: Include P2\n    end\n    \n    rect rgb(220, 200, 240)\n    Note right of R1: Core C2\n    R1->>R1: Back P3\n    R2->>R2: Include P3\n    R2->>R2: Back P4\n    R3->>R3: Include P4\n    end\n```\n\nTo help interpret the sequence diagrams above, note the following key elements:\n\n- The horizontal axis represents time progression through relay chain blocks (R1-R5).\n- Each colored rectangle shows processing on a specific core (C1 or C2).\n- In the single-core scenario, all blocks must be processed sequentially on one core.\n- In the multi-core scenario, blocks are processed in parallel across multiple cores, reducing total time.\n\nThe relay chain processes these multiple parablocks as independent validation units during the backing, availability, and approval phases. However, during inclusion, it verifies that their state roots align properly to maintain chain consistency.\n\nFrom an implementation perspective:\n\n- **Parachain side**: Collators must increase their block production rate to utilize multiple cores fully.\n- **Validation process**: Each core operates independently, but with coordinated state verification.\n- **Resource management**: Cores are dynamically allocated based on parachain requirements.\n- **State consistency**: While backed and processed in parallel, the parablocks maintain sequential state transitions."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#benefits-of-elastic-scaling", "page_title": "Elastic Scaling", "index": 2, "depth": 2, "title": "Benefits of Elastic Scaling", "anchor": "benefits-of-elastic-scaling", "start_char": 4198, "end_char": 5987, "estimated_token_count": 288, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Benefits of Elastic Scaling\n\n- **Increased throughput**: Multiple concurrent cores enable parachains to process transactions at multiples of their previous capacity. By allowing multiple parachain blocks to be validated within each relay chain block cycle, applications can achieve significantly higher transaction volumes.\n\n- **Lower latency**: Transaction finality improves substantially with multi-core processing. Parachains currently achieve 2-second latency with three cores, with projected improvements to 500ms using 12 cores, enabling near-real-time application responsiveness.\n\n- **Resource efficiency**: Applications acquire computational resources precisely matched to their needs, eliminating wasteful over-provisioning. Coretime can be purchased at granular intervals (blocks, hours, days), creating cost-effective operations, particularly for applications with variable transaction patterns.\n\n- **Scalable growth**: New applications can launch with minimal initial resource commitment and scale dynamically as adoption increases. This eliminates the traditional paradox of either over-allocating resources (increasing costs) or under-allocating (degrading performance) during growth phases.\n\n- **Workload distribution**: Parachains intelligently distribute workloads across cores during peak demand periods and release resources when traffic subsides. Paired with secondary coretime markets, this ensures maximum resource utilization across the entire network ecosystem.\n\n- **Reliable performance**: End-users experience reliable application performance regardless of network congestion levels. Applications maintain responsiveness even during traffic spikes, eliminating performance degradation that commonly impacts blockchain applications during high-demand periods."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#use-cases", "page_title": "Elastic Scaling", "index": 3, "depth": 2, "title": "Use Cases", "anchor": "use-cases", "start_char": 5987, "end_char": 6355, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use Cases\n\nElastic scaling enables applications to dynamically adjust their resource consumption based on real-time demand. This is especially valuable for decentralized applications where usage patterns can be highly variable. The following examples illustrate common scenarios where elastic scaling delivers significant performance and cost-efficiency benefits."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#handling-sudden-traffic-spikes", "page_title": "Elastic Scaling", "index": 4, "depth": 3, "title": "Handling Sudden Traffic Spikes", "anchor": "handling-sudden-traffic-spikes", "start_char": 6355, "end_char": 6772, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Handling Sudden Traffic Spikes\n\nMany decentralized applications experience unpredictable, high-volume traffic bursts, especially in gaming, DeFi protocols, NFT auctions, messaging platforms, and social media. Elastic scaling allows these systems to acquire additional coretime during peak usage and release it during quieter periods, ensuring responsiveness without incurring constant high infrastructure costs."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#supporting-early-stage-growth", "page_title": "Elastic Scaling", "index": 5, "depth": 3, "title": "Supporting Early-Stage Growth", "anchor": "supporting-early-stage-growth", "start_char": 6772, "end_char": 7154, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Supporting Early-Stage Growth\n\nStartups and new projects often begin with uncertain or volatile demand. With elastic scaling, teams can launch with minimal compute resources (e.g., a single core) and gradually scale as adoption increases. This prevents overprovisioning and enables cost-efficient growth until the application is ready for more permanent or horizontal scaling."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#scaling-massive-iot-networks", "page_title": "Elastic Scaling", "index": 6, "depth": 3, "title": "Scaling Massive IoT Networks", "anchor": "scaling-massive-iot-networks", "start_char": 7154, "end_char": 7542, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Scaling Massive IoT Networks\n\nInternet of Things (IoT) applications often involve processing data from millions of devices in real time. Elastic scaling supports this need by enabling high-throughput transaction processing as demand fluctuates. Combined with Polkadot’s shared security model, it provides a reliable and privacy-preserving foundation for large-scale IoT deployments."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-elastic-scaling", "url": "https://developer.polkadot.com/reference/parachains/consensus/elastic-scaling/#powering-real-time-low-latency-systems", "page_title": "Elastic Scaling", "index": 7, "depth": 3, "title": "Powering Real-Time, Low-Latency Systems", "anchor": "powering-real-time-low-latency-systems", "start_char": 7542, "end_char": 7856, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7b87fc2d8055238d076ddcbe38a5c1baae7b49b64d11aa81568e75ef2bf9d77", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Powering Real-Time, Low-Latency Systems\n\nApplications like payment processors, trading platforms, gaming engines, or real-time data feeds require fast, consistent performance. Elastic scaling can reduce execution latency during demand spikes, helping ensure low-latency, reliable service even under heavy load."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-inclusion-pipeline", "url": "https://developer.polkadot.com/reference/parachains/consensus/inclusion-pipeline/#introduction", "page_title": "Inclusion Pipeline", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 1071, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:51502cf5dd684533c26a3aaad82f2d32210f11759338d7111627381e398d28a3", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nThe inclusion pipeline is the multi-stage process through which every parachain block (parablock) is validated and secured before being finalized in the Polkadot relay chain. This pipeline ensures that all parachain blocks meet validity requirements through progressive verification by multiple sets of validators.\n\nThe pipeline exists to provide Polkadot's security guarantees, rather than relying on a single validator group. Each parablock passes through multiple validation stages with different validator sets, ensuring that invalid blocks cannot be finalized even if some validators are malicious or compromised.\n\nWhether a parachain uses synchronous or [asynchronous backing](/reference/parachains/consensus/async-backing), all parablocks follow the same inclusion pipeline. The difference is in the timing: asynchronous backing allows multiple blocks to be at different stages of the pipeline simultaneously (pipelining), while synchronous backing processes one block through the entire pipeline before starting the next."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-inclusion-pipeline", "url": "https://developer.polkadot.com/reference/parachains/consensus/inclusion-pipeline/#pipeline-stages", "page_title": "Inclusion Pipeline", "index": 1, "depth": 2, "title": "Pipeline Stages", "anchor": "pipeline-stages", "start_char": 1071, "end_char": 1589, "estimated_token_count": 156, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:51502cf5dd684533c26a3aaad82f2d32210f11759338d7111627381e398d28a3", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pipeline Stages\n\nThe inclusion pipeline consists of three main stages:\n\n```mermaid\n%%{init: {\"flowchart\": {\"nodeSpacing\": 40, \"rankSpacing\": 60}}}%%\nflowchart LR\n  %% Keep the pipeline on one row (container is hidden)\n  subgraph Row[\" \"]\n    direction LR\n    G[\"Generation\"] --> B[\"Backing\"] --> I[\"Inclusion\"]\n  end\n  style Row fill:none,stroke:none\n\n  %% Context: plain text (no box) pointing to both G and B\n  C[\"Context\"]:::nobox\n  C -.-> G\n  C -.-> B\n\n  classDef nobox fill:none,stroke:none,color:inherit;\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-inclusion-pipeline", "url": "https://developer.polkadot.com/reference/parachains/consensus/inclusion-pipeline/#context", "page_title": "Inclusion Pipeline", "index": 2, "depth": 3, "title": "Context", "anchor": "context", "start_char": 1589, "end_char": 2552, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:51502cf5dd684533c26a3aaad82f2d32210f11759338d7111627381e398d28a3", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Context\n\nTo build a parablock during the generation and backing stages, collators and validators require access to the state context of the parachain. This context is derived from two sources:\n\n  - **Relay Parent**: The relay chain block to which the parablock is anchored. Note that the relay parent of a parablock is always different from the relay chain block that eventually includes it. This context source resides on the relay chain.\n\n  - **Unincluded Segments**: Chains of candidate parablocks that have not yet been included in the relay chain. These segments represent sequences of block ancestors and may contain candidates at any stage pre-inclusion. A key feature enabled by [async backing](/reference/parachains/consensus/async-backing) is that collators can build new parablocks on top of these unincluded ancestors rather than being limited to ancestors already included in the relay chain state. This context source resides on the collators."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-inclusion-pipeline", "url": "https://developer.polkadot.com/reference/parachains/consensus/inclusion-pipeline/#generation", "page_title": "Inclusion Pipeline", "index": 3, "depth": 3, "title": "Generation", "anchor": "generation", "start_char": 2552, "end_char": 3007, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:51502cf5dd684533c26a3aaad82f2d32210f11759338d7111627381e398d28a3", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Generation\n\nCollators execute their blockchain core functionality to generate a new block, producing a [proof-of-validity](../../../wiki/general/glossary.md#proof-of-validity) (PoV), which is passed to validators selected for backing. The PoV is composed of:\n\n  - A list of state transitions called the **block candidate**\n  - The values in the parachain's database that the block modifies\n  - The hashes of the unaffected points in the Merkle tree"}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-inclusion-pipeline", "url": "https://developer.polkadot.com/reference/parachains/consensus/inclusion-pipeline/#backing", "page_title": "Inclusion Pipeline", "index": 4, "depth": 3, "title": "Backing", "anchor": "backing", "start_char": 3007, "end_char": 3550, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:51502cf5dd684533c26a3aaad82f2d32210f11759338d7111627381e398d28a3", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Backing \n\nA subset of active validators verify that the parablock follows the state transition rules of the parachain and sign a [validity statement](https://paritytech.github.io/polkadot-sdk/book/types/backing.html?#validity-attestation) about the PoV which can have a positive or negative outcome. With enough positive statements (at least 2/3 of assigned validators), the candidate is considered backable. It is then noted in a fork on the relay chain, at which point it is considered backed, ready for the next stage of the pipeline."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus-inclusion-pipeline", "url": "https://developer.polkadot.com/reference/parachains/consensus/inclusion-pipeline/#inclusion", "page_title": "Inclusion Pipeline", "index": 5, "depth": 3, "title": "Inclusion", "anchor": "inclusion", "start_char": 3550, "end_char": 3876, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:51502cf5dd684533c26a3aaad82f2d32210f11759338d7111627381e398d28a3", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Inclusion\n\n Validators gossip [erasure code chunks](https://paritytech.github.io/polkadot-sdk/book/types/availability.html#erasure-chunk) and put the parablock through the final [approval process](https://paritytech.github.io/polkadot-sdk/book/protocol-approval.html) before it is considered *included* in the relay chain."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus", "url": "https://developer.polkadot.com/reference/parachains/consensus/#introduction", "page_title": "Parachain Consensus", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 26, "end_char": 939, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a1651fcd309a36276974f620ffddfb2baa729b222f757e040eca1a31161ad5f8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nParachains are independent blockchains built with the Polkadot SDK, designed to leverage Polkadot’s relay chain for shared security and transaction finality. These specialized chains operate as part of Polkadot’s execution sharding model, where each parachain manages its own state and transactions while relying on the relay chain for validation and consensus.\n\nAt the core of parachain functionality are collators, specialized nodes that sequence transactions into blocks and maintain the parachain’s state. Collators optimize Polkadot’s architecture by offloading state management from the relay chain, allowing relay chain validators to focus solely on validating parachain blocks.\n\nThis guide explores how parachain consensus works, including the roles of collators and validators, and the steps involved in securing parachain blocks within Polkadot’s scalable and decentralized framework."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus", "url": "https://developer.polkadot.com/reference/parachains/consensus/#the-role-of-collators", "page_title": "Parachain Consensus", "index": 1, "depth": 2, "title": "The Role of Collators", "anchor": "the-role-of-collators", "start_char": 939, "end_char": 1561, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a1651fcd309a36276974f620ffddfb2baa729b222f757e040eca1a31161ad5f8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## The Role of Collators\n\nCollators are responsible for sequencing end-user transactions into blocks and maintaining the current state of their respective parachains. Their role is akin to Ethereum’s sequencers but optimized for Polkadot's architecture.\n\nKey responsibilities include:\n\n- **Transaction sequencing**: Organizing transactions into [Proof of Validity (PoV)](../../../wiki/general/glossary.md#proof-of-validity) blocks.\n- **State management**: Maintaining parachain states without burdening the relay chain validators.\n- **Consensus participation**: Sending PoV blocks to relay chain validators for approval."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus", "url": "https://developer.polkadot.com/reference/parachains/consensus/#consensus-and-validation", "page_title": "Parachain Consensus", "index": 2, "depth": 2, "title": "Consensus and Validation", "anchor": "consensus-and-validation", "start_char": 1561, "end_char": 2460, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a1651fcd309a36276974f620ffddfb2baa729b222f757e040eca1a31161ad5f8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus and Validation\n\nParachain consensus operates in tandem with the relay chain, leveraging Nominated Proof of Stake (NPoS) for shared security. The process ensures parachain transactions achieve finality through the following steps:\n\n1. **Packaging transactions**: Collators bundle transactions into PoV blocks (parablocks).\n2. **Submission to validator**: Parablocks are submitted to a randomly selected subset of relay chain validators, known as paravalidators.\n3. **Validation of PoV Blocks**: Paravalidators use the parachain’s state transition function (already available on the relay chain) to verify transaction validity.\n4. **Backing and inclusion**: If a sufficient number of positive validations are received, the parablock is backed and included via a para-header on the relay chain.\n\nThe following sections describe the actions taking place during each stage of the process."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus", "url": "https://developer.polkadot.com/reference/parachains/consensus/#path-of-a-parachain-block", "page_title": "Parachain Consensus", "index": 3, "depth": 3, "title": "Path of a Parachain Block", "anchor": "path-of-a-parachain-block", "start_char": 2460, "end_char": 5889, "estimated_token_count": 606, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a1651fcd309a36276974f620ffddfb2baa729b222f757e040eca1a31161ad5f8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Path of a Parachain Block\n\nPolkadot achieves scalability through execution sharding, where each parachain operates as an independent shard with its own blockchain and state. Shared security for all parachains is provided by the relay chain, powered by Nominated Proof of Stake (NPoS). This framework allows parachains to focus on transaction processing and state management, while the relay chain ensures validation and finality.\n\nThe journey of parachain transactions to reach consensus and finality can be described as follows:\n\n- Collators and parablocks:\n\n    - Collators, specialized nodes on parachains, package transactions into Proof of Validity (PoV) blocks, also called parablocks.\n    - These parablocks are sent to a subset of relay chain validators, known as paravalidators, for validation.\n    - The parachain's state transition function (Wasm blob) is not re-sent, as it is already stored on the relay chain.\n\n```mermaid\nflowchart TB\n    %% Subgraph: Parachain\n    subgraph Parachain\n        direction LR\n        Txs[Network Transactions]\n        Collator[Collator Node]\n        ParaBlock[ParaBlock + PoV]\n        Txs -->|Package Transactions| Collator\n        Collator -->|Create| ParaBlock\n    end\n\n    subgraph Relay[\"Relay Chain\"]\n        ParaValidator\n    end\n\n    %% Main Flow\n    Parachain -->|Submit To| Relay\n```\n\n- Validation by paravalidators:\n\n    - Paravalidators are groups of approximately five relay chain validators, randomly assigned to parachains and shuffled every minute.\n    - Each paravalidator downloads the parachain's Wasm blob and validates the parablock by ensuring all transactions comply with the parachain’s state transition rules.\n    - Paravalidators sign positive or negative validation statements based on the block’s validity.\n\n- Backing and approval:\n\n    - If a parablock receives sufficient positive validation statements, it is backed and included on the relay chain as a para-header.\n    - An additional approval process resolves disputes. If a parablock contains invalid transactions, additional validators are tasked with verification.\n    - Validators who back invalid parablocks are penalized through slashing, creating strong incentives for honest behavior.\n\n```mermaid\nflowchart\n    subgraph RelayChain[\"Relay Chain\"]\n        direction TB\n        subgraph InitialValidation[\"Initial Validation\"]\n            direction LR\n            PValidators[ParaValidators]\n            Backing[Backing<br>Process]\n            Header[Submit Para-header<br>on Relay Chain]\n        end\n        subgraph Secondary[\"Secondary Validation\"]\n            Approval[Approval<br>Process]\n            Dispute[Dispute<br>Resolution]\n            Slashing[Slashing<br>Mechanism]\n        end\n        \n    end\n\n\n    %% Validation Process\n    PValidators -->|Download<br>Wasm<br>Validate Block| Backing\n    Backing -->|If Valid<br>Signatures| Header\n    InitialValidation -->|Additional<br>Verification| Secondary\n    \n    %% Dispute Flow\n    Approval -->|If Invalid<br>Detected| Dispute\n    Dispute -->|Penalize<br>Dishonest<br>Validators| Slashing\n```\n\nIt is important to understand that relay chain blocks do not store full parachain blocks (parablocks). Instead, they include para-headers, which serve as summaries of the backed parablocks. The complete parablock remains within the parachain network, maintaining its autonomy while relying on the relay chain for validation and finality."}
{"source": "polkadot-docs", "page_id": "reference-parachains-consensus", "url": "https://developer.polkadot.com/reference/parachains/consensus/#where-to-go-next", "page_title": "Parachain Consensus", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5889, "end_char": 6722, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a1651fcd309a36276974f620ffddfb2baa729b222f757e040eca1a31161ad5f8", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Where to Go Next\n\nExplore more about Parachain consensus through these resources:\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> __Elastic Scaling__\n\n    ---\n\n    Learn more about how Elastic Scaling boosts parachain performance.\n\n    [:octicons-arrow-right-24: Elastic Scaling](/reference/parachains/consensus/elastic-scaling/)\n\n-   <span class=\"badge learn\">Learn</span> __Asynchronous Backing__\n\n    ---\n\n    Read about pipelining parachain block production via Async Backing.\n\n    [:octicons-arrow-right-24: Asynchronous Backing](/reference/parachains/consensus/async-backing/)\n\n\n\n-   <span class=\"badge external\">Learn</span> __Parachain Wiki__\n\n    ---\n\n    Explore more on Parachains in the Wiki.\n\n    [:octicons-arrow-right-24: Parachains](../../../wiki/learn/learn-parachains.md)\n\n\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#introduction", "page_title": "Cryptography", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 526, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nCryptography forms the backbone of blockchain technology, providing the mathematical verifiability crucial for consensus systems, data integrity, and user security. While a deep understanding of the underlying mathematical processes isn't necessary for most blockchain developers, grasping the fundamental applications of cryptography is essential. This page comprehensively overviews cryptographic implementations used across Polkadot SDK-based chains and the broader blockchain ecosystem."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#hash-functions", "page_title": "Cryptography", "index": 1, "depth": 2, "title": "Hash Functions", "anchor": "hash-functions", "start_char": 526, "end_char": 1155, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Hash Functions\n\nHash functions are fundamental to blockchain technology, creating a unique digital fingerprint for any piece of data, including simple text, images, or any other form of file. They map input data of any size to a fixed-size output (typically 32 bytes) using complex mathematical operations. Hashing is used to verify data integrity, create digital signatures, and provide a secure way to store passwords. This form of mapping is known as the [\"pigeonhole principle,\"](https://en.wikipedia.org/wiki/Pigeonhole_principle) it is primarily implemented to efficiently and verifiably identify data from large sets."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#key-properties-of-hash-functions", "page_title": "Cryptography", "index": 2, "depth": 3, "title": "Key Properties of Hash Functions", "anchor": "key-properties-of-hash-functions", "start_char": 1155, "end_char": 1689, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Key Properties of Hash Functions\n\n- **Deterministic**: The same input always produces the same output.\n- **Quick computation**: It's easy to calculate the hash value for any given input.\n- **Pre-image resistance**: It's infeasible to generate the input data from its hash.\n- **Small changes in input yield large changes in output**: Known as the [\"avalanche effect\"](https://en.wikipedia.org/wiki/Avalanche_effect).\n- **Collision resistance**: The probabilities are extremely low to find two different inputs with the same hash."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#blake2", "page_title": "Cryptography", "index": 3, "depth": 3, "title": "Blake2", "anchor": "blake2", "start_char": 1689, "end_char": 2194, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Blake2\n\nThe Polkadot SDK utilizes Blake2, a state-of-the-art hashing method that offers:\n\n- Equal or greater security compared to [SHA-2](https://en.wikipedia.org/wiki/SHA-2).\n- Significantly faster performance than other algorithms.\n\nThese properties make Blake2 ideal for blockchain systems, reducing sync times for new nodes and lowering the resources required for validation. For detailed technical specifications about Blake2, see the [official Blake2 paper](https://www.blake2.net/blake2.pdf)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#types-of-cryptography", "page_title": "Cryptography", "index": 4, "depth": 2, "title": "Types of Cryptography", "anchor": "types-of-cryptography", "start_char": 2194, "end_char": 2349, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Types of Cryptography\n\nThere are two different ways that cryptographic algorithms are implemented: symmetric cryptography and asymmetric cryptography."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#symmetric-cryptography", "page_title": "Cryptography", "index": 5, "depth": 3, "title": "Symmetric Cryptography", "anchor": "symmetric-cryptography", "start_char": 2349, "end_char": 3138, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Symmetric Cryptography\n\nSymmetric encryption is a branch of cryptography that isn't based on one-way functions, unlike asymmetric cryptography. It uses the same cryptographic key to encrypt plain text and decrypt the resulting ciphertext.\n\nSymmetric cryptography is a type of encryption that has been used throughout history, such as the Enigma Cipher and the Caesar Cipher. It is still widely used today and can be found in Web2 and Web3 applications alike. There is only one single key, and a recipient must also have access to it to access the contained information.\n\n#### Advantages \n\n- Fast and efficient for large amounts of data.\n- Requires less computational power.\n\n#### Disadvantages \n\n- Key distribution can be challenging.\n- Scalability issues in systems with many users."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#asymmetric-cryptography", "page_title": "Cryptography", "index": 6, "depth": 3, "title": "Asymmetric Cryptography", "anchor": "asymmetric-cryptography", "start_char": 3138, "end_char": 4046, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Asymmetric Cryptography\n\nAsymmetric encryption is a type of cryptography that uses two different keys, known as a keypair: a public key, used to encrypt plain text, and a private counterpart, used to decrypt the ciphertext.\n\nThe public key encrypts a fixed-length message that can only be decrypted with the recipient's private key and, sometimes, a set password. The public key can be used to cryptographically verify that the corresponding private key was used to create a piece of data without compromising the private key, such as with digital signatures. This has obvious implications for identity, ownership, and properties and is used in many different protocols across Web2 and Web3.\n\n#### Advantages \n\n- Solves the key distribution problem.\n- Enables digital signatures and secure key exchange.\n\n#### Disadvantages \n\n- Slower than symmetric encryption.\n- Requires more computational resources."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#trade-offs-and-compromises", "page_title": "Cryptography", "index": 7, "depth": 3, "title": "Trade-offs and Compromises", "anchor": "trade-offs-and-compromises", "start_char": 4046, "end_char": 4839, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Trade-offs and Compromises\n\nSymmetric cryptography is faster and requires fewer bits in the key to achieve the same level of security that asymmetric cryptography provides. However, it requires a shared secret before communication can occur, which poses issues to its integrity and a potential compromise point. On the other hand, asymmetric cryptography doesn't require the secret to be shared ahead of time, allowing for far better end-user security.\n\nHybrid symmetric and asymmetric cryptography is often used to overcome the engineering issues of asymmetric cryptography, as it is slower and requires more bits in the key to achieve the same level of security. It encrypts a key and then uses the comparatively lightweight symmetric cipher to do the \"heavy lifting\" with the message."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#digital-signatures", "page_title": "Cryptography", "index": 8, "depth": 2, "title": "Digital Signatures", "anchor": "digital-signatures", "start_char": 4839, "end_char": 6212, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Digital Signatures\n\nDigital signatures are a way of verifying the authenticity of a document or message using asymmetric keypairs. They are used to ensure that a sender or signer's document or message hasn't been tampered with in transit, and for recipients to verify that the data is accurate and from the expected sender.\n\nSigning digital signatures only requires a low-level understanding of mathematics and cryptography. For a conceptual example -- when signing a check, it is expected that it cannot be cashed multiple times. This isn't a feature of the signature system but rather the check serialization system. The bank will check that the serial number on the check hasn't already been used. Digital signatures essentially combine these two concepts, allowing the signature to provide the serialization via a unique cryptographic fingerprint that cannot be reproduced.\n\nUnlike pen-and-paper signatures, knowledge of a digital signature cannot be used to create other signatures. Digital signatures are often used in bureaucratic processes, as they are more secure than simply scanning in a signature and pasting it onto a document.\n\nPolkadot SDK provides multiple different cryptographic schemes and is generic so that it can support anything that implements the [`Pair` trait](https://paritytech.github.io/polkadot-sdk/master/sp_core/crypto/trait.Pair.html)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#example-of-creating-a-digital-signature", "page_title": "Cryptography", "index": 9, "depth": 3, "title": "Example of Creating a Digital Signature", "anchor": "example-of-creating-a-digital-signature", "start_char": 6212, "end_char": 6786, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Example of Creating a Digital Signature\n\nThe process of creating and verifying a digital signature involves several steps:\n\n1. The sender creates a hash of the message.\n2. The hash is encrypted using the sender's private key, creating the signature.\n3. The message and signature are sent to the recipient.\n4. The recipient decrypts the signature using the sender's public key.\n5. The recipient hashes the received message and compares it to the decrypted hash.\n\nIf the hashes match, the signature is valid, confirming the message's integrity and the sender's identity."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#elliptic-curve", "page_title": "Cryptography", "index": 10, "depth": 2, "title": "Elliptic Curve", "anchor": "elliptic-curve", "start_char": 6786, "end_char": 7662, "estimated_token_count": 164, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Elliptic Curve\n\nBlockchain technology requires the ability to have multiple keys creating a signature for block proposal and validation. To this end, Elliptic Curve Digital Signature Algorithm (ECDSA) and Schnorr signatures are two of the most commonly used methods. While ECDSA is a far simpler implementation, Schnorr signatures are more efficient when it comes to multi-signatures.\n\nSchnorr signatures bring some noticeable features over the ECDSA/EdDSA schemes:\n\n- It is better for hierarchical deterministic key derivations.\n- It allows for native multi-signature through [signature aggregation](https://bitcoincore.org/en/2017/03/23/schnorr-signature-aggregation/).\n- It is generally more resistant to misuse.\n\nOne sacrifice that is made when using Schnorr signatures over ECDSA is that both require 64 bytes, but only ECDSA signatures communicate their public key."}
{"source": "polkadot-docs", "page_id": "reference-parachains-cryptography", "url": "https://developer.polkadot.com/reference/parachains/cryptography/#various-implementations", "page_title": "Cryptography", "index": 11, "depth": 3, "title": "Various Implementations", "anchor": "various-implementations", "start_char": 7662, "end_char": 8552, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4889d24d3bebed54dfe602b2e033380a8a1e869238f41da84ba464e324bb9e09", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Various Implementations\n\n- **[ECDSA](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm)**: Polkadot SDK provides an ECDSA signature scheme using the [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) curve. This is the same cryptographic algorithm used to secure [Bitcoin](https://en.wikipedia.org/wiki/Bitcoin) and [Ethereum](https://en.wikipedia.org/wiki/Ethereum).\n\n- **[Ed25519](https://en.wikipedia.org/wiki/EdDSA#Ed25519)**: An EdDSA signature scheme using [Curve25519](https://en.wikipedia.org/wiki/Curve25519). It is carefully engineered at several levels of design and implementation to achieve very high speeds without compromising security.\n\n- **[SR25519](../../wiki/learn/learn-cryptography.md#what-is-sr25519-and-where-did-it-come-from)**: Based on the same underlying curve as Ed25519. However, it uses Schnorr signatures instead of the EdDSA scheme."}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#introduction", "page_title": "Data Encoding", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 1472, "estimated_token_count": 295, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Polkadot SDK uses a lightweight and efficient encoding/decoding mechanism to optimize data transmission across the network. This mechanism, known as the _SCALE_ codec, is used for serializing and deserializing data.\n\nThe SCALE codec enables communication between the runtime and the outer node. This mechanism is designed for high-performance, copy-free data encoding and decoding in resource-constrained environments like the Polkadot SDK Wasm runtime.\n\nIt is not self-describing, meaning the decoding context must fully know the encoded data types. \n\nParity's libraries utilize the [`parity-scale-codec`](https://github.com/paritytech/parity-scale-codec) crate (a Rust implementation of the SCALE codec) to handle encoding and decoding for interactions between RPCs and the runtime.\n\nThe `codec` mechanism is ideal for Polkadot SDK-based chains because:\n\n- It is lightweight compared to generic serialization frameworks like [`serde`](https://serde.rs/), which add unnecessary bulk to binaries.\n- It doesn’t rely on Rust’s `libstd`, making it compatible with `no_std` environments like Wasm runtime.\n- It integrates seamlessly with Rust, allowing easy derivation of encoding and decoding logic for new types using `#[derive(Encode, Decode)]`.\n\nDefining a custom encoding scheme in the Polkadot SDK-based chains, rather than using an existing Rust codec library, is crucial for enabling cross-platform and multi-language support."}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#scale-codec", "page_title": "Data Encoding", "index": 1, "depth": 2, "title": "SCALE Codec", "anchor": "scale-codec", "start_char": 1472, "end_char": 1675, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## SCALE Codec\n\nThe codec is implemented using the following traits:\n\n- [`Encode`](#encode)\n- [`Decode`](#decode)\n- [`CompactAs`](#compactas)\n- [`HasCompact`](#hascompact)\n- [`EncodeLike`](#encodelike)"}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#encode", "page_title": "Data Encoding", "index": 2, "depth": 3, "title": "Encode", "anchor": "encode", "start_char": 1675, "end_char": 2736, "estimated_token_count": 285, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Encode\n\nThe [`Encode`](https://docs.rs/parity-scale-codec/latest/parity_scale_codec/trait.Encode.html) trait handles data encoding into SCALE format and includes the following key functions:\n\n- **`size_hint(&self) -> usize`**: Estimates the number of bytes required for encoding to prevent multiple memory allocations. This should be inexpensive and avoid complex operations. Optional if the size isn’t known.\n- **`encode_to<T: Output>(&self, dest: &mut T)`**: Encodes the data, appending it to a destination buffer.\n- **`encode(&self) -> Vec<u8>`**: Encodes the data and returns it as a byte vector.\n- **`using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R`**: Encodes the data and passes it to a closure, returning the result.\n- **`encoded_size(&self) -> usize`**: Calculates the encoded size. Should be used when the encoded data isn’t required.\n\n!!!tip\n    For best performance, value types should override `using_encoded`, and allocating types should override `encode_to`. It's recommended to implement `size_hint` for all types where possible."}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#decode", "page_title": "Data Encoding", "index": 3, "depth": 3, "title": "Decode", "anchor": "decode", "start_char": 2736, "end_char": 3061, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Decode\n\nThe [`Decode`](https://docs.rs/parity-scale-codec/latest/parity_scale_codec/trait.Decode.html) trait handles decoding SCALE-encoded data back into the appropriate types:\n\n- **`fn decode<I: Input>(value: &mut I) -> Result<Self, Error>`**: Decodes data from the SCALE format, returning an error if decoding fails."}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#compactas", "page_title": "Data Encoding", "index": 4, "depth": 3, "title": "CompactAs", "anchor": "compactas", "start_char": 3061, "end_char": 3395, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### CompactAs\n\nThe [`CompactAs`](https://docs.rs/parity-scale-codec/latest/parity_scale_codec/trait.CompactAs.html) trait wraps custom types for compact encoding:\n\n- **`encode_as(&self) -> &Self::As`**: Encodes the type as a compact type.\n- **`decode_from(_: Self::As) -> Result<Self, Error>`**: decodes from a compact encoded type."}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#hascompact", "page_title": "Data Encoding", "index": 5, "depth": 3, "title": "HasCompact", "anchor": "hascompact", "start_char": 3395, "end_char": 3565, "estimated_token_count": 43, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### HasCompact\n\nThe [`HasCompact`](https://docs.rs/parity-scale-codec/latest/parity_scale_codec/trait.HasCompact.html) trait indicates a type supports compact encoding."}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#encodelike", "page_title": "Data Encoding", "index": 6, "depth": 3, "title": "EncodeLike", "anchor": "encodelike", "start_char": 3565, "end_char": 3835, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### EncodeLike\n\nThe [`EncodeLike`](https://docs.rs/parity-scale-codec/latest/parity_scale_codec/trait.EncodeLike.html) trait is used to ensure multiple types that encode similarly are accepted by the same function. When using `derive`, it is automatically implemented."}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#data-types", "page_title": "Data Encoding", "index": 7, "depth": 3, "title": "Data Types", "anchor": "data-types", "start_char": 3835, "end_char": 10850, "estimated_token_count": 1201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Data Types\n\nThe table below outlines how the Rust implementation of the Parity SCALE codec encodes different data types.\n\n| Type                          | Description                                                                                                                                                                                                                                                                                                                | Example SCALE Decoded Value                                                                                                                        | SCALE Encoded Value                                                     |\n|-------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|\n| Boolean                       | Boolean values are encoded using the least significant bit of a single byte.                                                                                                                                                                                                                                               | `false` / `true`                                                                                                                                   | `0x00` / `0x01`                                                         |\n| Compact/general integers      | A \"compact\" or general integer encoding is sufficient for encoding large integers (up to 2^536) and is more efficient at encoding most values than the fixed-width version.                                                                                                                                                | `unsigned integer 0` / `unsigned integer 1` / `unsigned integer 42` / `unsigned integer 69` / `unsigned integer 65535` / `BigInt(100000000000000)` | `0x00` / `0x04` / `0xa8` / `0x1501` / `0xfeff0300` / `0x0b00407a10f35a` |\n| Enumerations (tagged-unions)  | A fixed number of variants, each mutually exclusive and potentially implying a further value or series of values. Encoded as the first byte identifying the index of the variant that the value is. Any further bytes are used to encode any data that the variant implies. Thus, no more than 256 variants are supported. | `Int(42)` and `Bool(true)` where `enum IntOrBool { Int(u8), Bool(bool) }`                                                                          | `0x002a` and `0x0101`                                                   |\n| Fixed-width integers          | Basic integers are encoded using a fixed-width little-endian (LE) format.                                                                                                                                                                                                                                                  | `signed 8-bit integer 69` / `unsigned 16-bit integer 42` / `unsigned 32-bit integer 16777215`                                                      | `0x45` / `0x2a00` / `0xffffff00`                                        |\n| Options                       | One or zero values of a particular type.                                                                                                                                                                                                                                                                                   | `Some` / `None`                                                                                                                                    | `0x01` followed by the encoded value / `0x00`                           |\n| Results                       | Results are commonly used enumerations which indicate whether certain operations were successful or unsuccessful.                                                                                                                                                                                                          | `Ok(42)` / `Err(false)`                                                                                                                            | `0x002a` / `0x0100`                                                     |\n| Strings                       | Strings are Vectors of bytes (Vec<u8>) containing a valid UTF8 sequence.                                                                                                                                                                                                                                                   |                                                                                                                                                    |                                                                         |\n| Structs                       | For structures, the values are named, but that is irrelevant for the encoding (names are ignored - only order matters).                                                                                                                                                                                                    | `SortedVecAsc::from([3, 5, 2, 8])`                                                                                                                 | `[3, 2, 5, 8] `                                                         |\n| Tuples                        | A fixed-size series of values, each with a possibly different but predetermined and fixed type. This is simply the concatenation of each encoded value.                                                                                                                                                                    | Tuple of compact unsigned integer and boolean: `(3, false)`                                                                                        | `0x0c00`                                                                |\n| Vectors (lists, series, sets) | A collection of same-typed values is encoded, prefixed with a compact encoding of the number of items, followed by each item's encoding concatenated in turn.                                                                                                                                                              | Vector of unsigned `16`-bit integers: `[4, 8, 15, 16, 23, 42]`                                                                                     | `0x18040008000f00100017002a00`                                          |"}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#encode-and-decode-rust-trait-implementations", "page_title": "Data Encoding", "index": 8, "depth": 2, "title": "Encode and Decode Rust Trait Implementations", "anchor": "encode-and-decode-rust-trait-implementations", "start_char": 10850, "end_char": 11902, "estimated_token_count": 444, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Encode and Decode Rust Trait Implementations\n\nHere's how the `Encode` and `Decode` traits are implemented:\n\n\n```rust\nuse parity_scale_codec::{Encode, Decode};\n\n[derive(Debug, PartialEq, Encode, Decode)]\nenum EnumType {\n    #[codec(index = 15)]\n    A,\n    B(u32, u64),\n    C {\n        a: u32,\n        b: u64,\n    },\n}\n\nlet a = EnumType::A;\nlet b = EnumType::B(1, 2);\nlet c = EnumType::C { a: 1, b: 2 };\n\na.using_encoded(|ref slice| {\n    assert_eq!(slice, &b\"\\x0f\");\n});\n\nb.using_encoded(|ref slice| {\n    assert_eq!(slice, &b\"\\x01\\x01\\0\\0\\0\\x02\\0\\0\\0\\0\\0\\0\\0\");\n});\n\nc.using_encoded(|ref slice| {\n    assert_eq!(slice, &b\"\\x02\\x01\\0\\0\\0\\x02\\0\\0\\0\\0\\0\\0\\0\");\n});\n\nlet mut da: &[u8] = b\"\\x0f\";\nassert_eq!(EnumType::decode(&mut da).ok(), Some(a));\n\nlet mut db: &[u8] = b\"\\x01\\x01\\0\\0\\0\\x02\\0\\0\\0\\0\\0\\0\\0\";\nassert_eq!(EnumType::decode(&mut db).ok(), Some(b));\n\nlet mut dc: &[u8] = b\"\\x02\\x01\\0\\0\\0\\x02\\0\\0\\0\\0\\0\\0\\0\";\nassert_eq!(EnumType::decode(&mut dc).ok(), Some(c));\n\nlet mut dz: &[u8] = &[0];\nassert_eq!(EnumType::decode(&mut dz).ok(), None);\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains-data-encoding", "url": "https://developer.polkadot.com/reference/parachains/data-encoding/#scale-codec-libraries", "page_title": "Data Encoding", "index": 9, "depth": 2, "title": "SCALE Codec Libraries", "anchor": "scale-codec-libraries", "start_char": 11902, "end_char": 13324, "estimated_token_count": 514, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1857f5c45733f39d3eacbec3b9fdddc5f5c17c4561be8fb6c7ce3be3ec528cf0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## SCALE Codec Libraries\n\nSeveral SCALE codec implementations are available in various languages. Here's a list of them:\n\n- **AssemblyScript**: [`LimeChain/as-scale-codec`](https://github.com/LimeChain/as-scale-codec)\n- **C**: [`MatthewDarnell/cScale`](https://github.com/MatthewDarnell/cScale)\n- **C++**: [`qdrvm/scale-codec-cpp`](https://github.com/qdrvm/scale-codec-cpp)\n- **JavaScript**: [`polkadot-js/api`](https://github.com/polkadot-js/api)\n- **Dart**: [`leonardocustodio/polkadart`](https://github.com/leonardocustodio/polkadart)\n- **Haskell**: [`airalab/hs-web3`](https://github.com/airalab/hs-web3/tree/master/packages/scale)\n- **Golang**: [`itering/scale.go`](https://github.com/itering/scale.go)\n- **Java**: [`splix/polkaj`](https://github.com/splix/polkaj)\n- **Python**: [`polkascan/py-scale-codec`](https://github.com/polkascan/py-scale-codec)\n- **Ruby**: [` wuminzhe/scale_rb`](https://github.com/wuminzhe/scale_rb)\n- **TypeScript**: [`parity-scale-codec-ts`](https://github.com/tjjfvi/subshape), [`scale-ts`](https://github.com/unstoppablejs/unstoppablejs/tree/main/packages/scale-ts#scale-ts), [`soramitsu/scale-codec-js-library`](https://github.com/soramitsu/scale-codec-js-library), [`subsquid/scale-codec`](https://github.com/subsquid/squid-sdk/tree/master/substrate/scale-codec)\n- **Solidity**: [`LucasGrasso/solidity-scale-codec`](https://github.com/LucasGrasso/solidity-scale-codec) _(not audited)_"}
{"source": "polkadot-docs", "page_id": "reference-parachains", "url": "https://developer.polkadot.com/reference/parachains/#introduction", "page_title": "Parachains Overview", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 24, "end_char": 1323, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:260d7cf5621fd5e58271c2645645b677498dbb22e08c74c58389ac0ff8844ec5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA Parachain is a specialized blockchain that connects to the Polkadot relay chain, benefiting from shared security, interoperability, and scalability. Parachains are built using the [Polkadot SDK](https://github.com/paritytech/polkadot-sdk), a powerful toolkit written in Rust that provides everything needed to create custom blockchain logic while integrating seamlessly with the Polkadot network.\n\nUnlike standalone blockchains that must bootstrap their own validator sets and security, parachains leverage Polkadot's pooled security model. This allows parachain developers to focus on their application-specific functionality rather than consensus and security infrastructure. Parachains can communicate with each other through Cross-Consensus Messaging (XCM), enabling seamless interoperability across the Polkadot ecosystem.\n\nKey capabilities that parachains provide include:\n\n- **Shared security**: Inherit security from Polkadot's validator set without maintaining your own.\n- **Interoperability**: Communicate trustlessly with other parachains via XCM.\n- **Scalability**: Process transactions in parallel with other parachains.\n- **Customization**: Build application-specific logic tailored to your use case.\n- **Upgradeability**: Upgrade runtime logic without hard forks."}
{"source": "polkadot-docs", "page_id": "reference-parachains", "url": "https://developer.polkadot.com/reference/parachains/#polkadot-sdk-parachain-architecture", "page_title": "Parachains Overview", "index": 1, "depth": 2, "title": "Polkadot SDK: Parachain Architecture", "anchor": "polkadot-sdk-parachain-architecture", "start_char": 1323, "end_char": 2481, "estimated_token_count": 278, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:260d7cf5621fd5e58271c2645645b677498dbb22e08c74c58389ac0ff8844ec5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot SDK: Parachain Architecture\n\nBuilding a parachain involves understanding and utilizing several key components of the Polkadot SDK:\n\n![](/images/reference/parachains/index/overview-01.webp)\n\n- **[Substrate](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/substrate/index.html)**: The foundation providing core blockchain primitives and libraries.\n- **[FRAME](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/frame_runtime/index.html)**: A modular framework for building your parachain's runtime logic.\n- **[Cumulus](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/cumulus/index.html)**: Essential libraries and pallets that enable parachain functionality.\n- **[XCM (Cross Consensus Messaging)](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/xcm/index.html)**: The messaging format for communicating with other parachains and the relay chain.\n- **[Polkadot](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/polkadot/index.html)**: The relay chain that provides security and coordination."}
{"source": "polkadot-docs", "page_id": "reference-parachains", "url": "https://developer.polkadot.com/reference/parachains/#substrate-the-foundation", "page_title": "Parachains Overview", "index": 2, "depth": 3, "title": "Substrate: The Foundation", "anchor": "substrate-the-foundation", "start_char": 2481, "end_char": 4222, "estimated_token_count": 339, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:260d7cf5621fd5e58271c2645645b677498dbb22e08c74c58389ac0ff8844ec5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Substrate: The Foundation\n\nSubstrate provides the core infrastructure that every parachain is built upon. It handles the low-level blockchain functionality, allowing you to focus on your application's unique features. Substrate includes implementations for networking, database management, consensus participation, and the execution environment for your runtime.\n\nEvery Polkadot SDK node consists of two main components:\n\n- **Client (Host)**: Handles infrastructure services.\n\n    - Native binary that runs on validator and collator nodes.\n    - Executes the Wasm-compiled runtime.\n    - Manages networking, database, mempool, and block production.\n    - Interfaces with the relay chain for validation.\n\n- **Runtime (State Transition Function)**: Contains your business logic.\n\n    - Defines how your Polkadot SDK node processes transactions.\n    - Compiled to [Wasm](https://webassembly.org/) for deterministic execution.\n    - Stored on-chain and upgradeable via governance.\n\n```mermaid\n%%{init: {'flowchart': {'padding': 5, 'nodeSpacing': 50, 'rankSpacing': 10}}}%%\ngraph TB\n    classDef title font-size:20px,font-weight:bold,stroke-width:0px\n    classDef clientStyle font-size:16px,font-weight:bold\n    classDef clientSubNodeStyle margin-top:10px\n    classDef runtimeCallExecutorStyle padding-top:10px\n\n    subgraph sg1[Parachain<br /> Node]\n        direction TB\n\n        I[RuntimeCall Executor]\n        B[Wasm Runtime - STF]\n\n        subgraph sg2[Client]\n            direction TB\n            C[Network and Blockchain<br/>Infrastructure Services<br/>+ Relay Chain Interface]\n        end\n\n        I --> B\n    end\n\n    class sg1 title\n    class sg2 clientStyle\n    class C clientSubNodeStyle\n    class I runtimeCallExecutorStyle\n\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains", "url": "https://developer.polkadot.com/reference/parachains/#frame-building-blocks-for-your-runtime", "page_title": "Parachains Overview", "index": 3, "depth": 3, "title": "FRAME: Building Blocks for Your Runtime", "anchor": "frame-building-blocks-for-your-runtime", "start_char": 4222, "end_char": 6110, "estimated_token_count": 395, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:260d7cf5621fd5e58271c2645645b677498dbb22e08c74c58389ac0ff8844ec5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### FRAME: Building Blocks for Your Runtime\n\nFRAME provides a modular component called a Pallet that you can configure and combine to build your parachain's runtime. Each pallet provides specific functionality that you can customize for your needs. This modular approach allows you to quickly assemble complex functionality without writing everything from scratch.\n\n```mermaid\ngraph LR\n    subgraph SP[\"<b style='font-size:18px;'>Parachain Runtime</b>\"]\n        direction LR\n        Timestamp ~~~ Aura ~~~ ParachainSystem\n        Balances ~~~ TransactionPayment ~~~ Sudo\n        subgraph Timestamp[\"Timestamp\"]\n            SS1[Custom Config]\n        end\n        subgraph Aura[\"Aura\"]\n            SS2[Custom Config]\n        end\n        subgraph ParachainSystem[\"Parachain System\"]\n            SS3[Custom Config]\n        end\n        subgraph Balances[\"Balances\"]\n            SS4[Custom Config]\n        end\n        subgraph TransactionPayment[\"Transaction Payment\"]\n            SS5[Custom Config]\n        end\n        subgraph Sudo[\"Sudo\"]\n            SS6[Custom Config]\n        end\n        style Timestamp stroke:#FF69B4\n        style Aura stroke:#FF69B4\n        style ParachainSystem stroke:#FF69B4\n        style Balances stroke:#FF69B4\n        style TransactionPayment stroke:#FF69B4\n        style Sudo stroke:#FF69B4\n        style SS1 stroke-dasharray: 5\n        style SS2 stroke-dasharray: 5\n        style SS3 stroke-dasharray: 5\n        style SS4 stroke-dasharray: 5\n        style SS5 stroke-dasharray: 5\n        style SS6 stroke-dasharray: 5\n\n    end\n    subgraph AP[\"<b style='font-size:18px;'>Available FRAME Pallets</b>\"]\n        direction LR\n        A1[Aura]~~~A2[Parachain<br>System]~~~A3[Transaction<br>Payment]~~~A4[Sudo]\n        B1[Identity]~~~B2[Balances]~~~B3[Assets]~~~B4[EVM]\n        C1[Timestamp]~~~C2[Staking]~~~C3[Contracts]~~~C4[and more...]\n    end\n    AP --> SP\n```"}
{"source": "polkadot-docs", "page_id": "reference-parachains", "url": "https://developer.polkadot.com/reference/parachains/#cumulus-parachain-specific-functionality", "page_title": "Parachains Overview", "index": 4, "depth": 3, "title": "Cumulus: Parachain-Specific Functionality", "anchor": "cumulus-parachain-specific-functionality", "start_char": 6110, "end_char": 6815, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:260d7cf5621fd5e58271c2645645b677498dbb22e08c74c58389ac0ff8844ec5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cumulus: Parachain-Specific Functionality\n\nCumulus is what transforms a Polkadot SDK-based runtime into a parachain-capable runtime. It provides the essential components for communicating with the relay chain, participating in Polkadot's consensus, and handling parachain-specific operations like block validation and collation.\n\nKey Cumulus components include:\n\n- **Parachain system pallet**: Core parachain functionality and relay chain communication.\n- **Collator consensus**: Block production logic for parachain collators.\n- **Relay chain interface**: APIs for interacting with the Polkadot relay chain.\n- **Validation data**: Handling proof-of-validity data required by relay chain validators."}
{"source": "polkadot-docs", "page_id": "reference-parachains", "url": "https://developer.polkadot.com/reference/parachains/#where-to-go-next", "page_title": "Parachains Overview", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6815, "end_char": 8339, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:260d7cf5621fd5e58271c2645645b677498dbb22e08c74c58389ac0ff8844ec5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nBuilding a parachain requires understanding the relationship between your chain and the Polkadot relay chain. The Polkadot SDK provides all the tools needed to design custom runtime logic, enable cross-chain communication, and deploy your parachain to production.\n\nThe following sections provide detailed guidance on each aspect of parachain development, from initial design through deployment and ongoing maintenance.\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Launch a Simple Parachain__\n\n    ---\n\n    Walk through the complete parachain launch flow: from setup and deployment to obtaining coretime.\n\n    [:octicons-arrow-right-24: Deploy](/parachains/launch-a-parachain/set-up-the-parachain-template/)\n\n\n-   <span class=\"badge guide\">Guide</span> __Customize Your Runtime__\n\n    ---\n\n    Design your parachain's runtime logic and choose appropriate pallets for your use case.\n\n    [:octicons-arrow-right-24: Get Started](/parachains/customize-runtime/)\n\n-   <span class=\"badge guide\">Guide</span> __Interoperability__\n\n    ---\n\n    Implement XCM for trustless cross-chain communication with other parachains.\n\n    [:octicons-arrow-right-24: Learn More](/parachains/interoperability/get-started/)\n\n-   <span class=\"badge guide\">Guide</span> __Runtime Upgrades__\n\n    ---\n\n    Upgrade your parachain's runtime without hard forks using forkless upgrade mechanisms.\n\n    [:octicons-arrow-right-24: Maintain](/parachains/runtime-maintenance/runtime-upgrades/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-parachains-interoperability", "url": "https://developer.polkadot.com/reference/parachains/interoperability/#introduction", "page_title": "Interoperability", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 608, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:938a00fca91ca2d3dfd4c28bc0cbf94a52928b2c57cfd4efad1d6c31dec47392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nInteroperability lies at the heart of the Polkadot ecosystem, enabling communication and collaboration across a diverse range of blockchains. By bridging the gaps between parachains, relay chains, and even external networks, Polkadot unlocks the potential for truly decentralized applications, efficient resource sharing, and scalable solutions.\n\nPolkadot’s design ensures that blockchains can transcend their individual limitations by working together as part of a unified system. This cooperative architecture is what sets Polkadot apart in the blockchain landscape."}
{"source": "polkadot-docs", "page_id": "reference-parachains-interoperability", "url": "https://developer.polkadot.com/reference/parachains/interoperability/#why-interoperability-matters", "page_title": "Interoperability", "index": 1, "depth": 2, "title": "Why Interoperability Matters", "anchor": "why-interoperability-matters", "start_char": 608, "end_char": 1642, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:938a00fca91ca2d3dfd4c28bc0cbf94a52928b2c57cfd4efad1d6c31dec47392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why Interoperability Matters\n\nThe blockchain ecosystem is inherently fragmented. Different blockchains excel in specialized domains such as finance, gaming, or supply chain management, but these chains function in isolation without interoperability. This lack of connectivity stifles the broader utility of blockchain technology.\n\nInteroperability solves this problem by enabling blockchains to:\n\n- **Collaborate across networks**: Chains can interact to share assets, functionality, and data, creating synergies that amplify their individual strengths.\n- **Achieve greater scalability**: Specialized chains can offload tasks to others, optimizing performance and resource utilization.\n- **Expand use-case potential**: Cross-chain applications can leverage features from multiple blockchains, unlocking novel user experiences and solutions.\n\nIn the Polkadot ecosystem, interoperability transforms a collection of isolated chains into a cohesive, efficient network, pushing the boundaries of what blockchains can achieve together."}
{"source": "polkadot-docs", "page_id": "reference-parachains-interoperability", "url": "https://developer.polkadot.com/reference/parachains/interoperability/#key-mechanisms-for-interoperability", "page_title": "Interoperability", "index": 2, "depth": 2, "title": "Key Mechanisms for Interoperability", "anchor": "key-mechanisms-for-interoperability", "start_char": 1642, "end_char": 1922, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:938a00fca91ca2d3dfd4c28bc0cbf94a52928b2c57cfd4efad1d6c31dec47392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Key Mechanisms for Interoperability\n\nAt the core of Polkadot's cross-chain collaboration are foundational technologies designed to break down barriers between networks. These mechanisms empower blockchains to communicate, share resources, and operate as a cohesive ecosystem."}
{"source": "polkadot-docs", "page_id": "reference-parachains-interoperability", "url": "https://developer.polkadot.com/reference/parachains/interoperability/#cross-consensus-messaging-xcm-the-backbone-of-communication", "page_title": "Interoperability", "index": 3, "depth": 3, "title": "Cross-Consensus Messaging (XCM): The Backbone of Communication", "anchor": "cross-consensus-messaging-xcm-the-backbone-of-communication", "start_char": 1922, "end_char": 2735, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:938a00fca91ca2d3dfd4c28bc0cbf94a52928b2c57cfd4efad1d6c31dec47392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cross-Consensus Messaging (XCM): The Backbone of Communication\n\nPolkadot's Cross-Consensus Messaging (XCM) is the standard framework for interaction between parachains, relay chains, and, eventually, external blockchains. XCM provides a trustless, secure messaging format for exchanging assets, sharing data, and executing cross-chain operations.\n\nThrough XCM, decentralized applications can:\n\n- Transfer tokens and other assets across chains.\n- Coordinate complex workflows that span multiple blockchains.\n- Enable seamless user experiences where underlying blockchain differences are invisible.\n- XCM exemplifies Polkadot’s commitment to creating a robust and interoperable ecosystem.\n\nFor further information about XCM, check the [Get Started with XCM](/parachains/interoperability/get-started/) article."}
{"source": "polkadot-docs", "page_id": "reference-parachains-interoperability", "url": "https://developer.polkadot.com/reference/parachains/interoperability/#bridges-connecting-external-networks", "page_title": "Interoperability", "index": 4, "depth": 3, "title": "Bridges: Connecting External Networks", "anchor": "bridges-connecting-external-networks", "start_char": 2735, "end_char": 3499, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:938a00fca91ca2d3dfd4c28bc0cbf94a52928b2c57cfd4efad1d6c31dec47392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Bridges: Connecting External Networks\n\nWhile XCM enables interoperability within the Polkadot ecosystem, bridges extend this functionality to external blockchains such as Ethereum and Bitcoin. By connecting these networks, bridges allow Polkadot-based chains to access external liquidity, additional functionalities, and broader user bases.\n\nWith bridges, developers and users gain the ability to:\n\n- Integrate external assets into Polkadot-based applications.\n- Combine the strengths of Polkadot’s scalability with the liquidity of other networks.\n- Facilitate accurate multi-chain applications that transcend ecosystem boundaries.\n\nFor more information about bridges in the Polkadot ecosystem, see the [Bridge Hub](/reference/polkadot-hub/bridging/) guide."}
{"source": "polkadot-docs", "page_id": "reference-parachains-interoperability", "url": "https://developer.polkadot.com/reference/parachains/interoperability/#the-polkadot-advantage", "page_title": "Interoperability", "index": 5, "depth": 2, "title": "The Polkadot Advantage", "anchor": "the-polkadot-advantage", "start_char": 3499, "end_char": 4217, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:938a00fca91ca2d3dfd4c28bc0cbf94a52928b2c57cfd4efad1d6c31dec47392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Polkadot Advantage\n\nPolkadot was purpose-built for interoperability. Unlike networks that add interoperability as an afterthought, Polkadot integrates it as a fundamental design principle. This approach offers several distinct advantages:\n\n- **Developer empowerment**: Polkadot’s interoperability tools allow developers to build applications that leverage multiple chains’ capabilities without added complexity.\n- **Enhanced ecosystem collaboration**: Chains in Polkadot can focus on their unique strengths while contributing to the ecosystem’s overall growth.\n- **Future-proofing blockchain**: By enabling seamless communication, Polkadot ensures its ecosystem can adapt to evolving demands and technologies."}
{"source": "polkadot-docs", "page_id": "reference-parachains-interoperability", "url": "https://developer.polkadot.com/reference/parachains/interoperability/#looking-ahead", "page_title": "Interoperability", "index": 6, "depth": 2, "title": "Looking Ahead", "anchor": "looking-ahead", "start_char": 4217, "end_char": 4604, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:938a00fca91ca2d3dfd4c28bc0cbf94a52928b2c57cfd4efad1d6c31dec47392", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Looking Ahead\n\nPolkadot’s vision of interoperability extends beyond technical functionality, representing a shift towards a more collaborative blockchain landscape. By enabling chains to work together, Polkadot fosters innovation, efficiency, and accessibility, paving the way for a decentralized future where blockchains are not isolated competitors but interconnected collaborators."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#introduction", "page_title": "Networks", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 587, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nThe Polkadot ecosystem is built on a robust set of networks that enable secure, scalable development. Whether you are testing new features or deploying to live production, Polkadot offers several network layers tailored to each stage of the development process. From local environments to the official Polkadot TestNet (Paseo), developers can thoroughly test, iterate, and validate their applications before deploying to Polkadot MainNet. This guide will introduce you to Polkadot's various networks and explain how they fit into the development workflow."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#network-overview", "page_title": "Networks", "index": 1, "depth": 2, "title": "Network Overview", "anchor": "network-overview", "start_char": 587, "end_char": 1570, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Network Overview \n\nPolkadot's development process is structured to ensure that new features and upgrades are rigorously tested before deployment to live production networks. For all parachain and dApp developers, the recommended progression follows a well-defined path: starting from local environments, testing on Paseo (the official Polkadot TestNet), and ultimately deploying to either Kusama or Polkadot MainNet. The diagram below outlines the recommended development flow:\n\n``` mermaid\nflowchart LR\n    id1[Local] --> id2[Paseo TestNet] --> id3[Kusama]\n    id1[Local] --> id2[Paseo TestNet] --> id4[Polkadot MainNet]\n```\n\nThis flow ensures developers can thoroughly test and iterate without risking real tokens or affecting production networks. **Paseo TestNet is the recommended testing environment for all deployments**, whether targeting Kusama or Polkadot. Testing tools like [Chopsticks](#chopsticks) make it easier to experiment safely before releasing to production."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#recommended-development-path", "page_title": "Networks", "index": 2, "depth": 3, "title": "Recommended Development Path", "anchor": "recommended-development-path", "start_char": 1570, "end_char": 2873, "estimated_token_count": 258, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Recommended Development Path\n\nFor all parachain teams and dApp developers, the recommended journey looks like this:\n\n1. **Local development node**: Development starts in a local environment, where developers can create, test, and iterate on upgrades or new features using a local development node. This stage enables rapid experimentation in an isolated setup with no external dependencies. Parachain developers can leverage local TestNets, such as [Zombienet](#zombienet), for multi-chain testing.\n\n2. **Paseo (Polkadot TestNet)**: After testing locally, deploy to [Paseo](#polkadot-testnet-paseo), the official Polkadot TestNet. Paseo is a stable, community-run TestNet that mirrors Polkadot's runtime and is specifically designed for parachain teams and dApp developers to test before deploying to production networks. **This is the recommended TestNet whether you plan to deploy to Kusama or Polkadot MainNet**.\n\n3. **Production deployment**: After thorough testing on Paseo, features are considered ready for deployment to either:\n   - **Kusama**: An experimental \"canary\" network with real economic value, suitable for teams that want to deploy in a faster-moving production environment before Polkadot\n   - **Polkadot MainNet**: The primary production network with enterprise-grade security"}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#alternative-networks", "page_title": "Networks", "index": 3, "depth": 3, "title": "Alternative Networks", "anchor": "alternative-networks", "start_char": 2873, "end_char": 3760, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Alternative Networks\n\nThe Polkadot ecosystem also includes alternative networks, but these are not part of the recommended development flow:\n\n- **Westend**: A protocol-focused TestNet maintained by Parity Technologies, primarily used for testing low-level protocol changes and infrastructure updates. Westend is designed for infrastructure operators and core protocol developers, not for general parachain or dApp development. **The onboarding process for Westend is not clearly documented, and external developers should use Paseo TestNet instead.** See the [Other Networks](#other-networks) section for details.\n\n!!!note\n    The Rococo TestNet was deprecated on October 14, 2024. Paseo is now the official Polkadot TestNet for parachain and dApp development. For protocol-level testing, teams may use Westend, but most external developers should use Paseo as the default TestNet."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#polkadot-mainnet", "page_title": "Networks", "index": 4, "depth": 2, "title": "Polkadot MainNet", "anchor": "polkadot-mainnet", "start_char": 3760, "end_char": 4322, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot MainNet\n\nPolkadot is the production network where real value and live applications operate. After thorough testing on Paseo and local development environments, teams deploy their parachains and dApps to Polkadot MainNet. Polkadot provides enterprise-grade security through its shared security model, where all parachains benefit from the collective security of the relay chain's validator set.\n\nThe native token for Polkadot is DOT. For more information about DOT, visit the [Native Assets](../../wiki/learn/learn-DOT.md) page on the Polkadot Wiki."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#polkadot-testnet-paseo", "page_title": "Networks", "index": 5, "depth": 2, "title": "Polkadot TestNet (Paseo)", "anchor": "polkadot-testnet-paseo", "start_char": 4322, "end_char": 5980, "estimated_token_count": 358, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot TestNet (Paseo)\n\n[Paseo](https://github.com/paseo-network) is the official Polkadot TestNet for parachain teams and dApp developers. As a stable, community-run TestNet that mirrors Polkadot's runtime, Paseo is specifically designed to provide a reliable testing environment for teams preparing to deploy to Polkadot MainNet.\n\n**Paseo is the recommended TestNet for the vast majority of external developers.** It provides a Polkadot-like environment without the risks and costs associated with live networks, making it ideal for testing parachains, smart contracts, cross-chain messaging (XCM), governance mechanisms, and other application features.\n\nKey characteristics of Paseo:\n\n- **Official Polkadot TestNet**: Recognized as the primary TestNet for Polkadot ecosystem development\n- **Stable and reliable**: Maintained by the community with a focus on stability and uptime\n- **Runtime parity**: Mirrors Polkadot's runtime, ensuring your tests accurately reflect MainNet behavior\n- **Community-driven**: Governed and operated by Polkadot community members\n- **Purpose-built for developers**: Specifically designed for parachain and dApp testing workflows\n\nThe native token for Paseo is PAS. TestNet tokens are available from the [Polkadot faucet](https://faucet.polkadot.io/). Additional information on PAS is available on the [Native Assets](../../wiki/learn/learn-DOT.md#__tabbed_2_1) page.\n\nFor more details about Paseo's role as the official Polkadot TestNet, see the [forum announcement](https://forum.polkadot.network/t/testnets-paseo-officially-becomes-the-polkadot-testnet-temporary-passet-hub-chain-for-smart-contracts-testing/13209)."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#other-networks", "page_title": "Networks", "index": 6, "depth": 2, "title": "Other Networks", "anchor": "other-networks", "start_char": 5980, "end_char": 6153, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Other Networks\n\nWhile Paseo serves as the default TestNet for most development workflows, the Polkadot ecosystem includes additional networks for specialized use cases."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#kusama-network", "page_title": "Networks", "index": 7, "depth": 3, "title": "Kusama Network", "anchor": "kusama-network", "start_char": 6153, "end_char": 6911, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Kusama Network\n\nKusama is Polkadot's \"canary\" network—an experimental, production-grade environment with real economic value. Unlike TestNets, Kusama operates as a live network with actual incentives and economic consequences. It moves faster than Polkadot and has lower barriers to entry, making it suitable for teams that want to deploy in a real economic environment before moving to Polkadot.\n\nKusama is ideal for:\n\n- Teams that want to test with real economic incentives\n- Projects seeking a faster-moving governance and upgrade cycle\n- Experiments and innovations that may eventually move to Polkadot\n\nThe native token for Kusama is KSM. For more information about KSM, visit the [Native Assets](../../wiki/kusama/kusama-getting-started.md) page."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#westend", "page_title": "Networks", "index": 8, "depth": 3, "title": "Westend", "anchor": "westend", "start_char": 6911, "end_char": 8373, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Westend\n\nWestend is a protocol-focused TestNet maintained by Parity Technologies, primarily used for testing low-level Polkadot protocol changes, runtime upgrades, and infrastructure updates before they reach Kusama or Polkadot. Unlike Paseo, Westend is intentionally unstable and receives cutting-edge protocol changes first, making it better suited to core protocol development and infrastructure testing than to parachain or dApp development.\n\n**Important**: Most external developers should **not** use Westend; instead, they should use Paseo TestNet. Westend's onboarding process is not clearly documented, and it is designed for infrastructure operators rather than general parachain teams. **Even if you plan to deploy to Kusama, you should test on Paseo TestNet, not Westend.**\n\nWestend is primarily relevant for:\n\n- Core Polkadot protocol developers testing runtime changes\n- Infrastructure operators and validators testing low-level integrations\n- Teams that specifically need to test against upcoming protocol changes before they reach production networks\n\nUnlike temporary test networks, Westend is permanent and is not reset to the genesis block, making it an ongoing environment for long-term protocol testing.\n\nThe native token for Westend is WND. TestNet tokens are available from the [Polkadot faucet](https://faucet.polkadot.io/). More details about WND can be found on the [Native Assets](../../wiki/learn/learn-DOT.md#__tabbed_2_2) page."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#local-test-networks", "page_title": "Networks", "index": 9, "depth": 2, "title": "Local Test Networks", "anchor": "local-test-networks", "start_char": 8373, "end_char": 8856, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Local Test Networks\n\nLocal test networks are an essential part of the development cycle for blockchain developers using the Polkadot SDK. They allow for fast, iterative testing in controlled, private environments without connecting to public TestNets. Developers can quickly spin up local instances to experiment, debug, and validate their code before deploying to Paseo TestNet and ultimately to production. Two key tools for local network testing are Zombienet and Chopsticks."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#zombienet", "page_title": "Networks", "index": 10, "depth": 3, "title": "Zombienet", "anchor": "zombienet", "start_char": 8856, "end_char": 9764, "estimated_token_count": 158, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Zombienet\n\n[Zombienet](https://github.com/paritytech/zombienet) is a flexible testing framework for Polkadot SDK-based blockchains. It enables developers to create and manage ephemeral, short-lived networks. This feature makes Zombienet particularly useful for quick iterations, as it allows you to run multiple local networks concurrently, mimicking different runtime conditions. Whether you're developing a parachain or testing your custom blockchain logic, Zombienet gives you the tools to automate local testing.\n\nKey features of Zombienet include:\n\n- Creating dynamic, local networks with different configurations.\n- Running parachains and relay chains in a simulated environment.\n- Efficient testing of network components like cross-chain messaging and governance.\n\nZombienet is ideal for developers looking to test quickly and thoroughly before moving to more resource-intensive public TestNets."}
{"source": "polkadot-docs", "page_id": "reference-parachains-networks", "url": "https://developer.polkadot.com/reference/parachains/networks/#chopsticks", "page_title": "Networks", "index": 11, "depth": 3, "title": "Chopsticks", "anchor": "chopsticks", "start_char": 9764, "end_char": 10600, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef6a0df8f693ed713f6e2e320b41935b17b00117b9f381852915df3144b03154", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Chopsticks\n\n[Chopsticks](https://github.com/AcalaNetwork/chopsticks) is a tool designed to create forks of Polkadot SDK-based blockchains, allowing developers to interact with network forks as part of their testing process. This capability makes Chopsticks a powerful option for testing upgrades, runtime changes, or cross-chain applications in a forked network environment.\n\nKey features of Chopsticks include:\n\n- Forking live Polkadot SDK-based blockchains for isolated testing.\n- Simulating cross-chain messages in a private, controlled setup.\n- Debugging network behavior by interacting with the fork in real-time.\n\nChopsticks provides a controlled environment for developers to safely explore the effects of runtime changes. It ensures that network behavior is tested and verified before upgrades are deployed to live networks."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#introduction", "page_title": "Node and Runtime", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 21, "end_char": 965, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nEvery blockchain platform relies on a decentralized network of computers, called nodes, that communicate with each other about transactions and blocks. In this context, a node refers to the software running on the connected devices rather than the physical or virtual machines in the network.\n\nPolkadot SDK-based nodes consist of two main components, each with distinct responsibilities: the client (also called node) and the runtime.\n\nIf the system were a monolithic protocol, any modification would require updating the entire system. Instead, Polkadot achieves true upgradeability by defining an immutable meta-protocol (the client) and a protocol (the runtime) that can be upgraded independently.\n\nThis separation gives the [Polkadot relay chain](/reference/polkadot-hub/consensus-and-security/relay-chain/) and all connected [parachains](/reference/parachains/) an evolutionary advantage over other blockchain platforms."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#architectural-principles", "page_title": "Node and Runtime", "index": 1, "depth": 2, "title": "Architectural Principles", "anchor": "architectural-principles", "start_char": 965, "end_char": 1687, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Architectural Principles\n\nThe Polkadot SDK-based blockchain architecture is fundamentally built on two distinct yet interconnected components:\n\n- Client (Meta-protocol):\n    - Handles the foundational infrastructure of the blockchain.\n    - Manages runtime execution, networking, consensus, and other off-chain components.\n    - Provides an immutable base layer that ensures network stability.\n    - Upgradable only through hard forks.\n\n- Runtime (Protocol):\n    - Defines the blockchain's state transition logic.\n    - Determines the specific rules and behaviors of the blockchain.\n    - Compiled to WebAssembly (Wasm) for platform-independent execution.\n    - Capable of being upgraded without network-wide forking."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#advantages-of-this-architecture", "page_title": "Node and Runtime", "index": 2, "depth": 3, "title": "Advantages of this Architecture", "anchor": "advantages-of-this-architecture", "start_char": 1687, "end_char": 2068, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Advantages of this Architecture\n\n- **Forkless upgrades**: Runtime can be updated without disrupting the entire network.\n- **Modularity**: Clear separation allows independent development of client and runtime.\n- **Flexibility**: Enables rapid iteration and evolution of blockchain logic.\n- **Performance**: WebAssembly compilation provides efficient, cross-platform execution."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#node-client", "page_title": "Node and Runtime", "index": 3, "depth": 2, "title": "Node (Client)", "anchor": "node-client", "start_char": 2068, "end_char": 2901, "estimated_token_count": 164, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Node (Client)\n\nThe node, also known as the client, is the core component responsible for executing the Wasm runtime and orchestrating various essential blockchain components. It ensures the correct execution of the state transition function and manages multiple critical subsystems, including:\n\n- **Wasm execution**: Runs the blockchain runtime, which defines the state transition rules.\n- **Database management**: Stores blockchain data.\n- **Networking**: Facilitates peer-to-peer communication, block propagation, and transaction gossiping.\n- **Transaction pool (Mempool)**: Manages pending transactions before they are included in a block.\n- **Consensus mechanism**: Ensures agreement on the blockchain state across nodes.\n- **RPC services**: Provides external interfaces for applications and users to interact with the node."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#runtime", "page_title": "Node and Runtime", "index": 4, "depth": 2, "title": "Runtime", "anchor": "runtime", "start_char": 2901, "end_char": 3183, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Runtime\n\nThe runtime is more than just a set of rules. It's the fundamental logic engine that defines a blockchain's entire behavior. In Polkadot SDK-based blockchains, the runtime represents a complete, self-contained description of the blockchain's state transition function."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#characteristics", "page_title": "Node and Runtime", "index": 5, "depth": 3, "title": "Characteristics", "anchor": "characteristics", "start_char": 3183, "end_char": 3517, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Characteristics\n\nThe runtime is distinguished by three key characteristics:\n\n- **Business logic**: Defines the complete application-specific blockchain behavior.\n- **WebAssembly compilation**: Ensures platform-independent, secure execution.\n- **On-chain storage**: Stored within the blockchain's state, allowing dynamic updates."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#key-functions", "page_title": "Node and Runtime", "index": 6, "depth": 3, "title": "Key Functions", "anchor": "key-functions", "start_char": 3517, "end_char": 3802, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key Functions\n\nThe runtime performs several critical functions, such as:\n\n- Define state transition rules.\n- Implement blockchain-specific logic.\n- Manage account interactions.\n- Control transaction processing.\n- Define governance mechanisms.\n- Handle custom pallets and modules."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#communication-between-node-and-runtime", "page_title": "Node and Runtime", "index": 7, "depth": 2, "title": "Communication Between Node and Runtime", "anchor": "communication-between-node-and-runtime", "start_char": 3802, "end_char": 4045, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Communication Between Node and Runtime\n\nThe client and runtime communicate exclusively using [SCALE-encoded](/reference/parachains/data-encoding/) communication. This ensures efficient and compact data exchange between the two components."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#runtime-apis", "page_title": "Node and Runtime", "index": 8, "depth": 3, "title": "Runtime APIs", "anchor": "runtime-apis", "start_char": 4045, "end_char": 4470, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Runtime APIs\n\nThe Runtime API consists of well-defined functions and constants a client assumes are implemented in the Runtime Wasm blob. These APIs enable the client to interact with the runtime to execute blockchain operations and retrieve information. The client invokes these APIs to:\n\n- Build, execute, and finalize blocks.\n- Access metadata.\n- Access consensus related information.\n- Handle transaction execution."}
{"source": "polkadot-docs", "page_id": "reference-parachains-node-and-runtime", "url": "https://developer.polkadot.com/reference/parachains/node-and-runtime/#host-functions", "page_title": "Node and Runtime", "index": 9, "depth": 3, "title": "Host Functions", "anchor": "host-functions", "start_char": 4470, "end_char": 4869, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:136b898d605b86e17166d616db64d0c1c8fdd8a9ad5442e110e8f7972f37e3a6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Host Functions\n\nDuring execution, the runtime can access certain external client functionalities via host functions. The specific functions the client exposes allow the runtime to perform operations outside the WebAssembly domain. Host functions enable the runtime to:\n\n- Perform cryptographic operations.\n- Access the current blockchain state.\n- Handle storage modifications.\n- Allocate memory."}
{"source": "polkadot-docs", "page_id": "reference-parachains-randomness", "url": "https://developer.polkadot.com/reference/parachains/randomness/#introduction", "page_title": "Randomness", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 15, "end_char": 1207, "estimated_token_count": 267, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0380441a11b7c694191b823951697a386943d149c02d5c9262fe0bd2f0eccf2a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nRandomness is crucial in Proof of Stake (PoS) blockchains to ensure a fair and unpredictable distribution of validator duties. However, computers are inherently deterministic, meaning the same input always produces the same output. What we typically refer to as \"random\" numbers on a computer are actually pseudo-random. These numbers rely on an initial \"seed,\" which can come from external sources like [atmospheric noise](https://www.random.org/randomness/), [heart rates](https://mdpi.altmetric.com/details/47574324), or even [lava lamps](https://en.wikipedia.org/wiki/Lavarand). While this may seem random, given the same \"seed,\" the same sequence of numbers will always be generated.\n\nIn a global blockchain network, relying on real-world entropy for randomness isn’t feasible because these inputs vary by time and location. If nodes use different inputs, blockchains can fork. Hence, real-world randomness isn't suitable for use as a seed in blockchain systems.\n\nCurrently, two primary methods for generating randomness in blockchains are used: [`RANDAO`](#randao) and [`VRF`](#vrf) (Verifiable Random Function). Polkadot adopts the `VRF` approach for its randomness."}
{"source": "polkadot-docs", "page_id": "reference-parachains-randomness", "url": "https://developer.polkadot.com/reference/parachains/randomness/#vrf", "page_title": "Randomness", "index": 1, "depth": 2, "title": "VRF", "anchor": "vrf", "start_char": 1207, "end_char": 1963, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0380441a11b7c694191b823951697a386943d149c02d5c9262fe0bd2f0eccf2a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## VRF\n\nA Verifiable Random Function (VRF) is a cryptographic function that generates a random number and proof that ensures the submitter produced the number. This proof allows anyone to verify the validity of the random number.\n\nPolkadot's VRF is similar to the one used in [**Ouroboros Praos**](https://eprint.iacr.org/2017/573.pdf), which secures randomness for block production in systems like [BABE](/reference/polkadot-hub/consensus-and-security/pos-consensus/#block-production-babe) (Polkadot’s block production mechanism). \n\nThe key difference is that Polkadot's VRF doesn’t rely on a central clock—avoiding the issue of whose clock to trust. Instead, it uses its own past results and slot numbers to simulate time and determine future outcomes."}
{"source": "polkadot-docs", "page_id": "reference-parachains-randomness", "url": "https://developer.polkadot.com/reference/parachains/randomness/#how-vrf-works", "page_title": "Randomness", "index": 2, "depth": 3, "title": "How VRF Works", "anchor": "how-vrf-works", "start_char": 1963, "end_char": 4484, "estimated_token_count": 531, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0380441a11b7c694191b823951697a386943d149c02d5c9262fe0bd2f0eccf2a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How VRF Works\n\nSlots on Polkadot are discrete units of time, each lasting six seconds, and can potentially hold a block. Multiple slots form an epoch, with 2400 slots making up one four-hour epoch.\n\nIn each slot, validators execute a \"die roll\" using a VRF. The VRF uses three inputs:\n\n1. A \"secret key,\" unique to each validator, is used for the die roll.\n2. An epoch randomness value, derived from the hash of VRF outputs from blocks two epochs ago (N-2), so past randomness influences the current epoch (N).\n3. The current slot number.\n\nThis process helps maintain fair randomness across the network.\n\nHere is a graphical representation:\n\n![](/images/reference/parachains/randomness/randomness-01.webp)\n\nThe VRF produces two outputs: a result (the random number) and a proof (verifying that the number was generated correctly).\n\nThe result is checked by the validator against a protocol threshold. If it's below the threshold, the validator becomes a candidate for block production in that slot. \n\nThe validator then attempts to create a block, submitting it along with the `PROOF` and `RESULT`.\n\nSo, VRF can be expressed like:\n\n`(RESULT, PROOF) = VRF(SECRET, EPOCH_RANDOMNESS_VALUE, CURRENT_SLOT_NUMBER)`\n\nPut simply, performing a \"VRF roll\" generates a random number along with proof that the number was genuinely produced and not arbitrarily chosen.\n\nAfter executing the VRF, the `RESULT` is compared to a protocol-defined `THRESHOLD`. If the `RESULT` is below the `THRESHOLD`, the validator becomes a valid candidate to propose a block for that slot. Otherwise, the validator skips the slot.\n\nAs a result, there may be multiple validators eligible to propose a block for a slot. In this case, the block accepted by other nodes will prevail, provided it is on the chain with the latest finalized block as determined by the GRANDPA finality gadget. It's also possible for no block producers to be available for a slot, in which case the AURA consensus takes over. AURA is a fallback mechanism that randomly selects a validator to produce a block, running in parallel with BABE and only stepping in when no block producers exist for a slot. Otherwise, it remains inactive.\n\nBecause validators roll independently, no block candidates may appear in some slots if all roll numbers are above the threshold. \n\nTo verify resolution of this issue and that Polkadot block times remain near constant-time, see the [PoS Consensus](/reference/polkadot-hub/consensus-and-security/pos-consensus/) page of this documentation."}
{"source": "polkadot-docs", "page_id": "reference-parachains-randomness", "url": "https://developer.polkadot.com/reference/parachains/randomness/#randao", "page_title": "Randomness", "index": 3, "depth": 2, "title": "RANDAO", "anchor": "randao", "start_char": 4484, "end_char": 5155, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0380441a11b7c694191b823951697a386943d149c02d5c9262fe0bd2f0eccf2a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## RANDAO\n\nAn alternative on-chain randomness method is Ethereum's RANDAO, where validators perform thousands of hashes on a seed and publish the final hash during a round. The collective input from all validators forms the random number, and as long as one honest validator participates, the randomness is secure.\n\nTo enhance security, RANDAO can optionally be combined with a Verifiable Delay Function (VDF), ensuring that randomness can't be predicted or manipulated during computation.\n\nFor more information about RANDAO, see the [Randomness - RANDAO](https://eth2book.info/capella/part2/building_blocks/randomness/) section of the Upgrading Ethereum documentation."}
{"source": "polkadot-docs", "page_id": "reference-parachains-randomness", "url": "https://developer.polkadot.com/reference/parachains/randomness/#vdfs", "page_title": "Randomness", "index": 4, "depth": 2, "title": "VDFs", "anchor": "vdfs", "start_char": 5155, "end_char": 5832, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0380441a11b7c694191b823951697a386943d149c02d5c9262fe0bd2f0eccf2a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## VDFs\n\nVerifiable Delay Functions (VDFs) are time-bound computations that, even on parallel computers, take a set amount of time to complete. \n\nThey produce a unique result that can be quickly verified publicly. When combined with RANDAO, feeding RANDAO's output into a VDF introduces a delay that nullifies an attacker's chance to influence the randomness.\n\nHowever, VDF likely requires specialized ASIC devices to run separately from standard nodes.\n\n!!!warning \n    While only one is needed to secure the system, and they will be open-source and inexpensive, running VDF devices involves significant costs without direct incentives, adding friction for blockchain users."}
{"source": "polkadot-docs", "page_id": "reference-parachains-randomness", "url": "https://developer.polkadot.com/reference/parachains/randomness/#additional-resources", "page_title": "Randomness", "index": 5, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 5832, "end_char": 6333, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0380441a11b7c694191b823951697a386943d149c02d5c9262fe0bd2f0eccf2a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Additional Resources\n\nFor more information about the reasoning for choices made along with proofs, see Polkadot's research on blockchain randomness and sortition in the [Randomness](../../wiki/learn/learn-cryptography.md#randomness) entry of the Polkadot Wiki.\n\nFor a discussion with Web3 Foundation researchers about when and under what conditions Polkadot's randomness can be utilized, see the [Discussion on Randomness used in Polkadot](https://github.com/use-ink/ink/issues/57) issue on GitHub."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#introduction", "page_title": "Polkadot Hub Assets", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 27, "end_char": 665, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub is Polkadot’s system parachain that provides core functionality for the network, including issuing and managing on-chain assets. While the relay chain provides security, Polkadot Hub handles asset logic—minting, burning, transfers, and metadata—efficiently and cost-effectively.\n\nPolkadot Hub supports native assets issued on the parachain and foreign assets from other chains, both of which can move seamlessly across the network via XCM.\n\nThis guide explains how assets are created, managed, and moved across chains, including key operations, roles, and the differences between native and foreign assets."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#why-use-polkadot-hub", "page_title": "Polkadot Hub Assets", "index": 1, "depth": 2, "title": "Why Use Polkadot Hub?", "anchor": "why-use-polkadot-hub", "start_char": 665, "end_char": 1532, "estimated_token_count": 198, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why Use Polkadot Hub?\n\nPolkadot Hub provides a standardized framework for creating and managing fungible and non-fungible assets. Projects can issue tokens, manage supply, and transfer assets across parachains, extending the functionality of the Polkadot relay chain, which only supports its native token (DOT).\n\n**Key features**:\n\n- **Built-in asset operations**: Mint, burn, and transfer like ERC-20 on Ethereum, but native to Polkadot's runtime.\n- **Custom asset creation**: Issue tokens or NFTs with configurable permissions and metadata.\n- **Low fees**: Transactions cost roughly one-tenth of relay chain fees.\n- **Lower deposits**: Minimal on-chain storage costs for asset data.\n- **Pay fees in any asset**: Users don’t need DOT to transact; supported assets can cover fees.\n- **Cross-chain ready**: Assets can be transferred to other parachains using XCM."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#types-of-assets", "page_title": "Polkadot Hub Assets", "index": 2, "depth": 2, "title": "Types of Assets", "anchor": "types-of-assets", "start_char": 1532, "end_char": 1996, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Types of Assets\n\nPolkadot Hub supports two types of assets:\n\n- **Native assets**: Tokens and NFTs issued directly on Polkadot Hub using the Assets pallet. These assets benefit from the platform's custom features, such as configurable permissions and low fees\n- **Foreign assets**: Tokens originating from other Polkadot parachains or external networks (like Ethereum, via bridges). Once registered on Polkadot Hub, they are treated similarly to native assets."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#asset-structure", "page_title": "Polkadot Hub Assets", "index": 3, "depth": 2, "title": "Asset Structure", "anchor": "asset-structure", "start_char": 1996, "end_char": 2459, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Asset Structure\n\nEach asset is identified by a unique ID and stores:\n\n- Asset administrators\n- Total supply and holder count\n- Minimum balance configuration\n- Sufficiency–whether the asset can keep an account alive without DOT\n- Metadata (name, symbol, decimals)\n\nIf a balance falls below the configured minimum, called the Existential Deposit, it may be removed as “dust.” This ensures efficient storage while giving developers control over asset economics."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#common-asset-ids", "page_title": "Polkadot Hub Assets", "index": 4, "depth": 2, "title": "Common Asset IDs", "anchor": "common-asset-ids", "start_char": 2459, "end_char": 2934, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Common Asset IDs\n\nThe following well-known native assets are registered on Polkadot Hub:\n\n| Asset ID | Symbol | Name | Decimals | Sufficient |\n|:---:|:---:|:---:|:---:|:---:|\n| 1984 | USDt | Tether USD | 6 | Yes |\n| 1337 | USDC | USD Coin | 6 | Yes |\n\n!!! note\n    The on-chain symbol for Tether on Polkadot Hub is `USDt`, which is commonly referred to as \"USDT\" on exchanges and in wallets.\n\nA sufficient asset can keep an account alive without requiring a DOT balance."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#how-native-assets-work", "page_title": "Polkadot Hub Assets", "index": 5, "depth": 2, "title": "How Native Assets Work", "anchor": "how-native-assets-work", "start_char": 2934, "end_char": 3494, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Native Assets Work\n\nNative assets on Polkadot Hub are created and managed via the Assets pallet from the Polkadot SDK. This pallet defines the runtime logic for issuing, configuring, and administering fungible assets with customizable permissions.\n\nIt supports both permissioned and permissionless asset creation, enabling everything from simple user-issued tokens to governed assets controlled by teams or DAOs.\n\nFor implementation details, see the [Assets Pallet Rust docs](https://paritytech.github.io/polkadot-sdk/master/pallet_assets/index.html)."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#asset-operations", "page_title": "Polkadot Hub Assets", "index": 6, "depth": 3, "title": "Asset Operations", "anchor": "asset-operations", "start_char": 3494, "end_char": 4519, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Asset Operations\n\nThe Assets pallet provides both state-changing operations and read-only queries for full lifecycle management of assets.\n\nCore operations include:\n\n- **Asset issuance**: Create new assets and assign initial supply.\n- **Transfers**: Move assets between accounts with balance tracking.\n- **Burning**: Reduce total supply by destroying tokens.\n- **Delegated transfers**: Approve transfers on behalf of another account without giving up custody.\n- **Freezing and thawing**: Temporarily lock and unlock an account's balance.\n\nFor a complete list of extrinsics, see the [`pallet-assets` dispatchable functions reference](https://docs.rs/pallet-assets/latest/pallet_assets/pallet/enum.Call.html).\n\nData queries make it possible to:\n\n- Check account balances and total supply.\n- Retrieve asset metadata and configuration details.\n- Inspect account and asset status on-chain.\n\nFor a full list of queries, see the [Pallet reference](https://docs.rs/pallet-assets/latest/pallet_assets/pallet/struct.Pallet.html)."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#roles-and-permissions", "page_title": "Polkadot Hub Assets", "index": 7, "depth": 3, "title": "Roles and Permissions", "anchor": "roles-and-permissions", "start_char": 4519, "end_char": 5315, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Roles and Permissions\n\nThe Assets pallet uses role-based permissions to control who can manage different parts of an asset’s lifecycle:\n\n- **Owner**: Overarching control, including destroying an asset class; can set or update Issuer, Freezer, and Admin roles.\n- **Admin**: Can freeze assets and forcibly transfer balances between accounts. Admins can also reduce the balance of an asset class across arbitrary accounts.\n- **Issuer**: Responsible for minting new tokens. When new assets are created, the Issuer is the account that controls their distribution to other accounts.\n- **Freezer**: Can lock the transfer of assets from an account, preventing the account holder from moving their balance.\n\nThese roles allow projects to enforce governance and security policies around their assets."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#freezing-assets", "page_title": "Polkadot Hub Assets", "index": 8, "depth": 3, "title": "Freezing Assets", "anchor": "freezing-assets", "start_char": 5315, "end_char": 5837, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Freezing Assets\n\nAssets can be temporarily locked to prevent transfers from specific accounts. This is useful for dispute resolution, fraud prevention, or compliance controls.\n\n**How it works**:\n\n- Only authorized parties can freeze or unfreeze (thaw) assets.\n- Freezing pauses the movement of the asset without burning or removing it.\n- Once thawed, the asset can be transferred normally.\n\nFreezing provides a safe way to control asset flow while maintaining full ownership.\n\n**Key functions**: `freeze` and `thaw`."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#delegated-transfers", "page_title": "Polkadot Hub Assets", "index": 9, "depth": 3, "title": "Delegated Transfers", "anchor": "delegated-transfers", "start_char": 5837, "end_char": 6572, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Delegated Transfers\n\nPolkadot Hub supports delegated asset transfers, allowing one account to authorize another to move a limited amount of its assets—without giving up full control. This is useful for escrow logic, automated payments, and multi-party applications.\n\n**How it works**:\n\n- An account can grant permission to another account to transfer a specific amount of its assets.\n- Permissions can be revoked at any time, preventing further transfers.\n- Authorized accounts can execute transfers on behalf of the original owner within the approved limits.\n\nDelegated transfers simplify multi-step transactions and enable complex asset flows.\n\n**Key functions**: `approve_transfer`, `cancel_approval`, and `transfer_approved`."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#how-foreign-assets-work", "page_title": "Polkadot Hub Assets", "index": 10, "depth": 2, "title": "How Foreign Assets Work", "anchor": "how-foreign-assets-work", "start_char": 6572, "end_char": 7434, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Foreign Assets Work\n\nForeign assets are assets originating from other chains and are managed on Polkadot Hub via an instance of the Assets pallet that is configured specifically for foreign assets. It enables transfers, balance checks, and other standard asset operations, while handling foreign-asset specifics such as:\n\n- **Asset identifiers**: Foreign assets use an XCM multilocation as their identifier, rather than a numeric AssetId. This ensures assets from different chains can be referenced and moved safely across parachains.\n\n- **Transfers**: Once registered on Polkadot Hub, foreign assets can be transferred between accounts just like native assets. If supported, they can also be returned to their original blockchain using cross-chain messaging.\n\nThis unified interface makes it easy for dApps to handle both native and cross-chain assets."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#moving-assets-across-chains", "page_title": "Polkadot Hub Assets", "index": 11, "depth": 2, "title": "Moving Assets Across Chains", "anchor": "moving-assets-across-chains", "start_char": 7434, "end_char": 7822, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Moving Assets Across Chains\n\nPolkadot Hub enables assets to move safely between parachains and the relay chain using XCM (Cross-Consensus Messaging). XCM ensures assets can move securely between chains while preserving ownership and traceability\n\nTo learn more about asset transfers with XCM, please refer to the [Introduction to XCM](/parachains/interoperability/get-started/) page."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-assets", "url": "https://developer.polkadot.com/reference/polkadot-hub/assets/#where-to-go-next", "page_title": "Polkadot Hub Assets", "index": 12, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 7822, "end_char": 8726, "estimated_token_count": 230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8443f207b18e9fe071c6833afba8ad13e77fa79f0a2238b01b0bb6ddef5c3db8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-  <span class=\"badge guide\">Guide</span> __Register a Foreign Asset__\n\n    ---\n\n    Learn step-by-step how to register a foreign asset on Polkadot Hub.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/token-operations/register-foreign-asset/)\n\n-  <span class=\"badge guide\">Guide</span> __Register a Local Asset__\n\n    ---\n\n    Learn step-by-step how to register a local asset on Polkadot Hub.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/token-operations/register-local-asset/)\n\n-  <span class=\"badge guide\">Guide</span> __Convert Assets__\n\n    ---\n\n    Learn how to convert and manage assets on Asset Hub, including creating liquidity pools, adding liquidity, swapping assets, and withdrawing liquidity.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/token-operations/convert-assets/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-bridging", "url": "https://developer.polkadot.com/reference/polkadot-hub/bridging/#introduction", "page_title": "Bridge Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 15, "end_char": 1032, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8476b442f7bdf55b30b56062ced6e084cd6f0d9738d2bd1b14c62e53fa8f20ef", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nThe Bridge Hub system parachain plays a crucial role in facilitating trustless interactions between Polkadot, Kusama, Ethereum, and other blockchain ecosystems. By implementing on-chain light clients and supporting protocols like BEEFY and GRANDPA, Bridge Hub ensures seamless message transmission and state verification across chains. It also provides essential Pallet functionality for sending and receiving messages, making it a cornerstone of Polkadot’s interoperability framework. With built-in support for XCM (Cross-Consensus Messaging), Bridge Hub enables secure, efficient communication between diverse blockchain networks.\n\nThis guide covers the architecture, components, and deployment of the Bridge Hub system. You'll explore its trustless bridging mechanisms, key pallets for various blockchains, and specific implementations like Snowbridge and the Polkadot <> Kusama bridge. By the end, you'll understand how Bridge Hub enhances connectivity within the Polkadot ecosystem and beyond."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-bridging", "url": "https://developer.polkadot.com/reference/polkadot-hub/bridging/#trustless-bridging", "page_title": "Bridge Hub", "index": 1, "depth": 2, "title": "Trustless Bridging", "anchor": "trustless-bridging", "start_char": 1032, "end_char": 2606, "estimated_token_count": 301, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8476b442f7bdf55b30b56062ced6e084cd6f0d9738d2bd1b14c62e53fa8f20ef", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Trustless Bridging\n\nBridge Hub provides a mode of trustless bridging through its implementation of on-chain light clients and trustless relayers. Trustless bridges are essentially two one-way bridges, where each chain has a method of verifying the state of the other in a trustless manner through consensus proofs. In this context, \"trustless\" refers to the lack of need to trust a human when interacting with various system components. Trustless systems are based instead on trusting mathematics, cryptography, and code. The target chain and source chain both provide ways of verifying one another's state and actions (such as a transfer) based on the consensus and finality of both chains rather than an external mechanism controlled by a third party.\n\n[BEEFY (Bridge Efficiency Enabling Finality Yielder)](/reference/polkadot-hub/consensus-and-security/pos-consensus/#bridging-beefy) is instrumental in this solution. It provides a more efficient way to verify the consensus on the relay chain. It allows the participants in a network to verify finality proofs, meaning a remote chain like Ethereum can verify the state of Polkadot at a given block height. \n\nFor example, the Ethereum and Polkadot bridging solution that [Snowbridge](https://docs.snowbridge.network/) implements involves two light clients: one which verifies the state of Polkadot and the other which verifies the state of Ethereum. The light client for Polkadot is implemented in the runtime as a pallet, whereas the light client for Ethereum is implemented as a smart contract on the beacon chain."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-bridging", "url": "https://developer.polkadot.com/reference/polkadot-hub/bridging/#bridging-components", "page_title": "Bridge Hub", "index": 2, "depth": 2, "title": "Bridging Components", "anchor": "bridging-components", "start_char": 2606, "end_char": 3494, "estimated_token_count": 218, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8476b442f7bdf55b30b56062ced6e084cd6f0d9738d2bd1b14c62e53fa8f20ef", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bridging Components\n\nIn any given Bridge Hub implementation (Kusama, Polkadot, or other relay chains), there are a few primary pallets that are utilized:\n\n- **[Pallet Bridge GRANDPA](https://paritytech.github.io/polkadot-sdk/master/pallet_bridge_grandpa/index.html)**: An on-chain GRANDPA light client for Substrate based chains.\n- **[Pallet Bridge Parachains](https://paritytech.github.io/polkadot-sdk/master/pallet_bridge_parachains/index.html)**: A finality module for parachains.\n- **[Pallet Bridge Messages](https://paritytech.github.io/polkadot-sdk/master/pallet_bridge_messages/index.html)**: A pallet which allows sending, receiving, and tracking of inbound and outbound messages.\n- **[Pallet XCM Bridge](https://paritytech.github.io/polkadot-sdk/master/pallet_xcm_bridge_hub/index.html)**: A pallet which, with the Bridge Messages pallet, adds XCM support to bridge pallets."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-bridging", "url": "https://developer.polkadot.com/reference/polkadot-hub/bridging/#ethereum-specific-support", "page_title": "Bridge Hub", "index": 3, "depth": 3, "title": "Ethereum-Specific Support", "anchor": "ethereum-specific-support", "start_char": 3494, "end_char": 4064, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8476b442f7bdf55b30b56062ced6e084cd6f0d9738d2bd1b14c62e53fa8f20ef", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Ethereum-Specific Support\n\nBridge Hub also has a set of components and pallets that support a bridge between Polkadot and Ethereum through [Snowbridge](https://github.com/Snowfork/snowbridge).\n\nTo view the complete list of which pallets are included in Bridge Hub, visit the Subscan [Runtime Modules](https://bridgehub-polkadot.subscan.io/runtime) page. Alternatively, the source code for those pallets can be found in the Polkadot SDK [Snowbridge Pallets](https://github.com/paritytech/polkadot-sdk/tree/polkadot-stable2609/bridges/snowbridge/pallets) repository."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-bridging", "url": "https://developer.polkadot.com/reference/polkadot-hub/bridging/#deployed-bridges", "page_title": "Bridge Hub", "index": 4, "depth": 2, "title": "Deployed Bridges", "anchor": "deployed-bridges", "start_char": 4064, "end_char": 4574, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8476b442f7bdf55b30b56062ced6e084cd6f0d9738d2bd1b14c62e53fa8f20ef", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Deployed Bridges\n\n- [**Snowbridge**](../../wiki/learn/learn-snowbridge.md): A general-purpose, trustless bridge between Polkadot and Ethereum.\n- [**Hyperbridge**](../../wiki/learn/learn-hyperbridge.md): A cross-chain solution built as an interoperability coprocessor, providing state-proof-based interoperability across all blockchains.\n- [**Polkadot <> Kusama Bridge**](../../wiki/learn/learn-DOT-KSM-bridge.md): A bridge that utilizes relayers to bridge the Polkadot and Kusama relay chains trustlessly."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-bridging", "url": "https://developer.polkadot.com/reference/polkadot-hub/bridging/#where-to-go-next", "page_title": "Bridge Hub", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4574, "end_char": 5148, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8476b442f7bdf55b30b56062ced6e084cd6f0d9738d2bd1b14c62e53fa8f20ef", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Where to Go Next\n\n- Go over the Bridge Hub README in the Polkadot SDK [Bridge-hub Parachains](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/cumulus/parachains/runtimes/bridge-hubs/README.md) repository.\n- Take a deeper dive into bridging architecture in the Polkadot SDK [High-Level Bridge](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/bridges/docs/high-level-overview.md) documentation.\n- Read more about [BEEFY and Bridging in the Polkadot Wiki](/reference/polkadot-hub/consensus-and-security/pos-consensus/#bridging-beefy)."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-collectives-and-daos", "url": "https://developer.polkadot.com/reference/polkadot-hub/collectives-and-daos/#introduction", "page_title": "Collectives Chain", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 1, "end_char": 770, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e1d66c7313f34fa4e306c221d0dea32d10a3e4b1c3a54b22f522903dc9fa940", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nEstablished through [Referendum 81](https://polkadot-old.polkassembly.io/referendum/81), the Collectives chain operates as a dedicated parachain exclusive to the Polkadot network with no counterpart on Kusama. This specialized infrastructure provides a foundation for various on-chain governance groups essential to Polkadot's ecosystem.\n\nThe architecture enables entire networks to function as unified entities, allowing them to present cohesive positions and participate in cross-network governance through [Bridge Hub](/reference/polkadot-hub/bridging/). This capability represents a fundamental advancement in Web3 principles, eliminating dependencies on traditional third-party intermediaries such as legal systems or jurisdictional authorities."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-collectives-and-daos", "url": "https://developer.polkadot.com/reference/polkadot-hub/collectives-and-daos/#key-collectives", "page_title": "Collectives Chain", "index": 1, "depth": 2, "title": "Key Collectives", "anchor": "key-collectives", "start_char": 770, "end_char": 2175, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e1d66c7313f34fa4e306c221d0dea32d10a3e4b1c3a54b22f522903dc9fa940", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Key Collectives\n\nThe Collectives chain hosts several important governance bodies:\n\n- [**Polkadot Technical Fellowship**](../../wiki/learn/learn-polkadot-technical-fellowship.md): A self-governing assembly of protocol experts and developers who oversee technical aspects of the Polkadot and Kusama networks. The Fellowship operates both on-chain through the collectives system and off-chain via GitHub repositories, public discussion forums, and monthly development calls that are publicly accessible.\n\n- [**Polkadot Alliance**](../../wiki/general/glossary.md#polkadot-alliance): A consortium founded by seven leading parachain projects (Acala, Astar, Interlay, Kilt, Moonbeam, Phala, and Subscan) to establish development standards and ethical guidelines within the ecosystem. This ranked collective, comprised of \"Fellows\" and \"Allies,\" focuses on promoting best practices and identifying potential bad actors. Membership is primarily designed for organizations, projects, and other networks rather than individuals.\n\nThese collectives serve as pillars of Polkadot's decentralized governance model, enabling community-driven decision-making and establishing technical standards that shape the network's evolution. Through structured on-chain representation, they provide transparent mechanisms for ecosystem development while maintaining the core Web3 principles of trustlessness and decentralization."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-agile-coretime", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/agile-coretime/#introduction", "page_title": "Agile Coretime", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 1412, "estimated_token_count": 304, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea70e4ca4a6c5818ad8a3c8aa85558c4b55ca505c1aa672f170979abb380f2f5", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nAgile Coretime is the [scheduling](https://en.wikipedia.org/wiki/Scheduling_(computing)) framework on Polkadot that lets parachains efficiently access cores, which comprise an active validator set tasked with parablock validation. As the first blockchain to enable a flexible scheduling system for blockspace production, Polkadot offers unparalleled adaptability for parachains.\n\n``` mermaid\ngraph TB\n    A[Cores Designation]\n    B[Bulk Coretime]\n    C[On-Demand Coretime]\n    A --continuous--> B\n    A --flexible--> C \n```\n\nCores can be designated to a parachain either continuously through [bulk coretime](#bulk-coretime) or dynamically via [on-demand coretime](#on-demand-coretime). Additionally, Polkadot supports scheduling multiple cores in parallel through [elastic scaling](../../../wiki/learn/learn-elastic-scaling.md), which is a feature under active development on Polkadot. This flexibility empowers parachains to optimize their resource usage and block production according to their unique needs.\n\nIn this guide, you'll learn how bulk coretime enables continuous core access with features like interlacing and splitting, and how on-demand coretime provides flexible, pay-per-use scheduling for parachains. For a deep dive on Agile Coretime and its terminology, refer to the [Wiki doc](../../../wiki/learn/learn-agile-coretime.md#introduction-to-agile-coretime)."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-agile-coretime", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/agile-coretime/#bulk-coretime", "page_title": "Agile Coretime", "index": 1, "depth": 2, "title": "Bulk Coretime", "anchor": "bulk-coretime", "start_char": 1412, "end_char": 2155, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea70e4ca4a6c5818ad8a3c8aa85558c4b55ca505c1aa672f170979abb380f2f5", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bulk Coretime\n\nBulk coretime is a fixed duration of continuous coretime represented by an NFT that can be purchased through [coretime sales](../../../wiki/learn/learn-agile-coretime.md#coretime-sales) in DOT and can be split, shared, or resold. Currently, the duration of bulk coretime is set to 28 days. Coretime purchased in bulk and assigned to a single parachain is eligible for a price-capped renewal, providing a form of rent-controlled access, which is important for predicting the running costs in the near future. Suppose the bulk coretime is [interlaced](#coretime-interlacing) or [split](#coretime-splitting) or is kept idle without assigning it to a parachain. In that case, it will be ineligible for the price-capped renewal."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-agile-coretime", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/agile-coretime/#coretime-interlacing", "page_title": "Agile Coretime", "index": 2, "depth": 3, "title": "Coretime Interlacing", "anchor": "coretime-interlacing", "start_char": 2155, "end_char": 2526, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea70e4ca4a6c5818ad8a3c8aa85558c4b55ca505c1aa672f170979abb380f2f5", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Coretime Interlacing\n\nIt is the action of dividing bulk coretime across multiple parachains that produce blocks spaced uniformly in time. For example, think of multiple parachains taking turns producing blocks, demonstrating a simple form of interlacing. This feature can be used by parachains with a low transaction volume and need not continuously produce blocks."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-agile-coretime", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/agile-coretime/#coretime-splitting", "page_title": "Agile Coretime", "index": 3, "depth": 3, "title": "Coretime Splitting", "anchor": "coretime-splitting", "start_char": 2526, "end_char": 2791, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea70e4ca4a6c5818ad8a3c8aa85558c4b55ca505c1aa672f170979abb380f2f5", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Coretime Splitting\n\nIt is the action of dividing bulk coretime into multiple contiguous regions. This feature can be used by parachains that need to produce blocks continuously but do not require the whole 28 days of bulk coretime and require only part of it."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-agile-coretime", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/agile-coretime/#on-demand-coretime", "page_title": "Agile Coretime", "index": 4, "depth": 2, "title": "On-Demand Coretime", "anchor": "on-demand-coretime", "start_char": 2791, "end_char": 3004, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ea70e4ca4a6c5818ad8a3c8aa85558c4b55ca505c1aa672f170979abb380f2f5", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## On-Demand Coretime\n\nPolkadot has dedicated cores assigned to provide core time on demand. These cores are excluded from the coretime sales and are reserved for on-demand parachains, which pay in DOT per block."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#introduction", "page_title": "Proof of Stake Consensus", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 692, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nPolkadot's Proof of Stake consensus model leverages a unique hybrid approach by design to promote decentralized and secure network operations. In traditional Proof of Stake (PoS) systems, a node's ability to validate transactions is tied to its token holdings, which can lead to centralization risks and limited validator participation. Polkadot addresses these concerns through its Nominated Proof of Stake (NPoS) model and a combination of advanced consensus mechanisms to ensure efficient block production and strong finality guarantees. This combination enables the Polkadot network to scale while maintaining security and decentralization."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#nominated-proof-of-stake", "page_title": "Proof of Stake Consensus", "index": 1, "depth": 2, "title": "Nominated Proof of Stake", "anchor": "nominated-proof-of-stake", "start_char": 692, "end_char": 1667, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominated Proof of Stake\n\nPolkadot uses Nominated Proof of Stake (NPoS) to select the validator set and secure the network. This model is designed to maximize decentralization and security by balancing the roles of [validators](../../../wiki/learn/learn-validator.md) and [nominators](../../../wiki/learn/learn-nominator.md).\n\n- **Validators**: Play a key role in maintaining the network's integrity. They produce new blocks, validate parachain blocks, and ensure the finality of transactions across the relay chain.\n- **Nominators**: Support the network by selecting validators to back with their stake. This mechanism allows users who don't want to run a validator node to still participate in securing the network and earn rewards based on the validators they support.\n\nIn Polkadot's NPoS system, nominators can delegate their tokens to trusted validators, giving them voting power in selecting validators while spreading security responsibilities across the network."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#hybrid-consensus", "page_title": "Proof of Stake Consensus", "index": 2, "depth": 2, "title": "Hybrid Consensus", "anchor": "hybrid-consensus", "start_char": 1667, "end_char": 2719, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Hybrid Consensus\n\nPolkadot employs a hybrid consensus model that combines two key protocols: a finality gadget called [GRANDPA](#finality-gadget-grandpa) and a block production mechanism known as [BABE](#block-production-babe). This hybrid approach enables the network to benefit from both rapid block production and provable finality, ensuring security and performance.\n\nThe hybrid consensus model has some key advantages:\n\n- **Probabilistic finality**: With BABE constantly producing new blocks, Polkadot ensures that the network continues to make progress, even when a final decision has not yet been reached on which chain is the true canonical chain.\n\n- **Provable finality**: GRANDPA guarantees that once a block is finalized, it can never be reverted, ensuring that all network participants agree on the finalized chain.\n\nBy using separate protocols for block production and finality, Polkadot can achieve rapid block creation and strong guarantees of finality while avoiding the typical trade-offs seen in traditional consensus mechanisms."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#block-production-babe", "page_title": "Proof of Stake Consensus", "index": 3, "depth": 2, "title": "Block Production - BABE", "anchor": "block-production-babe", "start_char": 2719, "end_char": 4503, "estimated_token_count": 348, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Block Production - BABE\n\nBlind Assignment for Blockchain Extension (BABE) is Polkadot's block production mechanism, working with GRANDPA to ensure blocks are produced consistently across the network. As validators participate in BABE, they are assigned block production slots through a randomness-based lottery system. This helps determine which validator is responsible for producing a block at a given time. BABE shares similarities with [Ouroboros Praos](https://eprint.iacr.org/2017/573.pdf) but differs in key aspects like chain selection rules and slot timing.\n\nKey features of BABE include:\n\n- **Epochs and slots**: BABE operates in phases called epochs, each of which is divided into slots (around 6 seconds per slot). Validators are assigned slots at the beginning of each epoch based on stake and randomness.\n\n- **Randomized block production**: Validators enter a lottery to determine which will produce a block in a specific slot. This randomness is sourced from the relay chain's [randomness cycle](/reference/parachains/randomness/).\n\n- **Multiple block producers per slot**: In some cases, more than one validator might win the lottery for the same slot, resulting in multiple blocks being produced. These blocks are broadcasted, and the network's fork choice rule helps decide which chain to follow.\n\n- **Handling empty slots**: If no validators win the lottery for a slot, a secondary selection algorithm ensures that a block is still produced. Validators selected through this method always produce a block, ensuring no slots are skipped.\n\nBABE's combination of randomness and slot allocation creates a secure, decentralized system for consistent block production while also allowing for fork resolution when multiple validators produce blocks for the same slot."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#validator-participation", "page_title": "Proof of Stake Consensus", "index": 4, "depth": 3, "title": "Validator Participation", "anchor": "validator-participation", "start_char": 4503, "end_char": 6045, "estimated_token_count": 292, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Validator Participation\n\nIn BABE, validators participate in a lottery for every slot to determine whether they are responsible for producing a block during that slot. This process's randomness ensures a decentralized and unpredictable block production mechanism.\n\nThere are two lottery outcomes for any given slot that initiate additional processes:\n\n- **Multiple validators in a slot**: Due to the randomness, multiple validators can be selected to produce a block for the same slot. When this happens, each validator produces a block and broadcasts it to the network resulting in a race condition. The network's topology and latency then determine which block reaches the majority of nodes first. BABE allows both chains to continue building until the finalization process resolves which one becomes canonical. The [Fork Choice](#fork-choice) rule is then used to decide which chain the network should follow.\n\n- **No validators in a slot**: On occasions when no validator is selected by the lottery, a secondary validator selection algorithm steps in. This backup ensures that a block is still produced, preventing skipped slots. However, if the primary block produced by a verifiable random function [(VRF)-selected](/reference/parachains/randomness/#vrf) validator exists for that slot, the secondary block will be ignored. As a result, every slot will have either a primary or a secondary block.\n\nThis design ensures continuous block production, even in cases of multiple competing validators or an absence of selected validators."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#additional-resources", "page_title": "Proof of Stake Consensus", "index": 5, "depth": 3, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 6045, "end_char": 6289, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Additional Resources\n\nFor further technical insights about BABE, including cryptographic details and formal proofs, see the [BABE paper](https://github.com/paritytech/research/blob/master/docs/Polkadot/protocols/block-production/Babe.md)."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#finality-gadget-grandpa", "page_title": "Proof of Stake Consensus", "index": 6, "depth": 2, "title": "Finality Gadget - GRANDPA", "anchor": "finality-gadget-grandpa", "start_char": 6289, "end_char": 7792, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Finality Gadget - GRANDPA\n\nGRANDPA (GHOST-based Recursive ANcestor Deriving Prefix Agreement) serves as the finality gadget for Polkadot's relay chain. Operating alongside the BABE block production mechanism, it ensures provable finality, giving participants confidence that blocks finalized by GRANDPA cannot be reverted.\n\nKey features of GRANDPA include:\n\n- **Independent finality service**: GRANDPA runs separately from the block production process, operating in parallel to ensure seamless finalization.\n- **Chain-based finalization**: Instead of finalizing one block at a time, GRANDPA finalizes entire chains, speeding up the process significantly.\n- **Batch finalization**: Can finalize multiple blocks in a single round, enhancing efficiency and minimizing delays in the network.\n- **Partial synchrony tolerance**: GRANDPA works effectively in a partially synchronous network environment, managing both asynchronous and synchronous conditions.\n- **Byzantine fault tolerance**: Can handle up to 1/5 Byzantine (malicious) nodes, ensuring the system remains secure even when faced with adversarial behavior.\n\n??? note \"What is GHOST?\"\n    [GHOST (Greedy Heaviest-Observed Subtree)](https://eprint.iacr.org/2018/104.pdf) is a consensus protocol used in blockchain networks to select the heaviest branch in a block tree. Unlike traditional longest-chain rules, GHOST can more efficiently handle high block production rates by considering the weight of subtrees rather than just the chain length."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#probabilistic-vs-provable-finality", "page_title": "Proof of Stake Consensus", "index": 7, "depth": 3, "title": "Probabilistic vs. Provable Finality", "anchor": "probabilistic-vs-provable-finality", "start_char": 7792, "end_char": 8598, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Probabilistic vs. Provable Finality\n\nIn traditional Proof of Work (PoW) blockchains, finality is probabilistic. As blocks are added to the chain, the probability that a block is final increases, but it can never be guaranteed. Eventual consensus means that all nodes will agree on a single version of the blockchain over time, but this process can be unpredictable and slow.\n\nConversely, GRANDPA provides provable finality, which means that once a block is finalized, it is irreversible. By using Byzantine fault-tolerant agreements, GRANDPA finalizes blocks more efficiently and securely than probabilistic mechanisms like Nakamoto consensus. Like Ethereum's Casper the Friendly Finality Gadget (FFG), GRANDPA ensures that finalized blocks cannot be reverted, offering stronger consensus guarantees."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#additional-resources_1", "page_title": "Proof of Stake Consensus", "index": 8, "depth": 3, "title": "Additional Resources", "anchor": "additional-resources_1", "start_char": 8598, "end_char": 9096, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Additional Resources\n\nFor technical insights, including formal proofs and detailed algorithms, see the [GRANDPA paper](https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf) from Web3 Foundation.\n\nFor a deeper look at the code behind GRANDPA, see the following GitHub repositories:\n\n- [GRANDPA Rust implementation](https://github.com/paritytech/finality-grandpa)\n- [GRANDPA Pallet](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/grandpa/src/lib.rs)"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#fork-choice", "page_title": "Proof of Stake Consensus", "index": 9, "depth": 2, "title": "Fork Choice", "anchor": "fork-choice", "start_char": 9096, "end_char": 9938, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Fork Choice\n\nThe fork choice of the relay chain combines BABE and GRANDPA:\n\n1. BABE must always build on the chain that GRANDPA has finalized.\n2. When there are forks after the finalized head, BABE builds on the chain with the most primary blocks to provide probabilistic finality.\n\n![Fork choice diagram](/images/reference/polkadot-hub/consensus-and-security/pos-consensus/consensus-protocols-01.webp)\n\nIn the preceding diagram, finalized blocks are black, and non-finalized blocks are yellow. Primary blocks are labeled '1', and secondary blocks are labeled '2.' The topmost chain is the longest chain originating from the last finalized block, but it is not selected because it only has one primary block at the time of evaluation. In comparison, the one below it originates from the last finalized block and has three primary blocks."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#additional-resources_2", "page_title": "Proof of Stake Consensus", "index": 10, "depth": 3, "title": "Additional Resources", "anchor": "additional-resources_2", "start_char": 9938, "end_char": 10493, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Additional Resources\n\nTo learn more about how BABE and GRANDPA work together to produce and finalize blocks on Kusama, see this [Block Production and Finalization in Polkadot](https://youtu.be/FiEAnVECa8c) talk from Web3 Foundation's Bill Laboon. \n\nFor an in-depth academic discussion about Polkadot's hybrid consensus model, see this [Block Production and Finalization in Polkadot: Understanding the BABE and GRANDPA Protocols](https://www.youtube.com/watch?v=1CuTSluL7v4&t=4s) MIT Cryptoeconomic Systems 2020 talk by Web3 Foundation's Bill Laboon."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-pos-consensus", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/pos-consensus/#bridging-beefy", "page_title": "Proof of Stake Consensus", "index": 11, "depth": 2, "title": "Bridging - BEEFY", "anchor": "bridging-beefy", "start_char": 10493, "end_char": 11898, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:366a7d3358e7c6340d247f92163967badbbdfe461719d09822c363961de9aa5d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bridging - BEEFY\n\nBridge Efficiency Enabling Finality Yielder (BEEFY) is a specialized protocol that extends the finality guarantees provided by GRANDPA. It is specifically designed to facilitate efficient bridging between Polkadot relay chains (such as Polkadot and Kusama) and external blockchains like Ethereum. While GRANDPA is well-suited for finalizing blocks within Polkadot, it has limitations when bridging external chains that weren't built with Polkadot's interoperability features in mind. BEEFY addresses these limitations by ensuring other networks can efficiently verify finality proofs.\n\nKey features of BEEFY include:\n\n- **Efficient finality proof verification**: BEEFY enables external networks to easily verify Polkadot finality proofs, ensuring seamless communication between chains.\n- **Merkle Mountain Ranges (MMR)**: This data structure is used to efficiently store and transmit proofs between chains, optimizing data storage and reducing transmission overhead.\n- **ECDSA signature schemes**: BEEFY uses ECDSA signatures, which are widely supported on Ethereum and other EVM-based chains, making integration with these ecosystems smoother.\n- **Light client optimization**: BEEFY reduces the computational burden on light clients by allowing them to check for a super-majority of validator votes rather than needing to process all validator signatures, improving performance."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#introduction", "page_title": "Overview of the Polkadot Relay Chain", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 13, "end_char": 755, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nPolkadot is a next-generation blockchain protocol designed to support a multi-chain future by enabling secure communication and interoperability between different blockchains. Built as a Layer-0 protocol, Polkadot introduces innovations like application-specific Layer-1 chains ([parachains](/reference/parachains/)), shared security through Nominated Proof of Stake (NPoS), and cross-chain interactions via its native [Cross-Consensus Messaging Format (XCM)](/parachains/interoperability/get-started/).\n\nThis guide covers key aspects of Polkadot’s architecture, including its high-level protocol structure, blockspace commoditization, and the role of its native token, DOT, in governance, staking, and resource allocation."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#polkadot-10", "page_title": "Overview of the Polkadot Relay Chain", "index": 1, "depth": 2, "title": "Polkadot 1.0", "anchor": "polkadot-10", "start_char": 755, "end_char": 2662, "estimated_token_count": 421, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot 1.0\n\nPolkadot 1.0 represents the state of Polkadot as of 2023, coinciding with the release of [Polkadot runtime v1.0.0](https://github.com/paritytech/polkadot/releases/tag/v1.0.0). This section will focus on Polkadot 1.0, along with philosophical insights into network resilience and blockspace.\n\nAs a Layer-0 blockchain, Polkadot contributes to the multi-chain vision through several key innovations and initiatives, including:\n\n- **Application-specific Layer-1 blockchains (parachains)**: Polkadot's sharded network allows for parallel transaction processing, with shards that can have unique state transition functions, enabling custom-built L1 chains optimized for specific applications.\n\n- **Shared security and scalability**: L1 chains connected to Polkadot benefit from its [Nominated Proof of Stake (NPoS)](/reference/polkadot-hub/consensus-and-security/pos-consensus/#nominated-proof-of-stake) system, providing security out-of-the-box without the need to bootstrap their own.\n\n- **Secure interoperability**: Polkadot's native interoperability enables seamless data and value exchange between parachains. This interoperability can also be used outside of the ecosystem for bridging with external networks.\n\n- **Resilient infrastructure**: Decentralized and scalable, Polkadot ensures ongoing support for development and community initiatives via its on-chain [treasury](../../../wiki/learn/learn-polkadot-opengov-treasury.md) and governance.\n\n- **Rapid L1 development**: The [Polkadot SDK](/reference/parachains/) allows fast, flexible creation and deployment of Layer-1 chains.\n\n- **Cultivating the next generation of Web3 developers**: Polkadot supports the growth of Web3 core developers through initiatives such as.\n\n    - [Polkadot Blockchain Academy](https://polkadot.academy/)\n    - [EdX courses](https://www.edx.org/school/web3x)\n    - Rust and Substrate courses (coming soon)"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#high-level-architecture", "page_title": "Overview of the Polkadot Relay Chain", "index": 2, "depth": 3, "title": "High-Level Architecture", "anchor": "high-level-architecture", "start_char": 2662, "end_char": 3944, "estimated_token_count": 258, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### High-Level Architecture\n\nPolkadot features a chain that serves as the central component of the system. This chain is depicted as a ring encircled by several parachains that are connected to it.\n\nAccording to Polkadot's design, any blockchain that can compile to WebAssembly (Wasm) and adheres to the Parachains Protocol becomes a parachain on the Polkadot network.\n\nHere’s a high-level overview of the Polkadot protocol architecture:\n\n![](/images/reference/polkadot-hub/consensus-and-security/relay-chain/relay-chain-01.webp)\n\nParachains propose blocks to Polkadot validators, who check for availability and validity before finalizing them. With the relay chain providing security, collators—full nodes of parachains—can focus on their tasks without needing strong incentives.\n\nThe [Cross-Consensus Messaging Format (XCM)](/parachains/interoperability/get-started/) allows parachains to exchange messages freely, leveraging the chain's security for trust-free communication.\n\nIn order to interact with chains that want to use their own finalization process (e.g., Bitcoin), Polkadot has [bridges](/reference/parachains/interoperability/#bridges-connecting-external-networks) that offer two-way compatibility, meaning that transactions can be made between different parachains."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#polkadots-additional-functionalities", "page_title": "Overview of the Polkadot Relay Chain", "index": 3, "depth": 3, "title": "Polkadot's Additional Functionalities", "anchor": "polkadots-additional-functionalities", "start_char": 3944, "end_char": 5759, "estimated_token_count": 389, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot's Additional Functionalities\n\nHistorically, obtaining core slots on Polkadot chain relied upon crowdloans and auctions. Chain cores were leased through auctions for three-month periods, up to a maximum of two years. Crowdloans enabled users to securely lend funds to teams for lease deposits in exchange for pre-sale tokens, which is the only way to access slots on Polkadot 1.0. Auctions are now deprecated in favor of [coretime](/reference/polkadot-hub/consensus-and-security/agile-coretime/).\n\nAdditionally, the chain handles [staking](../../../wiki/learn/learn-staking.md), [accounts](/reference/parachains/accounts/), balances, and [governance](/reference/governance/).\n\n#### Agile Coretime\n\nThe new and more efficient way of obtaining core on Polkadot is to go through the process of purchasing coretime.\n\n[Agile coretime](/reference/polkadot-hub/consensus-and-security/agile-coretime/) improves the efficient use of Polkadot's network resources and offers economic flexibility for developers, extending Polkadot's capabilities far beyond the original vision outlined in the [whitepaper](https://assets.polkadot.network/Polkadot-whitepaper.pdf)..\n\nIt enables parachains to purchase monthly \"bulk\" allocations of coretime (the time allocated for utilizing a core, measured in Polkadot relay chain blocks), ensuring heavy-duty parachains that can author a block every six seconds with [Asynchronous Backing](../../../wiki/learn/learn-async-backing.md#asynchronous-backing) can reliably renew their coretime each month. Although six-second block times are now the default, parachains have the option of producing blocks less frequently.\n\nRenewal orders are prioritized over new orders, offering stability against price fluctuations and helping parachains budget more effectively for project costs."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#polkadots-resilience", "page_title": "Overview of the Polkadot Relay Chain", "index": 4, "depth": 3, "title": "Polkadot's Resilience", "anchor": "polkadots-resilience", "start_char": 5759, "end_char": 7011, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot's Resilience\n\nDecentralization is a vital component of blockchain networks, but it comes with trade-offs:\n\n- An overly decentralized network may face challenges in reaching consensus and require significant energy to operate.\n- Also, a network that achieves consensus quickly risks centralization, making it easier to manipulate or attack.\n\nA network should be decentralized enough to prevent manipulative or malicious influence. In this sense, decentralization is a tool for achieving resilience.\n\nPolkadot 1.0 currently achieves resilience through several strategies:\n\n- **Nominated Proof of Stake (NPoS)**: Ensures that the stake per validator is maximized and evenly distributed among validators.\n\n- **Decentralized nodes**: Designed to encourage operators to join the network. This program aims to expand and diversify the validators in the ecosystem who aim to become independent of the program during their term. Feel free to explore more about the program on the official [Decentralized Nodes](https://nodes.web3.foundation/) page.\n\n- **On-chain treasury and governance**: Known as [OpenGov](/reference/governance/), this system allows every decision to be made through public referenda, enabling any token holder to cast a vote."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#polkadots-blockspace", "page_title": "Overview of the Polkadot Relay Chain", "index": 5, "depth": 3, "title": "Polkadot's Blockspace", "anchor": "polkadots-blockspace", "start_char": 7011, "end_char": 8699, "estimated_token_count": 322, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot's Blockspace\n\nPolkadot 1.0’s design allows for the commoditization of blockspace.\n\nBlockspace is a blockchain's capacity to finalize and commit operations, encompassing its security, computing, and storage capabilities. Its characteristics can vary across different blockchains, affecting security, flexibility, and availability.\n\n- **Security**: Measures the robustness of blockspace in Proof of Stake (PoS) networks linked to the stake locked on validator nodes, the variance in stake among validators, and the total number of validators. It also considers social centralization (how many validators are owned by single operators) and physical centralization (how many validators run on the same service provider).\n\n- **Flexibility**: Reflects the functionalities and types of data that can be stored, with high-quality data essential to avoid bottlenecks in critical processes.\n\n- **Availability**: Indicates how easily users can access blockspace. It should be easily accessible, allowing diverse business models to thrive, ideally regulated by a marketplace based on demand and supplemented by options for \"second-hand\" blockspace.\n\nPolkadot is built on core blockspace principles, but there's room for improvement. Tasks like balance transfers, staking, and governance are managed on the relay chain.\n\nDelegating these responsibilities to [system chains](/reference/polkadot-hub/#core-components) could enhance flexibility and allow the relay chain to concentrate on providing shared security and interoperability.\n\nFor more information about blockspace, read [Robert Habermeier’s technical blog post](https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/)."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#dot-token", "page_title": "Overview of the Polkadot Relay Chain", "index": 6, "depth": 2, "title": "DOT Token", "anchor": "dot-token", "start_char": 8699, "end_char": 8992, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## DOT Token\n\nDOT is the native token of the Polkadot network, much like BTC for Bitcoin and Ether for the Ethereum blockchain. DOT has 10 decimals, uses the Planck base unit, and has a balance type of `u128`. The same is true for Kusama's KSM token with the exception of having 12 decimals."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#redenomination-of-dot", "page_title": "Overview of the Polkadot Relay Chain", "index": 7, "depth": 3, "title": "Redenomination of DOT", "anchor": "redenomination-of-dot", "start_char": 8992, "end_char": 9544, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Redenomination of DOT\n    \nPolkadot conducted a community poll, which ended on 27 July 2020 at block 888,888, to decide whether to redenominate the DOT token. The stakeholders chose to redenominate the token, changing the value of 1 DOT from 1e12 plancks to 1e10 plancks.\n\nImportantly, this did not affect the network's total number of base units (plancks); it only affects how a single DOT is represented. The redenomination became effective 72 hours after transfers were enabled, occurring at block 1,248,328 on 21 August 2020 around 16:50 UTC."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#the-planck-unit", "page_title": "Overview of the Polkadot Relay Chain", "index": 8, "depth": 3, "title": "The Planck Unit", "anchor": "the-planck-unit", "start_char": 9544, "end_char": 9950, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### The Planck Unit\n\nThe smallest unit of account balance on Polkadot SDK-based blockchains (such as Polkadot and Kusama) is called _Planck_, named after the Planck length, the smallest measurable distance in the physical universe.\n\nSimilar to how BTC's smallest unit is the Satoshi and ETH's is the Wei, Polkadot's native token DOT equals 1e10 Planck, while Kusama's native token KSM equals 1e12 Planck."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#uses-for-dot", "page_title": "Overview of the Polkadot Relay Chain", "index": 9, "depth": 3, "title": "Uses for DOT", "anchor": "uses-for-dot", "start_char": 9950, "end_char": 10517, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Uses for DOT\n\nDOT serves three primary functions within the Polkadot network:\n\n- **Governance**: It is used to participate in the governance of the network.\n- **Staking**: DOT is staked to support the network's operation and security.\n- **Buying coretime**: Used to purchase coretime in-bulk or on-demand and access the  chain to benefit from Polkadot's security and interoperability.\n\nAdditionally, DOT can serve as a transferable token. For example, DOT, held in the treasury, can be allocated to teams developing projects that benefit the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-consensus-and-security-relay-chain", "url": "https://developer.polkadot.com/reference/polkadot-hub/consensus-and-security/relay-chain/#jam-and-the-road-ahead", "page_title": "Overview of the Polkadot Relay Chain", "index": 10, "depth": 2, "title": "JAM and the Road Ahead", "anchor": "jam-and-the-road-ahead", "start_char": 10517, "end_char": 11880, "estimated_token_count": 239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be35d221ec75522614c10ce35613941f103c0f53078dd4e9750336f179b1955b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## JAM and the Road Ahead\n\nThe Join-Accumulate Machine (JAM) represents a transformative redesign of Polkadot's core architecture, envisioned as the successor to the current relay chain. Unlike traditional blockchain architectures, JAM introduces a unique computational model that processes work through two primary functions:\n\n- **Join**: Handles data integration.\n- **Accumulate**: Folds computations into the chain's state.\n\nJAM removes many of the opinions and constraints of the current relay chain while maintaining its core security properties. Expected improvements include:\n\n- **Permissionless code execution**: JAM is designed to be more generic and flexible, allowing for permissionless code execution through services that can be deployed without governance approval.\n- **More effective block time utilization**: JAM's efficient pipeline processing model places the prior state root in block headers instead of the posterior state root, enabling more effective utilization of block time for computations.\n\nThis architectural evolution promises to enhance Polkadot's scalability and flexibility while maintaining robust security guarantees. JAM is planned to be rolled out to Polkadot as a single, complete upgrade rather than a stream of smaller updates. This approach seeks to minimize the developer overhead required to address any breaking changes."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#use-cases", "page_title": "Data Storage", "index": 0, "depth": 2, "title": "Use Cases", "anchor": "use-cases", "start_char": 957, "end_char": 1571, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use Cases\n\nThe Bulletin Chain is suited for any scenario where you need decentralized, content-addressable storage on Polkadot. Common use cases include:\n\n- **Static sites**: Host a static website entirely on-chain, served via IPFS-compatible gateways.\n- **Images and media assets**: Store images, icons, or other media files with permanent, verifiable CIDs.\n- **Application data**: Persist configuration files, metadata, or other structured data that needs to be publicly accessible and tamper-proof.\n- **Document storage**: Store documents, certificates, or records that benefit from on-chain verifiability."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#key-concepts", "page_title": "Data Storage", "index": 1, "depth": 2, "title": "Key Concepts", "anchor": "key-concepts", "start_char": 1571, "end_char": 2234, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Key Concepts\n\n- **No balances**: The chain does not use token balances for transaction fees. Authorization is required to store data.\n- **Authorization-based access**: Accounts must be authorized before they can submit storage transactions.\n- **Content Identifiers (CIDs)**: Stored data is addressable via IPFS-compatible CIDs, enabling interoperability with IPFS tooling.\n- **Retention periods**: Stored data is retained for a limited period (~2 weeks on Polkadot TestNet) and must be renewed to persist beyond that.\n- **Chunked uploads**: Files larger than 2 MiB must be split into chunks, each stored as a separate transaction (max 2 MiB per transaction)."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#authorization", "page_title": "Data Storage", "index": 2, "depth": 2, "title": "Authorization", "anchor": "authorization", "start_char": 2234, "end_char": 3182, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Authorization\n\nThe Bulletin Chain has no token balances — there are no fees to pay. Instead, storage access is controlled through an authorization system that prevents spam and ensures fair usage. Only privileged origins can grant authorizations, as described in [Who Grants Authorization](#who-grants-authorization).\n\nAuthorization is not a token transfer — it's a **permission entry** recorded in the chain's storage that specifies:\n\n- The **account** allowed to store data\n- The number of **transactions** and **bytes** the account can use\n- An **expiration block** after which the authorization becomes invalid, set a fixed number of blocks after the authorization is granted (14 days on Polkadot TestNet)\n\nAuthorization is consumed as you store data — each storage transaction decrements your remaining transaction count and byte allowance. Once your allocation is used up or the expiration block is reached, you need a new authorization."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#who-grants-authorization", "page_title": "Data Storage", "index": 3, "depth": 3, "title": "Who Grants Authorization", "anchor": "who-grants-authorization", "start_char": 3182, "end_char": 4064, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Who Grants Authorization\n\nThe `authorize_account` and `authorize_preimage` extrinsics require the _authorizer_ origin. On Polkadot TestNet, the authorizer origin accepts Root, sibling parachains that are allowed to manage authorizations, and accounts that Root registers with `add_authorizer`. Each registered account has a budget that limits how much authorization it can grant.\n\nHow you get authorization depends on the network:\n\n| Network | Authorization Source |\n|:--:|:--:|\n| Polkadot TestNet | The [Console UI Faucet](https://paritytech.github.io/polkadot-bulletin-chain/) grants authorization for testing |\n| Local Development | The `//Alice` account has sudo access for local testing |\n| Polkadot Mainnet | The authorization model is being finalized. Check the [Bulletin Chain repository](https://github.com/paritytech/polkadot-bulletin-chain) for the latest updates |"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#account-authorization", "page_title": "Data Storage", "index": 4, "depth": 3, "title": "Account Authorization", "anchor": "account-authorization", "start_char": 4064, "end_char": 4502, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Account Authorization\n\nAccount authorization grants a specific account the ability to store any data on-chain, up to the allocated transaction and byte limits. This is the most common authorization type for active users.\n\n- Granted via the `authorize_account` extrinsic (authorizer origin)\n- Can be refreshed with `refresh_account_authorization`\n- Expired authorizations can be cleaned up with `remove_expired_account_authorization`"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#preimage-authorization", "page_title": "Data Storage", "index": 5, "depth": 3, "title": "Preimage Authorization", "anchor": "preimage-authorization", "start_char": 4502, "end_char": 5011, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Preimage Authorization\n\nPreimage authorization grants storage access to anyone who can provide the preimage of a specific hash. This is useful for sponsored uploads where a third party authorizes the storage of specific, known content without needing to know which account will submit it.\n\n- Granted via the `authorize_preimage` extrinsic (authorizer origin)\n- Can be refreshed with `refresh_preimage_authorization`\n- Expired authorizations can be cleaned up with `remove_expired_preimage_authorization`"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#capacity-planning", "page_title": "Data Storage", "index": 6, "depth": 3, "title": "Capacity Planning", "anchor": "capacity-planning", "start_char": 5011, "end_char": 5419, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Capacity Planning\n\nWhen requesting authorization, estimate how many transactions and bytes you need. For simple uploads, a single file of up to 2 MiB requires one transaction. For chunked uploads (files over 2 MiB), each chunk requires a separate transaction, plus one additional transaction for the manifest. With the Bulletin SDKs' default chunk size of 1 MiB, a 10 MiB file requires 11 transactions."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#transaction-storage-pallet", "page_title": "Data Storage", "index": 7, "depth": 2, "title": "Transaction Storage Pallet", "anchor": "transaction-storage-pallet", "start_char": 5419, "end_char": 9635, "estimated_token_count": 839, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Transaction Storage Pallet\n\nThe `TransactionStorage` pallet is the core module for interacting with the Bulletin Chain. It provides the following extrinsics:\n\n| Extrinsic | Description | Origin |\n|:--:|:--:|:--:|\n| `store(data)` | Store data on-chain. Emits `Stored` with the transaction index, content hash, and CID | Authorized account, Root, or unsigned with a matching preimage authorization |\n| `store_with_cid_config(cid, data)` | Store data with an explicit CID configuration (codec and hashing algorithm) | Authorized account, Root, or unsigned with a matching preimage authorization |\n| `authorize_account(who, transactions, bytes)` | Authorize an account to store up to `bytes` bytes in `transactions` transactions. Calling it again before the authorization expires adds to the existing allowance | Authorizer |\n| `authorize_preimage(content_hash, max_size)` | Authorize anyone to store data with the given content hash, up to `max_size` bytes | Authorizer |\n| `refresh_account_authorization(who)` | Extend the expiration of an existing account authorization. The allowance is unchanged | Authorizer |\n| `refresh_preimage_authorization(content_hash)` | Extend the expiration of an existing preimage authorization. The allowance is unchanged | Authorizer |\n| `remove_expired_account_authorization(who)` | Remove an expired account authorization from storage | Any account |\n| `remove_expired_preimage_authorization(content_hash)` | Remove an expired preimage authorization from storage | Any account |\n| `add_authorizer(who, budget)` | Allow an account to grant authorizations, within the given budget | Root |\n| `remove_authorizer(who)` | Remove an account from the allowed authorizers | Root |\n| `remove_exhausted_authorizer(who)` | Remove an authorizer whose budget is used up or whose validity period has ended | Any account |\n| `apply_block_inherents(proof)` | Submit the block's storage proof | None (inherent) |\n\nAuthorizations expire after a fixed number of blocks (14 days on Polkadot TestNet).\n\nThe pallet also exposes the following storage items:\n\n| Storage Item | Type | Description |\n|:--:|:--:|:--:|\n| `Authorizations` | `Map<AuthorizationScope, Authorization>` | Active authorizations, keyed by account (`Account`) or content hash (`Preimage`) |\n| `AllowedAuthorizers` | `Map<AccountId, AuthorizerBudget>` | Accounts allowed to grant authorizations, with their remaining budget |\n| `Transactions` | `Map<BlockNumber, Vec<TransactionInfo>>` | Metadata of the transactions stored in each block |\n| `TransactionByContentHash` | `Map<Hash, (BlockNumber, u32)>` | Most recent block number and transaction index for each content hash. Updated on every renewal |\n| `BlockTransactions` | `Vec<TransactionInfo>` | Transactions stored in the current block |\n| `ProofChecked` | `bool` | Whether the storage proof was checked in the current block |\n| `ByteFee` | `Balance` | The fee charged per byte of stored data |\n| `EntryFee` | `Balance` | The base fee charged per storage transaction |\n| `RetentionPeriod` | `BlockNumber` | The number of blocks for which stored data is retained |\n\nThe pallet emits the following events:\n\n| Event | Description |\n|:--:|:--:|\n| `Stored` | Emitted when data is stored. Contains the transaction index, content hash, and CID |\n| `ProofChecked` | Emitted when a storage proof is successfully verified |\n| `AccountAuthorized` | Emitted when an account is granted storage authorization |\n| `AccountAuthorizationRefreshed` | Emitted when an account authorization is refreshed |\n| `PreimageAuthorized` | Emitted when a content hash is granted storage authorization |\n| `PreimageAuthorizationRefreshed` | Emitted when a preimage authorization is refreshed |\n| `ExpiredAccountAuthorizationRemoved` | Emitted when an expired account authorization is removed |\n| `ExpiredPreimageAuthorizationRemoved` | Emitted when an expired preimage authorization is removed |\n| `AuthorizerAdded` | Emitted when an account is added to the allowed authorizers |\n| `AuthorizerRemoved` | Emitted when Root removes an account from the allowed authorizers |\n| `ExhaustedAuthorizerRemoved` | Emitted when an authorizer is removed because its budget is used up or its validity period has ended |"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#data-renewal-pallet", "page_title": "Data Storage", "index": 8, "depth": 2, "title": "Data Renewal Pallet", "anchor": "data-renewal-pallet", "start_char": 9635, "end_char": 13165, "estimated_token_count": 740, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Data Renewal Pallet\n\nStored data is removed when its retention period ends. The `DataRenewal` pallet extends the retention of data stored through the `TransactionStorage` pallet. Renewal calls identify the data in one of two ways:\n\n- **`Position { block, index }`**: The block number and transaction index of the most recent store or renewal of the data.\n- **`ContentHash(hash)`**: The content hash of the data. The chain maps each content hash to its most recent position, so this form keeps working after the data is renewed.\n\nThe pallet provides the following extrinsics:\n\n| Extrinsic | Description | Origin |\n|:--:|:--:|:--:|\n| `renew(entry)` | Schedule a one-time renewal. It takes effect when the retention period ends, and the registration is then removed. The renewal is paid from your authorization when you register it | Authorized account |\n| `force_renew(entry)` | Renew the data immediately | Authorized account, Root, or unsigned with a matching preimage authorization |\n| `enable_auto_renew(content_hash)` | Renew the data at the end of every retention period. The first renewal is paid when you register; later renewals are charged to your authorization, and the registration is dropped if your authorization cannot cover one | Authorized account |\n| `disable_auto_renew(content_hash)` | Cancel recurring renewal. The owner can disable it only after the prepaid first renewal has taken effect | Authorized account that owns the registration, or Root |\n| `process_pending_renewals()` | Process the renewals due in the current block | None (inherent) |\n\nEach content hash can have only one registered renewal at a time, across all accounts: `renew` and `enable_auto_renew` fail with `RenewalAlreadyEnabled` while a registration exists.\n\nRenewed bytes are tracked separately from stored bytes. A renewal is rejected when the bytes already renewed under the authorization, plus the size of the data, would exceed the authorization's byte allowance (`InvalidTransaction::Custom(5)`), or when it would exceed the chain-wide cap on renewed storage, `MaxPermanentStorageSize` (`InvalidTransaction::Custom(6)`). To check whether a renewal would be accepted, call the `BulletinTransactionStorageApi.can_renew(account, entry)` runtime API.\n\nThe pallet exposes the following storage items:\n\n| Storage Item | Type | Description |\n|:--:|:--:|:--:|\n| `Renewals` | `Map<Hash, RenewalData>` | Renewal registrations, keyed by content hash |\n| `PendingRenewals` | `Vec<(Hash, TransactionInfo, RenewalData)>` | Renewals to process in the current block |\n| `PermanentStorageUsed` | `u64` | Total bytes of renewed data on chain, across all accounts |\n\nThe pallet emits the following events:\n\n| Event | Description |\n|:--:|:--:|\n| `Renewed` | Emitted when data is renewed immediately with `force_renew`. Contains the new transaction index and the content hash |\n| `RenewalEnabled` | Emitted when a renewal is registered. `recurring` is `true` for `enable_auto_renew` |\n| `AutoRenewalDisabled` | Emitted when recurring renewal is disabled |\n| `DataRenewed` | Emitted when a registered renewal takes effect. Contains the new transaction index, the content hash, and the account |\n| `RenewalFailed` | Emitted when a registered renewal cannot be paid from the account's authorization. The registration is dropped and the data expires |\n| `PermanentStorageUsedUpdated` | Emitted when the total of renewed storage changes |\n| `PermanentStorageNearCap` | Emitted when the total of renewed storage crosses 80% of `MaxPermanentStorageSize` |"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#ipfs-integration-and-data-retrieval", "page_title": "Data Storage", "index": 9, "depth": 2, "title": "IPFS Integration and Data Retrieval", "anchor": "ipfs-integration-and-data-retrieval", "start_char": 13165, "end_char": 13551, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## IPFS Integration and Data Retrieval\n\nThe Bulletin Chain follows a **\"write-to-chain, read-from-network\"** architecture. Data is stored via on-chain transactions and retrieved directly from collator nodes using the CID. The chain is designed to work seamlessly with the [InterPlanetary File System (IPFS)](https://ipfs.tech/) — Bulletin Chain nodes are themselves IPFS participants."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#how-it-works", "page_title": "Data Storage", "index": 10, "depth": 3, "title": "How It Works", "anchor": "how-it-works", "start_char": 13551, "end_char": 14169, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How It Works\n\nWhen you store data on the Bulletin Chain, the following happens:\n\n1. **CID generation**: The chain computes an IPFS-compatible [Content Identifier (CID)](https://docs.ipfs.tech/concepts/content-addressing/) from your data using a cryptographic hash. This CID uniquely identifies the content regardless of where it is stored.\n2. **Bitswap serving**: Bulletin Chain collator nodes implement the IPFS [Bitswap](https://docs.ipfs.tech/concepts/bitswap/) wire protocol, which is the standard way IPFS nodes exchange data blocks. IPFS clients can request data directly from collator nodes using the CID."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#retrieval-methods", "page_title": "Data Storage", "index": 11, "depth": 3, "title": "Retrieval Methods", "anchor": "retrieval-methods", "start_char": 14169, "end_char": 15365, "estimated_token_count": 282, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Retrieval Methods\n\n| Method | Status | Description |\n|:--:|:--:|:--:|\n| [Console UI](https://paritytech.github.io/polkadot-bulletin-chain/) | Available | Download data via the Bulletin Chain Console UI using P2P or the IPFS gateway. The simplest option — no code required |\n| Direct P2P ([Helia](https://helia.io/)) | Available | Connect to collator nodes via [libp2p](https://libp2p.io/) and fetch data using the CID. The recommended decentralized approach for production applications |\n| Bulletin Chain IPFS Gateway | Available | Access data via `https://paseo-bulletin-next-ipfs.polkadot.io/ipfs/<CID>` for Polkadot TestNet. Can also be used programmatically via `fetch()` |\n| Smoldot Light Client | Coming Soon | Fully decentralized retrieval via the `bitswap_block` RPC, enabling trustless data access without connecting to a full node |\n\n!!! warning\n    Generic public IPFS gateways like `ipfs.io` or `cloudflare-ipfs.com` are **deprecated** for Bulletin Chain retrieval. They do not reliably serve Bulletin Chain data and introduce external single points of failure.\n\n!!! tip\n    For fully decentralized retrieval, use Direct P2P (Helia) or the upcoming Smoldot light client support."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#data-lifecycle", "page_title": "Data Storage", "index": 12, "depth": 2, "title": "Data Lifecycle", "anchor": "data-lifecycle", "start_char": 15365, "end_char": 16086, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Data Lifecycle\n\nThe typical lifecycle of data on the Bulletin Chain follows these steps:\n\n1. **Authorization**: Obtain authorization to store data through the faucet (Polkadot TestNet) or from a privileged account (MainNet).\n2. **Storage**: Submit a `store` or `store_with_cid_config` transaction with your data payload.\n3. **Retrieval**: Fetch data from collator nodes using the CID via the Console UI, Direct P2P (Helia), the Bulletin Chain IPFS gateway, or (coming soon) the Smoldot light client.\n4. **Renewal**: Before the retention period ends, register a renewal with the `DataRenewal` pallet: `renew` for a one-time renewal or `enable_auto_renew` for recurring renewal. Use `force_renew` to renew immediately."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#size-limits", "page_title": "Data Storage", "index": 13, "depth": 2, "title": "Size Limits", "anchor": "size-limits", "start_char": 16086, "end_char": 16936, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Size Limits\n\n| Parameter | Value |\n|:---:|:--:|\n| Max transaction size | 2 MiB |\n| Default chunk size (Bulletin SDKs) | 1 MiB |\n| Max file size per chunking operation (Bulletin SDKs) | 64 MiB |\n| Retention period (Polkadot TestNet) | ~2 weeks |\n\nFor files larger than the max transaction size, data must be split into chunks using the [DAG-PB (UnixFS)](https://ipld.io/specs/codecs/dag-pb/) standard. Each chunk is stored as a separate transaction. A final manifest transaction is uploaded last, containing the CIDs of all chunks. The manifest's CID becomes the root CID for the complete file. IPFS clients can then retrieve and reassemble the file automatically using the manifest.\n\nThe Bulletin SDKs chunk at most 64 MiB in a single operation. To store a larger file, split it into segments of at most 64 MiB and chunk each segment separately."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#network-endpoints", "page_title": "Data Storage", "index": 14, "depth": 2, "title": "Network Endpoints", "anchor": "network-endpoints", "start_char": 16936, "end_char": 17167, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Network Endpoints\n\n| Network | Endpoint |\n|:--:|:--:|\n| Bulletin Chain RPC (Polkadot TestNet) | `wss://paseo-bulletin-next-rpc.polkadot.io` |\n| IPFS Gateway (Polkadot TestNet) | `https://paseo-bulletin-next-ipfs.polkadot.io` |"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-data-storage", "url": "https://developer.polkadot.com/reference/polkadot-hub/data-storage/#where-to-go-next", "page_title": "Data Storage", "index": 15, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 17167, "end_char": 17533, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4dfe8563bf6358605aaadc879d767581e8c324abdf677e3efd8398c1fa81ca10", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Store Data on the Bulletin Chain__\n\n    ---\n\n    Learn how to authorize your account, store an image, retrieve it, and manage renewals using the Console UI or PAPI.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/store-data/bulletin-chain/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#introduction", "page_title": "Polkadot Hub Overview", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 1, "end_char": 711, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub is the entry point for all users and application developers to Polkadot. It provides access to essential Web3 services, including smart contracts, staking, governance, identity management, and cross-ecosystem interoperability—without requiring you to deploy or manage a parachain.\n\nThe Hub encompasses a set of core functionality that enables developers and users to build and interact with applications on Polkadot. This specialized system of parachains and services works together seamlessly to deliver a unified platform experience. The modular approach lets you interact with services optimized for specific use cases, while still benefiting from Polkadot's shared security."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#polkadot-hub-capabilities", "page_title": "Polkadot Hub Overview", "index": 1, "depth": 2, "title": "Polkadot Hub Capabilities", "anchor": "polkadot-hub-capabilities", "start_char": 711, "end_char": 1823, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot Hub Capabilities\n\nWhether you're just getting started or building complex applications, the Hub supports the ability to:\n \n- Hold, send, and receive DOT and other assets across the network.\n- Stake DOT to participate in network security and earn rewards.\n- Vote in governance referendums and shape Polkadot's future.\n- Create both fungible and non-fungible tokens and assets for your projects.\n- Pay transaction fees in any asset, not just DOT.\n- Register as an individual and establish your on-chain identity.\n\nFor more sophisticated development use cases, the Hub enables you to:\n\n- Deploy Ethereum-compatible smart contracts using Solidity or other EVM languages.\n- Build decentralized applications that leverage Polkadot's security and interoperability.\n- Create and manage fungible tokens and NFTs with low fees and flexible operations.\n- Manage cross-chain interactions through XCM messaging with other parachains.\n- Set verified identities and apply for network opportunities like the Ambassador Program.\n- Join collectives and participate in governance organizations with specialized roles."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#core-components", "page_title": "Polkadot Hub Overview", "index": 2, "depth": 2, "title": "Core Components", "anchor": "core-components", "start_char": 1823, "end_char": 1982, "estimated_token_count": 24, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Components\n\nThe Polkadot Hub consists of several specialized system parachains and services working together as described in the following sections."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#smart-contracts", "page_title": "Polkadot Hub Overview", "index": 3, "depth": 3, "title": "Smart Contracts", "anchor": "smart-contracts", "start_char": 1982, "end_char": 2468, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Smart Contracts\n\n[Smart Contracts](/reference/polkadot-hub/smart-contracts/) on Polkadot Hub enable developers to deploy Ethereum-compatible smart contracts written in Solidity and other familiar EVM languages. Build decentralized applications with full access to Polkadot's security, interoperability, and cross-chain capabilities. Smart contracts on the Hub benefit from lower fees and integration with native Polkadot features, such as identity management and asset operations."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#asset-management", "page_title": "Polkadot Hub Overview", "index": 4, "depth": 3, "title": "Asset Management", "anchor": "asset-management", "start_char": 2468, "end_char": 3016, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Asset Management\n\n[Asset Management](/reference/polkadot-hub/assets/) provides the foundation for on-chain asset management. Create, manage, and transfer fungible tokens and NFTs across the ecosystem. Asset Management offers significantly lower transaction fees—approximately one-tenth the cost of relay chain transactions—and reduced deposit requirements, making it ideal for projects managing digital assets at scale. It also enables payment of transaction fees in non-native assets, providing developers and users with greater flexibility."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#people-chain", "page_title": "Polkadot Hub Overview", "index": 5, "depth": 3, "title": "People Chain", "anchor": "people-chain", "start_char": 3016, "end_char": 3442, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### People Chain\n\n[People Chain](/reference/polkadot-hub/people-and-identity/) powers Polkadot's decentralized identity system. Establish verifiable on-chain identities, control disclosure of personal information, and receive verification from trusted registrars. People Chain enables secure identity management with hierarchical sub-account support, forming the foundation for trusted interactions throughout the ecosystem."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#bridge-hub", "page_title": "Polkadot Hub Overview", "index": 6, "depth": 3, "title": "Bridge Hub", "anchor": "bridge-hub", "start_char": 3442, "end_char": 3837, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Bridge Hub\n\n[Bridge Hub](/reference/polkadot-hub/bridging/) facilitates trustless interactions between Polkadot and external blockchains like Ethereum and Kusama. Through implementations such as Snowbridge, Bridge Hub enables secure cross-chain communication via on-chain light clients and trustless relayers. This component ensures seamless interoperability beyond the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#consensus-security", "page_title": "Polkadot Hub Overview", "index": 7, "depth": 3, "title": "Consensus & Security", "anchor": "consensus-security", "start_char": 3837, "end_char": 4270, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Consensus & Security\n\n[Consensus and Security](/reference/polkadot-hub/consensus-and-security/relay-chain/) covers the fundamental mechanisms that protect the network. Learn about validator participation, how the relay chain validates all transactions, and the cryptoeconomic incentives that secure Polkadot. Understanding these mechanisms is essential for validators and anyone building critical infrastructure on the network."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#collectives-daos", "page_title": "Polkadot Hub Overview", "index": 8, "depth": 3, "title": "Collectives & DAOs", "anchor": "collectives-daos", "start_char": 4270, "end_char": 4662, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Collectives & DAOs\n\n[Collectives and DAOs](/reference/polkadot-hub/collectives-and-daos/) enable specialized governance organizations within Polkadot. Participate in collective membership, manage treasury operations, and engage in coordinated decision-making with groups aligned around specific purposes. This functionality supports the creation of autonomous organizations on Polkadot."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub", "url": "https://developer.polkadot.com/reference/polkadot-hub/#where-to-go-next", "page_title": "Polkadot Hub Overview", "index": 9, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4662, "end_char": 6259, "estimated_token_count": 400, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e18f37cc92afce553a35f9b9e8d3f17b670e1fedba3e1691ed88ca621795053b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nConsider the following resources to explore specific Hub functionality.\n\n<div class=\"grid cards\" markdown>\n\n- <span class=\"badge learn\">Learn</span> **Smart Contracts**\n\n    ---\n\n    Deploy Ethereum-compatible smart contracts and build decentralized applications.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/smart-contracts/)\n\n- <span class=\"badge learn\">Learn</span> **Asset Management**\n\n    ---\n\n    Manage fungible tokens and NFTs with low fees and flexible asset operations.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/assets/)\n\n- <span class=\"badge learn\">Learn</span> **People Chain**\n\n    ---\n\n    Establish and verify decentralized identities for trusted interactions on Polkadot.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/people-and-identity/)\n\n- <span class=\"badge learn\">Learn</span> **Bridge Hub**\n\n    ---\n\n    Facilitate trustless cross-chain interactions with Ethereum and other blockchains.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/bridging/)\n\n- <span class=\"badge learn\">Learn</span> **Consensus & Security**\n\n    ---\n\n    Understand how Polkadot validates transactions and secures the network.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/consensus-and-security/relay-chain/)\n\n- <span class=\"badge learn\">Learn</span> **Collectives & DAOs**\n\n    ---\n\n    Participate in specialized governance organizations with coordinated decision-making.\n\n    [:octicons-arrow-right-24: Reference](/reference/polkadot-hub/collectives-and-daos/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#introduction", "page_title": "People Chain", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 505, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Introduction\n\nPeople chain is a specialized parachain within the Polkadot ecosystem dedicated to secure, decentralized identity management. \n\nThis solution empowers users to create, control, and verify their digital identities without reliance on centralized authorities. By prioritizing user sovereignty and data privacy, People chain establishes a foundation for trusted interactions throughout the Polkadot ecosystem while returning control of personal information to individuals."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#identity-management-system", "page_title": "People Chain", "index": 1, "depth": 2, "title": "Identity Management System", "anchor": "identity-management-system", "start_char": 505, "end_char": 954, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Identity Management System\n\nPeople chain provides a comprehensive identity framework allowing users to:\n\n- Establish verifiable on-chain identities.\n- Control disclosure of personal information.\n- Receive verification from trusted registrars.\n- Link multiple accounts under a unified identity.\n\nUsers must reserve funds in a bond to store their information on chain. These funds are locked, not spent, and returned when the identity is cleared."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#sub-identities", "page_title": "People Chain", "index": 2, "depth": 3, "title": "Sub-Identities", "anchor": "sub-identities", "start_char": 954, "end_char": 1225, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Sub-Identities\n\nThe platform supports hierarchical identity structures through sub-accounts:\n\n- Primary accounts can establish up to 100 linked sub-accounts.\n- Each sub-account maintains its own distinct identity.\n- All sub-accounts require a separate bond deposit."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#verification-process", "page_title": "People Chain", "index": 3, "depth": 2, "title": "Verification Process", "anchor": "verification-process", "start_char": 1225, "end_char": 1250, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Verification Process"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#judgment-requests", "page_title": "People Chain", "index": 4, "depth": 3, "title": "Judgment Requests", "anchor": "judgment-requests", "start_char": 1250, "end_char": 1599, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Judgment Requests\n\nAfter establishing an on-chain identity, users can request verification from [registrars](#registrars):\n\n1. Users specify the maximum fee they're willing to pay for judgment.\n2. Only registrars whose fees fall below this threshold can provide verification.\n3. Registrars assess the provided information and issue a judgment."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#judgment-classifications", "page_title": "People Chain", "index": 5, "depth": 3, "title": "Judgment Classifications", "anchor": "judgment-classifications", "start_char": 1599, "end_char": 2386, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Judgment Classifications\n\nRegistrars can assign the following confidence levels to identity information:\n\n- **Unknown**: Default status; no judgment rendered yet.\n- **Reasonable**: Data appears valid but without formal verification (standard for most verified identities).\n- **Known good**: Information certified correct through formal verification (requires documentation; limited to registrars).\n- **Out of date**: Previously verified information that requires updating.\n- **Low quality**: Imprecise information requiring correction.\n- **Erroneous**: Incorrect information, potentially indicating fraudulent intent.\n\nA temporary \"Fee Paid\" status indicates judgment in progress. Both \"Fee Paid\" and \"Erroneous\" statuses lock identity information from modification until resolved."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#registrars", "page_title": "People Chain", "index": 6, "depth": 3, "title": "Registrars", "anchor": "registrars", "start_char": 2386, "end_char": 3681, "estimated_token_count": 198, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Registrars\n\nRegistrars serve as trusted verification authorities within the People chain ecosystem. These entities validate user identities and provide attestations that build trust in the network.\n\n- Registrars set specific fees for their verification services.\n- They can specialize in verifying particular identity fields.\n- Verification costs vary based on complexity and thoroughness.\n\nWhen requesting verification, users specify their maximum acceptable fee. Only registrars whose fees fall below this threshold can provide judgment. Upon completing the verification process, the user pays the registrar's fee, and the registrar issues an appropriate confidence level classification based on their assessment.\n\nMultiple registrars operate across the Polkadot and People chain ecosystems, each with unique specializations and fee structures. To request verification:\n\n1. Research available registrars and their verification requirements.\n2. Contact your chosen registrar directly through their specified channels.\n3. Submit required documentation according to their verification process.\n4. Pay the associated verification fee.\n\nYou must contact specific registrars individually to request judgment. Each registrar maintains its own verification procedures and communication channels."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-people-and-identity", "url": "https://developer.polkadot.com/reference/polkadot-hub/people-and-identity/#where-to-go-next", "page_title": "People Chain", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3681, "end_char": 4737, "estimated_token_count": 256, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1654d8d55673d320a75df3c9184db36c50302ff120986fd4723adb898fb65145", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Polkadot.js Guides about Identity__\n\n    ---\n\n    Step-by-step instructions for managing identities through the Polkadot.js interface, with practical examples and visual guides.\n\n    [:octicons-arrow-right-24: Reference](../../wiki/learn/learn-guides-identity.md)\n\n-   <span class=\"badge external\">External</span> __How to Set and Clear an Identity__\n\n    ---\n\n    Practical walkthrough covering identity setup and removal process on People chain.\n\n    [:octicons-arrow-right-24: Reference](https://support.polkadot.network/support/solutions/articles/65000181981-how-to-set-and-clear-an-identity)\n\n-   <span class=\"badge external\">External</span> __People Chain Runtime Implementation__\n\n    ---\n\n    Source code for the People chain runtime, detailing the technical architecture of decentralized identity management.\n\n    [:octicons-arrow-right-24: Reference](https://github.com/polkadot-fellows/runtimes/tree/main/system-parachains/people)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-smart-contracts", "url": "https://developer.polkadot.com/reference/polkadot-hub/smart-contracts/#introduction", "page_title": "Polkadot Hub Smart Contracts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 36, "end_char": 675, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df4a8ba2875e91e488cc4ba3c3b83bfaada5fd2bfeb4de44fbbbee9f575c43e5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub enables developers to deploy and interact with Solidity contracts through REVM, a high-performance, Rust-based Ethereum Virtual Machine implementation. Polkadot-native precompiles bring Ethereum compatibility to Polkadot Hub, letting teams use familiar Solidity tooling, integrate with on-chain features like governance and XCM, and take advantage of cross-chain interoperability.\n\nFor projects that require maximum computational performance, Polkadot Hub also supports PolkaVM (PVM), a native RISC-V execution engine. PVM is optional and designed for high-throughput, performance-intensive smart contracts."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-smart-contracts", "url": "https://developer.polkadot.com/reference/polkadot-hub/smart-contracts/#revm-smart-contracts", "page_title": "Polkadot Hub Smart Contracts", "index": 1, "depth": 3, "title": "REVM Smart Contracts", "anchor": "revm-smart-contracts", "start_char": 675, "end_char": 1678, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df4a8ba2875e91e488cc4ba3c3b83bfaada5fd2bfeb4de44fbbbee9f575c43e5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### REVM Smart Contracts\n\n[REVM](https://github.com/bluealloy/revm) brings full EVM compatibility to Polkadot Hub through a fast, memory-safe Rust implementation of the Ethereum Virtual Machine. Unlike PolkaVM, which compiles contracts to RISC-V for native execution, REVM executes standard Ethereum bytecode directly—making it ideal for teams who want to migrate existing Solidity projects to Polkadot with minimal changes.\n\nWith REVM, developers can:\n\n- Deploy existing Solidity contracts without rewriting them.\n- Use familiar Ethereum tooling like Hardhat, Foundry, Remix, and MetaMask.\n- Interact with other parachains and on-chain assets using XCM and Polkadot Hub features.\n\nREVM builds on Rust’s safety guarantees and performance optimizations while retaining full opcode compatibility with the EVM. \n\nEthereum-native developers can use Polkadot-native precompiles to access Polkadot features—such as governance, treasury, multisig, and XCM—within a unified, interoperable runtime environment."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-smart-contracts", "url": "https://developer.polkadot.com/reference/polkadot-hub/smart-contracts/#pvm-smart-contracts", "page_title": "Polkadot Hub Smart Contracts", "index": 2, "depth": 3, "title": "PVM Smart Contracts", "anchor": "pvm-smart-contracts", "start_char": 1678, "end_char": 2642, "estimated_token_count": 186, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df4a8ba2875e91e488cc4ba3c3b83bfaada5fd2bfeb4de44fbbbee9f575c43e5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### PVM Smart Contracts\n\nPVM is Polkadot Hub’s native, high-performance smart contract engine. Instead of emulating EVM bytecode, it runs contracts compiled to a [RISC-V](https://en.wikipedia.org/wiki/RISC-V) instruction set, unlocking higher performance and parallel execution while staying friendly to Ethereum-style development.\n\nWith PVM, developers can:\n\n- Write Solidity contracts and use familiar tooling (e.g., Hardhat, Foundry) targeting PVM\n- Benefit from fast, predictable execution with carefully metered gas/weight.\n- Access detailed observability through Substrate events and contract logs for indexing and debugging.\n\nPolkaVM delivers maximum performance for computationally intensive contracts, offering a native, high-throughput option for Ethereum-style developers on Polkadot Hub.\n\n!!! smartcontract \"PVM Preview Release\"\n    PVM smart contracts with Ethereum compatibility are in **early-stage development and may be unstable or incomplete**."}
{"source": "polkadot-docs", "page_id": "reference-polkadot-hub-smart-contracts", "url": "https://developer.polkadot.com/reference/polkadot-hub/smart-contracts/#where-to-go-next", "page_title": "Polkadot Hub Smart Contracts", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 2642, "end_char": 3272, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df4a8ba2875e91e488cc4ba3c3b83bfaada5fd2bfeb4de44fbbbee9f575c43e5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy a Basic Contract__\n\n    ---\n\n    Learn step-by-step how to deploy a basic Solidity smart contract to Polkadot Hub.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/)\n\n-   <span class=\"badge guide\">Guide</span> __Explore Development Environments__\n\n    ---\n\n    Check out the development environments you can use to build, test, and deploy smart contracts.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/dev-environments/local-dev-node/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#introduction", "page_title": "Chopsticks", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 15, "end_char": 593, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Chopsticks](https://github.com/AcalaNetwork/chopsticks/), developed by the [Acala Foundation](https://github.com/AcalaNetwork), is a versatile tool tailored for developers working on Polkadot SDK-based blockchains. With Chopsticks, you can fork live chains locally, replay blocks to analyze extrinsics, and simulate complex scenarios like XCM interactions, all without deploying to a live network.\n\nBy streamlining testing and experimentation, Chopsticks empowers developers to innovate and accelerate their blockchain projects within the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#key-features", "page_title": "Chopsticks", "index": 1, "depth": 3, "title": "Key Features", "anchor": "key-features", "start_char": 593, "end_char": 1513, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key Features\n\n- **Local chain forking**: Fork live Polkadot SDK chains locally for testing and development.\n- **Block replay**: Replay specific blocks to analyze state changes and debug extrinsics.\n- **XCM testing**: Simulate cross-chain messaging between multiple parachains and relay chains.\n- **Storage manipulation**: Override storage values to test specific scenarios.\n- **WebSocket commands**: Control the forked environment with specialized RPC methods.\n- **Time travel**: Manipulate block timestamps for testing time-dependent logic.\n- **Build block modes**: Choose between batch, instant, or manual block production.\n\n!!! warning\n    Chopsticks uses [Smoldot](https://github.com/smol-dot/smoldot) light client, which only supports the native Polkadot SDK API. Consequently, a Chopsticks-based fork doesn't support Ethereum JSON-RPC calls, meaning you cannot use it to fork your chain and connect Metamask."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#prerequisites", "page_title": "Chopsticks", "index": 2, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1513, "end_char": 1770, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following installed:\n\n- [Node.js](https://nodejs.org/en/)\n- A package manager such as [npm](https://www.npmjs.com/), which should be installed with Node.js by default, or [yarn](https://yarnpkg.com/)"}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#installation", "page_title": "Chopsticks", "index": 3, "depth": 2, "title": "Installation", "anchor": "installation", "start_char": 1770, "end_char": 2070, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installation\n\nYou can install Chopsticks globally or locally in your project. Choose the option that best fits your development workflow. \n\n!!! tip\n    This documentation explains the features of Chopsticks version `1.5.2`. Make sure you're using the correct version to match these instructions."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#global-installation", "page_title": "Chopsticks", "index": 4, "depth": 3, "title": "Global Installation", "anchor": "global-installation", "start_char": 2070, "end_char": 2502, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Global Installation\n\nTo install Chopsticks globally, allowing you to use it across multiple projects, run:\n\n=== \"npm\"\n\n    ```bash\n    npm i -g @acala-network/chopsticks@1.5.2\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm add -g @acala-network/chopsticks@1.5.2\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn global add @acala-network/chopsticks@1.5.2\n    ```\n\nNow, you should be able to run the `chopsticks` command from your terminal."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#local-installation", "page_title": "Chopsticks", "index": 5, "depth": 3, "title": "Local Installation", "anchor": "local-installation", "start_char": 2502, "end_char": 3170, "estimated_token_count": 188, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Local Installation\n\nTo use Chopsticks in a specific project, first create a new directory and initialize a Node.js project:\n\n```bash\nmkdir my-chopsticks-project\ncd my-chopsticks-project\nnpm init -y\n```\n\nThen, install Chopsticks as a local dependency:\n\n=== \"npm\"\n\n    ```bash\n    npm i @acala-network/chopsticks@1.5.2\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm add @acala-network/chopsticks@1.5.2\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn add @acala-network/chopsticks@1.5.2\n    ```\n\nFinally, you can run Chopsticks using the `npx` command. To see all available options and commands, run it with the `--help` flag:\n\n```bash\nnpx @acala-network/chopsticks --help\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#get-started", "page_title": "Chopsticks", "index": 6, "depth": 2, "title": "Get Started", "anchor": "get-started", "start_char": 3170, "end_char": 3186, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Started"}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#configuration-options", "page_title": "Chopsticks", "index": 7, "depth": 3, "title": "Configuration Options", "anchor": "configuration-options", "start_char": 3186, "end_char": 4527, "estimated_token_count": 361, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Configuration Options\n\nTo run Chopsticks, you need to configure some parameters. This can be set either via a configuration file or the command-line interface (CLI). The parameters that can be configured are as follows:\n\n- **`genesis`**: The link to a parachain's raw genesis file to build the fork from, instead of an endpoint.\n- **`timestamp`**: Timestamp of the block to fork from.\n- **`endpoint`**: The endpoint of the parachain to fork.\n- **`block`**: Use to specify at which block hash or number to replay the fork.\n- **`wasm-override`**: Path of the Wasm to use as the parachain runtime, instead of an endpoint's runtime.\n- **`db`**: Path to the name of the file that stores or will store the parachain's database.\n- **`config`**: Path or URL of the config file.\n- **`port`**: The port to expose an endpoint on.\n- **`build-block-mode`**: How blocks should be built in the fork: batch, manual, instant.\n- **`import-storage`**: A pre-defined JSON/YAML storage path to override in the parachain's storage.\n- **`allow-unresolved-imports`**: Whether to allow Wasm unresolved imports when using a Wasm to build the parachain.\n- **`html`**: Include to generate storage diff preview between blocks.\n- **`mock-signature-host`**: Mock signature host so that any signature starts with `0xdeadbeef` and filled by `0xcd` is considered valid."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#configuration-file", "page_title": "Chopsticks", "index": 8, "depth": 3, "title": "Configuration File", "anchor": "configuration-file", "start_char": 4527, "end_char": 5692, "estimated_token_count": 257, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Configuration File\n\nThe Chopsticks source repository includes a collection of [YAML](https://yaml.org/) files that can be used to set up various Polkadot SDK chains locally. You can download these configuration files from the [repository's `configs` folder](https://github.com/AcalaNetwork/chopsticks/tree/master/configs).\n\nAn example of a configuration file for Polkadot is as follows:\n\n```yaml title=\"polkadot.yml\"\nendpoint:\n  - wss://rpc.ibp.network/polkadot\n  - wss://polkadot-rpc.dwellir.com\nmock-signature-host: true\nblock: ${env.POLKADOT_BLOCK_NUMBER}\ndb: ./db.sqlite\nruntime-log-level: 5\n\nimport-storage:\n  System:\n    Account:\n      - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY\n        - providers: 1\n          data:\n            free: '10000000000000000000'\n  ParasDisputes:\n    $removePrefix: ['disputes'] # those can makes block building super slow\n```\n\nThe configuration file allows you to modify the storage of the forked network by rewriting the pallet, state component, and value that you want to change. For example, Polkadot's file rewrites Alice's `system.Account` storage so that the free balance is set to `10000000000000000000`."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#create-a-fork", "page_title": "Chopsticks", "index": 9, "depth": 3, "title": "Create a Fork", "anchor": "create-a-fork", "start_char": 5692, "end_char": 6874, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create a Fork\n\nTo run Chopsticks using a configuration file, utilize the `--config` flag. You can use a raw GitHub URL, a path to a local file, or simply the chain's name:\n\n=== \"Chain Name\"\n\n    ```bash\n    npx @acala-network/chopsticks --config=polkadot\n    ```\n\n=== \"GitHub URL\"\n\n    ```bash\n    npx @acala-network/chopsticks \\\n    --config=https://raw.githubusercontent.com/AcalaNetwork/chopsticks/master/configs/polkadot.yml\n    ```\n\n=== \"Local File Path\"\n\n    ```bash\n    npx @acala-network/chopsticks --config=configs/polkadot.yml\n    ```\n\nAlternatively, you can create a fork using CLI flags. For example, to fork Polkadot at block 100:\n\n```bash\nnpx @acala-network/chopsticks \\\n--endpoint wss://polkadot-rpc.dwellir.com \\\n--block 100\n```\n\nIf the fork is successful, you will see output indicating the RPC is listening:\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\">npx @acala-network/chopsticks --endpoint wss://polkadot-rpc.dwellir.com --block 100</span>\n    <span data-ty=\"output\">[19:12:21.023] INFO: Polkadot RPC listening on port 8000</span>\n</div>\n\nYou can now access the running Chopsticks fork using the default address: `ws://localhost:8000`."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#interact-with-a-fork", "page_title": "Chopsticks", "index": 10, "depth": 3, "title": "Interact with a Fork", "anchor": "interact-with-a-fork", "start_char": 6874, "end_char": 8298, "estimated_token_count": 368, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Interact with a Fork\n\nYou can interact with the forked chain using various libraries such as [Polkadot.js](https://polkadot.js.org/docs/).\n\n=== \"Via Polkadot.js Apps\"\n\n    To interact with Chopsticks via the hosted user interface, visit [Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer) and follow these steps:\n\n    1. Select the network icon in the top left corner.\n\n        ![](/images/reference/tools/chopsticks/chopsticks-1.webp)\n\n    2. Scroll to the bottom and select **Development**.\n    3. Choose **Custom**.\n    4. Enter `ws://localhost:8000` in the input field.\n    5. Select the **Switch** button.\n\n        ![](/images/reference/tools/chopsticks/chopsticks-2.webp)\n\n    You should now be connected to your local fork and can interact with it as you would with a real chain.\n\n=== \"Via Polkadot.js API\"\n\n    For programmatic interaction, you can use the [Polkadot.js](/reference/tools/polkadot-js-api/) library:\n\n    ```typescript title=\"connect-to-fork.ts\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    async function connectToFork() {\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      await api.isReady;\n    \n      // Now you can use 'api' to interact with your fork\n      console.log(`Connected to chain: ${await api.rpc.system.chain()}`);\n    }\n    \n    connectToFork();\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#replay-blocks", "page_title": "Chopsticks", "index": 11, "depth": 3, "title": "Replay Blocks", "anchor": "replay-blocks", "start_char": 8298, "end_char": 8961, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Replay Blocks\n\nChopsticks lets you replay specific blocks in a chain, which is useful for debugging and analyzing state changes. Use the `run-block` subcommand with the following options:\n\n- **`output-path`**: Path to print output.\n- **`html`**: Generate HTML with storage diff.\n- **`open`**: Open generated HTML.\n\nFor example, to replay block 1000 from Polkadot and save the output to a JSON file:\n\n```bash\nnpx @acala-network/chopsticks run-block \\\n--endpoint wss://polkadot-rpc.dwellir.com \\\n--output-path ./polkadot-output.json \\\n--block 1000\n```\n\nThe output will include detailed information about the block execution, storage changes, and runtime logs."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#test-xcm", "page_title": "Chopsticks", "index": 12, "depth": 3, "title": "Test XCM", "anchor": "test-xcm", "start_char": 8961, "end_char": 10318, "estimated_token_count": 386, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test XCM\n\nTo test XCM (Cross-Consensus Messaging) messages between networks, you can fork multiple parachains and a relay chain locally using Chopsticks.\n\nUse the `xcm` subcommand with:\n\n- **`-r` / `--relaychain`**: Relay chain config file\n- **`-p` / `--parachain`**: Parachain config file (can be specified multiple times)\n\nFor example, to fork Moonbeam, Astar, and Polkadot, enabling XCM between them:\n\n```bash\nnpx @acala-network/chopsticks xcm \\\n--r polkadot \\\n--p moonbeam \\\n--p astar\n```\n\nAfter running it, you should see output indicating connections between the chains:\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\">npx @acala-network/chopsticks xcm --r polkadot --p moonbeam --p astar</span>\n    <span data-ty=\"output\">[13:46:12.631] INFO: Moonbeam RPC listening on port 8000</span>\n    <span data-ty=\"output\">[13:46:23.669] INFO: Astar RPC listening on port 8001</span>\n    <span data-ty=\"output\">[13:46:53.320] INFO: Polkadot RPC listening on port 8002</span>\n    <span data-ty=\"output\">[13:46:54.038] INFO (xcm): Connected relaychain 'Polkadot' with parachain 'Moonbeam'</span>\n    <span data-ty=\"output\">[13:46:55.028] INFO (xcm): Connected relaychain 'Polkadot' with parachain 'Astar'</span>\n</div>\n\nNow you can interact with your forked chains using the ports specified in the output and test XCM messages between them."}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#websocket-commands", "page_title": "Chopsticks", "index": 13, "depth": 2, "title": "WebSocket Commands", "anchor": "websocket-commands", "start_char": 10318, "end_char": 15190, "estimated_token_count": 1192, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## WebSocket Commands\n\nChopstick's internal WebSocket server has special endpoints that allow manipulating the local Polkadot SDK chain.\n\n???+ interface \"dev_newBlock\"\n\n    Generates one or more new blocks.\n\n    **Parameters:**\n\n    - **`newBlockParams` (NewBlockParams)**: The parameters to build the new block with, including:\n        - **`count` (number)**: The number of blocks to build\n        - **`dmp` ({ msg: string, sentAt: number }[])**: The downward messages to include in the block\n        - **`hrmp` (Record<string | number, { data: string, sentAt: number }[]>)**: The horizontal messages to include in the block\n        - **`to` (number)**: The block number to build to\n        - **`transactions` (string[])**: The transactions to include in the block\n        - **`ump` (Record<number, string[]>)**: The upward messages to include in the block\n        - **`unsafeBlockHeight` (number)**: Build block using a specific block height (unsafe)\n\n    **Example:**\n\n    ```typescript title=\"dev-newblock-example.ts\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    async function main() {\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      await api.isReady;\n      await api.rpc('dev_newBlock', { count: 1 });\n    }\n    \n    main();\n    \n    ```\n\n??? interface \"dev_setBlockBuildMode\"\n\n    Sets block build mode.\n\n    **Parameters:**\n\n    - **`buildBlockMode` (BuildBlockMode)**: The build mode. Can be:\n        - `Batch`: One block per batch (default)\n        - `Instant`: One block per transaction\n        - `Manual`: Only build when triggered\n\n    **Example:**\n\n    ```typescript title=\"dev-setBlockBuildMode-example.ts\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    async function main() {\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      await api.isReady;\n      await api.rpc('dev_setBlockBuildMode', 'Instant');\n    }\n    \n    main();\n    \n    ```\n\n??? interface \"dev_setHead\"\n\n    Sets the head of the blockchain to a specific hash or number.\n\n    **Parameters:**\n\n    - **`hashOrNumber` (string | number)**: The block hash or number to set as head\n\n    **Example:**\n\n    ```typescript title=\"dev-setHead-example.ts\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    async function main() {\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      await api.isReady;\n      await api.rpc('dev_setHead', 500);\n    }\n    \n    main();\n    \n    ```\n\n??? interface \"dev_setRuntimeLogLevel\"\n\n    Sets the runtime log level.\n\n    **Parameters:**\n\n    - **`runtimeLogLevel` (number)**: The runtime log level to set\n\n    **Example:**\n\n    ```typescript title=\"dev-setRuntimeLogLevel-example.ts\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    async function main() {\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      await api.isReady;\n      await api.rpc('dev_setRuntimeLogLevel', 1);\n    }\n    \n    main();\n    \n    ```\n\n??? interface \"dev_setStorage\"\n\n    Creates or overwrites the value of any storage.\n\n    **Parameters:**\n\n    - **`values` (object)**: JSON object resembling the path to a storage value\n    - **`blockHash` (string)**: The block hash to set the storage value\n\n    **Example:**\n\n    ```typescript title=\"dev-setStorage-example.ts\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    import { Keyring } from '@polkadot/keyring';\n    \n    async function main() {\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      await api.isReady;\n      const keyring = new Keyring({ type: 'ed25519' });\n      const bob = keyring.addFromUri('//Bob');\n      const storage = {\n        System: {\n          Account: [[[bob.address], { data: { free: 100000 }, nonce: 1 }]],\n        },\n      };\n      await api.rpc('dev_setStorage', storage);\n    }\n    \n    main();\n    \n    ```\n\n??? interface \"dev_timeTravel\"\n\n    Sets the block's timestamp to a specific date. All future blocks will be sequentially created after this point in time.\n\n    **Parameters:**\n\n    - **`date` (string)**: Timestamp or date string to set\n\n    **Example:**\n\n    ```typescript title=\"dev-timeTravel-example.ts\"\n    import { ApiPromise, WsProvider } from '@polkadot/api';\n    \n    async function main() {\n      const wsProvider = new WsProvider('ws://localhost:8000');\n      const api = await ApiPromise.create({ provider: wsProvider });\n      await api.isReady;\n      await api.rpc('dev_timeTravel', '2030-08-15T00:00:00');\n    }\n    \n    main();\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-chopsticks", "url": "https://developer.polkadot.com/reference/tools/chopsticks/#where-to-go-next", "page_title": "Chopsticks", "index": 14, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 15190, "end_char": 15622, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60f79e9735b9f1c148d506faa322b15a11266c3c16c97dbb1bf5da063ad265a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Chopsticks Support__\n\n    ---\n\n    For further support and information, refer to the official resources.\n\n    [:octicons-arrow-right-24: GitHub Repository](https://github.com/AcalaNetwork/chopsticks)\n\n    [:octicons-arrow-right-24: Create a GitHub Issue for Support](https://github.com/AcalaNetwork/chopsticks/issues)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#introduction", "page_title": "Dedot", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 10, "end_char": 369, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Dedot](https://github.com/dedotdev/dedot) is a next-generation JavaScript client for Polkadot and Polkadot SDK-based blockchains. Designed to elevate the dApp development experience, Dedot is built and optimized to be lightweight and tree-shakable, offering precise types and APIs suggestions for individual Polkadot SDK-based blockchains."}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#key-features", "page_title": "Dedot", "index": 1, "depth": 3, "title": "Key Features", "anchor": "key-features", "start_char": 369, "end_char": 1353, "estimated_token_count": 268, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key Features\n\n- **Lightweight and tree-shakable**: No more bn.js or WebAssembly blobs, optimized for dapps bundle size.\n- **Fully typed API**: Comprehensive TypeScript support for seamless on-chain interaction.\n- **Multi-version JSON-RPC support**: Compatible with both [legacy](https://github.com/w3f/PSPs/blob/master/PSPs/drafts/psp-6.md) and [new](https://paritytech.github.io/json-rpc-interface-spec/introduction.html) JSON-RPC APIs for broad ecosystem interoperability.\n- **Light client support**: Designed to work with light clients such as [Smoldot](https://github.com/smol-dot/smoldot).\n- **Native TypeScript for scale codec**: Implements scale codec parsing directly in TypeScript without relying on custom wrappers.\n- **Wallet integration**: Works out-of-the-box with [@polkadot/extension-based](https://github.com/polkadot-js/extension?tab=readme-ov-file#api-interface) wallets.\n- **Familiar API design**: Similar API style to Polkadot.js for easy and fast migration."}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#installation", "page_title": "Dedot", "index": 2, "depth": 2, "title": "Installation", "anchor": "installation", "start_char": 1353, "end_char": 1960, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installation\n\nTo add Dedot to your project, use the following command:\n\n=== \"npm\"\n\n    ```bash\n    npm i dedot\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm add dedot\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn add dedot\n    ```\n\nTo enable auto-completion/IntelliSense for individual chains, install the [`@dedot/chaintypes`](https://www.npmjs.com/package/@dedot/chaintypes) package as a development dependency:\n\n=== \"npm\"\n\n    ```bash\n    npm i -D @dedot/chaintypes\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm add -D @dedot/chaintypes\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn add -D @dedot/chaintypes\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#get-started", "page_title": "Dedot", "index": 3, "depth": 2, "title": "Get Started", "anchor": "get-started", "start_char": 1960, "end_char": 1976, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Started"}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#initialize-a-client-instance", "page_title": "Dedot", "index": 4, "depth": 3, "title": "Initialize a Client Instance", "anchor": "initialize-a-client-instance", "start_char": 1976, "end_char": 4020, "estimated_token_count": 502, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Initialize a Client Instance\n\nTo connect to and interact with different networks, Dedot provides two client options depending on your needs:\n\n- **[`DedotClient`](https://docs.dedot.dev/clients-and-providers/dedot-client#dedotclient)**: Interacts with chains via the [new JSON-RPC APIs](https://paritytech.github.io/json-rpc-interface-spec/introduction.html).\n- **[`LegacyClient`](https://docs.dedot.dev/clients-and-providers/dedot-client#legacyclient)**: Interacts with chains via the [legacy JSON-RPC APIs](https://github.com/w3f/PSPs/blob/master/PSPs/drafts/psp-6.md).\n\nUse the following snippets to connect to Polkadot using `DedotClient`:\n\n=== \"WebSocket\"\n\n    ```typescript\n    import { DedotClient, WsProvider } from 'dedot';\n    import type { PolkadotApi } from '@dedot/chaintypes';\n    \n    // Initialize providers & clients\n    const provider = new WsProvider('wss://rpc.polkadot.io');\n    const client = await DedotClient.new<PolkadotApi>(provider);\n    \n    ```\n\n=== \"Light Client (Smoldot)\"\n\n    ```typescript\n    import { DedotClient, SmoldotProvider } from 'dedot';\n    import type { PolkadotApi } from '@dedot/chaintypes';\n    import * as smoldot from 'smoldot';\n    \n    // import `polkadot` chain spec to connect to Polkadot\n    import { polkadot } from '@substrate/connect-known-chains';\n    \n    // Start smoldot instance & initialize a chain\n    const client = smoldot.start();\n    const chain = await client.addChain({ chainSpec: polkadot });\n    \n    // Initialize providers & clients\n    const provider = new SmoldotProvider(chain);\n    const client = await DedotClient.new<PolkadotApi>(provider);\n    \n    ```\n\nIf the node doesn't support new JSON-RPC APIs yet, you can connect to the network using the `LegacyClient`, which is built on top of the legacy JSON-RPC APIs.\n\n```typescript\nimport { LegacyClient, WsProvider } from 'dedot';\nimport type { PolkadotApi } from '@dedot/chaintypes';\n\nconst provider = new WsProvider('wss://rpc.polkadot.io');\nconst client = await LegacyClient.new<PolkadotApi>(provider);\n\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#enable-type-and-api-suggestions", "page_title": "Dedot", "index": 5, "depth": 3, "title": "Enable Type and API Suggestions", "anchor": "enable-type-and-api-suggestions", "start_char": 4020, "end_char": 5392, "estimated_token_count": 359, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Enable Type and API Suggestions\n\nIt is recommended to specify the `ChainApi` interface (e.g., `PolkadotApi` in the example in the previous section) of the chain you want to interact with. This enables type and API suggestions/autocompletion for that particular chain (via IntelliSense). If you don't specify a `ChainApi` interface, a default `SubstrateApi` interface will be used.\n\n```typescript\nimport { DedotClient, WsProvider } from 'dedot';\nimport type { PolkadotApi, KusamaApi } from '@dedot/chaintypes';\n\nconst polkadotClient = await DedotClient.new<PolkadotApi>(\n  new WsProvider('wss://rpc.polkadot.io')\n);\nconst kusamaClient = await DedotClient.new<KusamaApi>(\n  new WsProvider('wss://kusama-rpc.polkadot.io')\n);\nconst genericClient = await DedotClient.new(\n  new WsProvider('ws://localhost:9944')\n);\n\n```\n\nIf you don't find the `ChainApi` for the network you're working with in [the list](https://github.com/dedotdev/chaintypes?tab=readme-ov-file#supported-networks), you can generate the `ChainApi` (types and APIs) using the built-in [`dedot` cli](https://docs.dedot.dev/cli).\n\n```bash\n# Generate ChainApi interface for Polkadot network via rpc endpoint: wss://rpc.polkadot.io\nnpx dedot chaintypes -w wss://rpc.polkadot.io\n```\n\nOr open a pull request to add your favorite network to the [`@dedot/chaintypes`](https://github.com/dedotdev/chaintypes) repo."}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#read-on-chain-data", "page_title": "Dedot", "index": 6, "depth": 3, "title": "Read On-Chain Data", "anchor": "read-on-chain-data", "start_char": 5392, "end_char": 6743, "estimated_token_count": 348, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Read On-Chain Data\n\nDedot provides several ways to read data from the chain:\n\n- **Access runtime constants**: Use the syntax `client.consts.<pallet>.<constantName>` to inspect runtime constants (parameter types).\n\n    ```typescript\n    const ss58Prefix = client.consts.system.ss58Prefix;\n    console.log('Polkadot ss58Prefix:', ss58Prefix);\n    \n    ```\n\n- **Storage queries**: Use the syntax `client.query.<pallet>.<storgeEntry>` to query on-chain storage.\n\n    ```typescript\n    const balance = await client.query.system.account('INSERT_ADDRESS');\n    console.log('Balance:', balance.data.free);\n    \n    ```\n\n- **Subscribe to storage changes**:\n\n    ```typescript\n    const unsub = await client.query.system.number((blockNumber) => {\n      console.log(`Current block number: ${blockNumber}`);\n    });\n    \n    ```\n\n- **Call Runtime APIs**: Use the syntax `client.call.<runtimeApi>.<methodName>` to execute Runtime APIs.\n\n    ```typescript\n    const metadata = await client.call.metadata.metadataAtVersion(15);\n    console.log('Metadata V15', metadata);\n    \n    ```\n\n- **Watch on-chain events**: Use the syntax `client.events.<pallet>.<eventName>` to access pallet events.\n    \n    ```typescript\n    const unsub = await client.events.system.NewAccount.watch((events) => {\n      console.log('New Account Created', events);\n    });\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#sign-and-send-transactions", "page_title": "Dedot", "index": 7, "depth": 3, "title": "Sign and Send Transactions", "anchor": "sign-and-send-transactions", "start_char": 6743, "end_char": 8453, "estimated_token_count": 433, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sign and Send Transactions\n\nSign the transaction using `IKeyringPair` from Keyring ([`@polkadot/keyring`](https://polkadot.js.org/docs/keyring/start/sign-verify/)) and send the transaction.\n\n```typescript\nimport { cryptoWaitReady } from '@polkadot/util-crypto';\nimport { Keyring } from '@polkadot/keyring';\n// Setup keyring\nawait cryptoWaitReady();\nconst keyring = new Keyring({ type: 'sr25519' });\nconst alice = keyring.addFromUri('//Alice');\n// Send transaction\nconst unsub = await client.tx.balances\n  .transferKeepAlive('INSERT_DEST_ADDRESS', 2_000_000_000_000n)\n  .signAndSend(alice, async ({ status }) => {\n    console.log('Transaction status', status.type);\n    if (status.type === 'BestChainBlockIncluded') {\n      console.log(`Transaction is included in best block`);\n    }\n    if (status.type === 'Finalized') {\n      console.log(\n        `Transaction completed at block hash ${status.value.blockHash}`\n      );\n      await unsub();\n    }\n  });\n\n```\n\nYou can also use `Signer` from wallet extensions:\n\n```typescript\nconst injected = await window.injectedWeb3['polkadot-js'].enable('My dApp');\nconst account = (await injected.accounts.get())[0];\nconst signer = injected.signer;\nconst unsub = await client.tx.balances\n  .transferKeepAlive('INSERT_DEST_ADDRESS', 2_000_000_000_000n)\n  .signAndSend(account.address, { signer }, async ({ status }) => {\n    console.log('Transaction status', status.type);\n    if (status.type === 'BestChainBlockIncluded') {\n      console.log(`Transaction is included in best block`);\n    }\n    if (status.type === 'Finalized') {\n      console.log(\n        `Transaction completed at block hash ${status.value.blockHash}`\n      );\n      await unsub();\n    }\n  });\n\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-dedot", "url": "https://developer.polkadot.com/reference/tools/dedot/#where-to-go-next", "page_title": "Dedot", "index": 8, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 8453, "end_char": 8572, "estimated_token_count": 30, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef33f5d8495011793a7e451a30c253bd45cb65d67c074074bb03e07f0ae26595", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nFor more detailed information about Dedot, check the [official documentation](https://dedot.dev/)."}
{"source": "polkadot-docs", "page_id": "reference-tools-light-clients", "url": "https://developer.polkadot.com/reference/tools/light-clients/#introduction", "page_title": "Light Clients", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 995, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a610f7f1bce0e40fea278907a26caf877cee0ec2b2968ca21f06da53773bd1a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nLight clients enable secure and efficient blockchain interaction without running a Full Node. They provide a trust-minimized alternative to JSON-RPC by verifying data through cryptographic proofs rather than blindly trusting remote nodes.\n\nThis guide covers:\n\n- What light clients are and how they work.\n- Their advantages compared to full nodes and JSON-RPC.\n- Available implementations in the Polkadot ecosystem.\n- How to use light clients in your applications.\n\nLight clients are particularly valuable for resource-constrained environments and applications requiring secure, decentralized blockchain access without the overhead of maintaining full nodes.\n\n!!!note \"Light node or light client?\"\n    The terms _light node_ and _light client_ are interchangeable. Both refer to a blockchain client that syncs without downloading the entire blockchain state. All nodes in a blockchain network are fundamentally clients, engaging in peer-to-peer communication."}
{"source": "polkadot-docs", "page_id": "reference-tools-light-clients", "url": "https://developer.polkadot.com/reference/tools/light-clients/#light-clients-workflow", "page_title": "Light Clients", "index": 1, "depth": 2, "title": "Light Clients Workflow", "anchor": "light-clients-workflow", "start_char": 995, "end_char": 2478, "estimated_token_count": 310, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a610f7f1bce0e40fea278907a26caf877cee0ec2b2968ca21f06da53773bd1a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Light Clients Workflow\n\nUnlike JSON-RPC interfaces, where an application must maintain a list of providers or rely on a single node, light clients are not limited to or dependent on a single node. They use cryptographic proofs to verify the blockchain's state, ensuring it is up-to-date and accurate. By verifying only block headers, light clients avoid syncing the entire state, making them ideal for resource-constrained environments.\n\n```mermaid\nflowchart LR\nDAPP([dApp])-- Query Account Info -->LC([Light Client])\nLC -- Request --> FN(((Full Node)))\nLC -- Response --> DAPP\nFN -- Response (validated via Merkle proof) --> LC\n```\n\nIn the diagram above, the decentralized application queries on-chain account information through the light client. The light client runs as part of the application and requires minimal memory and computational resources. It uses Merkle proofs to verify the state retrieved from a full node in a trust-minimized manner. Polkadot-compatible light clients utilize warp syncing, which downloads only block headers.\n\nLight clients can quickly verify the blockchain's state, including GRANDPA finality justifications.\n\n!!!note \"What does it mean to be trust-minimized?\"\n    _Trust-minimized_ means that the light client does not need to fully trust the full node from which it retrieves the state. This is achieved through the use of Merkle proofs, which allow the light client to verify the correctness of the state by checking the Merkle tree root."}
{"source": "polkadot-docs", "page_id": "reference-tools-light-clients", "url": "https://developer.polkadot.com/reference/tools/light-clients/#json-rpc-and-light-client-comparison", "page_title": "Light Clients", "index": 2, "depth": 2, "title": "JSON-RPC and Light Client Comparison", "anchor": "json-rpc-and-light-client-comparison", "start_char": 2478, "end_char": 4236, "estimated_token_count": 410, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a610f7f1bce0e40fea278907a26caf877cee0ec2b2968ca21f06da53773bd1a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## JSON-RPC and Light Client Comparison\n\nAnother common method of communication between a user interface (UI) and a node is through the JSON-RPC protocol. Generally, the UI retrieves information from the node, fetches network or Pallet data, and interacts with the blockchain. This is typically done in one of two ways:\n\n- **User-controlled nodes**: The UI connects to a node client installed on the user's machine.\n    - These nodes are secure, but installation and maintenance can be inconvenient.\n- **Publicly accessible nodes**: The UI connects to a third-party-owned publicly accessible node client.\n    - These nodes are convenient but centralized and less secure. Applications must maintain a list of backup nodes in case the primary node becomes unavailable.\n\nWhile light clients still communicate with full nodes, they offer significant advantages for applications requiring a secure alternative to running a full node:\n\n| Full Node                                                                                       | Light Client                                                   |\n| :---------------------------------------------------------------------------------------------: | :------------------------------------------------------------: |\n| Fully verifies all blocks of the chain                                                          | Verifies only the authenticity of blocks                       |\n| Stores previous block data and the chain's storage in a database                                | Does not require a database                                    |\n| Installation, maintenance, and execution are resource-intensive and require technical expertise | No installation is typically included as part of the application |"}
{"source": "polkadot-docs", "page_id": "reference-tools-light-clients", "url": "https://developer.polkadot.com/reference/tools/light-clients/#using-light-clients", "page_title": "Light Clients", "index": 3, "depth": 2, "title": "Using Light Clients", "anchor": "using-light-clients", "start_char": 4236, "end_char": 4541, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a610f7f1bce0e40fea278907a26caf877cee0ec2b2968ca21f06da53773bd1a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Using Light Clients\n\nThe [`smoldot`](https://github.com/smol-dot/smoldot) client is the cornerstone of light client implementation for Polkadot SDK-based chains. It provides the primitives needed to build light clients and is also integrated into libraries such as [PAPI](#papi-light-client-support)."}
{"source": "polkadot-docs", "page_id": "reference-tools-light-clients", "url": "https://developer.polkadot.com/reference/tools/light-clients/#papi-light-client-support", "page_title": "Light Clients", "index": 4, "depth": 3, "title": "PAPI Light Client Support", "anchor": "papi-light-client-support", "start_char": 4541, "end_char": 4828, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a610f7f1bce0e40fea278907a26caf877cee0ec2b2968ca21f06da53773bd1a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### PAPI Light Client Support\n\nThe [Polkadot API (PAPI)](/reference/tools/papi/) library natively supports light client configurations powered by [`smoldot`](https://github.com/smol-dot/smoldot). This allows developers to connect to multiple chains simultaneously using a light client."}
{"source": "polkadot-docs", "page_id": "reference-tools-light-clients", "url": "https://developer.polkadot.com/reference/tools/light-clients/#substrate-connect-browser-extension", "page_title": "Light Clients", "index": 5, "depth": 3, "title": "Substrate Connect - Browser Extension", "anchor": "substrate-connect-browser-extension", "start_char": 4828, "end_char": 5583, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a610f7f1bce0e40fea278907a26caf877cee0ec2b2968ca21f06da53773bd1a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Substrate Connect - Browser Extension\n\nThe [Substrate Connect browser extension](https://www.npmjs.com/package/@substrate/connect-extension-protocol) enables end-users to interact with applications connected to multiple blockchains or to connect their own blockchains to supported applications.\n\nEstablishing a sufficient number of peers can be challenging due to browser limitations on WebSocket connections from HTTPS pages, as many nodes require TLS. The Substrate Connect browser extension addresses this limitation by keeping chains synced in the background, enabling faster application performance.\n\nSubstrate Connect automatically detects whether the user has the extension installed. If not, an in-page Wasm light client is created for them."}
{"source": "polkadot-docs", "page_id": "reference-tools-light-clients", "url": "https://developer.polkadot.com/reference/tools/light-clients/#resources", "page_title": "Light Clients", "index": 6, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 5583, "end_char": 5872, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7a610f7f1bce0e40fea278907a26caf877cee0ec2b2968ca21f06da53773bd1a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\n- [Introducing Substrate Connect: Browser-Based Light Clients for Connecting to Substrate Chains](https://www.parity.io/blog/introducing-substrate-connect)\n- [Substrate Connect GitHub Repository](https://github.com/paritytech/substrate-connect/tree/master/projects/extension)"}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#introduction", "page_title": "E2E Testing with Moonwall", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 30, "end_char": 787, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nMoonwall is an end-to-end testing framework designed explicitly for Polkadot SDK-based blockchain networks. It addresses one of the most significant challenges in blockchain development: managing complex test environments and network configurations.\n\nMoonwall consolidates this complexity by providing the following:\n\n- A centralized configuration management system that explicitly defines all network parameters.\n- A standardized approach to environment setup across different Substrate-based chains.\n- Built-in utilities for common testing scenarios and network interactions.\n\nDevelopers can focus on writing meaningful tests rather than managing infrastructure complexities or searching through documentation for configuration options."}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#prerequisites", "page_title": "E2E Testing with Moonwall", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 787, "end_char": 1047, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following installed:\n\n- [Node.js](https://nodejs.org/en/) (version 20.10 or higher).\n- A package manager such as [npm](https://www.npmjs.com/), [yarn](https://yarnpkg.com/), or [pnpm](https://pnpm.io/)."}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#install-moonwall", "page_title": "E2E Testing with Moonwall", "index": 2, "depth": 2, "title": "Install Moonwall", "anchor": "install-moonwall", "start_char": 1047, "end_char": 1387, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Moonwall\n\nMoonwall can be installed globally for system-wide access or locally within specific projects. This section covers both installation methods.\n\n!!! tip\n    This documentation corresponds to Moonwall version `5.18.3`. To avoid compatibility issues with the documented features, ensure you're using the matching version."}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#global-installation", "page_title": "E2E Testing with Moonwall", "index": 3, "depth": 3, "title": "Global Installation", "anchor": "global-installation", "start_char": 1387, "end_char": 1892, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Global Installation\n\nGlobal installation provides system-wide access to the Moonwall CLI, making it ideal for developers working across multiple blockchain projects. Install it by running one of the following commands:\n\n=== \"npm\"\n\n    ```bash\n    npm install -g @moonwall/cli@5.18.3\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm -g install @moonwall/cli@5.18.3\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn global add @moonwall/cli@5.18.3\n    ```\n\nNow, you can run the `moonwall` command from your terminal."}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#local-installation", "page_title": "E2E Testing with Moonwall", "index": 4, "depth": 3, "title": "Local Installation", "anchor": "local-installation", "start_char": 1892, "end_char": 2385, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Local Installation\n\nLocal installation is recommended for better dependency management and version control within a specific project. First, initialize your project:\n\n```bash\nmkdir my-moonwall-project\ncd my-moonwall-project\nnpm init -y\n```\n\nThen, install it as a local dependency:\n\n=== \"npm\"\n\n    ```bash\n    npm install @moonwall/cli@5.18.3\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm install @moonwall/cli@5.18.3\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn add @moonwall/cli@5.18.3\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#initialize-moonwall", "page_title": "E2E Testing with Moonwall", "index": 5, "depth": 2, "title": "Initialize Moonwall", "anchor": "initialize-moonwall", "start_char": 2385, "end_char": 5773, "estimated_token_count": 753, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize Moonwall\n\nThe `moonwall init` command launches an interactive wizard to create your configuration file:\n\n```bash\nmoonwall init\n```\n\nDuring setup, you will see prompts for the following parameters:\n\n- **`label`**: Identifies your test configuration.\n- **`global timeout`**: Maximum time (ms) for test execution.\n- **`environment name`**: Name for your testing environment.\n- **`network foundation`**: Type of blockchain environment to use.\n- **`tests directory`**: Location of your test files.\n\nSelect `Enter` to accept defaults or input custom values. You should see something like this:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>moonwall init</span>\n  <span data-ty>✔ Provide a label for the config file moonwall_config</span>\n  <span data-ty>✔ Provide a global timeout value 30000</span>\n  <span data-ty>✔ Provide a name for this environment default_env</span>\n  <span data-ty>✔ What type of network foundation is this? dev</span>\n  <span data-ty>✔ Provide the path for where tests for this environment are kept tests/</span>\n  <span data-ty>? Would you like to generate this config? (no to restart from beginning) (Y/n)</span>\n</div>\n\n\nThe wizard generates a `moonwall.config` file:\n\n```json\n{\n    \"label\": \"moonwall_config\",\n    \"defaultTestTimeout\": 30000,\n    \"environments\": [\n        {\n            \"name\": \"default_env\",\n            \"testFileDir\": [\"tests/\"],\n            \"foundation\": {\n                \"type\": \"dev\"\n            }\n        }\n    ]\n}\n\n```\n\nThe default configuration requires specific details about your blockchain node and test requirements:\n\n- The `foundation` object defines how your test blockchain node will be launched and managed. The dev foundation, which runs a local node binary, is used for local development.\n\n    For more information about available options, check the [Foundations](https://moonsong-labs.github.io/moonwall/guide/foundations.html) section.\n\n- The `connections` array specifies how your tests will interact with the blockchain node. This typically includes provider configuration and endpoint details.\n\n    A provider is a tool that allows you or your application to connect to a blockchain network and simplifies the low-level details of the process. A provider handles submitting transactions, reading state, and more. For more information on available providers, check the [Providers supported](https://moonsong-labs.github.io/moonwall/guide/intro/providers.html#providers-supported) page in the Moonwall documentation.\n\nHere's a complete configuration example for testing a local node using Polkadot.js as a provider:\n\n```json\n{\n    \"label\": \"moonwall_config\",\n    \"defaultTestTimeout\": 30000,\n    \"environments\": [\n        {\n            \"name\": \"default_env\",\n            \"testFileDir\": [\"tests/\"],\n            \"foundation\": {\n                \"launchSpec\": [\n                    {\n                        \"binPath\": \"./node-template\",\n                        \"newRpcBehaviour\": true,\n                        \"ports\": { \"rpcPort\": 9944 }\n                    }\n                ],\n                \"type\": \"dev\"\n            },\n            \"connections\": [\n                {\n                    \"name\": \"myconnection\",\n                    \"type\": \"polkadotJs\",\n                    \"endpoints\": [\"ws://127.0.0.1:9944\"]\n                }\n            ]\n        }\n    ]\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#writing-tests", "page_title": "E2E Testing with Moonwall", "index": 6, "depth": 2, "title": "Writing Tests", "anchor": "writing-tests", "start_char": 5773, "end_char": 8470, "estimated_token_count": 637, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Writing Tests\n\nMoonwall uses the [`describeSuite`](https://github.com/Moonsong-Labs/moonwall/blob/7568048c52e9f7844f38fb4796ae9e1b9205fdaa/packages/cli/src/lib/runnerContext.ts#L65) function to define test suites, like using [Mocha](https://mochajs.org/). Each test suite requires the following:\n\n- **`id`**: Unique identifier for the suite.\n- **`title`**: Descriptive name for the suite.\n- **`foundationMethods`**: Specifies the testing environment (e.g., `dev` for local node testing).\n- **`testCases`**: A callback function that houses the individual test cases of this suite.\n\nThe following example shows how to test a balance transfer between two accounts:\n\n```ts\nimport '@polkadot/api-augment';\nimport { describeSuite, expect } from '@moonwall/cli';\nimport { Keyring } from '@polkadot/api';\n\ndescribeSuite({\n  id: 'D1',\n  title: 'Demo suite',\n  foundationMethods: 'dev',\n  testCases: ({ it, context, log }) => {\n    it({\n      id: 'T1',\n      title: 'Test Case',\n      test: async () => {\n        // Set up polkadot.js API and testing accounts\n        let api = context.polkadotJs();\n        let alice = new Keyring({ type: 'sr25519' }).addFromUri('//Alice');\n        let charlie = new Keyring({ type: 'sr25519' }).addFromUri('//Charlie');\n\n        // Query Charlie's account balance before transfer\n        const balanceBefore = (await api.query.system.account(charlie.address))\n          .data.free;\n\n        // Before transfer, Charlie's account balance should be 0\n        expect(balanceBefore.toString()).toEqual('0');\n        log('Balance before: ' + balanceBefore.toString());\n\n        // Transfer from Alice to Charlie\n        const amount = 1000000000000000;\n        await api.tx.balances\n          .transferAllowDeath(charlie.address, amount)\n          .signAndSend(alice);\n\n        // Wait for the transaction to be included in a block.\n        // This is necessary because the balance is not updated immediately.\n        // Block time is 6 seconds.\n        await new Promise((resolve) => setTimeout(resolve, 6000));\n\n        // Query Charlie's account balance after transfer\n        const balanceAfter = (await api.query.system.account(charlie.address))\n          .data.free;\n\n        // After transfer, Charlie's account balance should be 1000000000000000\n        expect(balanceAfter.toString()).toEqual(amount.toString());\n        log('Balance after: ' + balanceAfter.toString());\n      },\n    });\n  },\n});\n\n```\n\nThis test demonstrates several key concepts:\n\n- Initializing the Polkadot.js API through Moonwall's context and setting up test accounts.\n- Querying on-chain state.\n- Executing transactions.\n- Waiting for block inclusion.\n- Verifying results using assertions."}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#running-the-tests", "page_title": "E2E Testing with Moonwall", "index": 7, "depth": 2, "title": "Running the Tests", "anchor": "running-the-tests", "start_char": 8470, "end_char": 9881, "estimated_token_count": 426, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Running the Tests\n\nExecute your tests using the `test` Moonwall CLI command. For the default environment setup run:\n\n```bash\nmoonwall test default_env -c moonwall.config\n```\n\nThe test runner will output detailed results showing:\n\n- Test suite execution status.\n- Individual test case results.\n- Execution time.\n- Detailed logs and error messages (if any).\n\nExample output:\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>moonwall test default_env -c moonwall.config</span>\n  <span data-ty>stdout | tests/test1.ts > 🗃️ D1 Demo suite > 📁 D1T1 Test Case</span>\n  <span data-ty>2025-01-21T19:27:55.624Z test:default_env Balance before: 0</span>\n  <span data-ty></span>\n  <span data-ty>stdout | tests/test1.ts > 🗃️ D1 Demo suite > 📁 D1T1 Test Case</span>\n  <span data-ty>2025-01-21T19:28:01.637Z test:default_env Balance after: 1000000000000000</span>\n  <span data-ty></span>\n  <span data-ty> ✓ default_env tests/test1.ts (1 test) 6443ms</span>\n  <span data-ty> ✓ 🗃️ D1 Demo suite > 📁 D1T1 Test Case 6028ms</span>\n  <span data-ty></span>\n  <span data-ty> Test Files 1 passed (1)</span>\n  <span data-ty> Tests 1 passed (1)</span>\n  <span data-ty> Start at 16:27:53</span>\n  <span data-ty> Duration 7.95s (transform 72ms, setup 0ms, collect 1.31s, tests 6.44s, environment 0ms, prepare 46ms)</span>\n  <span data-ty></span>\n  <span data-ty>✅ All tests passed</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-tools-moonwall", "url": "https://developer.polkadot.com/reference/tools/moonwall/#where-to-go-next", "page_title": "E2E Testing with Moonwall", "index": 8, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 9881, "end_char": 10092, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cf7f3ceac647aac7cb35f395de0f20bf0fae4060a1d20b26b6db0e6dc9a547b0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nFor a comprehensive guide to Moonwall's full capabilities, available configurations, and advanced usage, see the official [Moonwall](https://moonsong-labs.github.io/moonwall/) documentation."}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#introduction", "page_title": "Polkadot Omni Node", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 904, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [`polkadot-omni-node`](https://crates.io/crates/polkadot-omni-node/0.21.0) crate is a versatile, pre-built binary designed to simplify running parachains in the Polkadot ecosystem. Unlike traditional node binaries that are tightly coupled to specific runtime code, the `polkadot-omni-node` operates using an external Chain Specification file, allowing it to adapt dynamically to different parachains.\n\nThis approach enables it to act as a white-labeled node binary, capable of running most parachains that do not require custom node-level logic or extensions. Developers can leverage this flexibility to test, deploy, or operate parachain nodes without maintaining a dedicated codebase for each network.\n\nThis guide provides step-by-step instructions for installing the `polkadot-omni-node`, obtaining a chain specification, and spinning up a parachain node."}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#install-polkadot-omni-node", "page_title": "Polkadot Omni Node", "index": 1, "depth": 2, "title": "Install Polkadot Omni Node", "anchor": "install-polkadot-omni-node", "start_char": 904, "end_char": 2217, "estimated_token_count": 341, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Polkadot Omni Node\n\nDownload the pre-built `polkadot-omni-node` binary from the [Polkadot SDK release](https://github.com/paritytech/polkadot-sdk/releases/tag/polkadot-stable2609) (recommended):\n\n=== \"macOS\"\n\n    ```bash\n    curl -L -o polkadot-omni-node https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-omni-node-aarch64-apple-darwin\n    chmod +x polkadot-omni-node\n    sudo mv polkadot-omni-node /usr/local/bin/\n    ```\n\n=== \"Ubuntu\"\n\n    ```bash\n    curl -L -o polkadot-omni-node https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-stable2609/polkadot-omni-node\n    chmod +x polkadot-omni-node\n    sudo mv polkadot-omni-node /usr/local/bin/\n    ```\n\nAlternatively, you can install from source using `cargo`:\n\n!!! note\n    Building from source requires Rust and system dependencies. See [Install Dependencies: macOS](/parachains/install-polkadot-sdk/#install-dependencies-macos) or [Install Dependencies: Linux](/parachains/install-polkadot-sdk/#install-dependencies-linux) before proceeding.\n\n```bash\ncargo install --locked polkadot-omni-node@0.21.0\n```\n\nTo confirm the installation, run:\n\n```bash\npolkadot-omni-node --version\n```\n\nYou should see the installed version number printed to the terminal, confirming a successful installation."}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#obtain-chain-specifications", "page_title": "Polkadot Omni Node", "index": 2, "depth": 2, "title": "Obtain Chain Specifications", "anchor": "obtain-chain-specifications", "start_char": 2217, "end_char": 3005, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Obtain Chain Specifications\n\nThe `polkadot-omni-node` binary uses a chain specification file to configure and launch a parachain node. This file defines the parachain's genesis state and network settings.\n\nThe most common source for official chain specifications is the [`paritytech/chainspecs`](https://github.com/paritytech/chainspecs) repository. These specifications are also browsable in a user-friendly format via the [Chainspec Collection](https://paritytech.github.io/chainspecs/) website.\n\nTo obtain a chain specification:\n\n1. Visit the [Chainspec Collection](https://paritytech.github.io/chainspecs/) website.\n2. Find the parachain you want to run.\n3. Click the chain spec to open it.\n4. Copy the JSON content and save it locally as a `.json` file, e.g., `chain_spec.json`."}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#run-a-parachain-full-node", "page_title": "Polkadot Omni Node", "index": 3, "depth": 2, "title": "Run a Parachain Full Node", "anchor": "run-a-parachain-full-node", "start_char": 3005, "end_char": 4136, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run a Parachain Full Node\n\nOnce you've installed `polkadot-omni-node` and saved the appropriate chain specification file, you can start a full node for your chosen parachain.\n\nTo see all available flags and configuration options, run:\n\n```bash\npolkadot-omni-node --help\n```\n\nTo launch the node, run the following command, replacing `./INSERT_PARACHAIN_CHAIN_SPEC.json` with the actual path to your saved chain spec file.\n\nThis command will:\n\n- Load the chain specification.\n- Initialize the node using the provided network configuration.\n- Begin syncing with the parachain network.\n\n```bash\npolkadot-omni-node --chain ./INSERT_PARACHAIN_CHAIN_SPEC.json --sync warp\n```\n\n- The `--chain` flag tells the `polkadot-omni-node` which parachain to run by pointing to its chain specification file.\n- The `--sync warp` flag enables warp sync, allowing the node to quickly catch up to the latest finalized state. Historical blocks are fetched in the background as the node continues operating.\n\nOnce started, the node will begin connecting to peers and syncing with the network. You’ll see logs in your terminal reflecting its progress."}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#interact-with-the-node", "page_title": "Polkadot Omni Node", "index": 4, "depth": 2, "title": "Interact with the Node", "anchor": "interact-with-the-node", "start_char": 4136, "end_char": 4682, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the Node\n\nBy default, `polkadot-omni-node` exposes a WebSocket endpoint at `ws://localhost:9944`,  which you can use to interact with the running node. You can connect using:\n\n- **[Polkadot.js Apps](https://polkadot.js.org/apps/#/explorer)**: A web-based interface for exploring and interacting with Polkadot SDK-based chains.\n- Custom scripts using compatible [libraries](/chain-interactions/#development-tools-and-sdks).\n\nOnce connected, you can review blocks, call extrinsics, inspect storage, and interact with the runtime."}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#parachain-compatibility", "page_title": "Polkadot Omni Node", "index": 5, "depth": 2, "title": "Parachain Compatibility", "anchor": "parachain-compatibility", "start_char": 4682, "end_char": 5481, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Parachain Compatibility\n\nThe `polkadot-omni-node` is designed to work with most parachains out of the box; however, your parachain's runtime must meet specific requirements and follow certain conventions to be compatible. This section outlines what your runtime needs to implement and configure to work seamlessly with the `polkadot-omni-node`:\n\n- Your runtime must implement the required runtime APIs (see below).\n- Your runtime must include and configure the required pallets.\n\nThe [`parachain-template`](https://github.com/paritytech/polkadot-sdk-parachain-template/tree/v0.0.4) provides a complete reference implementation that is fully compatible with the `polkadot-omni-node`. You can use it as a starting point or reference for ensuring your runtime meets all compatibility requirements."}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#required-runtime-apis", "page_title": "Polkadot Omni Node", "index": 6, "depth": 3, "title": "Required Runtime APIs", "anchor": "required-runtime-apis", "start_char": 5481, "end_char": 6785, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Required Runtime APIs\n\nYour parachain runtime must implement the following runtime APIs for the `polkadot-omni-node` to function properly:\n\n- **GetParachainInfo Runtime API**: The omni-node requires the [`GetParachainInfo`](https://paritytech.github.io/polkadot-sdk/master/cumulus_primitives_core/trait.GetParachainInfo.html) runtime API to identify and configure the parachain correctly. This API provides the parachain ID to the node.\n\n    ```rust title=\"runtime/src/apis.rs\"\n    impl cumulus_primitives_core::GetParachainInfo<Block> for Runtime {\n        fn parachain_id() -> cumulus_primitives_core::ParaId {\n            // Return your parachain ID\n            ParachainInfo::parachain_id()\n        }\n    }\n    ```\n\n- **Aura Runtime API**: For consensus, the `polkadot-omni-node` expects the [Aura runtime API](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_frame/runtime/apis/trait.AuraApi.html) to be implemented.\n\n    ```rust title=\"runtime/src/apis.rs\"\n    impl sp_consensus_aura::AuraApi<Block, AuraId> for Runtime {\n        fn slot_duration() -> sp_consensus_aura::SlotDuration {\n            sp_consensus_aura::SlotDuration::from_millis(SLOT_DURATION)\n        }\n\n        fn authorities() -> Vec<AuraId> {\n            Aura::authorities().into_inner()\n        }\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-omninode", "url": "https://developer.polkadot.com/reference/tools/omninode/#required-pallets", "page_title": "Polkadot Omni Node", "index": 7, "depth": 3, "title": "Required Pallets", "anchor": "required-pallets", "start_char": 6785, "end_char": 9193, "estimated_token_count": 536, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:97ebf7f9648612915178104ccc25c4d4a7cbe9f7cf6756c0c0476675f0d20bfe", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Required Pallets\n\nYour runtime must include and properly configure the following pallets:\n\n- **System Pallet**: The System pallet ([`frame-system`](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_frame/prelude/frame_system/index.html)) is fundamental and must be configured with appropriate types.\n\n    ```rust title=\"runtime/src/lib.rs\"\n    #[frame_support::runtime]\n    impl frame_system::Config for Runtime {\n        type Block = Block;\n        type BlockNumber = BlockNumber;\n        // ... other configurations\n    }\n\n    // Must be named \"System\" for omni-node compatibility\n    pub type System = frame_system::Pallet<Runtime>;\n    ```\n\n- **ParachainSystem Pallet**: This pallet ([`cumulus-pallet-parachain-system`](https://paritytech.github.io/polkadot-sdk/master/cumulus_pallet_parachain_system/index.html)) enables parachain functionality and handles low-level details of being a parachain.\n\n    ```rust title=\"runtime/src/lib.rs\"\n    impl cumulus_pallet_parachain_system::Config for Runtime {\n        type RuntimeEvent = RuntimeEvent;\n        type OnSystemEvent = ();\n        // ... other configurations\n    }\n\n    // Must be named \"ParachainSystem\" for omni-node compatibility  \n    pub type ParachainSystem = cumulus_pallet_parachain_system::Pallet<Runtime>;\n    ```\n\n- **Aura Pallet**: For block authoring consensus ([`pallet-aura`](https://paritytech.github.io/polkadot-sdk/master/pallet_aura/index.html)).\n\n    ```rust title=\"runtime/src/lib.rs\"\n    impl pallet_aura::Config for Runtime {\n        type AuthorityId = AuraId;\n        type DisabledValidators = ();\n        type MaxAuthorities = MaxAuthorities;\n        type AllowMultipleBlocksPerSlot = ConstBool<false>;\n    }\n\n    pub type Aura = pallet_aura::Pallet<Runtime>;\n    ```\n\n- **ParachainInfo Pallet**: Provides parachain metadata ([`parachain-info`](https://paritytech.github.io/polkadot-sdk/master/staging_parachain_info/index.html)).\n\n    ```rust title=\"runtime/src/lib.rs\"\n    impl parachain_info::Config for Runtime {}\n\n    pub type ParachainInfo = parachain_info::Pallet<Runtime>;\n    ```\n\nIf you're migrating an existing parachain to use the `polkadot-omni-node`, you may need to perform runtime upgrades to add the required runtime APIs and pallets. Follow the standard parachain [runtime upgrade](/parachains/runtime-maintenance/runtime-upgrades/) procedures to implement these changes on your live network."}
{"source": "polkadot-docs", "page_id": "reference-tools-papi", "url": "https://developer.polkadot.com/reference/tools/papi/#introduction", "page_title": "Polkadot-API", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 17, "end_char": 1118, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:15f3680c9b73d99f437393f1bf6901a6e33498769835d5cc577d0dad43e489fc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Polkadot-API](https://github.com/polkadot-api/polkadot-api) (PAPI) is a set of libraries built to be modular, composable, and grounded in a “light-client first” approach. Its primary aim is to equip dApp developers with an extensive toolkit for building fully decentralized applications.\n\nPAPI is optimized for light-client functionality, using the new JSON-RPC spec to support decentralized interactions fully. It provides strong TypeScript support with types and documentation generated directly from on-chain metadata, and it offers seamless access to storage reads, constants, transactions, events, and runtime calls. Developers can connect to multiple chains simultaneously and prepare for runtime updates through multi-descriptor generation and compatibility checks. PAPI is lightweight and performant, leveraging native BigInt, dynamic imports, and modular subpaths to avoid bundling unnecessary assets. It supports promise-based and observable-based APIs, integrates easily with Polkadot.js extensions, and offers signing options through browser extensions or private keys."}
{"source": "polkadot-docs", "page_id": "reference-tools-papi", "url": "https://developer.polkadot.com/reference/tools/papi/#get-started", "page_title": "Polkadot-API", "index": 1, "depth": 2, "title": "Get Started", "anchor": "get-started", "start_char": 1118, "end_char": 1134, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:15f3680c9b73d99f437393f1bf6901a6e33498769835d5cc577d0dad43e489fc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Started"}
{"source": "polkadot-docs", "page_id": "reference-tools-papi", "url": "https://developer.polkadot.com/reference/tools/papi/#api-instantiation", "page_title": "Polkadot-API", "index": 2, "depth": 3, "title": "API Instantiation", "anchor": "api-instantiation", "start_char": 1134, "end_char": 5895, "estimated_token_count": 1101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:15f3680c9b73d99f437393f1bf6901a6e33498769835d5cc577d0dad43e489fc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### API Instantiation\n\nTo instantiate the API, you can install the package by using the following command:\n\n=== \"npm\"\n\n    ```bash\n    npm i polkadot-api@3.3.0\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm add polkadot-api@3.3.0\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn add polkadot-api@3.3.0\n    ```\n\nThen, obtain the latest metadata from the target chain and generate the necessary types:\n\n```bash\n# Add the target chain\nnpx papi add dot -n polkadot\n```\n\nThe `papi add` command initializes the library by generating the corresponding types needed for the chain used. It assigns the chain a custom name and specifies downloading metadata from the Polkadot chain. You can replace `dot` with the name you prefer or with another chain if you want to add a different one. Once the latest metadata is downloaded, generate the required types:\n\n```bash\n# Generate the necessary types\nnpx papi\n```\n\nYou can now set up a [`PolkadotClient`](https://github.com/polkadot-api/polkadot-api/blob/main/packages/client/src/types.ts#L153) with your chosen provider to begin interacting with the API. Choose from Smoldot via WebWorker, Node.js, or direct usage, or connect through the WSS provider. The examples below show how to configure each option for your setup.\n\n=== \"Smoldot (WebWorker)\"\n\n    ```typescript\n    // `dot` is the identifier assigned during `npx papi add`\n    import { dot } from '@polkadot-api/descriptors';\n    import { createClient } from 'polkadot-api';\n    import { getSmProvider } from 'polkadot-api/sm-provider';\n    import { chainSpec } from 'polkadot-api/chains/polkadot';\n    import { startFromWorker } from 'polkadot-api/smoldot/from-worker';\n    import SmWorker from 'polkadot-api/smoldot/worker?worker';\n    \n    const worker = new SmWorker();\n    const smoldot = startFromWorker(worker);\n    \n    // Establish connection to the Polkadot relay chain\n    const client = createClient(\n      getSmProvider(() => smoldot.addChain({ chainSpec })),\n    );\n    \n    // To interact with the chain, obtain the `TypedApi`, which provides\n    // the necessary types for every API call on this chain\n    const dotApi = client.getTypedApi(dot);\n    \n    ```\n\n=== \"Smoldot (Node.js)\"\n\n    ```typescript\n    // `dot` is the alias assigned during `npx papi add`\n    import { dot } from '@polkadot-api/descriptors';\n    import { createClient } from 'polkadot-api';\n    import { getSmProvider } from 'polkadot-api/sm-provider';\n    import { chainSpec } from 'polkadot-api/chains/polkadot';\n    import { startFromWorker } from 'polkadot-api/smoldot/from-node-worker';\n    import { fileURLToPath } from 'url';\n    import { Worker } from 'worker_threads';\n    \n    // Get the path for the worker file in ESM\n    const workerPath = fileURLToPath(\n      import.meta.resolve('polkadot-api/smoldot/node-worker'),\n    );\n    \n    const worker = new Worker(workerPath);\n    const smoldot = startFromWorker(worker);\n    \n    // Set up a client to connect to the Polkadot relay chain\n    const client = createClient(\n      getSmProvider(() => smoldot.addChain({ chainSpec })),\n    );\n    \n    // To interact with the chain's API, use `TypedApi` for access to\n    // all the necessary types and calls associated with this chain\n    const dotApi = client.getTypedApi(dot);\n    \n    ```\n\n=== \"Smoldot\"\n\n    ```typescript\n    // `dot` is the alias assigned when running `npx papi add`\n    import { dot } from '@polkadot-api/descriptors';\n    import { createClient } from 'polkadot-api';\n    import { getSmProvider } from 'polkadot-api/sm-provider';\n    import { chainSpec } from 'polkadot-api/chains/polkadot';\n    import { start } from 'polkadot-api/smoldot';\n    \n    // Initialize Smoldot client\n    const smoldot = start();\n    \n    // Set up a client to connect to the Polkadot relay chain\n    const client = createClient(\n      getSmProvider(() => smoldot.addChain({ chainSpec })),\n    );\n    \n    // Access the `TypedApi` to interact with all available chain calls and types\n    const dotApi = client.getTypedApi(dot);\n    \n    ```\n\n=== \"WSS\"\n\n    ```typescript\n    // `dot` is the identifier assigned when executing `npx papi add`\n    import { dot } from '@polkadot-api/descriptors';\n    import { createClient } from 'polkadot-api';\n    // Use this import for Node.js environments\n    import { getWsProvider } from 'polkadot-api/ws';\n    \n    // Establish a connection to the Polkadot relay chain\n    const client = createClient(getWsProvider('wss://dot-rpc.stakeworld.io'));\n    \n    // To interact with the chain, obtain the `TypedApi`, which provides\n    // the types for all available calls in that chain\n    const dotApi = client.getTypedApi(dot);\n    \n    ```\n\nNow that you have set up the client, you can interact with the chain by reading and sending transactions."}
{"source": "polkadot-docs", "page_id": "reference-tools-papi", "url": "https://developer.polkadot.com/reference/tools/papi/#reading-chain-data", "page_title": "Polkadot-API", "index": 3, "depth": 3, "title": "Reading Chain Data", "anchor": "reading-chain-data", "start_char": 5895, "end_char": 6829, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:15f3680c9b73d99f437393f1bf6901a6e33498769835d5cc577d0dad43e489fc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Reading Chain Data\n\nThe `TypedApi` provides a streamlined way to read blockchain data through three main interfaces, each designed for specific data access patterns:\n\n- **Constants**: Access fixed values or configurations on the blockchain using the `constants` interface.\n\n    ```typescript\n    const version = await typedApi.constants.System.Version();\n    ```\n\n- **Storage queries**: Retrieve stored values by querying the blockchain’s storage via the `query` interface.\n\n    ```typescript\n    const asset = await api.query.ForeignAssets.Asset.getValue(\n      token.location,\n      { at: 'best' },\n    );\n    ```\n\n- **Runtime APIs**: Interact directly with runtime APIs using the `apis` interface.\n\n    ```typescript\n    const metadata = await typedApi.apis.Metadata.metadata();\n    ```\n\nTo learn more about the different actions you can perform with the `TypedApi`, refer to the [TypedApi reference](https://papi.how/typed)."}
{"source": "polkadot-docs", "page_id": "reference-tools-papi", "url": "https://developer.polkadot.com/reference/tools/papi/#sending-transactions", "page_title": "Polkadot-API", "index": 4, "depth": 3, "title": "Sending Transactions", "anchor": "sending-transactions", "start_char": 6829, "end_char": 8496, "estimated_token_count": 349, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:15f3680c9b73d99f437393f1bf6901a6e33498769835d5cc577d0dad43e489fc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sending Transactions\n\nIn PAPI, the `TypedApi` provides the `tx` and `txFromCallData` methods to send transactions. \n\n- The `tx` method allows you to directly send a transaction with the specified parameters by using the `typedApi.tx.Pallet.Call` pattern:\n\n    ```typescript\n    const tx: Transaction = typedApi.tx.Pallet.Call({arg1, arg2, arg3});\n    ``` \n\n    For instance, to execute the `balances.transferKeepAlive` call, you can use the following snippet:\n\n    ```typescript\n    import { MultiAddress } from '@polkadot-api/descriptors';\n    \n    const tx: Transaction = typedApi.tx.Balances.transfer_keep_alive({\n      dest: MultiAddress.Id('INSERT_DESTINATION_ADDRESS'),\n      value: BigInt(INSERT_VALUE),\n    });\n    \n    ```\n\n    Ensure you replace `INSERT_DESTINATION_ADDRESS` and `INSERT_VALUE` with the actual destination address and value, respectively.\n\n- The `txFromCallData` method allows you to send a transaction using the call data. This option accepts binary call data and constructs the transaction from it. It validates the input upon creation and will throw an error if invalid data is provided. The pattern is as follows:\n\n    ```typescript\n    const callData = Binary.fromHex('0x...');\n    const tx: Transaction = typedApi.txFromCallData(callData);\n    ``` \n\n    For instance, to execute a transaction using the call data, you can use the following snippet:\n\n    ```typescript\n    const callData = Binary.fromHex('0x00002470617065726d6f6f6e');\n    const tx: Transaction = typedApi.txFromCallData(callData);\n    ```\n\nFor more information about sending transactions, refer to the [Transactions](https://papi.how/typed/tx#transactions) page."}
{"source": "polkadot-docs", "page_id": "reference-tools-papi", "url": "https://developer.polkadot.com/reference/tools/papi/#where-to-go-next", "page_title": "Polkadot-API", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 8496, "end_char": 8621, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:15f3680c9b73d99f437393f1bf6901a6e33498769835d5cc577d0dad43e489fc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nFor an in-depth guide on how to use PAPI, refer to the official [PAPI](https://papi.how/) documentation."}
{"source": "polkadot-docs", "page_id": "reference-tools-paraspell", "url": "https://developer.polkadot.com/reference/tools/paraspell/#introduction", "page_title": "ParaSpell XCM SDK", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 2256, "estimated_token_count": 474, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d7ec9289f2103213b9dd7098b70096c86929850501da01d1436d618818b9b26a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[ParaSpell](https://paraspell.github.io/docs/) is a comprehensive suite of open-source tools designed to simplify cross-chain interactions within the Polkadot ecosystem. At its core, ParaSpell is dedicated to enhancing the functionality of the [XCM (Cross-Consensus Messaging)](/parachains/interoperability/get-started/) protocol by providing developers with a unified and streamlined experience for building interoperable decentralized applications (dApps).\n\nThe primary goal of ParaSpell is to abstract away the complexities of the XCM protocol. While XCM is a powerful feature of the Polkadot network, its implementation can vary significantly between different parachains. ParaSpell addresses this challenge by providing a standardized set of tools that enable developers to easily integrate cross-chain functionality into their applications, saving valuable time and effort. ParaSpell is a \"common good\" software, meaning it is free, open-source, and dedicated to the growth of the Polkadot ecosystem.\n\nThe ParaSpell suite includes:\n\n- **[XCM SDK](https://paraspell.xyz/#xcm-sdk)**: Provides a unified layer to incorporate XCM into decentralized applications, simplifying complex cross-chain interactions.\n- **[XCM API](https://paraspell.xyz/#xcm-api)**: Offers an efficient, package-free approach to integrating XCM functionality while offloading heavy computing tasks, minimizing costs and improving application performance.\n- **[XCM Router](https://paraspell.xyz/#xcm-router)**: Enables cross-chain asset swaps in a single command, allowing developers to send one asset type (such as DOT on Polkadot) and receive a different asset on another chain (like ASTR on Astar).\n- **[XCM Analyser](https://paraspell.xyz/#xcm-analyser)**: Decodes and translates complex XCM multilocation data into readable information, supporting easier troubleshooting and debugging.\n- **[XCM Visualizator](https://paraspell.xyz/#xcm-visualizator)**: A tool designed to give developers a clear, interactive view of XCM activity across the Polkadot ecosystem, providing insights into cross-chain communication flow.\n- **[XCM Playground](https://paraspell.xyz/#try-it)**: An interactive playground for testing different XCM scenarios."}
{"source": "polkadot-docs", "page_id": "reference-tools-paraspell", "url": "https://developer.polkadot.com/reference/tools/paraspell/#paraspell-xcm-sdk", "page_title": "ParaSpell XCM SDK", "index": 1, "depth": 3, "title": "ParaSpell XCM SDK", "anchor": "paraspell-xcm-sdk", "start_char": 2256, "end_char": 3151, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d7ec9289f2103213b9dd7098b70096c86929850501da01d1436d618818b9b26a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### ParaSpell XCM SDK\n\nThe [ParaSpell XCM SDK](https://paraspell.github.io/docs/xcm-sdk/getting-started.html) is a core component of the ParaSpell toolset and a foundational library for developers looking to leverage XCM in their applications. It is the first and only XCM SDK in the ecosystem to support both PolkadotJS and Polkadot API, providing developers with flexibility and choice.\n\nThe SDK simplifies the process of creating and sending XCM messages by providing a user-friendly builder pattern. This allows developers to construct complex XCM calls with just a few lines of code, reducing the likelihood of errors and ensuring that messages are constructed correctly.\n\nBy using the ParaSpell XCM SDK, developers can significantly accelerate their development workflow and build powerful, interoperable dApps that take full advantage of the Polkadot network's cross-chain capabilities."}
{"source": "polkadot-docs", "page_id": "reference-tools-paraspell", "url": "https://developer.polkadot.com/reference/tools/paraspell/#install-paraspell", "page_title": "ParaSpell XCM SDK", "index": 2, "depth": 2, "title": "Install ParaSpell", "anchor": "install-paraspell", "start_char": 3151, "end_char": 3492, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d7ec9289f2103213b9dd7098b70096c86929850501da01d1436d618818b9b26a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install ParaSpell\n\nIf you want to use ParaSpell in your project you can add it as a dependency with the following command:\n\n=== \"npm\"\n\n    ```bash\n    npm install --save @paraspell/sdk@14.4.4\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm add @paraspell/sdk@14.4.4\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn add @paraspell/sdk@14.4.4\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-paraspell", "url": "https://developer.polkadot.com/reference/tools/paraspell/#where-to-go-next", "page_title": "ParaSpell XCM SDK", "index": 3, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3492, "end_char": 3900, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d7ec9289f2103213b9dd7098b70096c86929850501da01d1436d618818b9b26a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nExplore more about ParaSpell through these resources:\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge tutorial\">Tutorial</span> __Transfer Assets Between Parachains__\n\n    ---\n\n    Learn how to transfer assets across chains with ParaSpell.\n\n    [:octicons-arrow-right-24: Get Started](/chain-interactions/send-transactions/interoperability/transfer-assets-parachains/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#installation", "page_title": "Polkadart", "index": 0, "depth": 2, "title": "Installation", "anchor": "installation", "start_char": 439, "end_char": 1051, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installation\n\nAdd Polkadart to your `pubspec.yaml`:\n\n=== \"All packages\"\n\n    ```bash\n    dart pub add polkadart polkadart_cli polkadart_keyring polkadart_scale_codec secp256k1_ecdsa sr25519 ss58 substrate_bip39 substrate_metadata\n    ```\n\n=== \"Core only\"\n\n    ```bash\n    dart pub add polkadart polkadart_cli polkadart_keyring\n    ```\n\nFor type-safe API generation, add the following to your `pubspec.yaml`:\n\n```yaml title=\"pubspec.yaml\"\npolkadart:\n  output_dir: lib/generated\n  chains:\n    polkadot: wss://rpc.polkadot.io\n    kusama: wss://kusama-rpc.polkadot.io\n    custom: wss://your-node.example.com\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#get-started", "page_title": "Polkadart", "index": 1, "depth": 2, "title": "Get Started", "anchor": "get-started", "start_char": 1051, "end_char": 1067, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Started"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#type-generation", "page_title": "Polkadart", "index": 2, "depth": 3, "title": "Type Generation", "anchor": "type-generation", "start_char": 1067, "end_char": 1316, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Type Generation\n\nPolkadart provides a CLI tool to generate type definitions from any Polkadot-SDK compatible blockchain network. This allows you to build type-safe Dart applications without dealing with the low-level details of the blockchain."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#run-generator", "page_title": "Polkadart", "index": 3, "depth": 3, "title": "Run Generator", "anchor": "run-generator", "start_char": 1316, "end_char": 1383, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Run Generator\n\n```bash\ndart run polkadart_cli:generate -v\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#use-generated-types", "page_title": "Polkadart", "index": 4, "depth": 3, "title": "Use Generated Types", "anchor": "use-generated-types", "start_char": 1383, "end_char": 1926, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use Generated Types\n\n```dart\nimport 'package:your_app/generated/polkadot/polkadot.dart';\nimport 'package:polkadart/polkadart.dart';\nimport 'package:ss58/ss58.dart';\n\nfinal provider = Provider.fromUri(Uri.parse('wss://rpc.polkadot.io'));\nfinal polkadot = Polkadot(provider);\n  \n// Account from SS58 address\nfinal account = Address.decode('19t9Q2ay58hMDaeg6eeBhqmHsRnc2jDMV3cYYw9zbc59HLj');\n\n// Retrieve Account Balance\nfinal accountInfo = await polkadot.query.system.account(account.pubkey);\nprint('Balance: ${accountInfo.data.free}')\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#creating-an-api-instance", "page_title": "Polkadart", "index": 5, "depth": 3, "title": "Creating an API Instance", "anchor": "creating-an-api-instance", "start_char": 1926, "end_char": 2375, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Creating an API Instance\n\nAn API instance is required to interact with the blockchain. Polkadart provides a `Provider` class that allows you to connect to any network.\n\n```dart\nimport 'package:demo/generated/polkadot/polkadot.dart';\nimport 'package:polkadart/provider.dart';\n\nFuture<void> main(List<String> arguments) async {\n  final provider = Provider.fromUri(Uri.parse('wss://rpc.polkadot.io'));\n  final polkadot = Polkadot(provider);\n}\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#reading-chain-data", "page_title": "Polkadart", "index": 6, "depth": 3, "title": "Reading Chain Data", "anchor": "reading-chain-data", "start_char": 2375, "end_char": 2871, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Reading Chain Data\n\nBesides querying the data using the `query` from the generated API, you can also use the State API for querying storage data, metadata, runtime information, and other chain information.\n\n```dart\nfinal stateApi = StateApi(provider);\n\n// Get current runtime version\nfinal runtimeVersion = await stateApi.getRuntimeVersion();\nprint(runtimeVersion.toJson());\n\n// Get metadata\nfinal metadata = await stateApi.getMetadata();\nprint('Metadata version: ${metadata.version}');\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#subscribe-to-new-blocks", "page_title": "Polkadart", "index": 7, "depth": 3, "title": "Subscribe to New Blocks", "anchor": "subscribe-to-new-blocks", "start_char": 2871, "end_char": 3159, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Subscribe to New Blocks\n\nYou can subscribe to new blocks on the blockchain using the `subscribe` method.\n\n```dart\nfinal subscription = await provider.subscribe('chain_subscribeNewHeads', []);\n\nsubscription.stream.forEach((response) {\n  print('New head: ${response.result}');\n});\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#send-a-transaction", "page_title": "Polkadart", "index": 8, "depth": 3, "title": "Send a Transaction", "anchor": "send-a-transaction", "start_char": 3159, "end_char": 4918, "estimated_token_count": 380, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Send a Transaction\n\nPerhaps the most common operation done in any blockchain is transferring funds. Here you can see how that can be done using Polkadart:\n\n```dart\nfinal wallet = await KeyPair.sr25519.fromUri(\"//Alice\");\nprint('Alice\\' wallet: ${wallet.address}');\n\n// Get information necessary to build a proper extrinsic\nfinal runtimeVersion = await polkadot.rpc.state.getRuntimeVersion();\nfinal currentBlockNumber = (await polkadot.query.system.number()) - 1;\nfinal currentBlockHash = await polkadot.query.system.blockHash(currentBlockNumber);\nfinal genesisHash = await polkadot.query.system.blockHash(0);\nfinal nonce = await polkadot.rpc.system.accountNextIndex(wallet.address);\n\n// Make the encoded call\nfinal multiAddress = $MultiAddress().id(wallet.publicKey.bytes);\nfinal transferCall = polkadot.tx.balances.transferKeepAlive(dest: multiAddress, value: BigInt.one).encode();\n\n// Make the payload\nfinal payload = SigningPayload(\n    method: transferCall,\n    specVersion: runtimeVersion.specVersion,\n    transactionVersion: runtimeVersion.transactionVersion,\n    genesisHash: encodeHex(genesisHash),\n    blockHash: encodeHex(currentBlockHash),\n    blockNumber: currentBlockNumber,\n    eraPeriod: 64,\n    nonce: nonce,\n    tip: 0,\n).encode(polkadot.registry);\n\n// Sign the payload and build the final extrinsic\nfinal signature = wallet.sign(payload);\nfinal extrinsic = ExtrinsicPayload(\n  signer: wallet.bytes(),\n  method: transferCall,\n  signature: signature,\n  eraPeriod: 64,\n  blockNumber: currentBlockNumber,\n  nonce: nonce,\n  tip: 0,\n).encode(polkadot.registry, SignatureType.sr25519);\n\n// Send the extrinsic to the blockchain\nfinal author = AuthorApi(provider);\nawait author.submitAndWatchExtrinsic(extrinsic, (data) {\n  print(data);\n});\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadart", "url": "https://developer.polkadot.com/reference/tools/polkadart/#where-to-go-next", "page_title": "Polkadart", "index": 9, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4918, "end_char": 5123, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:02cadd6ee539dc6c4caad1c4f3fcd3154da99817e27ccde5c62dd73437999dd2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nTo dive deeper into Polkadart, refer to the [official Polkadart documentation](https://polkadart.dev/), where you can find comprehensive guides for common use cases and advanced usage."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#introduction", "page_title": "Polkadot.js API", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 328, "end_char": 596, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [Polkadot.js API](https://github.com/polkadot-js/api) uses JavaScript/TypeScript to interact with Polkadot SDK-based chains. It allows you to query nodes, read chain state, and submit transactions through a dynamic, auto-generated API interface."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#dynamic-api-generation", "page_title": "Polkadot.js API", "index": 1, "depth": 3, "title": "Dynamic API Generation", "anchor": "dynamic-api-generation", "start_char": 596, "end_char": 960, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Dynamic API Generation\n\nUnlike traditional static APIs, the Polkadot.js API generates its interfaces automatically when connecting to a node. Here's what happens when you connect:\n\n1. The API connects to your node.\n2. It retrieves the chain's metadata.\n3. Based on this metadata, it creates specific endpoints in this format: `api.<type>.<module>.<section>`."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#available-api-categories", "page_title": "Polkadot.js API", "index": 2, "depth": 3, "title": "Available API Categories", "anchor": "available-api-categories", "start_char": 960, "end_char": 1767, "estimated_token_count": 230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Available API Categories\n\nYou can access three main categories of chain interactions:\n\n- **[Runtime constants](https://polkadot.js.org/docs/api/start/api.consts)** (`api.consts`):\n\n    - Access runtime constants directly.\n    - Returns values immediately without function calls.\n    - **Example**: `api.consts.balances.existentialDeposit`\n\n- **[State queries](https://polkadot.js.org/docs/api/start/api.query/)** (`api.query`):\n\n    - Read chain state.\n    - **Example**: `api.query.system.account(accountId)`\n\n- **[Transactions](https://polkadot.js.org/docs/api/start/api.tx/)** (`api.tx`):\n    - Submit extrinsics (transactions).\n    - **Example**: `api.tx.balances.transfer(accountId, value)`\n\nThe available methods and interfaces will automatically reflect what's possible on your connected chain."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#installation", "page_title": "Polkadot.js API", "index": 3, "depth": 2, "title": "Installation", "anchor": "installation", "start_char": 1767, "end_char": 2304, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installation\n\nTo add the Polkadot.js API to your project, use the following command to install the version `17.0.2` which supports any Polkadot SDK-based chain:\n\n=== \"npm\"\n    ```bash\n    npm i @polkadot/api@17.0.2\n    ```\n\n=== \"pnpm\"\n    ```bash\n    pnpm add @polkadot/api@17.0.2\n    ```\n\n=== \"yarn\"\n    ```bash\n    yarn add @polkadot/api@17.0.2\n    ```\n\nFor more detailed information about installation, see the [Installation](https://polkadot.js.org/docs/api/start/install/) section in the official Polkadot.js API documentation."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#get-started", "page_title": "Polkadot.js API", "index": 4, "depth": 2, "title": "Get Started", "anchor": "get-started", "start_char": 2304, "end_char": 2320, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Started"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#creating-an-api-instance", "page_title": "Polkadot.js API", "index": 5, "depth": 3, "title": "Creating an API Instance", "anchor": "creating-an-api-instance", "start_char": 2320, "end_char": 3089, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Creating an API Instance\n\nTo interact with a Polkadot SDK-based chain, you must establish a connection through an API instance. The API provides methods for querying chain state, sending transactions, and subscribing to updates.\n\nTo create an API connection:\n\n```js\nimport { ApiPromise, WsProvider } from '@polkadot/api';\n\n// Create a WebSocket provider\nconst wsProvider = new WsProvider('wss://rpc.polkadot.io');\n\n// Initialize the API\nconst api = await ApiPromise.create({ provider: wsProvider });\n\n// Verify the connection by getting the chain's genesis hash\nconsole.log('Genesis Hash:', api.genesisHash.toHex());\n\n```\n\n!!!warning\n    All `await` operations must be wrapped in an async function or block since the API uses promises for asynchronous operations."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#reading-chain-data", "page_title": "Polkadot.js API", "index": 6, "depth": 3, "title": "Reading Chain Data", "anchor": "reading-chain-data", "start_char": 3089, "end_char": 3949, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Reading Chain Data\n\nThe API provides several ways to read data from the chain. You can access:\n\n- **Constants**: Values that are fixed in the runtime and don't change without a runtime upgrade.\n\n    ```js\n    // Get the minimum balance required for a new account\n    const minBalance = api.consts.balances.existentialDeposit.toNumber();\n    \n    ```\n\n- **State**: Current chain state that updates with each block.\n\n    ```js\n    // Example address\n    const address = '5DTestUPts3kjeXSTMyerHihn1uwMfLj8vU8sqF7qYrFabHE';\n    \n    // Get current timestamp\n    const timestamp = await api.query.timestamp.now();\n    \n    // Get account information\n    const { nonce, data: balance } = await api.query.system.account(address);\n    \n    console.log(`\n      Timestamp: ${timestamp}\n      Free Balance: ${balance.free}\n      Nonce: ${nonce}\n    `);\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#sending-transactions", "page_title": "Polkadot.js API", "index": 7, "depth": 3, "title": "Sending Transactions", "anchor": "sending-transactions", "start_char": 3949, "end_char": 4748, "estimated_token_count": 188, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sending Transactions\n\nTransactions (also called extrinsics) modify the chain state. Before sending a transaction, you need:\n\n- A funded account with sufficient balance to pay transaction fees.\n- The account's keypair for signing.\n\nTo make a transfer:\n\n```js\n// Assuming you have an `alice` keypair from the Keyring\nconst recipient = 'INSERT_RECIPIENT_ADDRESS';\nconst amount = 'INSERT_VALUE'; // Amount in the smallest unit (e.g., Planck for DOT)\n\n// Sign and send a transfer\nconst txHash = await api.tx.balances\n  .transfer(recipient, amount)\n  .signAndSend(alice);\n\nconsole.log('Transaction Hash:', txHash);\n\n```\n\nThe `alice` keypair in the example comes from a `Keyring` object. For more details about managing keypairs, see the [Keyring documentation](https://polkadot.js.org/docs/keyring)."}
{"source": "polkadot-docs", "page_id": "reference-tools-polkadot-js-api", "url": "https://developer.polkadot.com/reference/tools/polkadot-js-api/#where-to-go-next", "page_title": "Polkadot.js API", "index": 8, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4748, "end_char": 4892, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:661f93b20a7668efe5ae13ad82d8d0a830c41f32d3b8efb698255c5761ff1371", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nFor more detailed information about the Polkadot.js API, check the [official documentation](https://polkadot.js.org/docs/)."}
{"source": "polkadot-docs", "page_id": "reference-tools-pop-cli", "url": "https://developer.polkadot.com/reference/tools/pop-cli/#introduction", "page_title": "Quickstart Parachain Development with Pop CLI", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 50, "end_char": 734, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6960a20c382932272eb75db4dc53687650cba2bf997cddbc08796ff9d6b0f1cc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Pop CLI](https://www.onpop.io/cli/) is a powerful command-line tool designed explicitly for rapid parachain development within the Polkadot ecosystem. It addresses essential developer needs by providing streamlined commands to set up development environments, scaffold parachain templates, and manage local blockchain networks.\n\nPop CLI simplifies parachain development with features like:\n\n- Quick initialization of parachain development environments.\n- Project scaffolding from predefined parachain templates.\n- Easy deployment and management of local development networks.\n\nDevelopers can quickly begin coding and testing, significantly reducing setup overhead."}
{"source": "polkadot-docs", "page_id": "reference-tools-pop-cli", "url": "https://developer.polkadot.com/reference/tools/pop-cli/#install-pop-cli", "page_title": "Quickstart Parachain Development with Pop CLI", "index": 1, "depth": 3, "title": "Install Pop CLI", "anchor": "install-pop-cli", "start_char": 734, "end_char": 956, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6960a20c382932272eb75db4dc53687650cba2bf997cddbc08796ff9d6b0f1cc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install Pop CLI\n\nTo install Pop CLI, run the following command:\n\n```bash\ncargo install --force --locked pop-cli\n```\n\nConfirm that Pop CLI is installed by running `pop --help` in your terminal:\n\n```bash\npop --help\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-pop-cli", "url": "https://developer.polkadot.com/reference/tools/pop-cli/#set-up-your-development-environment", "page_title": "Quickstart Parachain Development with Pop CLI", "index": 2, "depth": 3, "title": "Set Up Your Development Environment", "anchor": "set-up-your-development-environment", "start_char": 956, "end_char": 2240, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6960a20c382932272eb75db4dc53687650cba2bf997cddbc08796ff9d6b0f1cc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Set Up Your Development Environment\n\nTo develop and build Polkadot SDK-based chains, preparing your local environment with the necessary tools and dependencies is essential. The [Install Polkadot SDK Dependencies](/parachains/install-polkadot-sdk/) guide walks you through this setup step-by-step.\n\nHowever, you can automate this entire process by running:\n\n```bash\npop install\n```\n\nThis command provides an interactive experience that checks and installs all necessary dependencies for you. It's the fastest and easiest way to prepare your development environment for building parachains with Pop CLI.\n\n<div id=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>pop install</span>\n    <span data-ty>┌ Pop CLI : Install dependencies for development</span>\n    <span data-ty>│ </span>\n    <span data-ty></span>\n    <span data-ty>⚙ ℹ️ Mac OS (Darwin) detected.</span>\n    <span data-ty>│ </span>\n    <span data-ty>⚙ More information about the packages to be installed here: https://docs.substrate.io/install/macos/</span>\n    <span data-ty>│ </span>\n    <span data-ty>◆ 📦 Do you want to proceed with the installation of the following packages: homebrew, protobuf, openssl, rustup and cmake ?</span>\n    <span data-ty>│ ● Yes / ○ No </span>\n  </div>"}
{"source": "polkadot-docs", "page_id": "reference-tools-pop-cli", "url": "https://developer.polkadot.com/reference/tools/pop-cli/#initialize-a-project", "page_title": "Quickstart Parachain Development with Pop CLI", "index": 3, "depth": 3, "title": "Initialize a Project", "anchor": "initialize-a-project", "start_char": 2240, "end_char": 3742, "estimated_token_count": 368, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6960a20c382932272eb75db4dc53687650cba2bf997cddbc08796ff9d6b0f1cc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Initialize a Project\n\nStart a new project quickly using Pop CLI's `pop new parachain` command:\n\n<div id=\"termynal\" data-termynal>\n    <img src=\"/images/reference/tools/pop-cli/pop-new.gif\" alt=\"pop new\" style=\"max-width: 100%\" />\n</div>\n\nThe command above scaffolds a new parachain project using the default template included with Pop CLI. For more specialized implementations, additional templates are available; you can explore them by running `pop new parachain --help`.\n\nOnce the project is generated, move into the new directory and build your parachain:\n\n```bash\ncd my-parachain\npop build --release\n```\n\n!!! note\n    Under the hood, `pop build --release` runs `cargo build --release`, but `pop build` adds functionality specific to Polkadot SDK projects, such as deterministic runtime builds and automatic management of feature flags like `benchmark` or `try-runtime`.\n\nPop CLI integrates the [Zombienet SDK](https://github.com/paritytech/zombienet-sdk) allowing you to easily launch ephemeral local networks for development and testing. To start a network, simply run the following:\n\n```bash\npop up network -f ./network.toml\n```\n\nThis command will automatically fetch the necessary binaries and spin up a Polkadot network with your configured parachains.\n\nYou can also interact with your local network using Pop CLI's `pop call chain` command:\n\n<div id=\"termynal\" data-termynal>\n    <img src=\"/images/reference/tools/pop-cli/call-chain.gif\" alt=\"pop call\" style=\"max-width: 100%\" />\n</div>"}
{"source": "polkadot-docs", "page_id": "reference-tools-pop-cli", "url": "https://developer.polkadot.com/reference/tools/pop-cli/#where-to-go-next", "page_title": "Quickstart Parachain Development with Pop CLI", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3742, "end_char": 4112, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6960a20c382932272eb75db4dc53687650cba2bf997cddbc08796ff9d6b0f1cc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nFor a comprehensive guide to all Pop CLI features and advanced usage, see the official [Pop CLI](https://learn.onpop.io/chains) documentation.\n\n!!! tip\n    Pop CLI also offers powerful solutions for smart contract developers. If you're interested in that path, check out the [Pop CLI Smart Contracts](https://learn.onpop.io/contracts) documentation."}
{"source": "polkadot-docs", "page_id": "reference-tools-py-substrate-interface", "url": "https://developer.polkadot.com/reference/tools/py-substrate-interface/#introduction", "page_title": "Python Substrate Interface", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 31, "end_char": 469, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ad2c73ac60161a0c9f1b8f280445e6d9fd60a6b02ccafc2d0dc8d71401049198", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [Python Substrate Interface](https://github.com/polkascan/py-substrate-interface) is a powerful library that enables interaction with Polkadot SDK-based chains. It provides essential functionality for:\n\n- Querying on-chain storage.\n- Composing and submitting extrinsics.\n- SCALE encoding/decoding.\n- Interacting with Substrate runtime metadata.\n- Managing blockchain interactions through convenient utility methods."}
{"source": "polkadot-docs", "page_id": "reference-tools-py-substrate-interface", "url": "https://developer.polkadot.com/reference/tools/py-substrate-interface/#installation", "page_title": "Python Substrate Interface", "index": 1, "depth": 2, "title": "Installation", "anchor": "installation", "start_char": 469, "end_char": 760, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ad2c73ac60161a0c9f1b8f280445e6d9fd60a6b02ccafc2d0dc8d71401049198", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installation\n\nInstall the library using `pip`:\n\n```py\npip install substrate-interface\n```\n\nFor more installation details, see the [Installation](https://jamdottech.github.io/py-polkadot-sdk/getting-started/installation/) section in the official Python Substrate Interface documentation."}
{"source": "polkadot-docs", "page_id": "reference-tools-py-substrate-interface", "url": "https://developer.polkadot.com/reference/tools/py-substrate-interface/#get-started", "page_title": "Python Substrate Interface", "index": 2, "depth": 2, "title": "Get Started", "anchor": "get-started", "start_char": 760, "end_char": 940, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ad2c73ac60161a0c9f1b8f280445e6d9fd60a6b02ccafc2d0dc8d71401049198", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Started\n\nThis guide will walk you through the basic operations with the Python Substrate Interface: connecting to a node, reading chain state, and submitting transactions."}
{"source": "polkadot-docs", "page_id": "reference-tools-py-substrate-interface", "url": "https://developer.polkadot.com/reference/tools/py-substrate-interface/#establishing-connection", "page_title": "Python Substrate Interface", "index": 3, "depth": 3, "title": "Establishing Connection", "anchor": "establishing-connection", "start_char": 940, "end_char": 1457, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ad2c73ac60161a0c9f1b8f280445e6d9fd60a6b02ccafc2d0dc8d71401049198", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Establishing Connection\n\nThe first step is to establish a connection to a Polkadot SDK-based node. You can connect to either a local or remote node:\n\n```py\nfrom substrateinterface import SubstrateInterface\n\n# Connect to a node using websocket\nsubstrate = SubstrateInterface(\n    # For local node: \"ws://127.0.0.1:9944\"\n    # For Polkadot: \"wss://rpc.polkadot.io\"\n    # For Kusama: \"wss://kusama-rpc.polkadot.io\"\n    url=\"INSERT_WS_URL\"\n)\n\n# Verify connection\nprint(f\"Connected to chain: {substrate.chain}\")\n\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-py-substrate-interface", "url": "https://developer.polkadot.com/reference/tools/py-substrate-interface/#reading-chain-state", "page_title": "Python Substrate Interface", "index": 4, "depth": 3, "title": "Reading Chain State", "anchor": "reading-chain-state", "start_char": 1457, "end_char": 2475, "estimated_token_count": 242, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ad2c73ac60161a0c9f1b8f280445e6d9fd60a6b02ccafc2d0dc8d71401049198", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Reading Chain State\n\nYou can query various on-chain storage items. To retrieve data, you need to specify three key pieces of information:\n\n- **Pallet name**: Module or pallet that contains the storage item you want to access.\n- **Storage item**: Specific storage entry you want to query within the pallet.\n- **Required parameters**: Any parameters needed to retrieve the desired data.\n\nHere's an example of how to check an account's balance and other details:\n\n```py\n# ...\n\n# Query account balance and info\naccount_info = substrate.query(\n    module=\"System\",  # The pallet name\n    storage_function=\"Account\",  # The storage item\n    params=[\"INSERT_ADDRESS\"],  # Account address in SS58 format\n)\n\n# Access account details from the result\nfree_balance = account_info.value[\"data\"][\"free\"]\nreserved = account_info.value[\"data\"][\"reserved\"]\nnonce = account_info.value[\"nonce\"]\n\nprint(\n    f\"\"\"\n    Account Details:\n    - Free Balance: {free_balance}\n    - Reserved: {reserved} \n    - Nonce: {nonce}\n    \"\"\"\n)\n\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-py-substrate-interface", "url": "https://developer.polkadot.com/reference/tools/py-substrate-interface/#submitting-transactions", "page_title": "Python Substrate Interface", "index": 5, "depth": 3, "title": "Submitting Transactions", "anchor": "submitting-transactions", "start_char": 2475, "end_char": 3852, "estimated_token_count": 288, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ad2c73ac60161a0c9f1b8f280445e6d9fd60a6b02ccafc2d0dc8d71401049198", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Submitting Transactions\n\nTo modify the chain state, you need to submit transactions (extrinsics). Before proceeding, ensure you have:\n\n- A funded account with sufficient balance to pay transaction fees.\n- Access to the account's keypair.\n\nHere's how to create and submit a balance transfer:\n\n```py\n#...\n\n# Compose the transfer call\ncall = substrate.compose_call(\n    call_module=\"Balances\",  # The pallet name\n    call_function=\"transfer_keep_alive\",  # The extrinsic function\n    call_params={\n        'dest': 'INSERT_ADDRESS',  # Recipient's address\n        'value': 'INSERT_VALUE'  # Amount in smallest unit (e.g., Planck for DOT)\n    }\n)\n\n# Create a signed extrinsic\nextrinsic = substrate.create_signed_extrinsic(\n    call=call, keypair=keypair  # Your keypair for signing\n)\n\n# Submit and wait for inclusion\nreceipt = substrate.submit_extrinsic(\n    extrinsic, wait_for_inclusion=True  # Wait until the transaction is in a block\n)\n\nif receipt.is_success:\n    print(\n        f\"\"\"\n        Transaction successful:\n        - Extrinsic Hash: {receipt.extrinsic_hash}\n        - Block Hash: {receipt.block_hash}\n        \"\"\"\n    )\nelse:\n    print(f\"Transaction failed: {receipt.error_message}\")\n\n```\n\nThe `keypair` object is essential for signing transactions. See the [Keypair](https://jamdottech.github.io/py-polkadot-sdk/reference/keypair/) documentation for more details."}
{"source": "polkadot-docs", "page_id": "reference-tools-py-substrate-interface", "url": "https://developer.polkadot.com/reference/tools/py-substrate-interface/#where-to-go-next", "page_title": "Python Substrate Interface", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3852, "end_char": 4238, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ad2c73ac60161a0c9f1b8f280445e6d9fd60a6b02ccafc2d0dc8d71401049198", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you understand the basics, you can:\n\n- Explore more complex queries and transactions.\n- Learn about batch transactions and utility functions.\n- Discover how to work with custom pallets and types.\n\nFor comprehensive reference materials and advanced features, see the [Python Substrate Interface](https://jamdottech.github.io/py-polkadot-sdk/) documentation."}
{"source": "polkadot-docs", "page_id": "reference-tools-sidecar", "url": "https://developer.polkadot.com/reference/tools/sidecar/#introduction", "page_title": "Sidecar REST API", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 16, "end_char": 1170, "estimated_token_count": 222, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ccc969fd5857a5341d3578beaf62c94d9079c2e033eb15207b6e3e1d201814d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [Sidecar REST API](https://github.com/paritytech/substrate-api-sidecar) is a service that provides a REST interface for interacting with Polkadot SDK-based blockchains. With this API, developers can easily access a broad range of endpoints for nodes, accounts, transactions, parachains, and more.\n\nSidecar functions as a caching layer between your application and a Polkadot SDK-based node, offering standardized REST endpoints that simplify interactions without requiring complex, direct RPC calls. This approach is especially valuable for developers who prefer REST APIs or build applications in languages with limited WebSocket support.\n\nSome of the key features of the Sidecar API include:\n\n- **REST API interface**: Provides a familiar REST API interface for interacting with Polkadot SDK-based chains.\n- **Standardized endpoints**: Offers consistent endpoint formats across different chain implementations.\n- **Caching layer**: Acts as a caching layer to improve performance and reduce direct node requests.\n- **Multiple chain support**: Works with any Polkadot SDK-based chain, including Polkadot, Kusama, and custom chains."}
{"source": "polkadot-docs", "page_id": "reference-tools-sidecar", "url": "https://developer.polkadot.com/reference/tools/sidecar/#prerequisites", "page_title": "Sidecar REST API", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1170, "end_char": 1453, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ccc969fd5857a5341d3578beaf62c94d9079c2e033eb15207b6e3e1d201814d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nSidecar API requires Node.js version 18.14 LTS or higher. Verify your Node.js version:\n\n```bash\nnode --version\n```\n\nIf you need to install or update Node.js, visit the [official Node.js website](https://nodejs.org/) to download and install the latest LTS version."}
{"source": "polkadot-docs", "page_id": "reference-tools-sidecar", "url": "https://developer.polkadot.com/reference/tools/sidecar/#installation", "page_title": "Sidecar REST API", "index": 2, "depth": 2, "title": "Installation", "anchor": "installation", "start_char": 1453, "end_char": 2090, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ccc969fd5857a5341d3578beaf62c94d9079c2e033eb15207b6e3e1d201814d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installation\n\nTo install Substrate API Sidecar, use one of the following commands:\n\n=== \"npm\"\n\n    ```bash\n    npm install -g @substrate/api-sidecar\n    ```\n\n=== \"pnpm\"\n\n    ```bash\n    pnpm install -g @substrate/api-sidecar\n    ```\n\n=== \"yarn\"\n\n    ```bash\n    yarn global add @substrate/api-sidecar\n    ```\n\nYou can confirm the installation by running:\n\n```bash\nsubstrate-api-sidecar --version\n```\n\nFor more information about the Sidecar API installation, see the [installation and usage](https://github.com/paritytech/substrate-api-sidecar?tab=readme-ov-file#npm-package-installation-and-usage) section of the Sidecar API README."}
{"source": "polkadot-docs", "page_id": "reference-tools-sidecar", "url": "https://developer.polkadot.com/reference/tools/sidecar/#usage", "page_title": "Sidecar REST API", "index": 3, "depth": 2, "title": "Usage", "anchor": "usage", "start_char": 2090, "end_char": 5594, "estimated_token_count": 987, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ccc969fd5857a5341d3578beaf62c94d9079c2e033eb15207b6e3e1d201814d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Usage\n\nTo use the Sidecar API, you have two options:\n\n- **Local node**: Run a node locally, which Sidecar will connect to by default, requiring no additional configuration. To start, run the following:\n\n    ```bash\n    substrate-api-sidecar\n    ```\n\n- **Remote node**: Connect Sidecar to a remote node by specifying the RPC endpoint for that chain. For example, to gain access to the Polkadot Asset Hub associated endpoints.\n\n    ```bash\n    SAS_SUBSTRATE_URL=wss://polkadot-asset-hub-rpc.polkadot.io substrate-api-sidecar\n    ```\n\n    For more configuration details, see the [Configuration](https://github.com/paritytech/substrate-api-sidecar?tab=readme-ov-file#configuration) section of the Sidecar API documentation.\n\nOnce the Sidecar API is running, you’ll see output similar to this:\n\n<div id=\"termynal\" data-termynal>\n    <span data-ty='input'><span class='file-path'></span>SAS_SUBSTRATE_URL=wss://polkadot-asset-hub-rpc.polkadot.io substrate-api-sidecar</span>\n    <br>\n    <span data-ty>SAS:</span>\n    <span data-ty>📦 LOG:</span>\n    <span data-ty>   ✅ LEVEL: \"info\"</span>\n    <span data-ty>   ✅ JSON: false</span>\n    <span data-ty>   ✅ FILTER_RPC: false</span>\n    <span data-ty>   ✅ STRIP_ANSI: false</span>\n    <span data-ty>   ✅ WRITE: false</span>\n    <span data-ty>   ✅ WRITE_PATH: \"/opt/homebrew/lib/node_modules/@substrate/api-sidecar/build/src/logs\"</span>\n    <span data-ty>   ✅ WRITE_MAX_FILE_SIZE: 5242880</span>\n    <span data-ty>   ✅ WRITE_MAX_FILES: 5</span>\n    <span data-ty>📦 SUBSTRATE:</span>\n    <span data-ty>   ✅ URL: \"wss://polkadot-asset-hub-rpc.polkadot.io\"</span>\n    <span data-ty>   ✅ TYPES_BUNDLE: undefined</span>\n    <span data-ty>   ✅ TYPES_CHAIN: undefined</span>\n    <span data-ty>   ✅ TYPES_SPEC: undefined</span>\n    <span data-ty>   ✅ TYPES: undefined</span>\n    <span data-ty>   ✅ CACHE_CAPACITY: undefined</span>\n    <span data-ty>📦 EXPRESS:</span>\n    <span data-ty>   ✅ BIND_HOST: \"127.0.0.1\"</span>\n    <span data-ty>   ✅ PORT: 8080</span>\n    <span data-ty>   ✅ KEEP_ALIVE_TIMEOUT: 5000</span>\n    <span data-ty>📦 METRICS:</span>\n    <span data-ty>   ✅ ENABLED: false</span>\n    <span data-ty>   ✅ PROM_HOST: \"127.0.0.1\"</span>\n    <span data-ty>   ✅ PROM_PORT: 9100</span>\n    <span data-ty>   ✅ LOKI_HOST: \"127.0.0.1\"</span>\n    <span data-ty>   ✅ LOKI_PORT: 3100</span>\n    <span data-ty>   ✅ INCLUDE_QUERYPARAMS: false</span>\n    <br>\n    <span data-ty>2024-11-06 08:06:01 info: Version: 19.3.0</span>\n    <span data-ty>2024-11-06 08:06:02 warn: API/INIT: RPC methods not decorated: chainHead_v1_body, chainHead_v1_call, chainHead_v1_continue, chainHead_v1_follow, chainHead_v1_header, chainHead_v1_stopOperation, chainHead_v1_storage, chainHead_v1_unfollow, chainHead_v1_unpin, chainSpec_v1_chainName, chainSpec_v1_genesisHash, chainSpec_v1_properties, transactionWatch_v1_submitAndWatch, transactionWatch_v1_unwatch, transaction_v1_broadcast, transaction_v1_stop</span>\n    <span data-ty>2024-11-06 08:06:02 info: Connected to chain Polkadot Asset Hub on the statemint client at wss://polkadot-asset-hub-rpc.polkadot.io</span>\n    <span data-ty>2024-11-06 08:06:02 info: Listening on http://127.0.0.1:8080/</span>\n    <span data-ty>2024-11-06 08:06:02 info: Check the root endpoint (http://127.0.0.1:8080/) to see the available endpoints for the current node</span>\n</div>\n\nWith Sidecar running, you can access the exposed endpoints via a browser, [`Postman`](https://www.postman.com/), [`curl`](https://curl.se/), or your preferred tool."}
{"source": "polkadot-docs", "page_id": "reference-tools-sidecar", "url": "https://developer.polkadot.com/reference/tools/sidecar/#endpoints", "page_title": "Sidecar REST API", "index": 4, "depth": 3, "title": "Endpoints", "anchor": "endpoints", "start_char": 5594, "end_char": 6919, "estimated_token_count": 388, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ccc969fd5857a5341d3578beaf62c94d9079c2e033eb15207b6e3e1d201814d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Endpoints\n\nSidecar API provides a set of REST endpoints that allow you to query different aspects of the chain, including blocks, accounts, and transactions. Each endpoint offers specific insights into the chain’s state and activities.\n\nFor example, to retrieve the version of the node, use the `/node/version` endpoint:\n\n```bash\ncurl -X 'GET' \\\n  'http://127.0.0.1:8080/node/version' \\\n  -H 'accept: application/json'\n```\n\nAlternatively, you can access `http://127.0.0.1:8080/node/version` directly in a browser since it’s a `GET` request.\n\nIn response, you’ll see output similar to this (assuming you’re connected to Polkadot Asset Hub):\n\n<div id=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>curl -X 'GET' 'http://127.0.0.1:8080/node/version' -H 'accept: application/json'</span>\n    <br>\n    <span data-ty>{</span>\n    <span data-ty>    \"clientVersion\": \"1.16.1-835e0767fe8\",</span>\n    <span data-ty>    \"clientImplName\": \"statemint\",</span>\n    <span data-ty>    \"chain\": \"Polkadot Asset Hub\"</span>\n    <span data-ty>}</span>\n</div>\n\nFor a complete list of available endpoints and their documentation, visit the [Sidecar API list endpoints](https://paritytech.github.io/substrate-api-sidecar/dist/). You can learn about the endpoints and how to use them in your applications."}
{"source": "polkadot-docs", "page_id": "reference-tools-sidecar", "url": "https://developer.polkadot.com/reference/tools/sidecar/#where-to-go-next", "page_title": "Sidecar REST API", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6919, "end_char": 7183, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3ccc969fd5857a5341d3578beaf62c94d9079c2e033eb15207b6e3e1d201814d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nTo dive deeper, refer to the [official Sidecar documentation](https://github.com/paritytech/substrate-api-sidecar?tab=readme-ov-file#substrateapi-sidecar). This provides a comprehensive guide to the available configurations and advanced usage."}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#introduction", "page_title": "Subxt Rust API", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 404, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nSubxt is a Rust library designed to interact with Polkadot SDK-based blockchains. It provides a type-safe interface for submitting transactions, querying on-chain state, and performing other blockchain interactions. By leveraging Rust's strong type system, subxt ensures that your code is validated at compile time, reducing runtime errors and improving reliability."}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#prerequisites", "page_title": "Subxt Rust API", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 404, "end_char": 719, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore using subxt, ensure you have the following requirements:\n\n- Rust and Cargo installed on your system. You can install them using [Rustup](https://rustup.rs/).\n- A Rust project initialized. If you don't have one, create it with:\n    ```bash\n    cargo new my_project && cd my_project\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#installation", "page_title": "Subxt Rust API", "index": 2, "depth": 2, "title": "Installation", "anchor": "installation", "start_char": 719, "end_char": 2783, "estimated_token_count": 503, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Installation\n\nTo use subxt in your project, you must install the necessary dependencies. Each plays a specific role in enabling interaction with the blockchain:\n\n1. **Install the subxt CLI**: [`subxt-cli`](https://crates.io/crates/subxt-cli) is a command-line tool that provides utilities for working with Polkadot SDK metadata. In the context of subxt, it is essential to download chain metadata, which is required to generate type-safe Rust interfaces for interacting with the blockchain. Install it using the following:\n\n    ```bash\n    cargo install subxt-cli@0.50.1\n    ```\n\n2. **Add core dependencies**: These dependencies are essential for interacting with the blockchain.\n\n    - **[subxt](https://crates.io/crates/subxt)**: The main library for communicating with Polkadot SDK nodes. It handles RPC requests, encoding/decoding, and type generation.\n\n        ```bash\n        cargo add subxt@0.50.1\n        ```\n\n    - **[subxt-signer](https://crates.io/crates/subxt-signer)**: Provides cryptographic functionality for signing transactions. Without this, you can only read data but cannot submit transactions.\n\n        ```bash\n        cargo add subxt-signer@0.50.1\n        ```\n\n    - **[tokio](https://crates.io/crates/tokio)**: An asynchronous runtime for Rust. Since blockchain operations are async, Tokio enables the efficient handling of network requests. The `rt` feature enables Tokio's runtime, including the current-thread single-threaded scheduler, which is necessary for async execution. The `macros` feature provides procedural macros like `#[tokio::main]` to simplify runtime setup.\n\n        ```bash\n        cargo add tokio@1.44.2 --features rt,macros\n        ```\n\n    After adding the dependencies, your `Cargo.toml` should look like this:\n\n    ```toml\n    [package]\n    name = \"my_project\"\n    version = \"0.1.0\"\n    edition = \"2021\"\n    \n    [[bin]]\n    name = \"subxt\"\n    path = \"subxt.rs\"\n    \n    [dependencies]\n    subxt = \"0.50.0\"\n    subxt-signer = \"0.50.0\"\n    tokio = { version = \"1.44.2\", features = [\"rt\", \"macros\"] }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#get-started", "page_title": "Subxt Rust API", "index": 3, "depth": 2, "title": "Get Started", "anchor": "get-started", "start_char": 2783, "end_char": 2960, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Started\n\nThis guide will walk you through the fundamental operations of subxt, from setting up your environment to executing transactions and querying blockchain state."}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#download-chain-metadata", "page_title": "Subxt Rust API", "index": 4, "depth": 3, "title": "Download Chain Metadata", "anchor": "download-chain-metadata", "start_char": 2960, "end_char": 3351, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Download Chain Metadata\n\nBefore interacting with a blockchain, you need to retrieve its metadata. This metadata defines storage structures, extrinsics, and other runtime details. Use the `subxt-cli` tool to download the metadata, replacing `INSERT_NODE_URL` with the URL of the node you want to interact with:\n\n```bash\nsubxt metadata --url INSERT_NODE_URL > polkadot_metadata.scale\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#generate-type-safe-interfaces", "page_title": "Subxt Rust API", "index": 5, "depth": 3, "title": "Generate Type-Safe Interfaces", "anchor": "generate-type-safe-interfaces", "start_char": 3351, "end_char": 5015, "estimated_token_count": 451, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Generate Type-Safe Interfaces\n\nUse the `#[subxt::subxt]` macro to generate a type-safe Rust interface from the downloaded metadata:\n\n```rust\n// Generate an interface that we can use from the node's metadata.\n#[subxt::subxt(runtime_metadata_path = \"./polkadot_metadata.scale\")]\npub mod polkadot {}\n```\n\nOnce subxt interfaces are generated, you can interact with your node in the following ways. You can use the links below to view the related subxt documentation:\n\n- **[Transactions](https://docs.rs/subxt/latest/subxt/transactions/index.html)**: Builds and submits transactions, monitors their inclusion in blocks, and retrieves associated events.\n- **[Storage](https://docs.rs/subxt/latest/subxt/storage/index.html)**: Enables querying of node storage data.\n- **[Events](https://docs.rs/subxt/latest/subxt/events/index.html)**: Retrieves events emitted from recent blocks.\n- **[Constants](https://docs.rs/subxt/latest/subxt/constants/index.html)**: Accesses constant values stored in nodes that remain unchanged across a specific runtime version.\n- **[Extrinsics](https://docs.rs/subxt/latest/subxt/extrinsics/index.html)**: Loads recent blocks or subscribes to new/finalized blocks, allowing examination of extrinsics, events, and storage at those blocks.\n- **[Runtime APIs](https://docs.rs/subxt/latest/subxt/runtime_apis/index.html)**: Makes calls into pallet runtime APIs to fetch data.\n- **[Custom values](https://docs.rs/subxt/latest/subxt/custom_values/index.html)**: Accesses \"custom values\" contained within metadata.\n- **[Raw RPC calls](https://docs.rs/subxt/latest/subxt/index.html#re-exports)**: Facilitates raw RPC requests to compatible nodes."}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#initialize-the-subxt-client", "page_title": "Subxt Rust API", "index": 6, "depth": 3, "title": "Initialize the Subxt Client", "anchor": "initialize-the-subxt-client", "start_char": 5015, "end_char": 6013, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Initialize the Subxt Client\n\nTo interact with a blockchain node using subxt, create an asynchronous main function and initialize the client. Replace `INSERT_NODE_URL` with the URL of your target node:\n\n```rust\nuse std::str::FromStr;\nuse subxt::utils::AccountId32;\nuse subxt::{OnlineClient, PolkadotConfig};\nuse subxt_signer::{bip39::Mnemonic,sr25519::Keypair};\n\n// Generate an interface that we can use from the node's metadata.\n#[subxt::subxt(runtime_metadata_path = \"./polkadot_metadata.scale\")]\npub mod polkadot {}\n\n#[tokio::main(flavor = \"current_thread\")]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    // Define the node URL.\n    const NODE_URL: &str = \"INSERT_NODE_URL\";\n\n    // Initialize the Subxt client to interact with the blockchain.\n    let api = OnlineClient::<PolkadotConfig>::from_url(NODE_URL).await?;\n\n    // Anchor to the current block for all subsequent queries.\n    let at_block = api.at_current_block().await?;\n    // Your code here...\n    Ok(())\n}\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#read-chain-data", "page_title": "Subxt Rust API", "index": 7, "depth": 3, "title": "Read Chain Data", "anchor": "read-chain-data", "start_char": 6013, "end_char": 7207, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Read Chain Data\n\nsubxt provides multiple ways to access on-chain data:\n\n- **Constants**: Constants are predefined values in the runtime that remain unchanged unless modified by a runtime upgrade.\n\n    For example, to retrieve the existential deposit, use:\n    \n    ```rust\n    // A query to obtain some constant.\n    let constant_query = polkadot::constants().balances().existential_deposit();\n    \n    // Obtain the value.\n    let value = at_block.constants().entry(constant_query)?;\n    ```\n\n- **State**: State refers to the current chain data, which updates with each block.\n\n    To fetch account information, replace `INSERT_ADDRESS` with the address you want to fetch data from and use:\n\n    ```rust\n    // Define the target account address.\n    const ADDRESS: &str = \"INSERT_ADDRESS\";\n    let account = AccountId32::from_str(ADDRESS).unwrap();\n    \n    // Build a storage query to access account information.\n    let account_storage = at_block\n        .storage()\n        .entry(polkadot::storage().system().account())?;\n    \n    // Fetch the latest state for the account.\n    let result = account_storage\n        .fetch((account.into(),))\n        .await?\n        .decode()?;\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#submit-transactions", "page_title": "Subxt Rust API", "index": 8, "depth": 3, "title": "Submit Transactions", "anchor": "submit-transactions", "start_char": 7207, "end_char": 8609, "estimated_token_count": 310, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Submit Transactions\n\nTo submit a transaction, you must construct an extrinsic, sign it with your private key, and send it to the blockchain. Replace `INSERT_DEST_ADDRESS` with the recipient's address, `INSERT_AMOUNT` with the amount to transfer, and `INSERT_SECRET_PHRASE` with the sender's mnemonic phrase:\n\n```rust\n// Define the recipient address and transfer amount.\nconst DEST_ADDRESS: &str = \"INSERT_DEST_ADDRESS\";\nconst AMOUNT: u128 = INSERT_AMOUNT;\n\n// Convert the recipient address into an `AccountId32`.\nlet dest = AccountId32::from_str(DEST_ADDRESS).unwrap();\n\n// Build the balance transfer extrinsic.\nlet balance_transfer_tx = polkadot::transactions()\n    .balances()\n    .transfer_allow_death(dest.into(), AMOUNT);\n\n// Load the sender's keypair from a mnemonic phrase.\nconst SECRET_PHRASE: &str = \"INSERT_SECRET_PHRASE\";\nlet mnemonic = Mnemonic::parse(SECRET_PHRASE).unwrap();\nlet sender_keypair = Keypair::from_phrase(&mnemonic, None).unwrap();\n\n// Sign and submit the extrinsic, then wait for it to be finalized.\nlet events = at_block\n    .transactions()\n    .sign_and_submit_then_watch_default(&balance_transfer_tx, &sender_keypair)\n    .await?\n    .wait_for_finalized_success()\n    .await?;\n\n// Check for a successful transfer event.\nif let Some(event) = events.find_first::<polkadot::balances::events::Transfer>() {\n    println!(\"Balance transfer successful: {:?}\", event);\n}\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-subxt", "url": "https://developer.polkadot.com/reference/tools/subxt/#where-to-go-next", "page_title": "Subxt Rust API", "index": 9, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 8609, "end_char": 8830, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:60bb4c264676f02310eeda8894cdb06e378b86aa46a46181b0dbd945120561dd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you've covered the basics dive into the official [subxt documentation](https://docs.rs/subxt/latest/subxt/introduction/index.html) for comprehensive reference materials and advanced features."}
{"source": "polkadot-docs", "page_id": "reference-tools-xcm-tools", "url": "https://developer.polkadot.com/reference/tools/xcm-tools/#introduction", "page_title": "XCM Tools", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 788, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0287db8547b6e3dd68dca75226e121ba933a804b88ef9608dd470d43d25d856d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nAs described in the [Interoperability](/parachains/interoperability/get-started/) section, XCM (Cross-Consensus Messaging) is a protocol used in the Polkadot and Kusama ecosystems to enable communication and interaction between chains. It facilitates cross-chain communication, allowing assets, data, and messages to flow seamlessly across the ecosystem.\n\nAs XCM is central to enabling communication between blockchains, developers need robust tools to help interact with, build, and test XCM messages. Several XCM tools simplify working with the protocol by providing libraries, frameworks, and utilities that enhance the development process, ensuring that applications built within the Polkadot ecosystem can efficiently use cross-chain functionalities."}
{"source": "polkadot-docs", "page_id": "reference-tools-xcm-tools", "url": "https://developer.polkadot.com/reference/tools/xcm-tools/#popular-xcm-tools", "page_title": "XCM Tools", "index": 1, "depth": 2, "title": "Popular XCM Tools", "anchor": "popular-xcm-tools", "start_char": 788, "end_char": 810, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0287db8547b6e3dd68dca75226e121ba933a804b88ef9608dd470d43d25d856d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Popular XCM Tools"}
{"source": "polkadot-docs", "page_id": "reference-tools-xcm-tools", "url": "https://developer.polkadot.com/reference/tools/xcm-tools/#moonsong-labs-xcm-tools", "page_title": "XCM Tools", "index": 2, "depth": 3, "title": "Moonsong Labs XCM Tools", "anchor": "moonsong-labs-xcm-tools", "start_char": 810, "end_char": 2143, "estimated_token_count": 315, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0287db8547b6e3dd68dca75226e121ba933a804b88ef9608dd470d43d25d856d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Moonsong Labs XCM Tools\n\n[Moonsong Labs XCM Tools](https://github.com/Moonsong-Labs/xcm-tools) provides a collection of scripts for managing and testing XCM operations between Polkadot SDK-based runtimes. These tools allow performing tasks like asset registration, channel setup, and XCM initialization. Key features include:\n\n- **Asset registration**: Registers assets, setting units per second (up-front fees), and configuring error (revert) codes.\n- **XCM initializer**: Initializes XCM, sets default XCM versions, and configures revert codes for XCM-related precompiles.\n- **HRMP manipulator**: Manages HRMP channel actions, including opening, accepting, or closing channels.\n- **XCM-Transactor-Info-Setter**: Configures transactor information, including extra weight and fee settings.\n- **Decode XCM**: Decodes XCM messages on the relay chain or parachains to help interpret cross-chain communication.\n\nTo get started, clone the repository and install the required dependencies:\n\n```bash\ngit clone https://github.com/Moonsong-Labs/xcm-tools && \ncd xcm-tools &&\nyarn install\n```\n\nFor a full overview of each script, visit the [scripts](https://github.com/Moonsong-Labs/xcm-tools/tree/main/scripts) directory or refer to the [official documentation](https://github.com/Moonsong-Labs/xcm-tools/blob/main/README.md) on GitHub."}
{"source": "polkadot-docs", "page_id": "reference-tools-xcm-tools", "url": "https://developer.polkadot.com/reference/tools/xcm-tools/#paraspell", "page_title": "XCM Tools", "index": 3, "depth": 3, "title": "ParaSpell", "anchor": "paraspell", "start_char": 2143, "end_char": 2604, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0287db8547b6e3dd68dca75226e121ba933a804b88ef9608dd470d43d25d856d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### ParaSpell\n\n[ParaSpell](/reference/tools/paraspell/) is a collection of open-source XCM tools that streamline cross-chain asset transfers and interactions across the Polkadot and Kusama ecosystems. It provides developers with an intuitive interface to build, test, and deploy interoperable dApps, featuring message composition, decoding, and practical utilities for parachain interactions that simplify debugging and cross-chain communication optimization."}
{"source": "polkadot-docs", "page_id": "reference-tools-xcm-tools", "url": "https://developer.polkadot.com/reference/tools/xcm-tools/#astar-xcm-tools", "page_title": "XCM Tools", "index": 4, "depth": 3, "title": "Astar XCM Tools", "anchor": "astar-xcm-tools", "start_char": 2604, "end_char": 4080, "estimated_token_count": 345, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0287db8547b6e3dd68dca75226e121ba933a804b88ef9608dd470d43d25d856d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Astar XCM Tools\n\nThe [Astar parachain](https://github.com/AstarNetwork/Astar/tree/master) offers a crate with a set of utilities for interacting with the XCM protocol. The [xcm-tools](https://github.com/AstarNetwork/Astar/tree/master/bin/xcm-tools) crate provides a straightforward method for users to locate a sovereign account or calculate an XC20 asset ID. Some commands included by the xcm-tools crate allow users to perform the following tasks:\n\n- **Sovereign accounts**: Obtain the sovereign account address for any parachain, either on the Relay Chain or for sibling parachains, using a simple command.\n- **XC20 EVM addresses**: Generate XC20-compatible Ethereum addresses for assets by entering the asset ID, making it easy to integrate assets across Ethereum-compatible environments.\n- **Remote accounts**: Retrieve remote account addresses needed for multi-location compatibility, using flexible options to specify account types and parachain IDs.\n\nTo start using these tools, clone the [Astar repository](https://github.com/AstarNetwork/Astar) and compile the xcm-tools package:\n\n```bash\ngit clone https://github.com/AstarNetwork/Astar &&\ncd Astar &&\ncargo build --release -p xcm-tools\n```\n\nAfter compiling, verify the setup with the following command:\n\n```bash\n./target/release/xcm-tools --help\n```\nFor more details on using Astar xcm-tools, consult the [official documentation](https://docs.astar.network/docs/learn/interoperability/xcm/integration/tools/)."}
{"source": "polkadot-docs", "page_id": "reference-tools-xcm-tools", "url": "https://developer.polkadot.com/reference/tools/xcm-tools/#chopsticks", "page_title": "XCM Tools", "index": 5, "depth": 3, "title": "Chopsticks", "anchor": "chopsticks", "start_char": 4080, "end_char": 4415, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0287db8547b6e3dd68dca75226e121ba933a804b88ef9608dd470d43d25d856d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Chopsticks\n\nThe Chopsticks library provides XCM functionality for testing XCM messages across networks, enabling you to fork multiple parachains along with a relay chain. For further details, see the [Replay and Dry Run XCMs using Chopsticks](/chain-interactions/send-transactions/interoperability/debug-and-preview-xcms/) guide."}
{"source": "polkadot-docs", "page_id": "reference-tools-xcm-tools", "url": "https://developer.polkadot.com/reference/tools/xcm-tools/#moonbeam-xcm-sdk", "page_title": "XCM Tools", "index": 6, "depth": 3, "title": "Moonbeam XCM SDK", "anchor": "moonbeam-xcm-sdk", "start_char": 4415, "end_char": 5964, "estimated_token_count": 355, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0287db8547b6e3dd68dca75226e121ba933a804b88ef9608dd470d43d25d856d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Moonbeam XCM SDK\n\nThe [Moonbeam XCM SDK](https://github.com/moonbeam-foundation/xcm-sdk) enables developers to easily transfer assets between chains, either between parachains or between a parachain and the relay chain, within the Polkadot/Kusama ecosystem. With the SDK, you don't need to worry about determining the [Multilocation](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#7-universal-consensus-location-identifiers) of the origin or destination assets or which extrinsics are used on which networks.\n\nThe SDK consists of two main packages:\n\n- **[XCM SDK](https://github.com/moonbeam-foundation/xcm-sdk/tree/main/packages/sdk)**: Core SDK for executing XCM transfers between chains in the Polkadot/Kusama ecosystem.\n- **[MRL SDK](https://github.com/moonbeam-foundation/xcm-sdk/tree/main/packages/mrl)**: Extension of the XCM SDK for transferring liquidity into and across the Polkadot ecosystem from other ecosystems like Ethereum.\n\nKey features include:\n\n- **Simplified asset transfers**: Abstracts away complex multilocation determinations and extrinsic selection.\n- **Cross-ecosystem support**: Enables transfers between Polkadot/Kusama chains and external ecosystems.\n- **Developer-friendly API**: Provides intuitive interfaces for cross-chain functionality.\n- **Comprehensive documentation**: Includes usage guides and API references for both packages.\n\nFor detailed usage examples and API documentation, visit the [official Moonbeam XCM SDK documentation](https://moonbeam-foundation.github.io/xcm-sdk/latest/)."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#introduction", "page_title": "Zombienet", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 854, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nZombienet is a testing framework designed for Polkadot SDK-based blockchain networks. It enables developers to efficiently deploy and test ephemeral blockchain environments on platforms like Kubernetes, Podman, and native setups. With its simple CLI and Domain Specific Language (DSL) for writing tests, Zombienet streamlines network spawning, testing, and performance validation.\n\nKey features include:\n\n- **Multi-provider support**: Run networks on Kubernetes, Podman, or locally as native processes.\n- **Network orchestration**: Spawn relay chains with multiple validators and parachains with collators.\n- **Test DSL**: Write natural-language test scripts to evaluate metrics, logs, events, and on-chain storage.\n- **Monitoring integration**: Built-in support for Prometheus, Grafana, and Tempo on supported providers."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#install-zombienet", "page_title": "Zombienet", "index": 1, "depth": 2, "title": "Install Zombienet", "anchor": "install-zombienet", "start_char": 854, "end_char": 3112, "estimated_token_count": 495, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Zombienet\n\nZombienet releases are available on the [Zombienet repository](https://github.com/paritytech/zombienet). Choose one of the following installation methods:\n\n=== \"Use the executable\"\n\n    Download the appropriate executable for your operating system from the [latest release](https://github.com/paritytech/zombienet/releases) page. Each release includes executables for Linux and macOS.\n\n    Make the downloaded file executable:\n\n    ```bash\n    chmod +x zombienet-macos-arm64\n    ```\n\n    !!! warning \"macOS Gatekeeper: Unidentified Developer\"\n        If macOS blocks the app with \"cannot be opened because it is from an unidentified developer\":\n\n        Remove the quarantine attribute so the terminal can run it by running the following command:\n        \n          ```bash\n          xattr -d com.apple.quarantine zombienet-macos-arm64\n          ```\n\n    Verify the installation:\n\n    ```bash\n    ./zombienet-macos-arm64 version\n    ```\n\n    Optionally, move the executable to your PATH:\n\n    ```bash\n    mv zombienet-macos-arm64 /usr/local/bin/zombienet\n    ```\n\n    Now you can use the `zombienet` command directly:\n\n    ```bash\n    zombienet version\n    ```\n\n=== \"Use Nix\"\n\n    For Nix users, the Zombienet repository provides a [`flake.nix`](https://github.com/paritytech/zombienet/blob/main/flake.nix) file. You need [Flakes](https://nixos.wiki/wiki/Flakes#Enable_flakes) enabled.\n    \n    Run Zombienet directly:\n\n    ```bash\n    nix run github:paritytech/zombienet/INSERT_ZOMBIENET_VERSION -- \\\n    spawn INSERT_ZOMBIENET_CONFIG_FILE_NAME.toml\n    ```\n\n    Or include Zombienet in your current shell:\n    \n    ```bash\n    nix shell github:paritytech/zombienet/INSERT_ZOMBIENET_VERSION\n    ```\n\n=== \"Use Docker\"\n\n    Run Zombienet using Docker:\n\n    ```bash\n    docker run -it --rm \\\n    -v $(pwd):/home/nonroot/zombie-net/host-current-files \\\n    paritytech/zombienet\n    ```\n\n    Inside the container, set up the necessary binaries:\n\n    ```bash\n    npm run zombie -- setup polkadot polkadot-parachain\n    ```\n\n    Add the binaries to your PATH:\n\n    ```bash\n    export PATH=/home/nonroot/zombie-net:$PATH\n    ```\n\n    Spawn a network:\n\n    ```bash\n    npm run zombie -- -p native spawn host-current-files/minimal.toml\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#providers", "page_title": "Zombienet", "index": 2, "depth": 2, "title": "Providers", "anchor": "providers", "start_char": 3112, "end_char": 3664, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Providers\n\nZombienet supports different backend providers for running nodes: [Kubernetes](https://kubernetes.io/), [Podman](https://podman.io/), and native (local processes). Specify the provider using the `--provider` flag or in your network configuration file:\n\n```bash\nzombienet spawn network.toml --provider INSERT_PROVIDER\n```\n\nOr set it in the configuration:\n\n```toml title=\"network.toml\"\n[settings]\nprovider = \"INSERT_PROVIDER\"\n...\n```\n\nEnsure to replace `INSERT_PROVIDER` with the appropriate provider: `kubernetes`, `podman`, or `native`."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#kubernetes", "page_title": "Zombienet", "index": 3, "depth": 3, "title": "Kubernetes", "anchor": "kubernetes", "start_char": 3664, "end_char": 4077, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Kubernetes\n\nKubernetes is compatible with [GKE](https://cloud.google.com/kubernetes-engine), [Docker Desktop](https://docs.docker.com/desktop/use-desktop/kubernetes/), and [kind](https://kind.sigs.k8s.io/).\n\n- **Requirements**: Install [`kubectl`](https://kubernetes.io/docs/tasks/tools/#kubectl) and ensure proper cluster permissions.\n- **Features**: Uses Prometheus operator for monitoring when available."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#podman", "page_title": "Zombienet", "index": 4, "depth": 3, "title": "Podman", "anchor": "podman", "start_char": 4077, "end_char": 4499, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Podman\n\nPodman is a daemonless container engine for Linux. Zombienet supports Podman rootless as a provider.\n\n- **Requirements**: Install [Podman](https://podman.io/getting-started/installation) on Linux.\n\n- **Features**: Deploys Prometheus, Tempo, and Grafana for monitoring. Services are accessible at `http://127.0.0.1:34123` (Prometheus), `http://127.0.0.1:34125` (Tempo), and `http://127.0.0.1:41461` (Grafana)."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#native", "page_title": "Zombienet", "index": 5, "depth": 3, "title": "Native", "anchor": "native", "start_char": 4499, "end_char": 4974, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Native\n\nThe native provider runs nodes as local processes on your machine.\n\n- **Requirements**: Have the necessary binaries (`polkadot`, `polkadot-parachain`) in your PATH. Install them using:\n\n    ```bash\n    zombienet setup polkadot polkadot-parachain\n    ```\n\n    For custom binaries, specify the path in your configuration or add them to your PATH:\n\n    ```bash\n    export PATH=$PATH:INSERT_PATH_TO_BINARY\n    ```\n\n- **Features**: No additional monitoring features."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#configure-zombienet", "page_title": "Zombienet", "index": 6, "depth": 2, "title": "Configure Zombienet", "anchor": "configure-zombienet", "start_char": 4974, "end_char": 5218, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Zombienet\n\nZombienet uses JSON or TOML configuration files to define network topology, nodes, and parameters. The [Zombienet repository](https://github.com/paritytech/zombienet/tree/main/examples) provides example configurations."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#basic-configuration", "page_title": "Zombienet", "index": 7, "depth": 3, "title": "Basic Configuration", "anchor": "basic-configuration", "start_char": 5218, "end_char": 6934, "estimated_token_count": 387, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Basic Configuration\n\nA minimal configuration includes settings, relay chain configuration, and parachain configuration.\n\n!!! important \"Polkadot TestNet chain specs\"\n    For Polkadot TestNet, use chain specs from the official [Polkadot TestNet chain specs repository](https://github.com/paseo-network/paseo-chain-specs/). Download the needed files and set `chain_spec_path` in your config. To download Polkadot Hub TestNet specs, you can use the following command:\n\n    ```bash\n    wget https://paseo-r2.zondax.ch/chain-specs/paseo-asset-hub.json\n    ```\n\n=== \"TOML\"\n\n    ```toml title=\"basic-network.toml\"\n    [settings]\n    timeout = 1000\n\n    [relaychain]\n    chain = \"paseo\"\n    default_command = \"polkadot\"\n\n        [[relaychain.nodes]]\n        name = \"alice\"\n        validator = true\n\n        [[relaychain.nodes]]\n        name = \"bob\"\n        validator = true\n\n    [[parachains]]\n    id = 1000\n    chain_spec_path = \"./paseo-asset-hub.json\"\n\n        [parachains.collator]\n        name = \"collator-01\"\n        command = \"polkadot-parachain\"\n    ```\n\n=== \"JSON\"\n\n    ```json title=\"basic-network.json\"\n    {\n      \"settings\": {\n        \"timeout\": 1000\n      },\n      \"relaychain\": {\n        \"chain\": \"paseo\",\n        \"default_command\": \"polkadot\",\n        \"nodes\": [\n          {\n            \"name\": \"alice\",\n            \"validator\": true\n          },\n          {\n            \"name\": \"bob\",\n            \"validator\": true\n          }\n        ]\n      },\n      \"parachains\": [\n        {\n          \"id\": 1000,\n          \"chain_spec_path\": \"./paseo-asset-hub.json\",\n          \"collator\": {\n            \"name\": \"collator-01\",\n            \"command\": \"polkadot-parachain\"\n          }\n        }\n      ]\n    }\n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#cli-commands", "page_title": "Zombienet", "index": 8, "depth": 3, "title": "CLI Commands", "anchor": "cli-commands", "start_char": 6934, "end_char": 7712, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### CLI Commands\n\nZombienet provides the following commands:\n\n- **`spawn <networkConfig>`**: Spawn the network defined in the configuration file.\n- **`test <testFile>`**: Run tests on the spawned network.\n- **`setup <binaries>`**: Download and set up `polkadot` or `polkadot-parachain` binaries.\n- **`convert <filePath>`**: Convert a [polkadot-launch](https://github.com/paritytech/polkadot-launch) configuration to Zombienet format.\n- **`version`**: Print Zombienet version.\n- **`help`**: Print help information.\n\nCommon flags:\n\n- **`-p`, `--provider`**: Override the provider.\n- **`-d`, `--dir`**: Specify directory for network files.\n- **`-m`, `--monitor`**: Start as monitor without auto cleanup.\n- **`-c`, `--spawn-concurrency`**: Number of concurrent spawning processes."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#settings", "page_title": "Zombienet", "index": 9, "depth": 3, "title": "Settings", "anchor": "settings", "start_char": 7712, "end_char": 10913, "estimated_token_count": 866, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Settings\n\nThrough the keyword `settings`, it's possible to define the general settings for the network. The available keys are:\n\n- **`global_volumes?`** ++\"GlobalVolume[]\"++: A list of global volumes to use.\n\n    ??? child \"`GlobalVolume` interface definition\"\n        ```js\n        export interface GlobalVolume {\n          name: string;\n          fs_type: string;\n          mount_path: string;\n        }\n        ```\n\n- **`bootnode`** ++\"boolean\"++: Add bootnode to network. Defaults to `true`.\n- **`bootnode_domain?`** ++\"string\"++: Domain to use for bootnode.\n- **`timeout`** ++\"number\"++: Global timeout to use for spawning the whole network.\n- **`node_spawn_timeout?`** ++\"number\"++: Timeout to spawn pod/process.\n- **`grafana?`** ++\"boolean\"++: Deploy an instance of Grafana.\n- **`prometheus?`** ++\"boolean\"++: Deploy an instance of Prometheus.\n- **`telemetry?`** ++\"boolean\"++: Enable telemetry for the network.\n- **`jaeger_agent?`** ++\"string\"++: The Jaeger agent endpoint passed to the nodes. Only available on Kubernetes.\n- **`tracing_collator_url?`** ++\"string\"++: The URL of the tracing collator used to query by the tracing assertion. Should be tempo query compatible.\n- **`tracing_collator_service_name?`** ++\"string\"++: Service name for tempo query frontend. Only available on Kubernetes. Defaults to `tempo-tempo-distributed-query-frontend`.\n- **`tracing_collator_service_namespace?`** ++\"string\"++: Namespace where tempo is running. Only available on Kubernetes. Defaults to `tempo`.\n- **`tracing_collator_service_port?`** ++\"number\"++: Port of the query instance of tempo. Only available on Kubernetes. Defaults to `3100`.\n- **`enable_tracing?`** ++\"boolean\"++: Enable the tracing system. Only available on Kubernetes. Defaults to `true`.\n- **`provider`** ++\"string\"++: Provider to use. Default is `kubernetes`\".\n- **`polkadot_introspector?`** ++\"boolean\"++: Deploy an instance of polkadot-introspector. Only available on Podman and Kubernetes. Defaults to `false`.\n- **`backchannel?`** ++\"boolean\"++: Deploy an instance of backchannel server. Only available on Kubernetes. Defaults to `false`.\n- **`image_pull_policy?`** ++\"string\"++: Image pull policy to use in the network. Possible values are `Always`, `IfNotPresent`, and `Never`.\n- **`local_ip?`** ++\"string\"++: IP used for exposing local services (rpc/metrics/monitors). Defaults to `\"127.0.0.1\"`.\n- **`global_delay_network_global_settings?`** ++\"number\"++: Delay in seconds to apply to the network.\n- **`node_verifier?`** ++\"string\"++: Specify how to verify node readiness or deactivate by using `None`. Possible values are `None` and `Metric`. Defaults to `Metric`.\n\nFor example, the following configuration file defines a minimal example for the settings:\n\n=== \"TOML\"\n\n    ```toml title=\"base-example.toml\"\n    [settings]\n    timeout = 1000\n    bootnode = false\n    provider = \"kubernetes\"\n    backchannel = false\n    # ...\n    \n    ```\n\n=== \"JSON\"\n\n    ```json title=\"base-example.json\"\n    {\n        \"settings\": {\n            \"timeout\": 1000,\n            \"bootnode\": false,\n            \"provider\": \"kubernetes\",\n            \"backchannel\": false,\n            \"...\": {}\n        },\n        \"...\": {}\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#relay-chain-configuration", "page_title": "Zombienet", "index": 10, "depth": 3, "title": "Relay Chain Configuration", "anchor": "relay-chain-configuration", "start_char": 10913, "end_char": 22420, "estimated_token_count": 2774, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Relay Chain Configuration\n\nYou can use the `relaychain` keyword to define further parameters for the relay chain at start-up. The available keys are:\n\n- **`default_command?`** ++\"string\"++: The default command to run. Defaults to `polkadot`.\n- **`default_image?`** ++\"string\"++: The default Docker image to use.\n- **`default_resources?`** ++\"Resources\"++: Represents the resource limits/reservations the nodes need by default. Only available on Kubernetes.\n\n    ??? child \"`Resources` interface definition\"\n        ```js\n        export interface Resources {\n          resources: {\n            requests?: {\n              memory?: string;\n              cpu?: string;\n            };\n            limits?: {\n              memory?: string;\n              cpu?: string;\n            };\n          };\n        }\n        ```\n\n- **`default_db_snapshot?`** ++\"string\"++: The default database snapshot to use.\n- **`default_prometheus_prefix`** ++\"string\"++: A parameter for customizing the metric's prefix. Defaults to `substrate`.\n- **`default_substrate_cli_args_version?`** ++\"SubstrateCliArgsVersion\"++: Set the Substrate CLI arguments version.\n\n    ??? child \"`SubstrateCliArgsVersion` enum definition\"\n        ```js\n        export enum SubstrateCliArgsVersion {\n          V0 = 0,\n          V1 = 1,\n          V2 = 2,\n          V3 = 3,\n        }\n        ```\n\n- **`default_keystore_key_types?`** ++\"string[]\"++: Defines which keystore keys should be created.\n- **`chain`** ++\"string\"++: The chain name.\n- **`chain_spec_path?`** ++\"string\"++: Path to the chain spec file. Should be the plain version to allow customizations.\n- **`chain_spec_command?`** ++\"string\"++: Command to generate the chain spec. It can't be used in combination with `chain_spec_path`.\n- **`default_args?`** ++\"string[]\"++: An array of arguments to use as default to pass to the command.\n- **`default_overrides?`** ++\"Override[]\"++: An array of overrides to upload to the node.\n\n    ??? child \"`Override` interface definition\"\n        ```js\n        export interface Override {\n          local_path: string;\n          remote_name: string;\n        }\n        ```\n\n- **`random_nominators_count?`** ++\"number\"++: If set and the stacking pallet is enabled, Zombienet will generate the input quantity of nominators and inject them into the genesis.\n- **`max_nominations`** ++\"number\"++: The max number of nominations allowed by a nominator. Should match the value set in the runtime. Defaults to `24`.\n- **`nodes?`** ++\"Node[]\"++: An array of nodes to spawn. It is further defined in the [Node Configuration](#node-configuration) section.\n- **`node_groups?`** ++\"NodeGroup[]\"++: An array of node groups to spawn. It is further defined in the [Node Group Configuration](#node-group-configuration) section.\n- **`total_node_in_group?`** ++\"number\"++: The total number of nodes in the group. Defaults to `1`.\n- **`genesis`** ++\"JSON\"++: The genesis configuration.\n- **`default_delay_network_settings?`** ++\"DelayNetworkSettings\"++: Sets the expected configuration to delay the network.\n\n    ??? child \"`DelayNetworkSettings` interface definition\"\n        ```js\n        export interface DelayNetworkSettings {\n          latency: string;\n          correlation?: string; // should be parsable as float by k8s\n          jitter?: string;\n        }\n        ```\n\n#### Node Configuration\n\nOne specific key capable of receiving more subkeys is the `nodes` key. This key is used to define further parameters for the nodes. The available keys:\n\n- **`name`** ++\"string\"++: Name of the node. Any whitespace will be replaced with a dash (for example, `new alice` will be converted to `new-alice`).\n- **`image?`** ++\"string\"++: Override default Docker image to use for this node.\n- **`command?`** ++\"string\"++: Override default command to run.\n- **`command_with_args?`** ++\"string\"++: Override default command and arguments.\n- **`args?`** ++\"string[]\"++: Arguments to be passed to the command.\n- **`env?`** ++\"envVars[]\"++: Environment variables to set in the container.\n\n    ??? child \"`envVars` interface definition\"\n        ```js\n        export interface EnvVars {\n          name: string;\n          value: string;\n        }\n        ```\n\n- **`prometheus_prefix?`** ++\"string\"++: Customizes the metric's prefix for the specific node. Defaults to `substrate`.\n- **`db_snapshot?`** ++\"string\"++: Database snapshot to use.\n- **`substrate_cli_args_version?`** ++\"SubstrateCliArgsVersion\"++: Set the Substrate CLI arguments version directly to skip binary evaluation overhead.\n\n    ??? child \"`SubstrateCliArgsVersion` enum definition\"\n        ```js\n        export enum SubstrateCliArgsVersion {\n          V0 = 0,\n          V1 = 1,\n          V2 = 2,\n          V3 = 3,\n        }\n        ```\n\n- **`resources?`** ++\"Resources\"++: Represent the resources limits/reservations needed by the node.\n\n    ??? child \"`Resources` interface definition\"\n        ```js\n        export interface Resources {\n          resources: {\n            requests?: {\n              memory?: string;\n              cpu?: string;\n            };\n            limits?: {\n              memory?: string;\n              cpu?: string;\n            };\n          };\n        }\n        ```\n\n- **`keystore_key_types?`** ++\"string[]\"++: Defines which keystore keys should be created.\n- **`validator`** ++\"boolean\"++: Pass the `--validator` flag to the command. Defaults to `true`.\n- **`invulnerable`** ++\"boolean\"++: If true, add the node to invulnerables in the chain spec. Defaults to `false`.\n- **`balance`** ++\"number\"++: Balance to set in balances for node's account. Defaults to `2000000000000`.\n- **`bootnodes?`** ++\"string[]\"++: Array of bootnodes to use.\n- **`add_to_bootnodes?`** ++\"boolean\"++: Add this node to the bootnode list. Defaults to `false`.\n- **`ws_port?`** ++\"number\"++: WS port to use.\n- **`rpc_port?`** ++\"number\"++: RPC port to use.\n- **`prometheus_port?`** ++\"number\"++: Prometheus port to use.\n- **`p2p_cert_hash?`** ++\"string\"++: Libp2p certhash to use with webRTC transport.\n- **`delay_network_settings?`** ++\"DelayNetworkSettings\"++: Sets the expected configuration to delay the network.\n\n    ??? child \"`DelayNetworkSettings` interface definition\"\n        ```js\n        export interface DelayNetworkSettings {\n          latency: string;\n          correlation?: string; // should be parsable as float by k8s\n          jitter?: string;\n        }\n        ```\n\nThe following configuration file defines a minimal example for the relay chain, including the `nodes` key:\n\n=== \"TOML\"\n\n    ```toml title=\"relaychain-example-nodes.toml\"\n    [relaychain]\n    default_command = \"polkadot\"\n    default_image = \"polkadot-debug:master\"\n    chain = \"paseo\"\n    chain_spec_path = \"INSERT_PATH_TO_CHAIN_SPEC\"\n    default_args = [\"--chain\", \"paseo\"]\n    \n    [[relaychain.nodes]]\n    name = \"alice\"\n    validator = true\n    balance = 1000000000000\n    \n    [[relaychain.nodes]]\n    name = \"bob\"\n    validator = true\n    balance = 1000000000000\n    # ...\n    \n    ```\n\n=== \"JSON\"\n\n    ```json title=\"relaychain-example-nodes.json\"\n    {\n        \"relaychain\": {\n            \"default_command\": \"polkadot\",\n            \"default_image\": \"polkadot-debug:master\",\n            \"chain\": \"paseo\",\n            \"chain_spec_path\": \"INSERT_PATH_TO_CHAIN-SPEC.JSON\",\n            \"default_args\": [\"--chain\", \"paseo\"],\n            \"nodes\": [\n                {\n                    \"name\": \"alice\",\n                    \"validator\": true,\n                    \"balance\": 1000000000000\n                },\n                {\n                    \"name\": \"bob\",\n                    \"validator\": true,\n                    \"balance\": 1000000000000\n                }\n            ]\n        }\n    }\n    \n    ```\n\n#### Node Group Configuration\n\nThe `node_groups` key defines further parameters for the node groups. The available keys are:\n\n- **`name`** ++\"string\"++: Name of the node. Any whitespace will be replaced with a dash (for example, `new alice` will be converted to `new-alice`).\n- **`image?`** ++\"string\"++: Override default Docker image to use for this node.\n- **`command?`** ++\"string\"++: Override default command to run.\n- **`args?`** ++\"string[]\"++: Arguments to be passed to the command.\n- **`env?`** ++\"envVars[]\"++: Environment variables to set in the container.\n\n    ??? child \"`envVars` interface definition\"\n        ```js\n        export interface EnvVars {\n          name: string;\n          value: string;\n        }\n        ```\n\n- **`overrides?`** ++\"Override[]\"++: Array of overrides definitions.\n\n    ??? child \"`Override` interface definition\"\n        ```js\n        export interface Override {\n          local_path: string;\n          remote_name: string;\n        }\n        ```\n\n- **`prometheus_prefix?`** ++\"string\"++: Customizes the metric's prefix for the specific node. Defaults to `substrate`.\n- **`db_snapshot?`** ++\"string\"++: Database snapshot to use.\n- **`substrate_cli_args_version?`** ++\"SubstrateCliArgsVersion\"++: Set the Substrate CLI arguments version directly to skip binary evaluation overhead.\n\n    ??? child \"`SubstrateCliArgsVersion` enum definition\"\n        ```js\n        export enum SubstrateCliArgsVersion {\n          V0 = 0,\n          V1 = 1,\n          V2 = 2,\n          V3 = 3,\n        }\n        ```\n\n- **`resources?`** ++\"Resources\"++: Represent the resources limits/reservations needed by the node.\n\n    ??? child \"`Resources` interface definition\"\n        ```js\n        export interface Resources {\n          resources: {\n            requests?: {\n              memory?: string;\n              cpu?: string;\n            };\n            limits?: {\n              memory?: string;\n              cpu?: string;\n            };\n          };\n        }\n        ```\n\n- **`keystore_key_types?`** ++\"string[]\"++: Defines which keystore keys should be created.\n- **`count`** ++\"number | string\"++: Number of nodes to launch for this group.\n- **`delay_network_settings?`** ++\"DelayNetworkSettings\"++: Sets the expected configuration to delay the network.\n\n    ??? child \"`DelayNetworkSettings` interface definition\"\n        ```js\n        export interface DelayNetworkSettings {\n          latency: string;\n          correlation?: string; // should be parsable as float by k8s\n          jitter?: string;\n        }\n        ```\n\nThe following configuration file defines a minimal example for the relay chain, including the `node_groups` key:\n\n=== \"TOML\"\n\n    ```toml title=\"relaychain-example-node-groups.toml\"\n    [relaychain]\n    default_command = \"polkadot\"\n    default_image = \"polkadot-debug:master\"\n    chain = \"paseo\"\n    chain_spec_path = \"INSERT_PATH_TO_CHAIN_SPEC\"\n    default_args = [\"--chain\", \"paseo\"]\n    \n    [[relaychain.node_groups]]\n    name = \"group-1\"\n    count = 2\n    image = \"polkadot-debug:master\"\n    command = \"polkadot\"\n    args = [\"--chain\", \"paseo\"]\n    # ...\n    \n    ```\n\n=== \"JSON\"\n\n    ```json title=\"relaychain-example-node-groups.json\"\n    {\n        \"relaychain\": {\n            \"default_command\": \"polkadot\",\n            \"default_image\": \"polkadot-debug:master\",\n            \"chain\": \"paseo\",\n            \"chain_spec_path\": \"INSERT_PATH_TO_CHAIN-SPEC.JSON\",\n            \"default_args\": [\"--chain\", \"paseo\"],\n            \"node_groups\": [\n                {\n                    \"name\": \"group-1\",\n                    \"count\": 2,\n                    \"image\": \"polkadot-debug:master\",\n                    \"command\": \"polkadot\",\n                    \"args\": [\"--chain\", \"paseo\"]\n                }\n            ],\n            \"...\": {}\n        },\n        \"...\": {}\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#parachain-configuration", "page_title": "Zombienet", "index": 11, "depth": 3, "title": "Parachain Configuration", "anchor": "parachain-configuration", "start_char": 22420, "end_char": 33624, "estimated_token_count": 2716, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Parachain Configuration\n\nThe `parachain` keyword defines further parameters for the parachain. The available keys are:\n\n- **`id`** ++\"number\"++: The id to assign to this parachain. Must be unique.\n- **`chain?`** ++\"string\"++: The chain name.\n- **`force_decorator?`** ++\"string\"++: Force the use of a specific decorator.\n- **`genesis?`** ++\"JSON\"++: The genesis configuration.\n- **`balance?`** ++\"number\"++: Balance to set in balances for parachain's account.\n- **`delay_network_settings?`** ++\"DelayNetworkSettings\"++: Sets the expected configuration to delay the network.\n\n    ??? child \"`DelayNetworkSettings` interface definition\"\n        ```js\n        export interface DelayNetworkSettings {\n          latency: string;\n          correlation?: string; // should be parsable as float by k8s\n          jitter?: string;\n        }\n        ```\n\n- **`add_to_genesis?`** ++\"boolean\"++: Flag to add parachain to genesis or register in runtime. Defaults to `true`.\n- **`register_para?`** ++\"boolean\"++: Flag to specify whether the para should be registered. The `add_to_genesis` flag must be set to false for this flag to have any effect. Defaults to `true`.\n- **`onboard_as_parachain?`** ++\"boolean\"++: Flag to specify whether the para should be onboarded as a parachain, rather than remaining a parathread. Defaults to `true`.\n- **`genesis_wasm_path?`** ++\"string\"++: Path to the Wasm file to use.\n- **`genesis_wasm_generator?`** ++\"string\"++: Command to generate the Wasm file.\n- **`genesis_state_path?`** ++\"string\"++: Path to the state file to use.\n- **`genesis_state_generator?`** ++\"string\"++: Command to generate the state file.\n- **`chain_spec_path?`** ++\"string\"++: Path to the chain spec file.\n- **`chain_spec_command?`** ++\"string\"++: Command to generate the chain spec.\n- **`cumulus_based?`** ++\"boolean\"++: Flag to use cumulus command generation. Defaults to `true`.\n- **`bootnodes?`** ++\"string[]\"++: Array of bootnodes to use.\n- **`prometheus_prefix?`** ++\"string\"++: Parameter for customizing the metric's prefix for all parachain nodes/collators. Defaults to `substrate`.\n- **`collator?`** ++\"Collator\"++: Further defined in the [Collator Configuration](#collator-configuration) section.\n- **`collator_groups?`** ++\"CollatorGroup[]\"++: An array of collator groups to spawn. It is further defined in the [Collator Groups Configuration](#collator-groups-configuration) section.\n\nFor example, the following configuration file defines a minimal example for the parachain:\n\n=== \"TOML\"\n\n    ```toml title=\"parachain-example.toml\"\n    [parachain]\n    id = 100\n    add_to_genesis = true\n    cumulus_based = true\n    genesis_wasm_path = \"INSERT_PATH_TO_WASM\"\n    genesis_state_path = \"INSERT_PATH_TO_STATE\"\n    # ...\n    \n    ```\n\n=== \"JSON\"\n\n    ```json title=\"parachain-example.json\"\n    {\n        \"parachain\": {\n            \"id\": 100,\n            \"add_to_genesis\": true,\n            \"cumulus_based\": true,\n            \"genesis_wasm_path\": \"INSERT_PATH_TO_WASM\",\n            \"genesis_state_path\": \"INSERT_PATH_TO_STATE\",\n            \"...\": {}\n        },\n        \"...\": {}\n    }\n    \n    ```\n\n#### Collator Configuration\n\nOne specific key capable of receiving more subkeys is the `collator` key. This key defines further parameters for the nodes. The available keys are:\n\n- **`name`** ++\"string\"++: Name of the collator. Any whitespace will be replaced with a dash (for example, `new alice` will be converted to `new-alice`).\n- **`image?`** ++\"string\"++: Image to use for the collator.\n- **`command_with_args?`** ++\"string\"++: Overrides both command and arguments for the collator.\n- **`validator`** ++\"boolean\"++: Pass the `--validator` flag to the command. Defaults to `true`.\n- **`invulnerable`** ++\"boolean\"++: If true, add the collator to invulnerables in the chain spec. Defaults to `false`.\n- **`balance`** ++\"number\"++: Balance to set in balances for collator's account. Defaults to `2000000000000`.\n- **`bootnodes?`** ++\"string[]\"++: Array of bootnodes to use.\n- **`add_to_bootnodes?`** ++\"boolean\"++: Add this collator to the bootnode list. Defaults to `false`.\n- **`ws_port?`** ++\"number\"++: WS port to use.\n- **`rpc_port?`** ++\"number\"++: RPC port to use.\n- **`prometheus_port?`** ++\"number\"++: Prometheus port to use.\n- **`p2p_port?`** ++\"number\"++: P2P port to use.\n- **`p2p_cert_hash?`** ++\"string\"++: Libp2p certhash to use with webRTC transport.\n- **`delay_network_settings?`** ++\"DelayNetworkSettings\"++: Sets the expected configuration to delay the network.\n\n    ??? child \"`DelayNetworkSettings` interface definition\"\n        ```js\n        export interface DelayNetworkSettings {\n          latency: string;\n          correlation?: string; // should be parsable as float by k8s\n          jitter?: string;\n        }\n        ```\n\n- **`command?`** ++\"string\"++: Override default command to run.\n- **`args?`** ++\"string[]\"++: Arguments to be passed to the command.\n- **`env?`** ++\"envVars[]\"++: Environment variables to set in the container.\n\n    ??? child \"`envVars` interface definition\"\n        ```js\n        export interface EnvVars {\n          name: string;\n          value: string;\n        }\n        ```\n\n- **`overrides?`** ++\"Override[]\"++: Array of overrides definitions.\n\n    ??? child \"`Override` interface definition\"\n        ```js\n        export interface Override {\n          local_path: string;\n          remote_name: string;\n        }\n        ```\n\n- **`prometheus_prefix?`** ++\"string\"++: Customizes the metric's prefix for the specific node. Defaults to `substrate`.\n- **`db_snapshot?`** ++\"string\"++: Database snapshot to use.\n- **`substrate_cli_args_version?`** ++\"SubstrateCliArgsVersion\"++: Set the Substrate CLI arguments version directly to skip binary evaluation overhead.\n\n    ??? child \"`SubstrateCliArgsVersion` enum definition\"\n        ```js\n        export enum SubstrateCliArgsVersion {\n          V0 = 0,\n          V1 = 1,\n          V2 = 2,\n          V3 = 3,\n        }\n        ```\n\n- **`resources?`** ++\"Resources\"++: Represent the resources limits/reservations needed by the node.\n\n    ??? child \"`Resources` interface definition\"\n        ```js\n        export interface Resources {\n          resources: {\n            requests?: {\n              memory?: string;\n              cpu?: string;\n            };\n            limits?: {\n              memory?: string;\n              cpu?: string;\n            };\n          };\n        }\n        ```\n\n- **`keystore_key_types?`** ++\"string[]\"++: Defines which keystore keys should be created.\n\nThe configuration file below defines a minimal example for the collator:\n\n=== \"TOML\"\n\n    ```toml title=\"collator-example.toml\"\n    [parachain]\n    id = 100\n    add_to_genesis = true\n    cumulus_based = true\n    genesis_wasm_path = \"INSERT_PATH_TO_WASM\"\n    genesis_state_path = \"INSERT_PATH_TO_STATE\"\n    \n    [[parachain.collators]]\n    name = \"alice\"\n    image = \"polkadot-parachain\"\n    command = \"polkadot-parachain\"\n    # ...\n    \n    ```\n\n=== \"JSON\"\n\n    ```json title=\"collator-example.json\"\n    {\n        \"parachain\": {\n            \"id\": 100,\n            \"add_to_genesis\": true,\n            \"cumulus_based\": true,\n            \"genesis_wasm_path\": \"INSERT_PATH_TO_WASM\",\n            \"genesis_state_path\": \"INSERT_PATH_TO_STATE\",\n            \"collators\": [\n                {\n                    \"name\": \"alice\",\n                    \"image\": \"polkadot-parachain\",\n                    \"command\": \"polkadot-parachain\",\n                    \"...\": {}\n                }\n            ]\n        },\n        \"...\": {}\n    }\n    \n    ```\n\n#### Collator Groups Configuration\n\nThe `collator_groups` key defines further parameters for the collator groups. The available keys are:\n\n- **`name`** ++\"string\"++: Name of the node. Any whitespace will be replaced with a dash (for example, `new alice` will be converted to `new-alice`).\n- **`image?`** ++\"string\"++: Override default Docker image to use for this node.\n- **`command?`** ++\"string\"++: Override default command to run.\n- **`args?`** ++\"string[]\"++: Arguments to be passed to the command.\n- **`env?`** ++\"envVars[]\"++: Environment variables to set in the container.\n\n    ??? child \"`envVars` interface definition\"\n        ```js\n        export interface EnvVars {\n          name: string;\n          value: string;\n        }\n        ```\n\n- **`overrides?`** ++\"Override[]\"++: Array of overrides definitions.\n\n    ??? child \"`Override` interface definition\"\n        ```js\n        export interface Override {\n          local_path: string;\n          remote_name: string;\n        }\n        ```\n\n- **`prometheus_prefix?`** ++\"string\"++: Customizes the metric's prefix for the specific node. Defaults to `substrate`.\n- **`db_snapshot?`** ++\"string\"++: Database snapshot to use.\n- **`substrate_cli_args_version?`** ++\"SubstrateCliArgsVersion\"++: Set the Substrate CLI arguments version directly to skip binary evaluation overhead.\n\n    ??? child \"`SubstrateCliArgsVersion` enum definition\"\n        ```js\n        export enum SubstrateCliArgsVersion {\n          V0 = 0,\n          V1 = 1,\n          V2 = 2,\n          V3 = 3,\n        }\n        ```\n\n- **`resources?`** ++\"Resources\"++: Represent the resources limits/reservations needed by the node.\n\n    ??? child \"`Resources` interface definition\"\n        ```js\n        export interface Resources {\n          resources: {\n            requests?: {\n              memory?: string;\n              cpu?: string;\n            };\n            limits?: {\n              memory?: string;\n              cpu?: string;\n            };\n          };\n        }\n        ```\n\n- **`keystore_key_types?`** ++\"string[]\"++: Defines which keystore keys should be created.\n- **`count`** ++\"number | string\"++: Number of nodes to launch for this group.\n- **`delay_network_settings?`** ++\"DelayNetworkSettings\"++: Sets the expected configuration to delay the network.\n\n    ??? child \"`DelayNetworkSettings` interface definition\"\n        ```js\n        export interface DelayNetworkSettings {\n          latency: string;\n          correlation?: string; // should be parsable as float by k8s\n          jitter?: string;\n        }\n        ```\n\nFor instance, the configuration file below defines a minimal example for the collator groups:\n\n=== \"TOML\"\n\n    ```toml title=\"collator-groups-example.toml\"\n    [parachain]\n    id = 100\n    add_to_genesis = true\n    cumulus_based = true\n    genesis_wasm_path = \"INSERT_PATH_TO_WASM\"\n    genesis_state_path = \"INSERT_PATH_TO_STATE\"\n    \n    [[parachain.collator_groups]]\n    name = \"group-1\"\n    count = 2\n    image = \"polkadot-parachain\"\n    command = \"polkadot-parachain\"\n    # ...\n    \n    ```\n\n=== \"JSON\"\n\n    ```json title=\"collator-groups-example.json\"\n    {\n        \"parachain\": {\n            \"id\": 100,\n            \"add_to_genesis\": true,\n            \"cumulus_based\": true,\n            \"genesis_wasm_path\": \"INSERT_PATH_TO_WASM\",\n            \"genesis_state_path\": \"INSERT_PATH_TO_STATE\",\n            \"collator_groups\": [\n                {\n                    \"name\": \"group-1\",\n                    \"count\": 2,\n                    \"image\": \"polkadot-parachain\",\n                    \"command\": \"polkadot-parachain\",\n                    \"...\": {}\n                }\n            ]\n        },\n        \"...\": {}\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#xcm-configuration", "page_title": "Zombienet", "index": 12, "depth": 3, "title": "XCM Configuration", "anchor": "xcm-configuration", "start_char": 33624, "end_char": 34555, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### XCM Configuration\n\nYou can use the `hrmp_channels` keyword to define further parameters for the XCM channels at start-up. The available keys are:\n\n- **`hrmp_channels`** ++\"HrmpChannelsConfig[]\"++: Array of Horizontal Relay-routed Message Passing (HRMP) channel configurations.\n\n    ??? child \"`HrmpChannelsConfig` interface definition\"\n        ```js\n        export interface HrmpChannelsConfig {\n          sender: number;\n          recipient: number;\n          max_capacity: number;\n          max_message_size: number;\n        }\n        ```\n        Each of the `HrmpChannelsConfig` keys are defined as follows:\n\n        - **`sender` ++\"number\"++**: Parachain ID of the sender.\n        - **`recipient` ++\"number\"++**: Parachain ID of the recipient.\n        - **`max_capacity` ++\"number\"++**: Maximum capacity of the HRMP channel.\n        - **`max_message_size` ++\"number\"++**: Maximum message size allowed in the HRMP channel."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#spawn-a-network", "page_title": "Zombienet", "index": 13, "depth": 2, "title": "Spawn a Network", "anchor": "spawn-a-network", "start_char": 34555, "end_char": 35019, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Spawn a Network\n\nTo spawn a network, create a configuration file and run:\n\n```bash\nzombienet spawn network.toml --provider native\n```\n\nZombienet will:\n\n1. Download or locate the required binaries.\n2. Generate chain specifications.\n3. Start relay chain validators.\n4. Register and start parachain collators.\n5. Display connection endpoints and logs.\n\nAccess the running nodes via the provided RPC endpoints (typically `ws://127.0.0.1:9944` for the first node)."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#write-tests", "page_title": "Zombienet", "index": 14, "depth": 2, "title": "Write Tests", "anchor": "write-tests", "start_char": 35019, "end_char": 35261, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Write Tests\n\nZombienet provides a Domain Specific Language (DSL) for writing tests in `.zndsl` files. Tests can evaluate:\n\n- Metrics from Prometheus\n- Log patterns\n- System events\n- On-chain storage\n- Custom JavaScript/TypeScript scripts"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#test-file-structure", "page_title": "Zombienet", "index": 15, "depth": 3, "title": "Test File Structure", "anchor": "test-file-structure", "start_char": 35261, "end_char": 35602, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Test File Structure\n\nTest files contain a header and body:\n\n```toml title=\"example-test.zndsl\"\nDescription: Example test suite\nNetwork: ./network.toml\nCreds: config\n\n# Test assertions\nalice: is up\nbob: is up\nalice: parachain 1000 is registered within 200 seconds\nalice: parachain 1000 block height is at least 10 within 300 seconds\n```"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#run-tests", "page_title": "Zombienet", "index": 16, "depth": 3, "title": "Run Tests", "anchor": "run-tests", "start_char": 35602, "end_char": 35778, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Run Tests\n\nExecute tests using:\n\n```bash\nzombienet test example-test.zndsl --provider native\n```\n\nThe test runner will execute each assertion and report pass/fail status."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#common-assertions", "page_title": "Zombienet", "index": 17, "depth": 3, "title": "Common Assertions", "anchor": "common-assertions", "start_char": 35778, "end_char": 36251, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Common Assertions\n\nSome frequently used assertions include:\n\n- **Well-known functions**: `alice: is up`, `alice: parachain 100 is registered within 225 seconds`\n- **Metrics**: `alice: reports node_roles is 4`\n- **Logs**: `alice: log line matches glob \"Imported #1\" within 10 seconds`\n- **System events**: `alice: system event matches \"\"paraId\":[0-9]+\" within 10 seconds`\n- **Custom scripts**: `alice: js-script ./script.js return is greater than 1 within 200 seconds`"}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#configuration-reference", "page_title": "Zombienet", "index": 18, "depth": 2, "title": "Configuration Reference", "anchor": "configuration-reference", "start_char": 36251, "end_char": 36681, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configuration Reference\n\nFor detailed configuration options, see:\n\n- [Configuration examples](https://github.com/paritytech/zombienet/tree/main/examples): Sample configurations for various scenarios.\n- [Testing DSL specification](https://paritytech.github.io/zombienet/cli/test-dsl-definition-spec.html): Complete DSL syntax reference.\n- [Zombienet book](https://paritytech.github.io/zombienet/): Comprehensive documentation."}
{"source": "polkadot-docs", "page_id": "reference-tools-zombienet", "url": "https://developer.polkadot.com/reference/tools/zombienet/#where-to-go-next", "page_title": "Zombienet", "index": 19, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 36681, "end_char": 37140, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:341bf997635d07f3e8945320ef68c4c0cb9d4e5455291fe6ec4b5415bb699b17", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Zombienet Support__\n\n    ---\n\n    For further support and information, refer to the official resources.\n\n    [:octicons-arrow-right-24: GitHub Repository](https://github.com/paritytech/zombienet)\n\n    [:octicons-arrow-right-24: Element Channel](https://matrix.to/#/!FWyuEyNvIFygLnWNMh:parity.io?via=parity.io&via=matrix.org&via=web3.foundation)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-connect", "url": "https://developer.polkadot.com/smart-contracts/connect/#networks-details", "page_title": "Connect to Polkadot", "index": 0, "depth": 2, "title": "Networks Details", "anchor": "networks-details", "start_char": 858, "end_char": 3206, "estimated_token_count": 555, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e9d645456a26b72ba42af9b8ac5d934fd4984bbdf0c94bd4cdea2198a48d781", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Networks Details\n\nDevelopers can leverage smart contracts across diverse networks, from TestNets to MainNet. This section outlines the network specifications and connection details for each environment.\n\n!!! note \"WebSocket (WSS) endpoints\"\n    The WSS endpoints listed below are not behind an eth-rpc proxy. For Ethereum JSON-RPC compatibility, use the HTTP RPC URLs provided for each network instead.\n\n=== \"Polkadot Hub TestNet\"\n\n    Network name\n\n    ```text\n    Polkadot Hub TestNet\n    ```\n\n    ---\n\n    Currency symbol\n    \n    ```text\n    PAS\n    ```\n\n    ---\n    \n    Chain ID\n    \n    ```text\n    420420417\n    ```\n\n    ---\n    \n    RPC URL\n    \n    === \"Parity\"\n\n        ```text\n        https://eth-rpc-testnet.polkadot.io/\n        ```\n\n    === \"OpsLayer\"\n\n        ```text\n        https://services.polkadothub-rpc.com/testnet/\n        ```\n\n    ---\n    \n    Block explorer URL\n\n    === \"Blockscout\"\n\n        ```text\n        https://blockscout-testnet.polkadot.io/\n        ```\n\n    === \"Routescan\"\n\n        ```text\n        https://polkadot.testnet.routescan.io/\n        ```\n\n    ---\n\n    WSS URL\n\n    ```text\n    wss://asset-hub-paseo-rpc.n.dwellir.com\n    ```\n\n\n=== \"Polkadot Hub\"\n\n    Network name\n\n    ```text\n    Polkadot Hub\n    ```\n\n    ---\n\n    Currency symbol\n    \n    ```text\n    DOT\n    ```\n\n    ---\n    \n    Chain ID\n    \n    ```text\n    420420419\n    ```\n\n    ---\n    \n    RPC URL\n\n    === \"Parity\"\n\n        ```text\n        https://eth-rpc.polkadot.io/\n        ```\n\n    === \"OpsLayer\"\n\n        ```text\n        https://services.polkadothub-rpc.com/mainnet/\n        ```\n\n    ---\n    \n    Block explorer URL\n\n    === \"Blockscout\"\n\n        ```text\n        https://blockscout.polkadot.io/\n        ```\n\n    ---\n\n    WSS URL\n\n    ```text\n    wss://polkadot-asset-hub-rpc.polkadot.io\n    ```\n\n=== \"Kusama Hub\"\n\n    Network name\n\n    ```text\n    Kusama Hub\n    ```\n\n    ---\n\n    Currency symbol\n    \n    ```text\n    KSM\n    ```\n\n    ---\n    \n    Chain ID\n    \n    ```text\n    420420418\n    ```\n\n    ---\n    \n    RPC URL\n\n    === \"Parity\"\n    \n        ```text\n        https://eth-rpc-kusama.polkadot.io/\n        ```\n\n    ---\n\n    Block explorer URL\n\n    === \"Blockscout\"\n\n        ```text\n        https://blockscout-kusama.polkadot.io/\n        ```\n\n    ---\n\n    WSS URL\n\n    ```text\n    wss://kusama-asset-hub-rpc.polkadot.io\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-connect", "url": "https://developer.polkadot.com/smart-contracts/connect/#test-tokens", "page_title": "Connect to Polkadot", "index": 1, "depth": 2, "title": "Test Tokens", "anchor": "test-tokens", "start_char": 3206, "end_char": 4189, "estimated_token_count": 223, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e9d645456a26b72ba42af9b8ac5d934fd4984bbdf0c94bd4cdea2198a48d781", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Tokens\n\nYou will need testnet tokens to perform transactions and engage with smart contracts on any chain. Here's how to obtain Paseo (PAS) tokens for testing purposes:\n\n1. Navigate to the [Polkadot Faucet](https://faucet.polkadot.io/). If the desired network is not already selected, choose it from the Network drop-down.\n\n2. Copy your address linked to the TestNet and paste it into the designated field.\n\n    ![](/images/smart-contracts/connect/connect-to-polkadot-01.webp)\n\n3. Click the **Get Some PASs** button to request free test PAS tokens. These tokens will be sent to your wallet shortly.\n\n    ![](/images/smart-contracts/connect/connect-to-polkadot-02.webp)\n\nNow that you have obtained PAS tokens in your wallet, you’re ready to deploy and interact with smart contracts on Polkadot Hub TestNet! These tokens will allow you to pay for gas fees when executing transactions, deploying contracts, and testing your dApp functionality in a secure testnet environment."}
{"source": "polkadot-docs", "page_id": "smart-contracts-connect", "url": "https://developer.polkadot.com/smart-contracts/connect/#where-to-go-next", "page_title": "Connect to Polkadot", "index": 2, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4189, "end_char": 5253, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e9d645456a26b72ba42af9b8ac5d934fd4984bbdf0c94bd4cdea2198a48d781", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nFor your next steps, explore the various smart contract guides demonstrating how to use and integrate different tools and development environments into your workflow.\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Get started with Remix__\n\n    ---\n\n    Learn how to get started with Remix, a browser-based IDE for writing, deploying, and interacting with smart contracts.\n\n    [:octicons-arrow-right-24: Build with Remix IDE](/smart-contracts/dev-environments/remix/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy a contract using Remix__\n\n    ---\n\n    Deploy your first contract on Polkadot Hub using the Remix IDE.\n\n    [:octicons-arrow-right-24: Build with Remix IDE](/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/)\n\n-   <span class=\"badge guide\">Guide</span> __Interact with the blockchain with viem__\n\n    ---\n\n    Use viem to deploy and interact with smart contracts on Polkadot Hub.\n\n    [:octicons-arrow-right-24: Build with viem](/smart-contracts/libraries/viem/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#prerequisites", "page_title": "Zero to Hero Smart Contract DApp", "index": 0, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 756, "end_char": 1195, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have the following:\n\n- [Node.js](https://nodejs.org/en) v22.10.0 or later installed on your system.\n- A crypto wallet (such as MetaMask) funded with test tokens. Refer to the [Connect to Polkadot](/smart-contracts/connect) guide for more details.\n- A basic understanding of React and JavaScript.\n- Some familiarity with blockchain fundamentals and Solidity (helpful but not required)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#project-overview", "page_title": "Zero to Hero Smart Contract DApp", "index": 1, "depth": 2, "title": "Project Overview", "anchor": "project-overview", "start_char": 1195, "end_char": 2383, "estimated_token_count": 296, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Project Overview\n\nThis dApp will interact with a basic Storage contract that you will create and deploy with Hardhat. The contract will allow you to:\n\n- Store a number on the blockchain.\n- Retrieve the stored number from the blockchain.\n- Update the stored number with a new value.\n\nYour project directory will be organized as follows:\n\n```bash\npolkadot-hub-tutorial/\n├── storage-contract/          # Hardhat project for smart contract\n│   ├── contracts/\n│   │   └── Storage.sol\n│   ├── scripts/\n│   │   └── deploy.ts\n│   ├── artifacts/\n│   │   └── contracts/\n│   │       └── Storage.sol/\n│   │           └── Storage.json\n│   ├── hardhat.config.ts\n│   ├── .env\n│   └── package.json\n│\n└── dapp/                 # Next.js dApp project\n    ├── abis/\n    │   └── Storage.json\n    └── app/\n        ├── components/\n        │   ├── ReadContract.tsx\n        │   ├── WalletConnect.tsx\n        │   └── WriteContract.tsx\n        ├── utils/\n        │   ├── contract.ts\n        │   └── viem.ts\n        ├── favicon.ico\n        ├── globals.css\n        ├── layout.tsx\n        └── page.tsx\n```\n\nCreate the main folder for the project:\n\n```bash\nmkdir polkadot-hub-tutorial\ncd polkadot-hub-tutorial\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#create-and-deploy-the-storage-contract", "page_title": "Zero to Hero Smart Contract DApp", "index": 2, "depth": 2, "title": "Create and Deploy the Storage Contract", "anchor": "create-and-deploy-the-storage-contract", "start_char": 2383, "end_char": 2632, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create and Deploy the Storage Contract\n\nBefore building the dApp, you'll need to create and deploy the Storage smart contract. This section will guide you through using Hardhat to write, compile, and deploy the contract to Polkadot Hub TestNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#set-up-hardhat-project", "page_title": "Zero to Hero Smart Contract DApp", "index": 3, "depth": 3, "title": "Set Up Hardhat Project", "anchor": "set-up-hardhat-project", "start_char": 2632, "end_char": 3031, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Set Up Hardhat Project\n\nFirst, create a new directory for your Hardhat project and initialize it:\n\n```bash\nmkdir storage-contract\ncd storage-contract\nnpm init -y\n```\n\nInstall Hardhat and its dependencies:\n\n```bash\nnpm install --save-dev hardhat@3.0.9\n```\n\nInitialize a new Hardhat project:\n\n```bash\nnpx hardhat --init\n```\n\nSelect **Create a TypeScript project** and accept the default options."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#create-the-storage-contract", "page_title": "Zero to Hero Smart Contract DApp", "index": 4, "depth": 3, "title": "Create the Storage Contract", "anchor": "create-the-storage-contract", "start_char": 3031, "end_char": 3570, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Create the Storage Contract\n\nIn the `contracts` directory, create a new file called `Storage.sol` and add the following code:\n\n```solidity title=\"Storage.sol\"\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract Storage {\n    uint256 private storedNumber;\n\n    event NumberStored(uint256 newNumber);\n\n    function setNumber(uint256 _number) public {\n        storedNumber = _number;\n        emit NumberStored(_number);\n    }\n}\n```\n\nThis simple contract stores a single number and provides functions to read and update it."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#configure-hardhat-for-polkadot-hub", "page_title": "Zero to Hero Smart Contract DApp", "index": 5, "depth": 3, "title": "Configure Hardhat for Polkadot Hub", "anchor": "configure-hardhat-for-polkadot-hub", "start_char": 3570, "end_char": 5390, "estimated_token_count": 415, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Configure Hardhat for Polkadot Hub\n\nUpdate your `hardhat.config.ts` file to include the Polkadot Hub TestNet configuration:\n\n```typescript title=\"hardhat.config.ts\" hl_lines=\"39-44\"\nimport type { HardhatUserConfig } from \"hardhat/config\";\n\nimport hardhatToolboxViemPlugin from \"@nomicfoundation/hardhat-toolbox-viem\";\nimport { configVariable } from \"hardhat/config\";\n\nconst config: HardhatUserConfig = {\n  plugins: [hardhatToolboxViemPlugin],\n  solidity: {\n    profiles: {\n      default: {\n        version: \"0.8.28\",\n      },\n      production: {\n        version: \"0.8.28\",\n        settings: {\n          optimizer: {\n            enabled: true,\n            runs: 200,\n          },\n        },\n      },\n    },\n  },\n  networks: {\n    hardhatMainnet: {\n      type: \"edr-simulated\",\n      chainType: \"l1\",\n    },\n    hardhatOp: {\n      type: \"edr-simulated\",\n      chainType: \"op\",\n    },\n    sepolia: {\n      type: \"http\",\n      chainType: \"l1\",\n      url: configVariable(\"SEPOLIA_RPC_URL\"),\n      accounts: [configVariable(\"SEPOLIA_PRIVATE_KEY\")],\n    },\n    polkadotTestNet: {\n      type: \"http\",\n      chainType: \"l1\",\n      url: 'https://services.polkadothub-rpc.com/testnet',\n      accounts: [process.env.PRIVATE_KEY || ''],\n    },\n  },\n};\n\nexport default config;\n```\n\nCreate a `.env` file in the root of your Hardhat project:\n\n```text title=\".env\"\nPRIVATE_KEY=INSERT_PRIVATE_KEY_HERE\n```\n\nReplace `INSERT_PRIVATE_KEY_HERE` with your actual private key. You can get this by exporting the private key from your wallet (e.g., MetaMask).\n\n!!! warning\n    Never commit your private key to version control. Use environment variables or a `.env` file (and add it to `.gitignore`) to manage sensitive information. Keep your private key safe, and never share it with anyone. If it is compromised, your funds can be stolen."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#compile-the-contract", "page_title": "Zero to Hero Smart Contract DApp", "index": 6, "depth": 3, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 5390, "end_char": 5539, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compile the Contract\n\nCompile your Storage contract:\n\n```bash\nnpx hardhat compile\n```\n\nYou should see output indicating successful compilation."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#deploy-the-contract", "page_title": "Zero to Hero Smart Contract DApp", "index": 7, "depth": 3, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 5539, "end_char": 7176, "estimated_token_count": 416, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Deploy the Contract\n\nCreate a deployment script in the `ignition/modules` directory called `Storage.ts`:\n\n```typescript title=\"Storage.ts\"\nimport { buildModule } from \"@nomicfoundation/hardhat-ignition/modules\";\n\nexport default buildModule(\"StorageModule\", (m) => {\n  const storage = m.contract(\"Storage\");\n\n  return { storage };\n});\n```\n\nDeploy the contract to Polkadot Hub TestNet:\n\n```bash\nnpx hardhat ignition deploy ./ignition/modules/Storage.ts --network polkadotTestNet\n```\n\nYou should see output similar to:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat ignition deploy ./ignition/modules/Storage.ts --network polkadotTestNet</span>\n  <span data-ty>WARNING: You are using Node.js 23.11.0 which is not supported by Hardhat.</span>\n  <span data-ty>Please upgrade to 22.10.0 or a later LTS version (even major version number)</span>\n  <span data-ty>✔ Confirm deploy to network polkadotTestNet (420420417)? … yes</span>\n  <span data-ty>Hardhat Ignition 🚀</span>\n  <span data-ty>Deploying [ StorageModule ]</span>\n  <span data-ty>Batch #1</span>\n  <span data-ty>  Executed StorageModule#Storage</span>\n  <span data-ty>[ StorageModule ] successfully deployed 🚀</span>\n  <span data-ty>Deployed Addresses</span>\n  <span data-ty>StorageModule#Storage - 0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3</span>\n</div>\n\n!!! note\n    Save the deployed contract address - you'll need it when building your dApp. In the following sections, we'll reference a pre-deployed contract at `0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3`, but you can use your own deployed contract address instead."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#export-the-contract-abi", "page_title": "Zero to Hero Smart Contract DApp", "index": 8, "depth": 3, "title": "Export the Contract ABI", "anchor": "export-the-contract-abi", "start_char": 7176, "end_char": 7563, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Export the Contract ABI\n\nAfter deployment, you'll need the contract's Application Binary Interface (ABI) for your dApp. You can find it in the `artifacts/contracts/Storage.sol/Storage.json` file generated by Hardhat. You'll use this in the next section when setting up your dApp.\n\nNow that you have your contract deployed, you're ready to build the dApp that will interact with it!"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#set-up-the-dapp-project", "page_title": "Zero to Hero Smart Contract DApp", "index": 9, "depth": 2, "title": "Set Up the DApp Project", "anchor": "set-up-the-dapp-project", "start_char": 7563, "end_char": 7760, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the DApp Project\n\nNavigate to the root of the project, and create a new Next.js project called `dapp`:\n\n```bash\nnpx create-next-app dapp --ts --eslint --tailwind --app --yes\ncd dapp\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#install-dependencies", "page_title": "Zero to Hero Smart Contract DApp", "index": 10, "depth": 2, "title": "Install Dependencies", "anchor": "install-dependencies", "start_char": 7760, "end_char": 7919, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies\n\nInstall viem and related packages:\n\n```bash\nnpm install viem@2.38.5\nnpm install --save-dev typescript@5.9.3 @types/node@22.19.24\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#connect-to-polkadot-hub", "page_title": "Zero to Hero Smart Contract DApp", "index": 11, "depth": 2, "title": "Connect to Polkadot Hub", "anchor": "connect-to-polkadot-hub", "start_char": 7919, "end_char": 9904, "estimated_token_count": 463, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Connect to Polkadot Hub\n\nTo interact with Polkadot Hub, you need to set up a [Public Client](https://viem.sh/docs/clients/public#public-client) that connects to the blockchain. In this example, you will interact with the Polkadot Hub TestNet, to experiment safely. Start by creating a new file called `utils/viem.ts` and add the following code:\n\n```typescript title=\"viem.ts\"\nimport { createPublicClient, http, createWalletClient, custom } from 'viem'\nimport 'viem/window';\n\nconst transport = http('https://services.polkadothub-rpc.com/testnet')\n\n// Configure the Polkadot Testnet Hub chain\nexport const polkadotTestnet = {\n  id: 420420417,\n  name: 'Polkadot Hub TestNet',\n  network: 'polkadot-testnet',\n  nativeCurrency: {\n    decimals: 18,\n    name: 'PAS',\n    symbol: 'PAS',\n  },\n  rpcUrls: {\n    default: {\n      http: ['https://services.polkadothub-rpc.com/testnet'],\n    },\n  },\n} as const\n\n// Create a public client for reading data\nexport const publicClient = createPublicClient({\n  chain: polkadotTestnet,\n  transport\n})\n\n// Create a wallet client for signing transactions\nexport const getWalletClient = async () => {\n  if (typeof window !== 'undefined' && window.ethereum) {\n    const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' });\n    return createWalletClient({\n      chain: polkadotTestnet,\n      transport: custom(window.ethereum),\n      account,\n    });\n  }\n  throw new Error('No Ethereum browser provider detected');\n};\n```\n\nThis file initializes a viem client, providing helper functions for obtaining a Public Client and a [Wallet Client](https://viem.sh/docs/clients/wallet#wallet-client). The Public Client enables reading blockchain data, while the Wallet Client allows users to sign and send transactions. Also, note that by importing `viem/window` the global `window.ethereum` will be typed as an `EIP1193Provider`, check the [`window` Polyfill](https://viem.sh/docs/typescript#window-polyfill) reference for more information."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#set-up-the-smart-contract-interface", "page_title": "Zero to Hero Smart Contract DApp", "index": 12, "depth": 2, "title": "Set Up the Smart Contract Interface", "anchor": "set-up-the-smart-contract-interface", "start_char": 9904, "end_char": 11783, "estimated_token_count": 410, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Smart Contract Interface\n\nFor this dApp, you'll use a simple [Storage contract](/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#create-the-contract) that's already deployed in the Polkadot Hub TestNet: `0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3`. To interact with it, you need to define the contract interface.\n\nCreate a folder called `abis` at the root of your project, then create a file named `Storage.json` and paste the corresponding ABI of the Storage contract. You can copy and paste the following:\n\n```bash\ncp ./storage-contract/artifacts/contracts/Storage.sol/Storage.json ./dapp/abis/Storage.json\n```\n\nNext, create a file called `utils/contract.ts`:\n\n```typescript title=\"contract.ts\"\nimport { getContract } from 'viem';\nimport { publicClient, getWalletClient } from './viem';\nimport StorageABI from '../abis/Storage.json';\n\nexport const CONTRACT_ADDRESS = '0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3'; // TODO: change when the paseo asset hub RPC URL is available, and the contract is redeployed\nexport const CONTRACT_ABI = StorageABI.abi;\n\n// Create a function to get a contract instance for reading\nexport const getContractInstance = () => {\n  return getContract({\n    address: CONTRACT_ADDRESS,\n    abi: CONTRACT_ABI,\n    client: publicClient,\n  });\n};\n\n// Create a function to get a contract instance with a signer for writing\nexport const getSignedContract = async () => {\n  const walletClient = await getWalletClient();\n  return getContract({\n    address: CONTRACT_ADDRESS,\n    abi: CONTRACT_ABI,\n    client: walletClient,\n  });\n};\n```\n\nThis file defines the contract address, ABI, and functions to create a viem [contract instance](https://viem.sh/docs/contract/getContract#contract-instances) for reading and writing operations. viem's contract utilities enable more efficient, type-safe interaction with smart contracts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#create-the-wallet-connection-component", "page_title": "Zero to Hero Smart Contract DApp", "index": 13, "depth": 2, "title": "Create the Wallet Connection Component", "anchor": "create-the-wallet-connection-component", "start_char": 11783, "end_char": 17810, "estimated_token_count": 1342, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Wallet Connection Component\n\nNow, you can create a component to handle wallet connections. Create a new file called `components/WalletConnect.tsx`:\n\n```typescript title=\"WalletConnect.tsx\"\n\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { polkadotTestnet } from \"../utils/viem\";\n\ninterface WalletConnectProps {\n  onConnect: (account: string) => void;\n}\n\nconst WalletConnect: React.FC<WalletConnectProps> = ({ onConnect }) => {\n  const [account, setAccount] = useState<string | null>(null);\n  const [chainId, setChainId] = useState<number | null>(null);\n  const [error, setError] = useState<string | null>(null);\n\n  useEffect(() => {\n    // Check if user already has an authorized wallet connection\n    const checkConnection = async () => {\n      if (typeof window !== 'undefined' && window.ethereum) {\n        try {\n          // eth_accounts doesn't trigger the wallet popup\n          const accounts = await window.ethereum.request({\n            method: 'eth_accounts',\n          }) as string[];\n          \n          if (accounts.length > 0) {\n            setAccount(accounts[0]);\n            const chainIdHex = await window.ethereum.request({\n              method: 'eth_chainId',\n            }) as string;\n            setChainId(parseInt(chainIdHex, 16));\n            onConnect(accounts[0]);\n          }\n        } catch (err) {\n          console.error('Error checking connection:', err);\n          setError('Failed to check wallet connection');\n        }\n      }\n    };\n\n    checkConnection();\n\n    if (typeof window !== 'undefined' && window.ethereum) {\n      // Setup wallet event listeners\n      window.ethereum.on('accountsChanged', (accounts: string[]) => {\n        setAccount(accounts[0] || null);\n        if (accounts[0]) onConnect(accounts[0]);\n      });\n\n      window.ethereum.on('chainChanged', (chainIdHex: string) => {\n        setChainId(parseInt(chainIdHex, 16));\n      });\n    }\n\n    return () => {\n      // Cleanup event listeners\n      if (typeof window !== 'undefined' && window.ethereum) {\n        window.ethereum.removeListener('accountsChanged', () => {});\n        window.ethereum.removeListener('chainChanged', () => {});\n      }\n    };\n  }, [onConnect]);\n\n  const connectWallet = async () => {\n    if (typeof window === 'undefined' || !window.ethereum) {\n      setError(\n        'MetaMask not detected! Please install MetaMask to use this dApp.'\n      );\n      return;\n    }\n\n    try {\n      // eth_requestAccounts triggers the wallet popup\n      const accounts = await window.ethereum.request({\n        method: 'eth_requestAccounts',\n      }) as string[];\n      \n      setAccount(accounts[0]);\n\n      const chainIdHex = await window.ethereum.request({\n        method: 'eth_chainId',\n      }) as string;\n      \n      const currentChainId = parseInt(chainIdHex, 16);\n      setChainId(currentChainId);\n\n      // Prompt user to switch networks if needed\n      if (currentChainId !== polkadotTestnet.id) {\n        await switchNetwork();\n      }\n\n      onConnect(accounts[0]);\n    } catch (err) {\n      console.error('Error connecting to wallet:', err);\n      setError('Failed to connect wallet');\n    }\n  };\n\n  const switchNetwork = async () => {\n    console.log('Switch network')\n    try {\n      await window.ethereum.request({\n        method: 'wallet_switchEthereumChain',\n        params: [{ chainId: `0x${polkadotTestnet.id.toString(16)}` }],\n      });\n    } catch (switchError: any) {\n      // Error 4902 means the chain hasn't been added to MetaMask\n      if (switchError.code === 4902) {\n        try {\n          await window.ethereum.request({\n            method: 'wallet_addEthereumChain',\n            params: [\n              {\n                chainId: `0x${polkadotTestnet.id.toString(16)}`,\n                chainName: polkadotTestnet.name,\n                rpcUrls: [polkadotTestnet.rpcUrls.default.http[0]],\n                nativeCurrency: {\n                  name: polkadotTestnet.nativeCurrency.name,\n                  symbol: polkadotTestnet.nativeCurrency.symbol,\n                  decimals: polkadotTestnet.nativeCurrency.decimals,\n                },\n              },\n            ],\n          });\n        } catch (addError) {\n          setError('Failed to add network to wallet');\n        }\n      } else {\n        setError('Failed to switch network');\n      }\n    }\n  };\n\n  // UI-only disconnection - MetaMask doesn't support programmatic disconnection\n  const disconnectWallet = () => {\n    setAccount(null);\n  };\n\n  return (\n    <div className=\"border border-pink-500 rounded-lg p-4 shadow-md bg-white text-pink-500 max-w-sm mx-auto\">\n      {error && <p className=\"text-red-500 text-sm mb-2\">{error}</p>}\n\n      {!account ? (\n        <button\n          onClick={connectWallet}\n          className=\"w-full bg-pink-500 hover:bg-pink-600 text-white font-bold py-2 px-4 rounded-lg transition\"\n        >\n          Connect Wallet\n        </button>\n      ) : (\n        <div className=\"flex flex-col items-center\">\n          <span className=\"text-sm font-mono bg-pink-100 px-2 py-1 rounded-md text-pink-700\">\n            {`${account.substring(0, 6)}...${account.substring(38)}`}\n          </span>\n          <button\n            onClick={disconnectWallet}\n            className=\"mt-3 w-full bg-gray-200 hover:bg-gray-300 text-pink-500 py-2 px-4 rounded-lg transition\"\n          >\n            Disconnect\n          </button>\n          {chainId !== polkadotTestnet.id && (\n            <button\n              onClick={switchNetwork}\n              className=\"mt-3 w-full bg-yellow-500 hover:bg-yellow-600 text-white font-bold py-2 px-4 rounded-lg transition\"\n            >\n              Switch to Polkadot Testnet\n            </button>\n          )}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default WalletConnect;\n```\n\nThis component handles connecting to the wallet, switching networks if necessary, and keeping track of the connected account. It provides a button for users to connect their wallet and displays the connected account address once connected."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#create-the-read-contract-component", "page_title": "Zero to Hero Smart Contract DApp", "index": 14, "depth": 2, "title": "Create the Read Contract Component", "anchor": "create-the-read-contract-component", "start_char": 17810, "end_char": 20339, "estimated_token_count": 614, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Read Contract Component\n\nNext, create a component to read data from the contract. Create a file called `components/ReadContract.tsx`:\n\n```typescript title=\"ReadContract.tsx\"\n'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { publicClient } from '../utils/viem';\nimport { CONTRACT_ADDRESS, CONTRACT_ABI } from '../utils/contract';\n\nconst ReadContract: React.FC = () => {\n  const [storedNumber, setStoredNumber] = useState<string | null>(null);\n  const [loading, setLoading] = useState<boolean>(true);\n  const [error, setError] = useState<string | null>(null);\n\n  useEffect(() => {\n    // Function to read data from the blockchain\n    const fetchData = async () => {\n      try {\n        setLoading(true);\n        // Call the smart contract's storedNumber function\n        const number = await publicClient.readContract({\n            address: CONTRACT_ADDRESS,\n            abi: CONTRACT_ABI,\n            functionName: 'storedNumber',\n            args: [],\n          }) as bigint;\n\n        setStoredNumber(number.toString());\n        setError(null);\n      } catch (err) {\n        console.error('Error fetching stored number:', err);\n        setError('Failed to fetch data from the contract');\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchData();\n\n    // Poll for updates every 10 seconds to keep UI in sync with blockchain\n    const interval = setInterval(fetchData, 10000);\n\n    // Clean up interval on component unmount\n    return () => clearInterval(interval);\n  }, []);\n\n  return (\n    <div className=\"border border-pink-500 rounded-lg p-4 shadow-md bg-white text-pink-500 max-w-sm mx-auto\">\n      <h2 className=\"text-lg font-bold text-center mb-4\">Contract Data</h2>\n      {loading ? (\n        <div className=\"flex justify-center my-4\">\n          <div className=\"w-6 h-6 border-4 border-pink-500 border-t-transparent rounded-full animate-spin\"></div>\n        </div>\n      ) : error ? (\n        <p className=\"text-red-500 text-center\">{error}</p>\n      ) : (\n        <div className=\"text-center\">\n          <p className=\"text-sm font-mono bg-pink-100 px-2 py-1 rounded-md text-pink-700\">\n            <strong>Stored Number:</strong> {storedNumber}\n          </p>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default ReadContract;\n```\n\nThis component reads the `storedNumber` value from the contract and displays it to the user. It also sets up a polling interval to refresh the data periodically, ensuring that the UI stays in sync with the blockchain state."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#create-the-write-contract-component", "page_title": "Zero to Hero Smart Contract DApp", "index": 15, "depth": 2, "title": "Create the Write Contract Component", "anchor": "create-the-write-contract-component", "start_char": 20339, "end_char": 28442, "estimated_token_count": 1822, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Write Contract Component\n\nFinally, create a component that allows users to update the stored number. Create a file called `components/WriteContract.tsx`:\n\n```typescript title=\"WriteContract.tsx\"\n\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { publicClient, getWalletClient } from '../utils/viem';\nimport { CONTRACT_ADDRESS, CONTRACT_ABI } from '../utils/contract';\n\ninterface WriteContractProps {\n  account: string | null;\n}\n\nconst WriteContract: React.FC<WriteContractProps> = ({ account }) => {\n  const [newNumber, setNewNumber] = useState<string>(\"\");\n  const [status, setStatus] = useState<{\n    type: string | null;\n    message: string;\n  }>({\n    type: null,\n    message: \"\",\n  });\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n  const [isCorrectNetwork, setIsCorrectNetwork] = useState<boolean>(true);\n\n  // Check if the account is on the correct network\n  useEffect(() => {\n    const checkNetwork = async () => {\n      if (!account) return;\n\n      try {\n        // Get the chainId from the public client\n        const chainId = await publicClient.getChainId();\n\n        // Get the user's current chainId from their wallet\n        const walletClient = await getWalletClient();\n        if (!walletClient) return;\n\n        const walletChainId = await walletClient.getChainId();\n\n        // Check if they match\n        setIsCorrectNetwork(chainId === walletChainId);\n      } catch (err) {\n        console.error(\"Error checking network:\", err);\n        setIsCorrectNetwork(false);\n      }\n    };\n\n    checkNetwork();\n  }, [account]);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n\n    // Validation checks\n    if (!account) {\n      setStatus({ type: \"error\", message: \"Please connect your wallet first\" });\n      return;\n    }\n\n    if (!isCorrectNetwork) {\n      setStatus({\n        type: \"error\",\n        message: \"Please switch to the correct network in your wallet\",\n      });\n      return;\n    }\n\n    if (!newNumber || isNaN(Number(newNumber))) {\n      setStatus({ type: \"error\", message: \"Please enter a valid number\" });\n      return;\n    }\n\n    try {\n      setIsSubmitting(true);\n      setStatus({ type: \"info\", message: \"Initiating transaction...\" });\n\n      // Get wallet client for transaction signing\n      const walletClient = await getWalletClient();\n\n      if (!walletClient) {\n        setStatus({ type: \"error\", message: \"Wallet client not available\" });\n        return;\n      }\n\n      // Check if account matches\n      if (\n        walletClient.account?.address.toLowerCase() !== account.toLowerCase()\n      ) {\n        setStatus({\n          type: \"error\",\n          message:\n            \"Connected wallet account doesn't match the selected account\",\n        });\n        return;\n      }\n\n      // Prepare transaction and wait for user confirmation in wallet\n      setStatus({\n        type: \"info\",\n        message: \"Please confirm the transaction in your wallet...\",\n      });\n\n      // Simulate the contract call first\n      console.log('newNumber', newNumber);\n      const { request } = await publicClient.simulateContract({\n        address: CONTRACT_ADDRESS,\n        abi: CONTRACT_ABI,\n        functionName: \"setNumber\",\n        args: [BigInt(newNumber)],\n        account: walletClient.account,\n      });\n\n      // Send the transaction with wallet client\n      const hash = await walletClient.writeContract(request);\n\n      // Wait for transaction to be mined\n      setStatus({\n        type: \"info\",\n        message: \"Transaction submitted. Waiting for confirmation...\",\n      });\n\n      const receipt = await publicClient.waitForTransactionReceipt({\n        hash,\n      });\n\n      setStatus({\n        type: \"success\",\n        message: `Transaction confirmed! Transaction hash: ${receipt.transactionHash}`,\n      });\n\n      setNewNumber(\"\");\n    } catch (err: any) {\n      console.error(\"Error updating number:\", err);\n\n      // Handle specific errors\n      if (err.code === 4001) {\n        // User rejected transaction\n        setStatus({ type: \"error\", message: \"Transaction rejected by user.\" });\n      } else if (err.message?.includes(\"Account not found\")) {\n        // Account not found on the network\n        setStatus({\n          type: \"error\",\n          message:\n            \"Account not found on current network. Please check your wallet is connected to the correct network.\",\n        });\n      } else if (err.message?.includes(\"JSON is not a valid request object\")) {\n        // JSON error - specific to your current issue\n        setStatus({\n          type: \"error\",\n          message:\n            \"Invalid request format. Please try again or contact support.\",\n        });\n      } else {\n        // Other errors\n        setStatus({\n          type: \"error\",\n          message: `Error: ${err.message || \"Failed to send transaction\"}`,\n        });\n      }\n    } finally {\n      setIsSubmitting(false);\n    }\n  };\n\n  return (\n    <div className=\"border border-pink-500 rounded-lg p-4 shadow-md bg-white text-pink-500 max-w-sm mx-auto space-y-4\">\n      <h2 className=\"text-lg font-bold\">Update Stored Number</h2>\n\n      {!isCorrectNetwork && account && (\n        <div className=\"p-2 rounded-md bg-yellow-100 text-yellow-700 text-sm\">\n          ⚠️ You are not connected to the correct network. Please switch\n          networks in your wallet.\n        </div>\n      )}\n\n      {status.message && (\n        <div\n          className={`p-2 rounded-md break-words h-fit text-sm ${\n            status.type === \"error\"\n              ? \"bg-red-100 text-red-500\"\n              : status.type === \"success\"\n              ? \"bg-green-100 text-green-700\"\n              : \"bg-blue-100 text-blue-700\"\n          }`}\n        >\n          {status.message}\n        </div>\n      )}\n\n      <form onSubmit={handleSubmit} className=\"space-y-4\">\n        <input\n          type=\"number\"\n          placeholder=\"New Number\"\n          value={newNumber}\n          onChange={(e) => setNewNumber(e.target.value)}\n          disabled={isSubmitting || !account}\n          className=\"w-full p-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-pink-400\"\n        />\n        <button\n          type=\"submit\"\n          disabled={\n            isSubmitting || !account || (!isCorrectNetwork && !!account)\n          }\n          className=\"w-full bg-pink-500 hover:bg-pink-600 text-white font-bold py-2 px-4 rounded-lg transition disabled:bg-gray-300\"\n        >\n          {isSubmitting ? \"Updating...\" : \"Update\"}\n        </button>\n      </form>\n\n      {!account && (\n        <p className=\"text-sm text-gray-500\">\n          Connect your wallet to update the stored number.\n        </p>\n      )}\n    </div>\n  );\n};\n\nexport default WriteContract;\n```\n\nThis component allows users to input a new number and send a transaction to update the value stored in the contract. It provides appropriate feedback during each step of the transaction process and handles error scenarios.\n\nUpdate the `app/page.tsx` file to integrate all components:\n\n```typescript title=\"page.tsx\"\n\"use client\";\n\nimport { useState } from \"react\";\nimport WalletConnect from \"./components/WalletConnect\";\nimport ReadContract from \"./components/ReadContract\";\nimport WriteContract from \"./components/WriteContract\";\n\nexport default function Home() {\n  const [account, setAccount] = useState<string | null>(null);\n\n  const handleConnect = (connectedAccount: string) => {\n    setAccount(connectedAccount);\n  };\n\n  return (\n    <section className=\"min-h-screen bg-white text-black flex flex-col justify-center items-center gap-4 py-10\">\n      <h1 className=\"text-2xl font-semibold text-center\">\n        Polkadot Hub - Zero To Hero DApp\n      </h1>\n      <WalletConnect onConnect={handleConnect} />\n      <ReadContract />\n      <WriteContract account={account} />\n    </section>\n  );\n}\n```\n\nRun the dApp:\n\n```bash\nnpm run dev\n```\n\nNavigate to `http://localhost:3000` in your browser, and you should see your dApp with the wallet connection button, the stored number displayed, and the form to update the number. You should see something like this:"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#how-it-works", "page_title": "Zero to Hero Smart Contract DApp", "index": 16, "depth": 2, "title": "How It Works", "anchor": "how-it-works", "start_char": 28442, "end_char": 28535, "estimated_token_count": 18, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How It Works\n\nThis dApp uses components to interact with the blockchain in several ways."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#wallet-connection", "page_title": "Zero to Hero Smart Contract DApp", "index": 17, "depth": 3, "title": "Wallet Connection", "anchor": "wallet-connection", "start_char": 28535, "end_char": 28841, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Wallet Connection \n\nThe `WalletConnect` component uses the browser's Ethereum provider (MetaMask) to connect to the user's wallet and handles network switching to ensure the user is connected to the Polkadot Hub TestNet. Once connected, it provides the user's account address to the parent component."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#data-reads", "page_title": "Zero to Hero Smart Contract DApp", "index": 18, "depth": 3, "title": "Data Reads", "anchor": "data-reads", "start_char": 28841, "end_char": 29142, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Data Reads\n\nThe `ReadContract` component uses viem's `readContract` function to call the `storedNumber` view function and periodically poll for updates to keep the UI in sync with the blockchain state. The component also displays a loading indicator while fetching data and handles error states."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#data-writes", "page_title": "Zero to Hero Smart Contract DApp", "index": 19, "depth": 3, "title": "Data Writes", "anchor": "data-writes", "start_char": 29142, "end_char": 29544, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Data Writes\n\nThe `WriteContract` component uses viem's `writeContract` function to send a transaction to the `setNumber` function and ensures the wallet is connected before allowing a transaction. The component shows detailed feedback during transaction submission and confirmation. After a successful transaction, the value displayed in the `ReadContract` component will update on the next poll."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#conclusion", "page_title": "Zero to Hero Smart Contract DApp", "index": 20, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 29544, "end_char": 30441, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nCongratulations! You've successfully built a fully functional dApp that interacts with a smart contract on Polkadot Hub using viem and Next.js. Your application can now:\n\n- Create a smart contract with Hardhat and deploy it to Polkadot Hub TestNet.\n- Connect to a user's wallet and handle network switching.\n- Read data from a smart contract and keep it updated.\n- Write data to the blockchain through transactions.\n\nThese fundamental skills provide the foundation for building more complex dApps on Polkadot Hub. With this knowledge, you can extend your application to interact with more sophisticated smart contracts and create advanced user interfaces.\n\nTo get started right away with a working example, you can clone the repository and navigate to the implementation:\n\n```bash\ngit clone https://github.com/polkadot-developers/revm-hardhat-examples.git\ncd zero-to-hero-dapp\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-dapps-zero-to-hero", "url": "https://developer.polkadot.com/smart-contracts/cookbook/dapps/zero-to-hero/#where-to-go-next", "page_title": "Zero to Hero Smart Contract DApp", "index": 21, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 30441, "end_char": 31026, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2eea2fe37c9a5705e3a14a491d426c5c3138e2c5a6f686f96303b9f29a3e3370", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Port Ethereum Projects to Polkadot Hub__\n\n    ---\n\n    Learn how to port an Ethereum project to Polkadot Hub using Hardhat and viem.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/eth-dapps/uniswap-v2/)\n\n-   <span class=\"badge guide\">Guide</span> __Dive Deeper into Polkadot Precompiles__\n\n    ---\n\n    Learn how to use the Polkadot precompiles to interact with the blockchain.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/precompiles/)\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#introduction", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 35, "end_char": 1071, "estimated_token_count": 217, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub supports two execution paths for running smart contracts: [PVM](/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#pvm) (which compiles Solidity to the Polkadot Virtual Machine via the revive compiler) and EVM (powered by [REVM](https://github.com/bluealloy/revm), a Rust implementation of the Ethereum Virtual Machine, which runs standard EVM bytecode with zero modifications). This tutorial follows the EVM path.\n\nWith EVM, you deploy the same unmodified Solidity contracts using the same standard Hardhat toolchain you already know. No special compiler plugins, no contract rewrites, and no porting effort. If your project compiles with vanilla Hardhat, it runs on Polkadot Hub through EVM.\n\nThis tutorial walks you through cloning, compiling, testing, and deploying [Uniswap V2](https://developers.uniswap.org/docs/protocols/v2/overview) on Polkadot Hub using Hardhat and TypeScript. By the end, you will have a fully functioning `UniswapV2Factory` contract deployed to the Polkadot Hub TestNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#prerequisites", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1071, "end_char": 1702, "estimated_token_count": 158, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- [Node.js](https://nodejs.org/) v22.0.0 or later and npm installed\n- Basic understanding of [Solidity](https://www.soliditylang.org/) and TypeScript\n- Familiarity with the [Hardhat](/smart-contracts/dev-environments/hardhat/) development environment\n- Some test tokens to cover transaction fees, obtained from the [Polkadot faucet](https://faucet.polkadot.io/) (see [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet)\n- A wallet with a private key for signing transactions\n- Basic understanding of how AMMs and liquidity pools work"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#set-up-the-project", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 2, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 1702, "end_char": 2822, "estimated_token_count": 249, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nStart by cloning the EVM Hardhat examples repository, which contains the Uniswap V2 Core project with a standard Hardhat and TypeScript configuration:\n\n1. Clone the repository and navigate to the Uniswap V2 project:\n\n    ```bash\n    git clone https://github.com/polkadot-developers/revm-hardhat-examples.git\n    cd revm-hardhat-examples\n    git checkout b0a8627059a9d9cb759682310219557550186bc4\n    cd uniswap-v2-core-hardhat/\n    ```\n\n2. Install the required dependencies:\n\n    ```bash\n    npm install\n    ```\n\n3. Compile the contracts:\n\n    ```bash\n    npx hardhat compile\n    ```\n\n    If the compilation is successful, you should see output similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat compile</span>\n      <span data-ty>Downloading solc 0.5.16</span>\n      <span data-ty>Compiling 12 Solidity files</span>\n      <span data-ty>Successfully compiled 12 Solidity files</span>\n    </div>\n    \n\n    After running this command, the compiled artifacts (ABI and bytecode) appear in the `artifacts` directory."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#configure-secure-key-management", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 3, "depth": 2, "title": "Configure Secure Key Management", "anchor": "configure-secure-key-management", "start_char": 2822, "end_char": 4173, "estimated_token_count": 301, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Secure Key Management\n\nThis project uses [Hardhat Configuration Variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) to manage private keys securely. Unlike `.env` files, configuration variables are stored outside your project directory and are never at risk of being committed to version control.\n\nTo set your private key for TestNet deployment, run:\n\n```bash\nnpx hardhat vars set TESTNET_PRIVATE_KEY\n```\n\nWhen prompted, paste your private key. Hardhat stores it securely and makes it available through `vars.get(\"TESTNET_PRIVATE_KEY\")` in the configuration file.\n\n!!! warning\n    Keep your private key safe and never share it with anyone. If it is compromised, your funds can be stolen.\n\nThe `hardhat.config.ts` file references the variable conditionally, so the project works without it for local development:\n\n```typescript title=\"hardhat.config.ts\"\nnetworks: {\n  localNode: {\n    url: \"http://127.0.0.1:8545\",\n  },\n  polkadotTestnet: {\n    url: \"https://services.polkadothub-rpc.com/testnet\",\n    accounts: vars.has(\"TESTNET_PRIVATE_KEY\")\n      ? [vars.get(\"TESTNET_PRIVATE_KEY\")]\n      : [],\n  },\n},\n```\n\n!!! note\n    You only need the `TESTNET_PRIVATE_KEY` variable when deploying to the Polkadot Hub TestNet. Local development against the development node does not require any key configuration."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#uniswap-v2-core-architecture", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 4, "depth": 2, "title": "Uniswap V2 Core Architecture", "anchor": "uniswap-v2-core-architecture", "start_char": 4173, "end_char": 6646, "estimated_token_count": 548, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Uniswap V2 Core Architecture\n\nBefore interacting with the contracts, it is essential to understand the core architecture that powers Uniswap V2. This model forms the basis of nearly every modern DEX implementation and operates under automated market making, token pair liquidity pools, and deterministic pricing principles.\n\nAt the heart of Uniswap V2 lies a simple but powerful system composed of two major smart contracts:\n\n- **Factory contract**: Acts as a registry and creator of new trading pairs. When two ERC-20 tokens are to be traded, the Factory contract generates a new Pair contract that manages that specific token pair's liquidity pool. It tracks all deployed pairs and ensures uniqueness, so no duplicate pools can exist for the same token combination.\n- **Pair contract**: Each Pair contract is a decentralized liquidity pool that holds reserves of two ERC-20 tokens. These contracts implement the core AMM logic, maintaining a constant product invariant (x * y = k) to facilitate swaps and price determination. Users contribute tokens to these pools in return for LP (liquidity provider) tokens, which represent their proportional share of the reserves.\n\nThis architecture enables Uniswap to be highly modular, trustless, and extensible. By distributing responsibilities across these components, developers and users can engage with the protocol in a composable and predictable manner.\n\nThe project scaffolding is as follows:\n\n```text\nuniswap-v2-core-hardhat/\n├── contracts/\n│   ├── interfaces/\n│   │   ├── IERC20.sol\n│   │   ├── IUniswapV2Callee.sol\n│   │   ├── IUniswapV2ERC20.sol\n│   │   ├── IUniswapV2Factory.sol\n│   │   └── IUniswapV2Pair.sol\n│   ├── libraries/\n│   │   ├── Math.sol\n│   │   ├── SafeMath.sol\n│   │   └── UQ112x112.sol\n│   ├── test/\n│   │   └── ERC20.sol\n│   ├── UniswapV2ERC20.sol\n│   ├── UniswapV2Factory.sol\n│   └── UniswapV2Pair.sol\n├── ignition/\n│   └── modules/\n│       └── UniswapV2Factory.ts\n├── scripts/\n│   └── deploy.ts\n├── test/\n│   ├── shared/\n│   │   └── utilities.ts\n│   ├── UniswapV2ERC20.test.ts\n│   ├── UniswapV2Factory.test.ts\n│   └── UniswapV2Pair.test.ts\n├── hardhat.config.ts\n├── package.json\n└── tsconfig.json\n```\n\nKey differences from a typical Ethereum Hardhat project are minimal. The Solidity contracts are the original Uniswap V2 source (Solidity 0.5.16) with no modifications. The test files use TypeScript (`.test.ts`) and avoid `loadFixture` for compatibility with the Polkadot execution environment."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#test-the-contracts", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 5, "depth": 2, "title": "Test the Contracts", "anchor": "test-the-contracts", "start_char": 6646, "end_char": 9570, "estimated_token_count": 810, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test the Contracts\n\nThe project includes a comprehensive test suite with 28 tests across three test files covering ERC-20 functionality, factory operations, and pair contract interactions including liquidity management and swaps.\n\nTo run the tests locally:\n\n1. Start the local development node. Follow the steps in the [Local Development Node](/smart-contracts/dev-environments/local-dev-node/) guide to set it up.\n\n2. In a new terminal, run the test suite against the local node:\n\n    ```bash\n    npx hardhat test --network localNode\n    ```\n\n    The tests are configured with a 120-second Mocha timeout to accommodate Polkadot network block times. The result should look similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat test --network localNode</span>\n      <span data-ty>Compiling 12 Solidity files</span>\n      <span data-ty>Successfully compiled 12 Solidity files</span>\n      <span data-ty></span>\n      <span data-ty>UniswapV2ERC20</span>\n      <span data-ty> ✔ name, symbol, decimals, totalSupply, balanceOf, DOMAIN_SEPARATOR, PERMIT_TYPEHASH (41ms)</span>\n      <span data-ty> ✔ approve (4983ms)</span>\n      <span data-ty> ✔ transfer (5047ms)</span>\n      <span data-ty> ✔ transfer:fail</span>\n      <span data-ty> ✔ transferFrom (6104ms)</span>\n      <span data-ty> ✔ transferFrom:max (6138ms)</span>\n      <span data-ty></span>\n      <span data-ty>UniswapV2Factory</span>\n      <span data-ty> ✔ feeTo, feeToSetter, allPairsLength</span>\n      <span data-ty> ✔ createPair (168ms)</span>\n      <span data-ty> ✔ createPair:reverse (1198ms)</span>\n      <span data-ty> ✔ setFeeTo (1112ms)</span>\n      <span data-ty> ✔ setFeeToSetter (1099ms)</span>\n      <span data-ty></span>\n      <span data-ty>UniswapV2Pair</span>\n      <span data-ty> ✔ mint (11208ms)</span>\n      <span data-ty> ✔ getInputPrice:0 (12374ms)</span>\n      <span data-ty> ✔ getInputPrice:1 (17382ms)</span>\n      <span data-ty> ✔ getInputPrice:2 (17401ms)</span>\n      <span data-ty> ✔ getInputPrice:3 (17488ms)</span>\n      <span data-ty> ✔ getInputPrice:4 (17433ms)</span>\n      <span data-ty> ✔ getInputPrice:5 (17378ms)</span>\n      <span data-ty> ✔ getInputPrice:6 (13427ms)</span>\n      <span data-ty> ✔ optimistic:0 (17431ms)</span>\n      <span data-ty> ✔ optimistic:1 (17730ms)</span>\n      <span data-ty> ✔ optimistic:2 (17441ms)</span>\n      <span data-ty> ✔ optimistic:3 (21409ms)</span>\n      <span data-ty> ✔ swap:token0 (12449ms)</span>\n      <span data-ty> ✔ swap:token1 (17415ms)</span>\n      <span data-ty> ✔ burn (17474ms)</span>\n      <span data-ty> ✔ feeTo:off (23684ms)</span>\n      <span data-ty> ✔ feeTo:on (24775ms)</span>\n      <span data-ty></span>\n      <span data-ty>28 passing (12m)</span>\n    </div>\n    \n\n!!! tip\n    If tests time out, ensure your local development node is running and accessible at `http://127.0.0.1:8545`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#deploy-the-contracts", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 6, "depth": 2, "title": "Deploy the Contracts", "anchor": "deploy-the-contracts", "start_char": 9570, "end_char": 11230, "estimated_token_count": 422, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contracts\n\nAfter successfully testing the contracts, you can deploy them to the Polkadot Hub TestNet using [Hardhat Ignition](https://hardhat.org/ignition/docs/getting-started#overview). The Ignition module at `ignition/modules/UniswapV2Factory.ts` deploys the UniswapV2Factory contract.\n\nMake sure you have [configured your private key](#configure-secure-key-management) and that your account has test tokens. Then run:\n\n```bash\nnpx hardhat ignition deploy ./ignition/modules/UniswapV2Factory.ts --network polkadotTestnet\n```\n\nWhen prompted, confirm the target network name and chain ID. Ignition deploys the Factory contract and prints the deployed address. The output should look similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\">npx hardhat ignition deploy ./ignition/modules/UniswapV2Factory.ts --network polkadotTestnet</span>\n  <span data-ty>✔ Confirm deploy to network polkadotTestnet (420420417)? … yes</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Hardhat Ignition 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deploying [ UniswapV2FactoryModule ]</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Batch #1</span>\n  <span data-ty> Executed UniswapV2FactoryModule#UniswapV2Factory</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>[ UniswapV2FactoryModule ] successfully deployed 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deployed Addresses</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>UniswapV2FactoryModule#UniswapV2Factory - 0x85b108660f47caDfAB9e0503104C08C1c96e0DA9</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#where-to-go-next", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 11230, "end_char": 12159, "estimated_token_count": 234, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge tutorial\">Tutorial</span> __Deploy Uniswap V2 Periphery__\n\n    ---\n\n    Deploy Router contracts for user-facing swaps, liquidity management, and WETH wrapping on top of V2 Core.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/)\n\n-   <span class=\"badge guide\">Guide</span> __Hardhat on Polkadot__\n\n    ---\n\n    Learn how to create, compile, test, and deploy smart contracts on Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Reference](/smart-contracts/dev-environments/hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Local Development Node__\n\n    ---\n\n    Set up and run a local development node for testing your smart contracts against Polkadot.\n\n    [:octicons-arrow-right-24: Set Up](/smart-contracts/dev-environments/local-dev-node/)\n\n</div>\n\n# Deploy Uniswap V2 Core"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#introduction", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 8, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12159, "end_char": 12820, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nDecentralized exchanges (DEXs) are a cornerstone of the DeFi ecosystem, allowing for permissionless token swaps without intermediaries. [Uniswap V2](https://developers.uniswap.org/docs/protocols/v2/overview), with its Automated Market Maker (AMM) model, revolutionized DEXs by enabling liquidity provision for any ERC-20 token pair.\n\nThis tutorial will guide you through how Uniswap V2 works so you can take advantage of it in your projects deployed to Polkadot Hub. By understanding these contracts, you'll gain hands-on experience with one of the most influential DeFi protocols and understand how it functions across blockchain ecosystems."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#prerequisites", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 9, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 12820, "end_char": 13261, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- Node.js (v16.0.0 or later) and npm installed.\n- Basic understanding of Solidity and JavaScript.\n- Familiarity with [Hardhat](/smart-contracts/dev-environments/hardhat/) development environment.\n- Some test tokens to cover transaction fees (obtained from the [Polkadot faucet](https://faucet.polkadot.io/?parachain=1111)).\n- Basic understanding of how AMMs and liquidity pools work."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#set-up-the-project", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 10, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 13261, "end_char": 14992, "estimated_token_count": 411, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nStart by cloning the Uniswap V2 project:\n\n1. Clone the Uniswap V2 repository:\n\n    ```\n    git clone https://github.com/polkadot-developers/polkavm-hardhat-examples.git\n    git checkout hardhat-polkadot-evm\n    cd polkavm-hardhat-examples/uniswap-v2-polkadot/\n    ```\n\n2. Install the required dependencies:\n\n    ```bash\n    npm install\n    ```\n\n3. Create a `.env` file in your project root to store your private keys (you can use as an example the `env.example` file):\n\n    ```text title=\".env\"\n    LOCAL_PRIV_KEY=\"INSERT_LOCAL_PRIVATE_KEY\"\n    AH_PRIV_KEY=\"INSERT_AH_PRIVATE_KEY\"\n    ```\n\n    Ensure to replace `\"INSERT_LOCAL_PRIVATE_KEY\"` with a private key available in the local environment (you can get them from this [file](https://github.com/paritytech/hardhat-polkadot/blob/main/packages/hardhat-polkadot-node/src/constants.ts#L21)). And `\"INSERT_AH_PRIVATE_KEY\"` with the account's private key you want to use to deploy the contracts. You can get this by exporting the private key from your wallet (e.g., MetaMask).\n\n    !!! warning\n        Keep your private key safe, and never share it with anyone. If it is compromised, your funds can be stolen.\n\n5. Compile the contracts:\n\n    ```bash\n    npx hardhat compile\n    ```\n\nIf the compilation is successful, you should see the following output:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat compile</span>\n  <span data-ty>Compiling 12 Solidity files</span>\n  <span data-ty>Successfully compiled 12 Solidity files</span>\n</div>\n\n\nAfter running the above command, you should see the compiled contracts in the `artifacts` directory. This directory contains the ABI and bytecode of your contracts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#understanding-uniswap-v2-architecture", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 11, "depth": 2, "title": "Understanding Uniswap V2 Architecture", "anchor": "understanding-uniswap-v2-architecture", "start_char": 14992, "end_char": 17344, "estimated_token_count": 527, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understanding Uniswap V2 Architecture\n\nBefore interacting with the contracts, it's essential to understand the core architecture that powers Uniswap V2. This model forms the basis of nearly every modern DEX implementation and operates under automated market making, token pair liquidity pools, and deterministic pricing principles.\n\nAt the heart of Uniswap V2 lies a simple but powerful system composed of two major smart contracts:\n\n- **Factory contract**: The factory acts as a registry and creator of new trading pairs. When two ERC-20 tokens are to be traded, the Factory contract is responsible for generating a new Pair contract that will manage that specific token pair’s liquidity pool. It keeps track of all deployed pairs and ensures uniqueness—no duplicate pools can exist for the same token combination.\n- **Pair contract**: Each pair contract is a decentralized liquidity pool that holds reserves of two ERC-20 tokens. These contracts implement the core logic of the AMM, maintaining a constant product invariant (x \\* y = k) to facilitate swaps and price determination. Users can contribute tokens to these pools in return for LP (liquidity provider) tokens, which represent their proportional share of the reserves.\n\nThis minimal architecture enables Uniswap to be highly modular, trustless, and extensible. By distributing responsibilities across these components, developers, and users can engage with the protocol in a composable and predictable manner, making it an ideal foundation for DEX functionality across ecosystems, including Polkadot Hub.\n\nThe project scaffolding is as follows:\n\n```bash\nuniswap-V2-polkadot\n├── bin/\n├── contracts/\n│   ├── interfaces/\n│   │   ├── IERC20.sol\n│   │   ├── IUniswapV2Callee.sol\n│   │   ├── IUniswapV2ERC20.sol\n│   │   ├── IUniswapV2Factory.sol\n│   │   └── IUniswapV2Pair.sol\n│   ├── libraries/\n│   │   ├── Math.sol\n│   │   ├── SafeMath.sol\n│   │   └── UQ112x112.sol\n│   ├── test/\n│   │   └── ERC20.sol\n│   ├── UniswapV2ERC20.sol\n│   ├── UniswapV2Factory.sol\n│   └── UniswapV2Pair.sol\n├── ignition/\n├── scripts/\n│   └── deploy.js\n├── node_modules/\n├── test/\n│   ├── shared/\n│   │   ├── fixtures.js\n│   │   └── utilities.js\n│   ├── UniswapV2ERC20.js\n│   ├── UniswapV2Factory.js\n│   └── UniswapV2Pair.js\n├── .env.example\n├── .gitignore\n├── hardhat.config.js\n├── package.json\n└── README.md\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#test-the-contracts", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 12, "depth": 2, "title": "Test the Contracts", "anchor": "test-the-contracts", "start_char": 17344, "end_char": 19825, "estimated_token_count": 759, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test the Contracts\n\nYou can run the provided test suite to ensure the contracts are working as expected. The tests cover various scenarios, including creating pairs, adding liquidity, and executing swaps.\n\nTo test it locally, you can run the following commands:\n\n1. Run the local `revive-dev-node`, for this, you can check the [Local Development Node](/smart-contracts/dev-environments/local-dev-node/) guide.\n\n2. In a new terminal, run the tests:\n\n    ```bash\n    npx hardhat test --network localNode\n    ```\n\nThe result should look like this:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat test --network localNode</span>\n  <span data-ty>Compiling 12 Solidity files</span>\n  <span data-ty>Successfully compiled 12 Solidity files</span>\n  <span data-ty></span>\n  <span data-ty>UniswapV2ERC20</span>\n  <span data-ty> ✔ name, symbol, decimals, totalSupply, balanceOf, DOMAIN_SEPARATOR, PERMIT_TYPEHASH (44ms)</span>\n  <span data-ty> ✔ approve (5128ms)</span>\n  <span data-ty> ✔ transfer (5133ms)</span>\n  <span data-ty> ✔ transfer:fail</span>\n  <span data-ty> ✔ transferFrom (6270ms)</span>\n  <span data-ty> ✔ transferFrom:max (6306ms)</span>\n  <span data-ty></span>\n  <span data-ty>UniswapV2Factory</span>\n  <span data-ty> ✔ feeTo, feeToSetter, allPairsLength</span>\n  <span data-ty> ✔ createPair (176ms)</span>\n  <span data-ty> ✔ createPair:reverse (1224ms)</span>\n  <span data-ty> ✔ setFeeTo (1138ms)</span>\n  <span data-ty> ✔ setFeeToSetter (1125ms)</span>\n  <span data-ty></span>\n  <span data-ty>UniswapV2Pair</span>\n  <span data-ty> ✔ mint (11425ms)</span>\n  <span data-ty> ✔ getInputPrice:0 (12590ms)</span>\n  <span data-ty> ✔ getInputPrice:1 (17600ms)</span>\n  <span data-ty> ✔ getInputPrice:2 (17618ms)</span>\n  <span data-ty> ✔ getInputPrice:3 (17704ms)</span>\n  <span data-ty> ✔ getInputPrice:4 (17649ms)</span>\n  <span data-ty> ✔ getInputPrice:5 (17594ms)</span>\n  <span data-ty> ✔ getInputPrice:6 (13643ms)</span>\n  <span data-ty> ✔ optimistic:0 (17647ms)</span>\n  <span data-ty> ✔ optimistic:1 (17946ms)</span>\n  <span data-ty> ✔ optimistic:2 (17657ms)</span>\n  <span data-ty> ✔ optimistic:3 (21625ms)</span>\n  <span data-ty> ✔ swap:token0 (12665ms)</span>\n  <span data-ty> ✔ swap:token1 (17631ms)</span>\n  <span data-ty> ✔ burn (17690ms)</span>\n  <span data-ty> ✔ feeTo:off (23900ms)</span>\n  <span data-ty> ✔ feeTo:on (24991ms)</span>\n  <span data-ty></span>\n  <span data-ty>28 passing (12m)</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#deploy-the-contracts", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 13, "depth": 2, "title": "Deploy the Contracts", "anchor": "deploy-the-contracts", "start_char": 19825, "end_char": 21578, "estimated_token_count": 379, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contracts\n\nAfter successfully testing the contracts, you can deploy them to the local node or Polkadot Hub. The deployment script is located in the `scripts` directory and is named `deploy.js`. This script deploys the `Factory` and `Pair` contracts to the network.\n\nTo deploy the contracts, run the following command:\n\n```bash\nnpx hardhat run scripts/deploy.js --network localNode\n```\n\nThis command deploys the contracts to your local blockchain for development and testing. If you want to deploy to Polkadot Hub, you can use the following command:\n\n```bash\nnpx hardhat run scripts/deploy.js --network polkadotHubTestNet\n```\n\nThe command above deploys to the actual Polkadot Hub TestNet. It requires test tokens, persists on the network, and operates under real network conditions.\n\nThe deployment script will output the addresses of the deployed contracts. Save these addresses, as you will need them to interact with the contracts. For example, the output should look like this:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat run scripts/deploy.js --network localNode</span>\n  <span data-ty>Successfully compiled 12 Solidity files</span>\n  <span data-ty>Deploying contracts using 0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac</span>\n  <span data-ty>Deploying UniswapV2ERC20...</span>\n  <span data-ty>ETH deployed to : 0x7acc1aC65892CF3547b1b0590066FB93199b430D</span>\n  <span data-ty>Deploying UniswapV2Factory...</span>\n  <span data-ty>Factory deployed to : 0x85b108660f47caDfAB9e0503104C08C1c96e0DA9</span>\n  <span data-ty>Deploying UniswapV2Pair with JsonRpcProvider workaround...</span>\n  <span data-ty>Pair deployed to : 0xF0e46847c8bFD122C4b5EEE1D4494FF7C5FC5104</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-core-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/#conclusion", "page_title": "Uniswap V2 Core with EVM on Polkadot", "index": 14, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 21578, "end_char": 22482, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:124c677754e5b40b46bc154a6d019fc049bbf856b3825a8fdf7e03f48e8e10a2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nThis tutorial guided you through deploying Uniswap V2 contracts to Polkadot Hub. This implementation brings the powerful AMM architecture to the Polkadot ecosystem, laying the foundation for the decentralized trading of ERC-20 token pairs.\n\nBy following this guide, you've gained practical experience with:\n\n- Setting up a Hardhat project for deploying to Polkadot Hub.\n- Understanding the Uniswap V2 architecture.\n- Testing Uniswap V2 contracts in a local environment.\n- Deploying contracts to both local and testnet environments.\n\nTo build on this foundation, you could extend this project by implementing functionality to create liquidity pools, execute token swaps, and build a user interface for interacting with your deployment.\n\nThis knowledge can be leveraged to build more complex DeFi applications or to integrate Uniswap V2 functionality into your existing projects on Polkadot."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/#tutorials", "page_title": "Uniswap V2 on Polkadot", "index": 0, "depth": 2, "title": "Tutorials", "anchor": "tutorials", "start_char": 884, "end_char": 1247, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4e7e1410a1ca57cb6f88488d7831dc4df067b1aa1fa326610318065d882005f1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Tutorials\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge tutorial\">Tutorial</span> __V2 Core__\n\n    ---\n\n    Deploy unmodified Uniswap V2 Factory and Pair contracts on Polkadot Hub using Hardhat. Supports both EVM and PVM execution paths.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#introduction", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 41, "end_char": 1294, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [Uniswap V2 Periphery](https://developers.uniswap.org/docs/protocols/v2/overview) contracts provide the Router layer that sits on top of the [Uniswap V2 Core](/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/) Factory and Pair contracts. While V2 Core handles the low-level AMM logic, the Periphery Router contracts expose the user-facing functions for adding liquidity, removing liquidity, and executing token swaps safely with built-in deadline and slippage protection.\n\nThis tutorial follows the EVM execution path. With EVM (powered by [REVM](https://github.com/bluealloy/revm), a Rust implementation of the Ethereum Virtual Machine), you deploy the same unmodified Solidity contracts using the same standard Hardhat toolchain you already know. No special compiler plugins, no contract rewrites, and no porting effort. If your project compiles with vanilla Hardhat, it runs on Polkadot Hub through EVM.\n\nThis tutorial walks you through cloning, compiling, testing, and deploying the Uniswap V2 Periphery contracts on Polkadot Hub using Hardhat and TypeScript. By the end, you will have a fully functioning WETH contract, Factory, Router02, two ERC-20 test tokens, and a trading pair deployed to the Polkadot Hub TestNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#prerequisites", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1294, "end_char": 2074, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- [Node.js](https://nodejs.org/) v22.0.0 or later and npm installed\n- Basic understanding of [Solidity](https://www.soliditylang.org/) and TypeScript\n- Familiarity with the [Hardhat](/smart-contracts/dev-environments/hardhat/) development environment\n- Some test tokens to cover transaction fees, obtained from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet\n- A wallet with a private key for signing transactions\n- Basic understanding of how AMMs and liquidity pools work\n- Completion of the [Uniswap V2 Core tutorial](/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/), as the Periphery contracts depend on V2 Core"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#set-up-the-project", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 2, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 2074, "end_char": 3527, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nStart by cloning the Hardhat examples repository, which contains the Uniswap V2 Periphery project with a standard Hardhat and TypeScript configuration:\n\n1. Clone the repository and navigate to the Uniswap V2 Periphery project:\n\n    ```bash\n    git clone https://github.com/polkadot-developers/revm-hardhat-examples.git\n    cd revm-hardhat-examples\n    git checkout a871364c8f4da052855b5c8ee4ed6b89fd182cb1\n    cd uniswap-v2-periphery-hardhat/\n    ```\n\n2. Install the required dependencies:\n\n    ```bash\n    npm install\n    ```\n\n    !!! note\n        The Periphery project depends on the V2 Core contracts through a local file reference (`\"@uniswap/v2-core\": \"file:../uniswap-v2-core-hardhat\"`). The `npm install` command resolves this automatically from the sibling directory in the repository.\n\n3. Compile the contracts:\n\n    ```bash\n    npx hardhat compile\n    ```\n\n    If the compilation is successful, you should see output similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat compile</span>\n      <span data-ty>Downloading solc 0.5.16</span>\n      <span data-ty>Downloading solc 0.6.6</span>\n      <span data-ty>Compiling 24 Solidity files</span>\n      <span data-ty>Successfully compiled 24 Solidity files</span>\n    </div>\n    \n\n    After running this command, the compiled artifacts (ABI and bytecode) appear in the `artifacts` directory."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#configure-secure-key-management", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 3, "depth": 2, "title": "Configure Secure Key Management", "anchor": "configure-secure-key-management", "start_char": 3527, "end_char": 4934, "estimated_token_count": 310, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Secure Key Management\n\nThis project uses [Hardhat Configuration Variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) to manage private keys securely. Unlike `.env` files, configuration variables are stored outside your project directory and are never at risk of being committed to version control.\n\nTo set your private key for TestNet deployment, run:\n\n```bash\nnpx hardhat vars set TESTNET_PRIVATE_KEY\n```\n\nWhen prompted, paste your private key. Hardhat stores it securely and makes it available through `vars.get(\"TESTNET_PRIVATE_KEY\")` in the configuration file.\n\n!!! warning\n    Keep your private key safe and never share it with anyone. If it is compromised, your funds can be stolen.\n\nThe `hardhat.config.ts` file references the variable conditionally, so the project works without it for local development:\n\n```typescript title=\"hardhat.config.ts\"\nnetworks: {\n  hardhat: {\n    allowUnlimitedContractSize: true,\n  },\n  localNode: {\n    url: \"http://127.0.0.1:8545\",\n  },\n  polkadotTestnet: {\n    url: \"https://services.polkadothub-rpc.com/testnet\",\n    accounts: vars.has(\"TESTNET_PRIVATE_KEY\")\n      ? [vars.get(\"TESTNET_PRIVATE_KEY\")]\n      : [],\n  },\n},\n```\n\n!!! note\n    You only need the `TESTNET_PRIVATE_KEY` variable when deploying to the Polkadot Hub TestNet. Local development against the development node does not require any key configuration."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#uniswap-v2-periphery-architecture", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 4, "depth": 2, "title": "Uniswap V2 Periphery Architecture", "anchor": "uniswap-v2-periphery-architecture", "start_char": 4934, "end_char": 7742, "estimated_token_count": 612, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Uniswap V2 Periphery Architecture\n\nBefore interacting with the contracts, it is essential to understand how the Periphery layer extends the V2 Core system. While the [V2 Core](/smart-contracts/cookbook/eth-dapps/uniswap-v2/core-v2/) contracts handle low-level pool operations, the Periphery contracts provide a safe and convenient interface for end users and integrating applications.\n\nThe Periphery layer introduces three major components:\n\n- **WETH9 contract**: A standard Wrapped Ether contract that allows native ETH to be used as an ERC-20 token. The Router uses WETH to support functions that accept native ETH directly (such as `addLiquidityETH` and `swapExactETHForTokens`), wrapping and unwrapping it transparently.\n- **Router01 contract**: The original Router implementation providing core functions for adding and removing liquidity, and executing multi-hop token swaps through a path of pairs. It validates deadlines and minimum output amounts to protect users from slippage and front-running.\n- **Router02 contract**: The production Router that extends Router01 with additional support for fee-on-transfer tokens. Functions like `swapExactTokensForTokensSupportingFeeOnTransferTokens` handle tokens that deduct fees on every transfer, ensuring swaps complete correctly even when the received amount is less than the sent amount.\n\nThis architecture separates user-facing logic from the core AMM primitives, keeping the Core contracts simple and immutable while allowing the Periphery to evolve independently.\n\nThe project scaffolding is as follows:\n\n```text\nuniswap-v2-periphery-hardhat/\n├── contracts/\n│   ├── interfaces/\n│   │   ├── IERC20.sol\n│   │   ├── IUniswapV2Router01.sol\n│   │   ├── IUniswapV2Router02.sol\n│   │   └── IWETH.sol\n│   ├── libraries/\n│   │   ├── SafeMath.sol\n│   │   └── UniswapV2Library.sol\n│   ├── test/\n│   │   ├── CompileHelper.sol\n│   │   ├── DeflatingERC20.sol\n│   │   ├── ERC20.sol\n│   │   ├── RouterEventEmitter.sol\n│   │   └── WETH9.sol\n│   ├── UniswapV2Router01.sol\n│   └── UniswapV2Router02.sol\n├── ignition/\n│   └── modules/\n│       └── UniswapV2Router02.ts\n├── scripts/\n│   └── deploy.ts\n├── test/\n│   ├── shared/\n│   │   ├── fixtures.ts\n│   │   └── utilities.ts\n│   ├── UniswapV2Router01.test.ts\n│   └── UniswapV2Router02.test.ts\n├── hardhat.config.ts\n├── package.json\n└── tsconfig.json\n```\n\nKey differences from a typical Ethereum Hardhat project are minimal. The Solidity contracts are the original Uniswap V2 Periphery source, using both Solidity 0.5.16 (for the V2 Core dependency) and 0.6.6 (for the Router contracts) with no modifications. The Hardhat configuration includes a multi-compiler setup to handle both versions. The test files use TypeScript (`.test.ts`) and avoid `loadFixture` for compatibility with the Polkadot execution environment."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#test-the-contracts", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 5, "depth": 2, "title": "Test the Contracts", "anchor": "test-the-contracts", "start_char": 7742, "end_char": 13159, "estimated_token_count": 1344, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test the Contracts\n\nThe project includes a comprehensive test suite with 50 tests across two test files. The Router01 test file covers 38 tests for liquidity operations, token swaps, ETH swaps, and permit-based liquidity removal. The Router02 test file covers 12 tests for fee-on-transfer token support and additional swap scenarios.\n\nTo run the tests locally:\n\n1. Start the local development node. Follow the steps in the [Local Development Node](/smart-contracts/dev-environments/local-dev-node/) guide to set it up.\n\n2. In a new terminal, run the test suite against the local node:\n\n    ```bash\n    npx hardhat test --network localNode\n    ```\n\n    The tests are configured with a 120-second Mocha timeout to accommodate Polkadot network block times. The result should look similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat test --network localNode</span>\n      <span data-ty>Compiling 24 Solidity files</span>\n      <span data-ty>Successfully compiled 24 Solidity files</span>\n      <span data-ty></span>\n      <span data-ty>UniswapV2Router{01,02}</span>\n      <span data-ty>  UniswapV2Router01</span>\n      <span data-ty>    ✔ factory, WETH</span>\n      <span data-ty>    ✔ addLiquidity (12045ms)</span>\n      <span data-ty>    ✔ addLiquidityETH (11987ms)</span>\n      <span data-ty>    ✔ removeLiquidity (17234ms)</span>\n      <span data-ty>    ✔ removeLiquidityETH (17456ms)</span>\n      <span data-ty>    ✔ removeLiquidityWithPermit (12134ms)</span>\n      <span data-ty>    ✔ removeLiquidityETHWithPermit (17523ms)</span>\n      <span data-ty>    swapExactTokensForTokens</span>\n      <span data-ty>      ✔ happy path (12378ms)</span>\n      <span data-ty>      ✔ amounts (6145ms)</span>\n      <span data-ty>    swapTokensForExactTokens</span>\n      <span data-ty>      ✔ happy path (12401ms)</span>\n      <span data-ty>      ✔ amounts (6178ms)</span>\n      <span data-ty>    swapExactETHForTokens</span>\n      <span data-ty>      ✔ happy path (12367ms)</span>\n      <span data-ty>      ✔ amounts (6134ms)</span>\n      <span data-ty>    swapTokensForExactETH</span>\n      <span data-ty>      ✔ happy path (12489ms)</span>\n      <span data-ty>      ✔ amounts (6201ms)</span>\n      <span data-ty>    swapExactTokensForETH</span>\n      <span data-ty>      ✔ happy path (12356ms)</span>\n      <span data-ty>      ✔ amounts (6167ms)</span>\n      <span data-ty>    swapETHForExactTokens</span>\n      <span data-ty>      ✔ happy path (12412ms)</span>\n      <span data-ty>      ✔ amounts (6189ms)</span>\n      <span data-ty>  UniswapV2Router02</span>\n      <span data-ty>    ✔ factory, WETH</span>\n      <span data-ty>    ✔ addLiquidity (12067ms)</span>\n      <span data-ty>    ✔ addLiquidityETH (11998ms)</span>\n      <span data-ty>    ✔ removeLiquidity (17289ms)</span>\n      <span data-ty>    ✔ removeLiquidityETH (17512ms)</span>\n      <span data-ty>    ✔ removeLiquidityWithPermit (12156ms)</span>\n      <span data-ty>    ✔ removeLiquidityETHWithPermit (17534ms)</span>\n      <span data-ty>    swapExactTokensForTokens</span>\n      <span data-ty>      ✔ happy path (12389ms)</span>\n      <span data-ty>      ✔ amounts (6156ms)</span>\n      <span data-ty>    swapTokensForExactTokens</span>\n      <span data-ty>      ✔ happy path (12423ms)</span>\n      <span data-ty>      ✔ amounts (6187ms)</span>\n      <span data-ty>    swapExactETHForTokens</span>\n      <span data-ty>      ✔ happy path (12378ms)</span>\n      <span data-ty>      ✔ amounts (6145ms)</span>\n      <span data-ty>    swapTokensForExactETH</span>\n      <span data-ty>      ✔ happy path (12501ms)</span>\n      <span data-ty>      ✔ amounts (6212ms)</span>\n      <span data-ty>    swapExactTokensForETH</span>\n      <span data-ty>      ✔ happy path (12367ms)</span>\n      <span data-ty>      ✔ amounts (6178ms)</span>\n      <span data-ty>    swapETHForExactTokens</span>\n      <span data-ty>      ✔ happy path (12423ms)</span>\n      <span data-ty>      ✔ amounts (6198ms)</span>\n      <span data-ty></span>\n      <span data-ty>UniswapV2Router02</span>\n      <span data-ty>  ✔ quote</span>\n      <span data-ty>  ✔ getAmountOut</span>\n      <span data-ty>  ✔ getAmountIn</span>\n      <span data-ty>  ✔ getAmountsOut (6123ms)</span>\n      <span data-ty>  ✔ getAmountsIn (6145ms)</span>\n      <span data-ty></span>\n      <span data-ty>fee-on-transfer tokens</span>\n      <span data-ty>  ✔ removeLiquidityETHSupportingFeeOnTransferTokens (23456ms)</span>\n      <span data-ty>  ✔ removeLiquidityETHWithPermitSupportingFeeOnTransferTokens (23567ms)</span>\n      <span data-ty>  swapExactTokensForTokensSupportingFeeOnTransferTokens</span>\n      <span data-ty>    ✔ DTT -> WETH (12345ms)</span>\n      <span data-ty>    ✔ WETH -> DTT (12378ms)</span>\n      <span data-ty>  ✔ swapExactETHForTokensSupportingFeeOnTransferTokens (12367ms)</span>\n      <span data-ty>  ✔ swapExactTokensForETHSupportingFeeOnTransferTokens (12389ms)</span>\n      <span data-ty></span>\n      <span data-ty>fee-on-transfer tokens: reloaded</span>\n      <span data-ty>  swapExactTokensForTokensSupportingFeeOnTransferTokens</span>\n      <span data-ty>    ✔ DTT -> DTT2 (12401ms)</span>\n      <span data-ty></span>\n      <span data-ty>50 passing (25m)</span>\n    </div>\n    \n\n!!! tip\n    If tests time out, ensure your local development node is running and accessible at `http://127.0.0.1:8545`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#deploy-the-contracts", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 6, "depth": 2, "title": "Deploy the Contracts", "anchor": "deploy-the-contracts", "start_char": 13159, "end_char": 15326, "estimated_token_count": 524, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contracts\n\nAfter successfully testing the contracts, you can deploy them to the Polkadot Hub TestNet using [Hardhat Ignition](https://hardhat.org/ignition/docs/getting-started#overview). The Ignition module at `ignition/modules/UniswapV2Router02.ts` deploys WETH9, the UniswapV2Factory, and the UniswapV2Router02 contracts.\n\nMake sure you have [configured your private key](#configure-secure-key-management) and that your account has test tokens. Then run:\n\n```bash\nnpx hardhat ignition deploy ./ignition/modules/UniswapV2Router02.ts --network polkadotTestnet\n```\n\nWhen prompted, confirm the target network name and chain ID. Ignition deploys the contracts in two batches (Factory and WETH9 in parallel, then Router02) and prints all deployed addresses. The output should look similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\">npx hardhat ignition deploy ./ignition/modules/UniswapV2Router02.ts --network polkadotTestnet</span>\n  <span data-ty>✔ Confirm deploy to network polkadotTestnet (420420417)? … yes</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Hardhat Ignition 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deploying [ UniswapV2Router02Module ]</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Batch #1</span>\n  <span data-ty> Executed UniswapV2Router02Module#UniswapV2Factory</span>\n  <span data-ty> Executed UniswapV2Router02Module#WETH9</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Batch #2</span>\n  <span data-ty> Executed UniswapV2Router02Module#UniswapV2Router02</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>[ UniswapV2Router02Module ] successfully deployed 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deployed Addresses</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>UniswapV2Router02Module#UniswapV2Factory - 0x3Ca8f8C6De9d51B4e14e9Ab7D6d2e38A39C93B85</span>\n  <span data-ty>UniswapV2Router02Module#WETH9 - 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D</span>\n  <span data-ty>UniswapV2Router02Module#UniswapV2Router02 - 0xC36442b4a4522E871399CD717aBDD847Ab11FE88</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v2-periphery-v2", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v2/periphery-v2/#where-to-go-next", "page_title": "Uniswap V2 Periphery with EVM on Polkadot", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 15326, "end_char": 16206, "estimated_token_count": 224, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b9b6601c6c97e5c080d8c8bf409f26efb75e8670632735313afb9d2c7706123f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge tutorial\">Tutorial</span> __Uniswap V3 Core__\n\n    ---\n\n    Deploy unmodified Uniswap V3 Core contracts on Polkadot Hub using Hardhat and the EVM execution path.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/)\n\n-   <span class=\"badge guide\">Guide</span> __Hardhat on Polkadot__\n\n    ---\n\n    Learn how to create, compile, test, and deploy smart contracts on Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Reference](/smart-contracts/dev-environments/hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Local Development Node__\n\n    ---\n\n    Set up and run a local development node for testing your smart contracts against Polkadot.\n\n    [:octicons-arrow-right-24: Set Up](/smart-contracts/dev-environments/local-dev-node/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#introduction", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 36, "end_char": 1012, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub supports two execution paths for running smart contracts: PVM (which compiles Solidity to the Polkadot Virtual Machine via the revive compiler) and EVM (powered by [REVM](https://github.com/bluealloy/revm), a Rust implementation of the Ethereum Virtual Machine, which runs standard EVM bytecode with zero modifications). This tutorial follows the EVM path.\n\nWith EVM, you deploy the same unmodified Solidity contracts using the same standard Hardhat toolchain you already know. No special compiler plugins, no contract rewrites, and no porting effort. If your project compiles with vanilla Hardhat, it runs on Polkadot Hub through EVM.\n\nThis tutorial walks you through cloning, compiling, testing, and deploying [Uniswap V3 Core](https://developers.uniswap.org/docs/protocols/v3/overview) on Polkadot Hub using Hardhat and TypeScript. By the end, you will have a fully functioning UniswapV3Factory contract deployed to the Polkadot Hub TestNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#prerequisites", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1012, "end_char": 1642, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- [Node.js](https://nodejs.org/) v22.0.0 or later and npm installed\n- Basic understanding of [Solidity](https://www.soliditylang.org/) and TypeScript\n- Familiarity with the [Hardhat](/smart-contracts/dev-environments/hardhat/) development environment\n- Some test tokens to cover transaction fees, obtained from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet\n- A wallet with a private key for signing transactions\n- Basic understanding of how AMMs and liquidity pools work"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#set-up-the-project", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 2, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 1642, "end_char": 2882, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nStart by cloning the EVM Hardhat examples repository, which contains the Uniswap V3 Core project with a standard Hardhat and TypeScript configuration:\n\n1. Clone the repository, check out the pinned commit, and navigate to the Uniswap V3 project:\n\n    ```bash\n    git clone https://github.com/polkadot-developers/revm-hardhat-examples.git\n    cd revm-hardhat-examples\n    git checkout 3ff28ae44c4ab041a96953f49d0e2dae0408f28f\n    cd uniswap-v3-core-hardhat/\n    ```\n\n2. Install the required dependencies:\n\n    ```bash\n    npm install\n    ```\n\n3. Compile the contracts:\n\n    ```bash\n    npx hardhat compile\n    ```\n\n    If the compilation is successful, you should see output similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat compile</span>\n      <span data-ty>Generating typings for: 50 artifacts in dir: typechain-types for target: ethers-v6</span>\n      <span data-ty>Successfully generated 78 typings!</span>\n      <span data-ty>Compiled 50 Solidity files successfully (evm target: istanbul).</span>\n    </div>\n    \n\n    After running this command, the compiled artifacts (ABI and bytecode) appear in the `artifacts` directory."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#configure-secure-key-management", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 3, "depth": 2, "title": "Configure Secure Key Management", "anchor": "configure-secure-key-management", "start_char": 2882, "end_char": 4152, "estimated_token_count": 273, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Secure Key Management\n\nThis project uses [Hardhat Configuration Variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) to manage private keys securely. Unlike `.env` files, configuration variables are stored outside your project directory and are never at risk of being committed to version control.\n\nTo set your private key for TestNet deployment, run:\n\n```bash\nnpx hardhat vars set TESTNET_PRIVATE_KEY\n```\n\nWhen prompted, paste your private key. Hardhat stores it securely and makes it available through `vars.get(\"TESTNET_PRIVATE_KEY\")` in the configuration file.\n\n!!! warning\n    Keep your private key safe and never share it with anyone. If it is compromised, your funds can be stolen.\n\nThe `hardhat.config.ts` file references the variable conditionally, so the project works without it for local development:\n\n```typescript title=\"hardhat.config.ts\"\npolkadotTestnet: {\n  url: \"https://services.polkadothub-rpc.com/testnet\",\n  accounts: vars.has(\"TESTNET_PRIVATE_KEY\")\n    ? [vars.get(\"TESTNET_PRIVATE_KEY\")]\n    : [],\n},\n```\n\n!!! note\n    You only need the `TESTNET_PRIVATE_KEY` variable when deploying to the Polkadot Hub TestNet. Local development against the development node does not require any key configuration."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#v3-specific-configuration", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 4, "depth": 3, "title": "V3-Specific Configuration", "anchor": "v3-specific-configuration", "start_char": 4152, "end_char": 5280, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### V3-Specific Configuration\n\nUniswap V3 Core requires specific Solidity compiler settings to keep the `UniswapV3Factory` contract under the [EIP-170](https://eips.ethereum.org/EIPS/eip-170) 24KB contract size limit. The `hardhat.config.ts` file sets `bytecodeHash` to `\"none\"`, which excludes the metadata hash from the compiled bytecode. This matches the original Uniswap V3 Core deployment configuration:\n\n```typescript title=\"hardhat.config.ts\"\nsolidity: {\n  version: \"0.7.6\",\n  settings: {\n    optimizer: {\n      enabled: true,\n      runs: 800,\n    },\n    metadata: {\n      // Exclude metadata hash to keep contract size deterministic and under EIP-170 limit\n      // This matches the original Uniswap V3 Core deployment configuration\n      bytecodeHash: \"none\",\n    },\n  },\n},\n```\n\nThe configuration also sets a fixed gas price of 50 gwei for the `localNode` network to match the gas price reported by the Polkadot local development node:\n\n```typescript title=\"hardhat.config.ts\"\nlocalNode: {\n  url: \"http://127.0.0.1:8545\",\n  gasPrice: 50_000_000_000, // 50 gwei — matches Polkadot local node reported gas price\n},\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#uniswap-v3-core-architecture", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 5, "depth": 2, "title": "Uniswap V3 Core Architecture", "anchor": "uniswap-v3-core-architecture", "start_char": 5280, "end_char": 5667, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Uniswap V3 Core Architecture\n\nBefore interacting with the contracts, it is essential to understand the core architecture that powers Uniswap V3. This version introduces concentrated liquidity, a fundamentally different model from V2's uniform distribution that allows liquidity providers to allocate capital within specific price ranges for dramatically improved capital efficiency."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#concentrated-liquidity-and-fee-tiers", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 6, "depth": 3, "title": "Concentrated Liquidity and Fee Tiers", "anchor": "concentrated-liquidity-and-fee-tiers", "start_char": 5667, "end_char": 6496, "estimated_token_count": 234, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Concentrated Liquidity and Fee Tiers\n\nIn Uniswap V2, liquidity is spread uniformly across the entire price curve from zero to infinity. Uniswap V3 replaces this with concentrated liquidity, where providers choose a specific price range in which their capital is active. This means a position only earns fees when the current price falls within its selected range, but the capital within that range is far more effective.\n\nUniswap V3 also introduces multiple fee tiers so that pools can match the risk profile of different token pairs:\n\n| Fee Tier | Fee Percentage | Tick Spacing | Typical Use Case |\n|:--------:|:--------------:|:------------:|:----------------:|\n| 500 | 0.05% | 10 | Stable pairs (e.g., USDC/DAI) |\n| 3000 | 0.30% | 60 | Standard pairs (e.g., ETH/USDC) |\n| 10000 | 1.00% | 200 | Exotic or volatile pairs |"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#tick-system-and-price-math", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 7, "depth": 3, "title": "Tick System and Price Math", "anchor": "tick-system-and-price-math", "start_char": 6496, "end_char": 6942, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Tick System and Price Math\n\nPrices in Uniswap V3 are represented as the square root of the price ratio, stored as a fixed-point Q64.96 value (`sqrtPriceX96`). The continuous price space is divided into discrete ticks, where each tick represents a 0.01% (1 basis point) price change. Liquidity positions are bounded by a lower tick and an upper tick, and the protocol tracks which ticks have active liquidity through a bitmap data structure."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#core-contracts", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 8, "depth": 3, "title": "Core Contracts", "anchor": "core-contracts", "start_char": 6942, "end_char": 7766, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Core Contracts\n\nAt the heart of Uniswap V3 are four core smart contracts:\n\n- **`UniswapV3Factory`**: Creates and registers new pools. Each unique combination of two tokens and a fee tier produces a single pool. The Factory also controls protocol fee settings and ownership.\n- **`UniswapV3Pool`**: The main contract for each trading pair and fee tier. It manages concentrated liquidity positions, executes swaps using the tick-based price system, and maintains a built-in TWAP (time-weighted average price) oracle.\n- **`UniswapV3PoolDeployer`**: A helper contract used by the Factory to deploy new pools via `CREATE2`, ensuring deterministic pool addresses.\n- **`NoDelegateCall`**: A security base contract that prevents delegate call exploits by verifying the execution context matches the original deployment address."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#math-libraries", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 9, "depth": 3, "title": "Math Libraries", "anchor": "math-libraries", "start_char": 7766, "end_char": 8154, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Math Libraries\n\nThe V3 protocol relies on an extensive suite of 16 math library contracts for precise fixed-point arithmetic, tick calculations, and price computations. These include `TickMath` for converting between ticks and sqrt prices, `SqrtPriceMath` for computing swap amounts, `FullMath` for 512-bit multiplication, and `Oracle` for TWAP accumulator management, among others."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#project-structure", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 10, "depth": 3, "title": "Project Structure", "anchor": "project-structure", "start_char": 8154, "end_char": 10799, "estimated_token_count": 675, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Project Structure\n\nThe project scaffolding is as follows:\n\n```text\nuniswap-v3-core-hardhat/\n├── contracts/\n│   ├── interfaces/\n│   │   ├── callback/\n│   │   │   ├── IUniswapV3FlashCallback.sol\n│   │   │   ├── IUniswapV3MintCallback.sol\n│   │   │   └── IUniswapV3SwapCallback.sol\n│   │   ├── pool/\n│   │   │   ├── IUniswapV3PoolActions.sol\n│   │   │   ├── IUniswapV3PoolDerivedState.sol\n│   │   │   ├── IUniswapV3PoolEvents.sol\n│   │   │   ├── IUniswapV3PoolImmutables.sol\n│   │   │   ├── IUniswapV3PoolOwnerActions.sol\n│   │   │   └── IUniswapV3PoolState.sol\n│   │   ├── IERC20Minimal.sol\n│   │   ├── IUniswapV3Factory.sol\n│   │   ├── IUniswapV3Pool.sol\n│   │   └── IUniswapV3PoolDeployer.sol\n│   ├── libraries/\n│   │   ├── BitMath.sol\n│   │   ├── FixedPoint128.sol\n│   │   ├── FixedPoint96.sol\n│   │   ├── FullMath.sol\n│   │   ├── LiquidityMath.sol\n│   │   ├── LowGasSafeMath.sol\n│   │   ├── Oracle.sol\n│   │   ├── Position.sol\n│   │   ├── SafeCast.sol\n│   │   ├── SqrtPriceMath.sol\n│   │   ├── SwapMath.sol\n│   │   ├── Tick.sol\n│   │   ├── TickBitmap.sol\n│   │   ├── TickMath.sol\n│   │   ├── TransferHelper.sol\n│   │   └── UnsafeMath.sol\n│   ├── test/\n│   │   ├── BitMathTest.sol\n│   │   ├── FullMathTest.sol\n│   │   ├── LiquidityMathTest.sol\n│   │   ├── MockTimeUniswapV3Pool.sol\n│   │   ├── MockTimeUniswapV3PoolDeployer.sol\n│   │   ├── NoDelegateCallTest.sol\n│   │   ├── OracleTest.sol\n│   │   ├── SqrtPriceMathTest.sol\n│   │   ├── SwapMathTest.sol\n│   │   ├── TestERC20.sol\n│   │   ├── TestUniswapV3Callee.sol\n│   │   ├── TestUniswapV3ReentrantCallee.sol\n│   │   ├── TestUniswapV3Router.sol\n│   │   ├── TestUniswapV3SwapPay.sol\n│   │   ├── TickBitmapTest.sol\n│   │   ├── TickMathTest.sol\n│   │   └── TickTest.sol\n│   ├── NoDelegateCall.sol\n│   ├── UniswapV3Factory.sol\n│   ├── UniswapV3Pool.sol\n│   └── UniswapV3PoolDeployer.sol\n├── ignition/\n│   └── modules/\n│       └── UniswapV3Factory.ts\n├── scripts/\n│   └── deploy.ts\n├── test/\n│   ├── shared/\n│   │   ├── checkObservationEquals.ts\n│   │   ├── fixtures.ts\n│   │   ├── format.ts\n│   │   └── utilities.ts\n│   ├── UniswapV3Factory.test.ts\n│   └── UniswapV3Pool.test.ts\n├── hardhat.config.ts\n├── package.json\n└── tsconfig.json\n```\n\nKey differences from V2 are significant. The Solidity contracts use version 0.7.6 (V2 used 0.5.16). The `contracts/libraries/` directory contains 16 math libraries for tick calculations, fixed-point arithmetic, and oracle management. The `contracts/test/` directory includes 17 test helper contracts, including mock pools, routers, and math test harnesses. The test suite is split across two files instead of three, with a shared utilities directory."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#test-the-contracts", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 11, "depth": 2, "title": "Test the Contracts", "anchor": "test-the-contracts", "start_char": 10799, "end_char": 16917, "estimated_token_count": 1632, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test the Contracts\n\nThe project includes a comprehensive test suite with 187 tests across two test files:\n\n- **`UniswapV3Factory.test.ts`**: 21 tests covering factory operations, pool creation, fee tier management, and ownership controls.\n- **`UniswapV3Pool.test.ts`**: 166 tests covering concentrated liquidity positions, swaps across tick boundaries, fee accumulation, flash loans, oracle observations, and edge cases.\n\nTo run the tests locally:\n\n1. Start the local development node. Follow the steps in the [Local Development Node](/smart-contracts/dev-environments/local-dev-node/) guide to set it up.\n\n2. In a new terminal, run the test suite against the local node:\n\n    ```bash\n    npx hardhat test --network localNode\n    ```\n\n    The tests are configured with a 120-second Mocha timeout to accommodate Polkadot network block times. The result should look similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat test --network localNode</span>\n      <span data-ty>Compiled 50 Solidity files successfully (evm target: istanbul).</span>\n      <span data-ty></span>\n      <span data-ty>UniswapV3Factory</span>\n      <span data-ty> ✔ owner is deployer</span>\n      <span data-ty> ✔ initial enabled fee amounts</span>\n      <span data-ty></span>\n      <span data-ty> #createPool</span>\n      <span data-ty>   ✔ succeeds for low fee pool (312ms)</span>\n      <span data-ty>   ✔ succeeds for medium fee pool (298ms)</span>\n      <span data-ty>   ✔ succeeds for high fee pool (301ms)</span>\n      <span data-ty>   ✔ succeeds if tokens are passed in reverse (287ms)</span>\n      <span data-ty>   ✔ fails if token a == token b</span>\n      <span data-ty>   ✔ fails if token a is 0 or token b is 0</span>\n      <span data-ty>   ✔ fails if fee amount is not enabled</span>\n      <span data-ty></span>\n      <span data-ty> #setOwner</span>\n      <span data-ty>   ✔ fails if caller is not owner</span>\n      <span data-ty>   ✔ updates owner (189ms)</span>\n      <span data-ty>   ✔ emits event (203ms)</span>\n      <span data-ty>   ✔ cannot be called by original owner</span>\n      <span data-ty></span>\n      <span data-ty> #enableFeeAmount</span>\n      <span data-ty>   ✔ fails if caller is not owner</span>\n      <span data-ty>   ✔ fails if fee is too great</span>\n      <span data-ty>   ✔ fails if tick spacing is too small</span>\n      <span data-ty>   ✔ fails if tick spacing is too large</span>\n      <span data-ty>   ✔ fails if already initialized</span>\n      <span data-ty>   ✔ sets the fee amount in the mapping (211ms)</span>\n      <span data-ty>   ✔ emits an event (198ms)</span>\n      <span data-ty>   ✔ enables pool creation (267ms)</span>\n      <span data-ty></span>\n      <span data-ty>UniswapV3Pool</span>\n      <span data-ty> ✔ constructor initializes immutables</span>\n      <span data-ty></span>\n      <span data-ty> #initialize</span>\n      <span data-ty>   ✔ fails if already initialized</span>\n      <span data-ty>   ✔ fails if starting price is too low</span>\n      <span data-ty>   ✔ fails if starting price is too high</span>\n      <span data-ty>   ✔ can be initialized at MIN_SQRT_RATIO (412ms)</span>\n      <span data-ty>   ✔ can be initialized at MAX_SQRT_RATIO - 1 (389ms)</span>\n      <span data-ty>   ✔ sets initial variables (401ms)</span>\n      <span data-ty>   ✔ initializes the first observations slot (445ms)</span>\n      <span data-ty>   ✔ emits a Initialized event with the input tick (378ms)</span>\n      <span data-ty></span>\n      <span data-ty> #increaseObservationCardinalityNext</span>\n      <span data-ty>   ✔ fails if not initialized</span>\n      <span data-ty>   ✔ does not change cardinality next if less than current (356ms)</span>\n      <span data-ty>   ✔ increases cardinality next (498ms)</span>\n      <span data-ty>   ✔ emits an event (423ms)</span>\n      <span data-ty></span>\n      <span data-ty> #mint</span>\n      <span data-ty>   after initialization</span>\n      <span data-ty>     ✔ fails if not initialized</span>\n      <span data-ty>     ✔ fails if tickLower greater than tickUpper (312ms)</span>\n      <span data-ty>     ✔ fails if tickLower less than min tick (298ms)</span>\n      <span data-ty>     ✔ fails if tickUpper greater than max tick (287ms)</span>\n      <span data-ty>     ✔ fails if amount is zero (401ms)</span>\n      <span data-ty>     ✔ mints within the range (15243ms)</span>\n      <span data-ty>     ✔ mints at the range lower edge (14987ms)</span>\n      <span data-ty>     ✔ mints at the range upper edge (15104ms)</span>\n      <span data-ty>     ✔ provides liquidity in both tokens when in range (16312ms)</span>\n      <span data-ty>     ✔ emits a Mint event (12876ms)</span>\n      <span data-ty></span>\n      <span data-ty> #burn</span>\n      <span data-ty>   ✔ cannot burn more than position liquidity (398ms)</span>\n      <span data-ty>   ✔ burns partial liquidity (18934ms)</span>\n      <span data-ty>   ✔ burns entire liquidity (19201ms)</span>\n      <span data-ty>   ✔ emits a Burn event (18756ms)</span>\n      <span data-ty></span>\n      <span data-ty> #observe</span>\n      <span data-ty>   ✔ fails if not initialized</span>\n      <span data-ty>   ✔ returns correct cumulative values (14523ms)</span>\n      <span data-ty>   ✔ interpolates correctly between observations (16891ms)</span>\n      <span data-ty></span>\n      <span data-ty> #collect</span>\n      <span data-ty>   ✔ reverts if position has no tokens owed (312ms)</span>\n      <span data-ty>   ✔ collects token0 and token1 fees (21345ms)</span>\n      <span data-ty>   ✔ collects protocol fees (22109ms)</span>\n      <span data-ty></span>\n      <span data-ty> #feeProtocol</span>\n      <span data-ty>   ✔ fails if caller is not factory owner</span>\n      <span data-ty>   ✔ sets fee protocol (19876ms)</span>\n      <span data-ty>   ✔ emits a SetFeeProtocol event (18543ms)</span>\n      <span data-ty></span>\n      <span data-ty>187 passing (42m)</span>\n    </div>\n    \n\n!!! tip\n    If tests time out, ensure your local development node is running and accessible at `http://127.0.0.1:8545`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#deploy-the-contracts", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 12, "depth": 2, "title": "Deploy the Contracts", "anchor": "deploy-the-contracts", "start_char": 16917, "end_char": 18577, "estimated_token_count": 422, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contracts\n\nAfter successfully testing the contracts, you can deploy them to the Polkadot Hub TestNet using [Hardhat Ignition](https://hardhat.org/ignition/docs/getting-started#overview). The Ignition module at `ignition/modules/UniswapV3Factory.ts` deploys the UniswapV3Factory contract.\n\nMake sure you have [configured your private key](#configure-secure-key-management) and that your account has test tokens. Then run:\n\n```bash\nnpx hardhat ignition deploy ./ignition/modules/UniswapV3Factory.ts --network polkadotTestnet\n```\n\nWhen prompted, confirm the target network name and chain ID. Ignition deploys the Factory contract and prints the deployed address. The output should look similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\">npx hardhat ignition deploy ./ignition/modules/UniswapV3Factory.ts --network polkadotTestnet</span>\n  <span data-ty>✔ Confirm deploy to network polkadotTestnet (420420417)? … yes</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Hardhat Ignition 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deploying [ UniswapV3FactoryModule ]</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Batch #1</span>\n  <span data-ty> Executed UniswapV3FactoryModule#UniswapV3Factory</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>[ UniswapV3FactoryModule ] successfully deployed 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deployed Addresses</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>UniswapV3FactoryModule#UniswapV3Factory - 0x2e234DAe75C793f67A35089C9d99245E1C58470b</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-core-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/#where-to-go-next", "page_title": "Uniswap V3 Core with EVM on Polkadot Hub", "index": 13, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 18577, "end_char": 19526, "estimated_token_count": 233, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e871984c8dc3b0608573196164a9db1b74fae19d990bc00299ef1f649c480495", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Hardhat on Polkadot__\n\n    ---\n\n    Learn how to create, compile, test, and deploy smart contracts on Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Reference](/smart-contracts/dev-environments/hardhat/)\n\n-   <span class=\"badge tutorial\">Tutorial</span> __Uniswap V3 Periphery__\n\n    ---\n\n    Deploy the SwapRouter and NonfungiblePositionManager contracts on Polkadot Hub to add token swaps and NFT-based liquidity position management on top of V3 Core.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/)\n\n-   <span class=\"badge guide\">Guide</span> __Local Development Node__\n\n    ---\n\n    Set up and run a local development node for testing your smart contracts against Polkadot.\n\n    [:octicons-arrow-right-24: Set Up](/smart-contracts/dev-environments/local-dev-node/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/#tutorials", "page_title": "Uniswap V3 on Polkadot", "index": 0, "depth": 2, "title": "Tutorials", "anchor": "tutorials", "start_char": 986, "end_char": 1383, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3cb01d63e98f7c571e958cb479868b4129ebba540560d73f391876bc6532cb37", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Tutorials\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge tutorial\">Tutorial</span> __V3 Core__\n\n    ---\n\n    Deploy unmodified Uniswap V3 Factory and Pool contracts on Polkadot Hub using Hardhat. Includes concentrated liquidity, fee tiers, and the full math library suite.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#introduction", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 41, "end_char": 1305, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [Uniswap V3 Periphery](https://developers.uniswap.org/docs/protocols/v3/overview) contracts provide the user-facing layer that sits on top of the [Uniswap V3 Core](/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/) Factory and Pool contracts. While V3 Core handles the low-level concentrated liquidity engine, the Periphery contracts expose the functions that users and applications interact with directly: executing token swaps through one or more pools and managing concentrated liquidity positions as ERC-721 NFTs.\n\nThis tutorial follows the EVM execution path. With EVM (powered by [REVM](https://github.com/bluealloy/revm), a Rust implementation of the Ethereum Virtual Machine), you deploy the same unmodified Solidity contracts using the same standard Hardhat toolchain you already know. No special compiler plugins, no contract rewrites, and no porting effort. If your project compiles with vanilla Hardhat, it runs on Polkadot Hub through EVM.\n\nThis tutorial walks you through cloning, compiling, testing, and deploying the Uniswap V3 Periphery contracts on Polkadot Hub using Hardhat and TypeScript. By the end, you will have a fully functioning SwapRouter and NonfungiblePositionManager deployed to the Polkadot Hub TestNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#prerequisites", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1305, "end_char": 2133, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore starting, make sure you have:\n\n- [Node.js](https://nodejs.org/) v22.0.0 or later and npm installed\n- Basic understanding of [Solidity](https://www.soliditylang.org/) and TypeScript\n- Familiarity with the [Hardhat](/smart-contracts/dev-environments/hardhat/) development environment\n- Some test tokens to cover transaction fees, obtained from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet\n- A wallet with a private key for signing transactions\n- Basic understanding of how AMMs and liquidity pools work\n- Completion of the [Uniswap V3 Core tutorial](/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/), as the Periphery contracts depend on the V3 Core contracts through a local package reference"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#set-up-the-project", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 2, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 2133, "end_char": 3750, "estimated_token_count": 354, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nStart by cloning the EVM Hardhat examples repository, which contains the Uniswap V3 Periphery project with a standard Hardhat and TypeScript configuration:\n\n1. Clone the repository, check out the pinned commit, and navigate to the Uniswap V3 Periphery project:\n\n    ```bash\n    git clone https://github.com/polkadot-developers/revm-hardhat-examples.git\n    cd revm-hardhat-examples\n    git checkout 96696ad15c3cf01b9168a71ad5114f27c34a8726\n    cd uniswap-v3-periphery-hardhat/\n    ```\n\n2. Install the required dependencies:\n\n    ```bash\n    npm install\n    ```\n\n    !!! note\n        The Periphery project depends on the V3 Core contracts through a local file reference (`\"@uniswap/v3-core\": \"file:../uniswap-v3-core-hardhat\"`). The `npm install` command resolves this automatically from the sibling directory in the repository, which is why you cloned the full monorepo rather than just the Periphery subdirectory.\n\n3. Compile the contracts:\n\n    ```bash\n    npx hardhat compile\n    ```\n\n    If the compilation is successful, you should see output similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat compile</span>\n      <span data-ty>Generating typings for: 111 artifacts in dir: typechain-types for target: ethers-v6</span>\n      <span data-ty>Successfully generated 172 typings!</span>\n      <span data-ty>Compiled 112 Solidity files successfully (evm target: istanbul).</span>\n    </div>\n    \n\n    After running this command, the compiled artifacts (ABI and bytecode) appear in the `artifacts` directory."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#configure-secure-key-management", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 3, "depth": 2, "title": "Configure Secure Key Management", "anchor": "configure-secure-key-management", "start_char": 3750, "end_char": 5020, "estimated_token_count": 273, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Secure Key Management\n\nThis project uses [Hardhat Configuration Variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) to manage private keys securely. Unlike `.env` files, configuration variables are stored outside your project directory and are never at risk of being committed to version control.\n\nTo set your private key for TestNet deployment, run:\n\n```bash\nnpx hardhat vars set TESTNET_PRIVATE_KEY\n```\n\nWhen prompted, paste your private key. Hardhat stores it securely and makes it available through `vars.get(\"TESTNET_PRIVATE_KEY\")` in the configuration file.\n\n!!! warning\n    Keep your private key safe and never share it with anyone. If it is compromised, your funds can be stolen.\n\nThe `hardhat.config.ts` file references the variable conditionally, so the project works without it for local development:\n\n```typescript title=\"hardhat.config.ts\"\npolkadotTestnet: {\n  url: \"https://services.polkadothub-rpc.com/testnet\",\n  accounts: vars.has(\"TESTNET_PRIVATE_KEY\")\n    ? [vars.get(\"TESTNET_PRIVATE_KEY\")]\n    : [],\n},\n```\n\n!!! note\n    You only need the `TESTNET_PRIVATE_KEY` variable when deploying to the Polkadot Hub TestNet. Local development against the development node does not require any key configuration."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#v3-specific-configuration", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 4, "depth": 3, "title": "V3-Specific Configuration", "anchor": "v3-specific-configuration", "start_char": 5020, "end_char": 6633, "estimated_token_count": 328, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### V3-Specific Configuration\n\nThe Periphery project uses the same critical compiler setting as V3 Core: `bytecodeHash` is set to `none`, which excludes the metadata hash from the compiled bytecode. This is required so that the compiled `UniswapV3Pool` bytecode matches the hardcoded `POOL_INIT_CODE_HASH` constant in `PoolAddress.sol`. The Periphery contracts use this constant to compute pool addresses via `CREATE2`. If there is a mismatch, every swap and LP operation silently calls the wrong address:\n\n```typescript title=\"hardhat.config.ts\"\nconst config: HardhatUserConfig = {\n  solidity: {\n    version: \"0.7.6\",\n    settings: {\n      optimizer: {\n        enabled: true,\n        runs: 800,\n      },\n      metadata: {\n        // Exclude metadata hash to keep bytecode deterministic.\n        // This matches the v3-core compilation settings so the compiled\n        // UniswapV3Pool bytecode hash aligns with the hardcoded\n        // POOL_INIT_CODE_HASH in PoolAddress.sol.\n        bytecodeHash: \"none\",\n      },\n    },\n  },\n```\n\nThe configuration also sets `allowUnlimitedContractSize: true` for the local Hardhat network, which is required because several Periphery contracts exceed the standard 24KB EIP-170 size limit. For the `localNode` network, a fixed gas price of 50 gwei matches the gas price reported by the Polkadot local development node:\n\n```typescript title=\"hardhat.config.ts\"\nnetworks: {\n  hardhat: {\n    allowUnlimitedContractSize: true,\n  },\n  localNode: {\n    url: \"http://127.0.0.1:8545\",\n    gasPrice: 50_000_000_000, // 50 gwei — matches Polkadot local node reported gas price\n  },\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#uniswap-v3-periphery-architecture", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 5, "depth": 2, "title": "Uniswap V3 Periphery Architecture", "anchor": "uniswap-v3-periphery-architecture", "start_char": 6633, "end_char": 7050, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Uniswap V3 Periphery Architecture\n\nBefore interacting with the contracts, it is essential to understand how the Periphery layer extends the V3 Core system. While the [V3 Core](/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/) contracts implement the concentrated liquidity engine, the Periphery contracts translate that engine into safe and ergonomic interfaces for end users and integrating applications."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#concentrated-liquidity-and-lp-positions", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 6, "depth": 3, "title": "Concentrated Liquidity and LP Positions", "anchor": "concentrated-liquidity-and-lp-positions", "start_char": 7050, "end_char": 8160, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Concentrated Liquidity and LP Positions\n\nUniswap V3 allows liquidity providers to concentrate capital within a chosen price range defined by a lower tick and an upper tick. A position earns trading fees only when the current pool price falls within its range.\n\nThe token composition of an out-of-range position is determined by its relationship to the current price. When the current price is below the position's range, the position holds 100% `token0` because all liquidity has been converted to the cheaper asset as the price moved down through the range. When the current price is above the range, the position holds 100% token1 because all liquidity has been converted to the more expensive asset as the price moved up. Only an in-range position holds both tokens simultaneously.\n\nAccumulated fees are tracked separately from principal liquidity and are staged in `tokensOwed` fields on the position. Retrieving fees requires two explicit steps: calling `decreaseLiquidity` to move accrued principal and fees into `tokensOwed`, then calling `collect` to transfer those amounts to the owner's wallet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#swaprouter", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 7, "depth": 3, "title": "SwapRouter", "anchor": "swaprouter", "start_char": 8160, "end_char": 9203, "estimated_token_count": 233, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### SwapRouter\n\nThe `SwapRouter` contract routes token swaps through one or more V3 pools. It supports four swap modes:\n\n- **`exactInputSingle`**: Spend a fixed amount of one token to receive as much of another token as possible through a single pool. The `amountOutMinimum` parameter enforces a slippage floor, and `sqrtPriceLimitX96` optionally caps how far the price can move (enabling partial fills).\n- **`exactInput`**: Execute a multi-hop swap along an ABI-encoded path of pools. Each hop specifies a `tokenIn`, `fee`, and `tokenOut`. The full input amount is consumed and the final output must meet `amountOutMinimum`.\n- **`exactOutputSingle`**: Buy a precise amount of one token using as little of another token as possible through a single pool. The `amountInMaximum` parameter caps the input, and the router refunds any unused allowance.\n- **`exactOutput`**: Execute a multi-hop exact-output swap. The path is encoded in reverse (from the output token back to the input token), and the caller specifies the exact amount to receive."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#nonfungiblepositionmanager", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 8, "depth": 3, "title": "NonfungiblePositionManager", "anchor": "nonfungiblepositionmanager", "start_char": 9203, "end_char": 10729, "estimated_token_count": 328, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### NonfungiblePositionManager\n\nThe `NonfungiblePositionManager` (NFPM) represents each concentrated liquidity position as an ERC-721 NFT. A single contract manages the full LP lifecycle:\n\n- **`createAndInitializePoolIfNecessary`**: Creates a new V3 pool for a token pair and fee tier if none exists, and sets its initial price as a `sqrtPriceX96` value. Calling this on an already-initialized pool is a safe no-op.\n- **`mint`**: Opens a new position within a specified tick range and mints an NFT to the recipient. The `tokenId` returned uniquely identifies the position. The `amount0Min` and `amount1Min` parameters guard against slippage during the initial deposit.\n- **`increaseLiquidity`**: Adds more capital to an existing position identified by its `tokenId`. The position's tick range and fee tier remain unchanged.\n- **`decreaseLiquidity`**: Removes a specified amount of liquidity from a position. Tokens are not transferred to the owner immediately; they are staged in the position's `tokensOwed0` and `tokensOwed1` fields. This two-step design allows the owner to decide when to withdraw.\n- **`collect`**: Transfers the amounts staged in `tokensOwed` (from both `decreaseLiquidity` and accumulated fees) to a specified recipient. The `amount0Max` and `amount1Max` parameters allow partial collection.\n- **`burn`**: Destroys the NFT for a position that has been fully exited. The position must have `liquidity == 0` and `tokensOwed0 == tokensOwed1 == 0`; attempting to burn a live or uncollected position reverts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#project-structure", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 9, "depth": 3, "title": "Project Structure", "anchor": "project-structure", "start_char": 10729, "end_char": 13035, "estimated_token_count": 521, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Project Structure\n\nThe project scaffolding is as follows:\n\n```text\nuniswap-v3-periphery-hardhat/\n├── contracts/\n│   ├── SwapRouter.sol                      # Swap router (single-hop + multi-hop)\n│   ├── NonfungiblePositionManager.sol      # LP position NFT manager\n│   ├── NonfungibleTokenPositionDescriptor.sol\n│   ├── base/                               # Abstract base contracts\n│   │   ├── PeripheryImmutableState.sol\n│   │   ├── PeripheryPayments.sol\n│   │   ├── LiquidityManagement.sol\n│   │   ├── ERC721Permit.sol\n│   │   ├── PoolInitializer.sol\n│   │   └── ...\n│   ├── libraries/                          # Pure utility libraries\n│   │   ├── PoolAddress.sol\n│   │   ├── Path.sol\n│   │   ├── LiquidityAmounts.sol\n│   │   └── ...\n│   ├── interfaces/                         # Contract interfaces\n│   │   ├── ISwapRouter.sol\n│   │   ├── INonfungiblePositionManager.sol\n│   │   └── ...\n│   └── test/                              # Test helper contracts\n│       ├── WETH9.sol\n│       ├── TestERC20.sol\n│       ├── MockTimeSwapRouter.sol\n│       ├── MockTimeNonfungiblePositionManager.sol\n│       └── CoreContracts.sol\n├── ignition/\n│   └── modules/\n│       └── UniswapV3Periphery.ts          # Hardhat Ignition deployment module\n├── scripts/\n│   └── deploy.ts\n├── test/\n│   ├── SwapRouter.test.ts                 # Router tests (14 tests)\n│   ├── NonfungiblePositionManager.test.ts # NFPM tests (25 tests)\n│   └── shared/\n│       ├── fixtures.ts\n│       └── utilities.ts\n├── hardhat.config.ts\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\nKey differences from the V3 Core project are minimal. The Solidity contracts use the same version 0.7.6. The `contracts/libraries/` directory contains periphery-specific math and path-encoding utilities such as `PoolAddress.sol` (deterministic CREATE2 address computation), `Path.sol` (multi-hop path encoding), and `LiquidityAmounts.sol` (token amount to liquidity unit conversion). The `contracts/test/` directory includes `CoreContracts.sol`, an import shim that forces Hardhat to compile `UniswapV3Factory` and `UniswapV3Pool` from `@uniswap/v3-core` so their artifacts are available during tests. The test suite avoids `loadFixture` for compatibility with the Polkadot execution environment, using `beforeEach` with direct fixture calls instead."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#test-the-contracts", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 10, "depth": 2, "title": "Test the Contracts", "anchor": "test-the-contracts", "start_char": 13035, "end_char": 19967, "estimated_token_count": 1735, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test the Contracts\n\nThe project includes a test suite with 39 tests across two test files:\n\n- **`SwapRouter.test.ts`**: 14 tests covering all four swap modes (`exactInputSingle`, `exactInput`, `exactOutputSingle`, `exactOutput`), slippage protection enforcement, recipient routing, `sqrtPriceLimitX96` partial fills, and on-chain pool state changes after swaps.\n- **`NonfungiblePositionManager.test.ts`**: 25 tests covering the full LP lifecycle, including pool creation and initialization, minting in-range and out-of-range positions, increasing and decreasing liquidity, fee collection through real swaps, and the complete burn cleanup sequence.\n\nTo run the tests locally:\n\n1. Start the local development node. Follow the steps in the [Local Development Node](/smart-contracts/dev-environments/local-dev-node/) guide to set it up.\n\n2. In a new terminal, run the test suite against the local node:\n\n    ```bash\n    npx hardhat test --network localNode\n    ```\n\n    The tests are configured with a 120-second Mocha timeout to accommodate Polkadot network block times. The result should look similar to the following:\n\n    <div id=\"termynal\" data-termynal>\n      <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat test --network localNode</span>\n      <span data-ty>Compiled 112 Solidity files successfully (evm target: istanbul).</span>\n      <span data-ty></span>\n      <span data-ty>NonfungiblePositionManager</span>\n      <span data-ty> ✔ constructor — returns correct factory and WETH9 addresses (298ms)</span>\n      <span data-ty></span>\n      <span data-ty> #createAndInitializePoolIfNecessary</span>\n      <span data-ty>   ✔ creates a new pool and sets the initial sqrtPriceX96 (1234ms)</span>\n      <span data-ty>   ✔ is a no-op when the pool already exists and is initialized (987ms)</span>\n      <span data-ty></span>\n      <span data-ty> #mint</span>\n      <span data-ty>   ✔ fails if pool does not exist (312ms)</span>\n      <span data-ty>   in-range (full-range) position</span>\n      <span data-ty>     success cases</span>\n      <span data-ty>       ✔ mints exactly one NFT to the recipient (2156ms)</span>\n      <span data-ty>       ✔ decreases token0 and token1 balances of the caller (2087ms)</span>\n      <span data-ty>       ✔ records correct position data in positions() (2243ms)</span>\n      <span data-ty>       ✔ emits IncreaseLiquidity event with positive liquidity (2178ms)</span>\n      <span data-ty>     failure cases</span>\n      <span data-ty>       ✔ reverts when amount0Min slippage is not satisfied (1123ms)</span>\n      <span data-ty>   out-of-range position (above current price)</span>\n      <span data-ty>     ✔ mints a single-sided token0 position — zero token1 consumed (2089ms)</span>\n      <span data-ty>   out-of-range position (below current price)</span>\n      <span data-ty>     ✔ mints a single-sided token1 position — zero token0 consumed (2134ms)</span>\n      <span data-ty></span>\n      <span data-ty> #increaseLiquidity</span>\n      <span data-ty>   ✔ increases the position liquidity (2345ms)</span>\n      <span data-ty>   ✔ emits IncreaseLiquidity event (2276ms)</span>\n      <span data-ty></span>\n      <span data-ty> #decreaseLiquidity</span>\n      <span data-ty>   success cases</span>\n      <span data-ty>     ✔ stages removed tokens in tokensOwed (not immediately transferred) (3234ms)</span>\n      <span data-ty>     ✔ can remove all liquidity from a position (3189ms)</span>\n      <span data-ty>     ✔ emits DecreaseLiquidity event (3156ms)</span>\n      <span data-ty>   failure cases</span>\n      <span data-ty>     ✔ reverts when called by a non-owner (2087ms)</span>\n      <span data-ty>     ✔ reverts when requested liquidity exceeds the position (2134ms)</span>\n      <span data-ty></span>\n      <span data-ty> #collect</span>\n      <span data-ty>   tokensOwed from decreaseLiquidity</span>\n      <span data-ty>     ✔ transfers tokensOwed back to the owner (3567ms)</span>\n      <span data-ty>     ✔ emits Collect event (3489ms)</span>\n      <span data-ty>     ✔ collecting less than the maximum leaves remainder in tokensOwed (3623ms)</span>\n      <span data-ty>   swap fee accumulation</span>\n      <span data-ty>     ✔ LP collects accrued trading fees after swaps through the pool (7891ms)</span>\n      <span data-ty></span>\n      <span data-ty> #burn</span>\n      <span data-ty>   ✔ burns the NFT after full removal and collection (4234ms)</span>\n      <span data-ty>   ✔ reverts when liquidity has not been fully removed (3123ms)</span>\n      <span data-ty>   ✔ reverts when tokensOwed have not been collected (3087ms)</span>\n      <span data-ty></span>\n      <span data-ty>SwapRouter</span>\n      <span data-ty> ✔ constructor — returns correct factory and WETH9 addresses (289ms)</span>\n      <span data-ty></span>\n      <span data-ty> #exactInputSingle</span>\n      <span data-ty>   success cases</span>\n      <span data-ty>     ✔ swaps token0 for token1 via a single pool (2134ms)</span>\n      <span data-ty>     ✔ respects sqrtPriceLimitX96 and executes a partial fill (2087ms)</span>\n      <span data-ty>     ✔ sends output tokens to the specified recipient, not the caller (2156ms)</span>\n      <span data-ty>   failure cases</span>\n      <span data-ty>     ✔ reverts when output is below amountOutMinimum (1234ms)</span>\n      <span data-ty></span>\n      <span data-ty> #exactInput</span>\n      <span data-ty>   success cases</span>\n      <span data-ty>     ✔ swaps token0 → token1 → token2 via two pools (3456ms)</span>\n      <span data-ty>   failure cases</span>\n      <span data-ty>     ✔ reverts when output is below amountOutMinimum (2345ms)</span>\n      <span data-ty></span>\n      <span data-ty> #exactOutputSingle</span>\n      <span data-ty>   success cases</span>\n      <span data-ty>     ✔ buys an exact amount of token1 using token0 (2178ms)</span>\n      <span data-ty>     ✔ spends strictly less than amountInMaximum when pool has sufficient liquidity (2234ms)</span>\n      <span data-ty>   failure cases</span>\n      <span data-ty>     ✔ reverts when amountInMaximum is exceeded (1198ms)</span>\n      <span data-ty></span>\n      <span data-ty> #exactOutput</span>\n      <span data-ty>   success cases</span>\n      <span data-ty>     ✔ buys an exact amount of token2 using token0 through two pools (3589ms)</span>\n      <span data-ty>   failure cases</span>\n      <span data-ty>     ✔ reverts when amountInMaximum is exceeded (multi-hop) (2456ms)</span>\n      <span data-ty></span>\n      <span data-ty> pool price impact</span>\n      <span data-ty>   ✔ exactInputSingle moves the pool sqrtPriceX96 (2089ms)</span>\n      <span data-ty>   ✔ exactOutputSingle moves the pool sqrtPriceX96 (2134ms)</span>\n      <span data-ty></span>\n      <span data-ty>39 passing (2m)</span>\n    </div>\n    \n\n!!! tip\n    If the tests fail due to a timeout, ensure your local development node is running and accessible at `http://127.0.0.1:8545`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#deploy-the-contracts", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 11, "depth": 2, "title": "Deploy the Contracts", "anchor": "deploy-the-contracts", "start_char": 19967, "end_char": 22474, "estimated_token_count": 581, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contracts\n\nAfter successfully testing the contracts, you can deploy them to the Polkadot Hub TestNet using [Hardhat Ignition](https://hardhat.org/ignition/docs/getting-started#overview). The Ignition module at `ignition/modules/UniswapV3Periphery.ts` deploys all four contracts: `UniswapV3Factory`, `WETH9`, `SwapRouter`, and `NonfungiblePositionManager`.\n\nMake sure you have [configured your private key](#configure-secure-key-management) and that your account has test tokens. Then run:\n\n```bash\nnpx hardhat ignition deploy ./ignition/modules/UniswapV3Periphery.ts --network polkadotTestnet\n```\n\nWhen prompted, confirm the target network name and chain ID. Ignition deploys the contracts in two batches. It first deploys the Factory and WETH9 in parallel, then deploys the `SwapRouter` and `NonfungiblePositionManager` once their dependencies are available. It prints all deployed addresses. The output should look similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\">npx hardhat ignition deploy ./ignition/modules/UniswapV3Periphery.ts --network polkadotTestnet</span>\n  <span data-ty>✔ Confirm deploy to network polkadotTestnet (420420417)? … yes</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Hardhat Ignition 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deploying [ UniswapV3PeripheryModule ]</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Batch #1</span>\n  <span data-ty> Executed UniswapV3PeripheryModule#UniswapV3Factory</span>\n  <span data-ty> Executed UniswapV3PeripheryModule#WETH9</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Batch #2</span>\n  <span data-ty> Executed UniswapV3PeripheryModule#SwapRouter</span>\n  <span data-ty> Executed UniswapV3PeripheryModule#NonfungiblePositionManager</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>[ UniswapV3PeripheryModule ] successfully deployed 🚀</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>Deployed Addresses</span>\n  <span data-ty>&nbsp;</span>\n  <span data-ty>UniswapV3PeripheryModule#UniswapV3Factory - 0x5FbDB2315678afecb367f032d93F642f64180aa3</span>\n  <span data-ty>UniswapV3PeripheryModule#WETH9 - 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512</span>\n  <span data-ty>UniswapV3PeripheryModule#SwapRouter - 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0</span>\n  <span data-ty>UniswapV3PeripheryModule#NonfungiblePositionManager - 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-eth-dapps-uniswap-v3-periphery-v3", "url": "https://developer.polkadot.com/smart-contracts/cookbook/eth-dapps/uniswap-v3/periphery-v3/#where-to-go-next", "page_title": "Uniswap V3 Periphery with EVM on Polkadot Hub", "index": 12, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 22474, "end_char": 23395, "estimated_token_count": 230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b9dee4906b5c1bfbc0827d16bf591928776c14d99b339103ab2e8860121b268", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge tutorial\">Tutorial</span> __Uniswap V3 Core__\n\n    ---\n\n    Deploy the Uniswap V3 Factory and Pool contracts on Polkadot Hub to understand the concentrated liquidity engine that the Periphery builds on.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/eth-dapps/uniswap-v3/core-v3/)\n\n-   <span class=\"badge guide\">Guide</span> __Hardhat on Polkadot__\n\n    ---\n\n    Learn how to create, compile, test, and deploy smart contracts on Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Reference](/smart-contracts/dev-environments/hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Local Development Node__\n\n    ---\n\n    Set up and run a local development node for testing your smart contracts against Polkadot.\n\n    [:octicons-arrow-right-24: Set Up](/smart-contracts/dev-environments/local-dev-node/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#introduction", "page_title": "Deploy a Basic Contract with Hardhat", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 41, "end_char": 379, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis guide demonstrates how to deploy a basic Solidity smart contract to Polkadot Hub TestNet using [Hardhat](https://hardhat.org/), which provides a comprehensive development environment with built-in testing, debugging, and deployment capabilities. It's ideal for professional development workflows and team projects."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#prerequisites", "page_title": "Deploy a Basic Contract with Hardhat", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 379, "end_char": 851, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following:\n\n- A basic understanding of [Solidity](https://www.soliditylang.org/) programming.\n- [Node.js](https://nodejs.org/en/download) v22.13.1 or later installed.\n- Test tokens for gas fees, available from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet.\n- A wallet with a private key for signing transactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#set-up-your-project", "page_title": "Deploy a Basic Contract with Hardhat", "index": 2, "depth": 2, "title": "Set Up Your Project", "anchor": "set-up-your-project", "start_char": 851, "end_char": 1069, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up Your Project\n\nUse the following terminal commands to create a directory and initialize your Hardhat project inside of it:\n\n```bash\nmkdir hardhat-deployment\ncd hardhat-deployment\nnpx hardhat@^2.27.0 init\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#configure-hardhat", "page_title": "Deploy a Basic Contract with Hardhat", "index": 3, "depth": 2, "title": "Configure Hardhat", "anchor": "configure-hardhat", "start_char": 1069, "end_char": 2097, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Hardhat\n\nOpen `hardhat.config.ts` and update to add `polkadotTestnet` to the `networks` configuration as highlighted in the following example code:\n\n```typescript title='hardhat.config.ts' hl_lines='19-23'\nimport type { HardhatUserConfig } from 'hardhat/config';\n\nimport hardhatToolboxViemPlugin from '@nomicfoundation/hardhat-toolbox-viem';\nimport { vars } from 'hardhat/config';\n\n\nconst config: HardhatUserConfig = {\n  plugins: [hardhatToolboxViemPlugin],\n  solidity: {\n    version: '0.8.28',\n    settings: {\n      optimizer: {\n        enabled: true,\n        runs: 200,\n      },\n    },\n  },\n  networks: {\n    polkadotTestnet: {\n      url: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      accounts: [vars.get('PRIVATE_KEY')],\n    },\n  },\n};\n\nexport default config;\n\n```\n\n!!! tip\n    Visit the Hardhat [Configuration variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) documentation to learn how to use Hardhat to handle your private keys securely."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#create-the-contract", "page_title": "Deploy a Basic Contract with Hardhat", "index": 4, "depth": 2, "title": "Create the Contract", "anchor": "create-the-contract", "start_char": 2097, "end_char": 2775, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Contract\n\nFollow these steps to create your smart contract:\n\n1. Delete the default contract file(s) in the `contracts` directory.\n\n2. Create a new file named `Storage.sol` inside the `contracts` directory.\n\n3. Add the following code to create the `Storage.sol` smart contract:\n\n    ```solidity title=\"Storage.sol\"\n    // SPDX-License-Identifier: MIT\n    pragma solidity ^0.8.9;\n    \n    contract Storage {\n        uint256 private storedNumber;\n    \n        function store(uint256 num) public {\n            storedNumber = num;\n        }\n    \n        function retrieve() public view returns (uint256) {\n            return storedNumber;\n        }\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#compile-the-contract", "page_title": "Deploy a Basic Contract with Hardhat", "index": 5, "depth": 2, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 2775, "end_char": 3397, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile the Contract\n\nCompile your `Storage.sol` contract using the following command:\n\n```bash\nnpx hardhat compile\n```\n\nYou will see a message in the terminal confirming the contract was successfully compiled, similar to the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat compile</span>\n  <span data-ty>Downloading solc 0.8.28</span>\n  <span data-ty>Downloading solc 0.8.28 (WASM build)</span>\n  <span data-ty>Compiled 1 Solidity file with solc 0.8.28 (evm target: cancun)</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#deploy-the-contract", "page_title": "Deploy a Basic Contract with Hardhat", "index": 6, "depth": 2, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 3397, "end_char": 5313, "estimated_token_count": 474, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contract\n\nYou are now ready to deploy the contract to your chosen network. This example demonstrates deployment to the Polkadot TestNet. Deploy the contract as follows:\n\n1. Delete the default file(s) inside the `ignition/modules` directory.\n\n2. Create a new file named `Storage.ts` inside the `ignition/modules` directory.\n\n3. Open `ignition/modules/Storage.ts` and add the following code to create your deployment module:\n\n    ```typescript title=\"ignition/modules/Storage.ts\"\n    import { buildModule } from '@nomicfoundation/hardhat-ignition/modules';\n    \n    export default buildModule('StorageModule', (m) => {\n      const storage = m.contract('Storage');\n      return { storage };\n    });\n    \n    ```\n\n4. Deploy your contract to Polkadot Hub TestNet using the following command:\n\n    ```bash\n    npx hardhat ignition deploy ignition/modules/Storage.ts --network polkadotTestnet \n    ```\n\n5. Confirm the target deployment network name and chain ID when prompted:\n\n    <div id=\"termynal\" data-termynal markdown>\n      <span data-ty=\"input\">npx hardhat ignition deploy ignition/modules/Storage.ts --network polkadotTestnet</span>\n      <span data-ty>✔ Confirm deploy to network polkadotTestnet (420420417)? … yes</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Hardhat Ignition 🚀</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Deploying [ StorageModule ]</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>[ StorageModule ] successfully deployed 🚀</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Deployed Addresses</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Storage - 0x12345.....</span>\n      <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n    </div>\n\nCongratulations! You've now deployed a basic smart contract to Polkadot Hub TestNet using Hardhat. Consider the following resources to build upon your progress."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/#where-to-go-next", "page_title": "Deploy a Basic Contract with Hardhat", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5313, "end_char": 5907, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6386aa73d807db7bb2304a4bd5a27febb6f1f3726f9f3fbfca09bc7938c31eed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an ERC-20__\n\n    ---\n\n    Walk through deploying a fully-functional ERC-20 to the Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an NFT__\n\n    ---\n\n    Walk through deploying an NFT to the Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/#introduction", "page_title": "Deploy a Basic Contract with Remix IDE", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 43, "end_char": 384, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0990cd04e9f13fb1f225b350609fa4fc4ea2d0ebac47f06c3acdb6fce909c390", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThis guide demonstrates how to deploy a basic Solidity smart contract to Polkadot Hub using [Remix IDE](https://remix.ethereum.org/), which offers a visual, browser-based environment perfect for rapid prototyping and learning. It requires no local installation and provides an intuitive interface for contract development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/#prerequisites", "page_title": "Deploy a Basic Contract with Remix IDE", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 384, "end_char": 866, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0990cd04e9f13fb1f225b350609fa4fc4ea2d0ebac47f06c3acdb6fce909c390", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following:\n\n- A basic understanding of [Solidity](https://www.soliditylang.org/) programming.\n- An EVM-compatible [wallet](/smart-contracts/connect/) connected to Polkadot Hub. This example utilizes [MetaMask](https://metamask.io/).\n- Test tokens for gas fees, available from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/#locate-your-contract", "page_title": "Deploy a Basic Contract with Remix IDE", "index": 2, "depth": 2, "title": "Locate Your Contract", "anchor": "locate-your-contract", "start_char": 866, "end_char": 1368, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0990cd04e9f13fb1f225b350609fa4fc4ea2d0ebac47f06c3acdb6fce909c390", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Locate Your Contract\n\nThis guide uses a default contract contract provided by Remix IDE. Follow these steps to locate the contract in Remix:\n\n1. Navigate to [Remix IDE](https://remix.ethereum.org/) in your web browser.\n\n2. Once the default workspace loads, locate the `contracts` folder. Inside `contracts`, locate the `Storage.sol` file which you will use as your sample contract throughout this guide.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/remix-01.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/#compile-the-contract", "page_title": "Deploy a Basic Contract with Remix IDE", "index": 3, "depth": 2, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 1368, "end_char": 2204, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0990cd04e9f13fb1f225b350609fa4fc4ea2d0ebac47f06c3acdb6fce909c390", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile the Contract\n\nSolidity source code compiles into bytecode that can be deployed on the blockchain. During this process, the compiler checks the contract for syntax errors, ensures type safety, and generates the machine-readable instructions needed for blockchain execution. \n\nEnsure your `Storage.sol` contract is open in the Remix IDE editor, and use the following steps to compile:\n\n1. Select the **Solidity Compiler** plugin from the left panel.\n2. Select the **Compile Storage.sol** button.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/remix-02.webp)\n\nThe **Solidity Compiler** icon will display a green checkmark once the contract compiles successfully. If any issues arise during contract compilation, errors and warnings will appear in the terminal panel at the bottom of the screen."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/#deploy-the-contract", "page_title": "Deploy a Basic Contract with Remix IDE", "index": 4, "depth": 2, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 2204, "end_char": 3098, "estimated_token_count": 186, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0990cd04e9f13fb1f225b350609fa4fc4ea2d0ebac47f06c3acdb6fce909c390", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contract\n\nFollow these steps to deploy the contract using Remix: \n\n1. Select **Deploy & Run Transactions** from the left panel.\n2. Ensure your MetaMask wallet is connected to Polkadot Hub TestNet, then select the **Environment** dropdown and select **Injected Provider - MetaMask**.\n3. Select the **Deploy** button to initiate the deployment.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/remix-03.webp)\n\nWhen prompted, approve the transaction in your MetaMask wallet. After the deployment succeeds, the terminal will display the transaction details, including the contract address and transaction hash, and your contract will appear in the **Deployed Contracts** section.\n\nCongratulations! You've successfully deployed a basic smart contract to Polkadot Hub TestNet using Remix IDE. Consider the following resources to build upon your progress."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-basic-basic-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/#where-to-go-next", "page_title": "Deploy a Basic Contract with Remix IDE", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3098, "end_char": 3684, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0990cd04e9f13fb1f225b350609fa4fc4ea2d0ebac47f06c3acdb6fce909c390", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an ERC-20__\n\n    ---\n\n    Walk through deploying a fully-functional ERC-20 to Polkadot Hub using Remix.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an NFT__\n\n    ---\n\n    Walk through deploying an NFT to Polkadot Hub using Remix.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/)        \n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#introduction", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 35, "end_char": 756, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[ERC-20](https://eips.ethereum.org/EIPS/eip-20) tokens are fungible tokens commonly used for creating cryptocurrencies, governance tokens, and staking mechanisms. Polkadot Hub enables easy deployment of ERC-20 tokens via Ethereum-compatible smart contracts and tools.\n\nThis guide demonstrates how to deploy an ERC-20 contract on Polkadot Hub TestNet using [Hardhat](https://hardhat.org/), an Ethereum development environment. The ERC-20 contract can be retrieved from OpenZeppelin's [GitHub repository](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/v5.6.1/contracts/token/ERC20) or generated with the [OpenZeppelin Contracts Wizard for Polkadot](https://wizard.openzeppelin.com/polkadot)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#prerequisites", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 756, "end_char": 1320, "estimated_token_count": 160, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following:\n\n- A basic understanding of [Solidity](https://www.soliditylang.org/) programming and [ERC-20](https://ethereum.org/developers/docs/standards/tokens/erc-20/) fungible tokens.\n- [Node.js](https://nodejs.org/en/download) v22.13.1 or later installed.\n- Test tokens for gas fees, available from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet.\n- A wallet with a private key for signing transactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#set-up-your-project", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 2, "depth": 2, "title": "Set Up Your Project", "anchor": "set-up-your-project", "start_char": 1320, "end_char": 1950, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up Your Project\n\nThis tutorial uses a [Hardhat ERC-20 template](https://github.com/polkadot-developers/revm-hardhat-examples/tree/master/erc20-hardhat) that contains all the necessary files. \n\nTo get started, take the following steps:\n\n1. Clone the GitHub repository locally:\n\n    ```bash\n    git clone https://github.com/polkadot-developers/revm-hardhat-examples/\n    cd revm-hardhat-examples/erc20-hardhat\n    ```\n\n2. Install the dependencies using the following command:\n\n    ```bash\n    npm i\n    ```\n    \n    This command will fetch all the necessary packages to help you use Hardhat to deploy an ERC-20 to Polkadot."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#configure-hardhat", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 3, "depth": 2, "title": "Configure Hardhat", "anchor": "configure-hardhat", "start_char": 1950, "end_char": 2936, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Hardhat\n\nIf you started with the cloned Hardhat ERC-20 template, `hardhat.config.ts` is already configured to deploy to the Polkadot TestNet as shown in the example below:\n\n```ts title=\"hardhat.config.ts\" hl_lines=\"14-19\"\nimport { HardhatUserConfig, vars } from \"hardhat/config\";\nimport \"@nomicfoundation/hardhat-toolbox\";\n\nconst config: HardhatUserConfig = {\n  solidity: {\n    version: \"0.8.28\",\n    settings: {\n      optimizer: {\n        enabled: true,\n        runs: 200,\n      },\n    },\n  },\n  networks: {\n    polkadotTestnet: {\n      url: \"https://services.polkadothub-rpc.com/testnet\",\n      accounts: vars.has(\"TESTNET_PRIVATE_KEY\") ? [vars.get(\"TESTNET_PRIVATE_KEY\")] : [],\n    },\n  },\n  mocha: {\n    timeout: 40000,\n  },\n};\n\nexport default config;\n```\n\n!!! tip\n    Visit the Hardhat [Configuration variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) documentation to learn how to use Hardhat to handle your private keys securely."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#compile-the-contract", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 4, "depth": 2, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 2936, "end_char": 3582, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile the Contract \n\nNext, compile the contract included with the template by running the following command:\n\n```bash\nnpx hardhat compile\n```\n\nIf everything compiles successfully, you will see output similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\">npx hardhat compile</span>\n  <span data-ty>Generating typings for: 23 artifacts in dir: typechain-types for target: ethers-v6</span>\n  <span data-ty>Successfully generated 62 typings!</span>\n  <span data-ty>Compiled 21 Solidity files successfully (evm target: paris).</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#test-the-contract", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 5, "depth": 2, "title": "Test the Contract", "anchor": "test-the-contract", "start_char": 3582, "end_char": 5432, "estimated_token_count": 570, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test the Contract\n\nYou can view the predefined test file at [`test/MyToken.test.ts`](https://github.com/polkadot-developers/revm-hardhat-examples/blob/master/erc20-hardhat/test/MyToken.test.ts). This example test includes verification of the following:\n\n- The token name and symbol exist (confirms deployment) and are correct.\n- The token owner is correctly configured.\n- The initial token supply is zero.\n- The owner can mint tokens.\n- The total supply increases after a mint.\n- Successful mints to different test addresses with expected account balance and total supply changes.\n\nRun the tests using the following command:\n\n```bash\nnpx hardhat test --network polkadotTestnet\n```\n\nIf tests are successful, you will see outputs similar to the following:\n\n<div id=\"termynal\" data-termynal markdown>\n  <span data-ty=\"input\">npx hardhat test --network polkadotTestnet</span>\n  <span data-ty></span>\n  <span data-ty>&nbsp;&nbsp;MyToken</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;Deployment</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;✔ Should have correct name and symbol</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;✔ Should set the right owner</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;✔ Should have zero initial supply</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;Minting</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;✔ Should allow owner to mint tokens</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;✔ Should increase total supply on mint</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;Multiple mints</span>\n  <span data-ty>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;✔ Should correctly track balance after multiple mints</span>\n  <span data-ty></span>\n  <span data-ty>&nbsp;&nbsp;6 passing (369ms)</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#deploy-the-contract", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 6, "depth": 2, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 5432, "end_char": 7094, "estimated_token_count": 425, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contract\n\nYou are now ready to deploy the contract to your chosen network. This example demonstrates deployment to the Polkadot TestNet. Deploy the contract as follows:\n\n1. Run the following command in your terminal:\n\n    ```bash\n    npx hardhat ignition deploy ./ignition/modules/MyToken.ts --network polkadotTestnet\n    ```\n\n2. Confirm the target deployment network name and chain ID when prompted:\n\n    <div id=\"termynal\" data-termynal markdown>\n      <span data-ty=\"input\">npx hardhat ignition deploy ./ignition/modules/MyToken.ts --network polkadotTestnet</span>\n      <span data-ty>✔ Confirm deploy to network polkadotTestnet (420420417)? … yes</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Hardhat Ignition 🚀</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Deploying [ TokenModule ]</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Batch #1</span>\n      <span data-ty> Executed TokenModule#MyToken</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Batch #2</span>\n      <span data-ty> Executed TokenModule#MyToken.mint</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>[ TokenModule ] successfully deployed 🚀</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Deployed Addresses</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>TokenModule#MyToken - 0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3</span>\n      <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n    </div>\n    \n\nCongratulations! You've successfully deployed an ERC-20 token contract to Polkadot Hub TestNet using Hardhat. Consider the following resources to build upon your progress."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/#where-to-go-next", "page_title": "Deploy an ERC-20 Using Hardhat", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 7094, "end_char": 7692, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3f69b3d5d5ec63c883837a4d8c6a3a6df694b04b5ffcb237dd7496f5d8d5dd87", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an NFT__\n\n    ---\n\n    Walk through deploying an NFT to the Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Create a DApp__\n\n    ---\n\n    Learn step-by-step how to build a fully functional dApp that interacts with a smart contract deployed via Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/dapps/zero-to-hero/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/#introduction", "page_title": "Deploy an ERC-20 Using Remix IDE", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 37, "end_char": 763, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbae73f8e49c6be599161159541e9f518f9047d0aa1bfd3232791bb58870351e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[ERC-20](https://eips.ethereum.org/EIPS/eip-20) tokens are fungible tokens commonly used for creating cryptocurrencies, governance tokens, and staking mechanisms. Polkadot Hub enables easy token deployment with Ethereum-compatible smart contracts and tools via the EVM backend.\n\nThis tutorial covers deploying an ERC-20 contract on Polkadot Hub TestNet using [Remix IDE](https://remix.ethereum.org/), a web-based development tool. The ERC-20 contract can be retrieved from OpenZeppelin's [GitHub repository](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/v5.6.1/contracts/token/ERC20) or generated with the [OpenZeppelin Contracts Wizard for Polkadot](https://wizard.openzeppelin.com/polkadot)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/#prerequisites", "page_title": "Deploy an ERC-20 Using Remix IDE", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 763, "end_char": 1323, "estimated_token_count": 158, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbae73f8e49c6be599161159541e9f518f9047d0aa1bfd3232791bb58870351e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have:\n\n- A basic understanding of [Solidity](https://www.soliditylang.org/) programming and [ERC-20](https://ethereum.org/developers/docs/standards/tokens/erc-20/) fungible tokens.\n- An EVM-compatible [wallet](/smart-contracts/connect/) connected to Polkadot Hub. This example utilizes [MetaMask](https://metamask.io/).\n- Test tokens for gas fees, available from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/#create-your-contract", "page_title": "Deploy an ERC-20 Using Remix IDE", "index": 2, "depth": 2, "title": "Create Your Contract", "anchor": "create-your-contract", "start_char": 1323, "end_char": 2800, "estimated_token_count": 346, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbae73f8e49c6be599161159541e9f518f9047d0aa1bfd3232791bb58870351e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create Your Contract\n\nFollow the steps below to create the ERC-20 contract:\n\n1. Navigate to [Remix IDE](https://remix.ethereum.org/) in your web browser.\n2. Select the **Create new file** button under the **contracts** folder, and name your contract `MyToken.sol`.\n\n    ![](/images/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/remix-01.webp)\n\n3. Now, paste the following ERC-20 contract code into `MyToken.sol`:\n\n    ```solidity title=\"MyToken.sol\"\n    // SPDX-License-Identifier: MIT\n    // Compatible with OpenZeppelin Contracts ^5.4.0\n    pragma solidity ^0.8.27;\n    \n    import {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n    import {ERC20Permit} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\";\n    import {Ownable} from \"@openzeppelin/contracts/access/Ownable.sol\";\n    \n    contract MyToken is ERC20, Ownable, ERC20Permit {\n        constructor(address initialOwner)\n            ERC20(\"MyToken\", \"MTK\")\n            Ownable(initialOwner)\n            ERC20Permit(\"MyToken\")\n        {}\n    \n        function mint(address to, uint256 amount) public onlyOwner {\n            _mint(to, amount);\n        }\n    }\n    ```\n    \n    !!! tip\n        The [OpenZeppelin Contracts Wizard for Polkadot](https://wizard.openzeppelin.com/polkadot) was used to generate this example ERC-20 contract. Use it to customize and generate your own ERC-20, ERC-721, or other OpenZeppelin-standard contracts for Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/#compile-the-contract", "page_title": "Deploy an ERC-20 Using Remix IDE", "index": 3, "depth": 2, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 2800, "end_char": 3634, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbae73f8e49c6be599161159541e9f518f9047d0aa1bfd3232791bb58870351e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile the Contract\n\nSolidity source code compiles into bytecode that can be deployed on the blockchain. During this process, the compiler checks the contract for syntax errors, ensures type safety, and generates the machine-readable instructions needed for blockchain execution.\n\nEnsure your `MyToken.sol` contract is open in the Remix IDE Editor, and use the following steps to compile:\n\n1. Select the **Solidity Compiler** plugin from the left panel.\n2. Select the **Compile MyToken.sol** button.\n\nThe **Solidity Compiler** icon will display a green checkmark once the contract compiles successfully. If any issues arise during contract compilation, errors and warnings will appear in the terminal panel at the bottom of the screen.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/remix-03.gif)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/#deploy-the-contract", "page_title": "Deploy an ERC-20 Using Remix IDE", "index": 4, "depth": 2, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 3634, "end_char": 4521, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbae73f8e49c6be599161159541e9f518f9047d0aa1bfd3232791bb58870351e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contract\n\nFollow these steps to deploy the contract using Remix:\n\n1. Select **Deploy & Run Transactions** from the left panel.\n2. Ensure your MetaMask wallet is connected to Polkadot Hub TestNet, then select the **Environment** dropdown and select **Injected Provider - MetaMask**.\n3. Configure the contract parameters by entering the address that will own the deployed token contract.\n4. Select the **Deploy** button to initiate the deployment.\n4. Approve the transaction in your MetaMask wallet when prompted.\n6. You will see the transaction details in the terminal when the deployment succeeds, including the contract address and deployment transaction hash.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/remix-04.gif)\n\nOnce successfully deployed, your contract will appear in the **Deployed Contracts** section, ready for interaction."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/#interact-with-the-contract", "page_title": "Deploy an ERC-20 Using Remix IDE", "index": 5, "depth": 2, "title": "Interact with the Contract", "anchor": "interact-with-the-contract", "start_char": 4521, "end_char": 5696, "estimated_token_count": 254, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbae73f8e49c6be599161159541e9f518f9047d0aa1bfd3232791bb58870351e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the Contract\n\nOnce deployed, you can interact with your contract through Remix. Find your contract under **Deployed/Unpinned Contracts**, and select it to expand the available methods. In this example, you'll mint some tokens to a given address using the following steps:\n\n1. Expand the **mint** function, then enter the recipient address and the amount (remember to add 18 zeros for one whole token).\n2. Select **transact**.\n3. Approve the transaction in your MetaMask wallet when prompted.\n4. You will see a green check mark in the terminal when the transaction is successful.\n5. You can also call the **balanceOf** function by passing the address of the **mint** call to confirm the new balance.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/remix-05.gif)\n\nFeel free to explore and interact with the contract's other functions by selecting the method, providing any required parameters, and confirming the transaction in MetaMask when prompted.\n\nCongratulations! You've successfully deployed an ERC-20 token contract to Polkadot Hub TestNet using Remix IDE. Consider the following resources to build upon your progress."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-erc20-erc20-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/#where-to-go-next", "page_title": "Deploy an ERC-20 Using Remix IDE", "index": 6, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 5696, "end_char": 6079, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbae73f8e49c6be599161159541e9f518f9047d0aa1bfd3232791bb58870351e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an NFT with Remix__\n\n    ---\n\n    Walk through deploying an ERC-721 Non-Fungible Token (NFT) using OpenZeppelin's battle-tested NFT implementation and Remix.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#introduction", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 36, "end_char": 964, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nNon-Fungible Tokens (NFTs) represent unique digital assets commonly used for digital art, collectibles, gaming, and identity verification.\n\nThis guide demonstrates how to deploy an [ERC-721](https://eips.ethereum.org/EIPS/eip-721) NFT contract to [Polkadot Hub](/smart-contracts/overview/#smart-contract-development) TestNet. You'll use OpenZeppelin's battle-tested [NFT implementation](https://github.com/OpenZeppelin/openzeppelin-contracts) and [Hardhat](https://hardhat.org/docs/getting-started), a comprehensive development environment with built-in testing, debugging, and deployment capabilities. You can generate a custom NFT contract with the [OpenZeppelin Contracts Wizard for Polkadot](https://wizard.openzeppelin.com/polkadot), then use it in this Hardhat workflow. Hardhat uses standard Solidity compilation to generate EVM bytecode, making it fully compatible with Polkadot Hub's EVM environment."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#prerequisites", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 964, "end_char": 1534, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore you begin, ensure you have the following:\n\n- A basic understanding of [Solidity](https://www.soliditylang.org/) programming and [ERC-721](https://ethereum.org/developers/docs/standards/tokens/erc-721/) non-fungible tokens.\n- [Node.js](https://nodejs.org/en/download) v22.13.1 or later installed.\n- Test tokens for gas fees, available from the [Polkadot faucet](https://faucet.polkadot.io/). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet.\n- A wallet with a private key for signing transactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#set-up-your-project", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 2, "depth": 2, "title": "Set Up Your Project", "anchor": "set-up-your-project", "start_char": 1534, "end_char": 1914, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up Your Project\n\n1. Use the following terminal commands to create a directory and initialize your Hardhat project inside of it:\n\n    ```bash\n    mkdir hardhat-nft-deployment\n    cd hardhat-nft-deployment\n    npx hardhat@^2.27.0 init\n    ```\n\n2. Install the OpenZeppelin contract dependencies using the command:\n\n    ```bash\n    npm install @openzeppelin/contracts\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#configure-hardhat", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 3, "depth": 2, "title": "Configure Hardhat", "anchor": "configure-hardhat", "start_char": 1914, "end_char": 2940, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Hardhat\n\nOpen `hardhat.config.ts` and update to add `polkadotTestnet` to the `networks` configuration as highlighted in the following example code:\n\n```typescript title=\"hardhat.config.ts\" hl_lines='18-23'\nimport type { HardhatUserConfig } from 'hardhat/config';\n\nimport hardhatToolboxViemPlugin from '@nomicfoundation/hardhat-toolbox-viem';\nimport { vars } from 'hardhat/config';\n\nconst config: HardhatUserConfig = {\n  plugins: [hardhatToolboxViemPlugin],\n  solidity: {\n    version: '0.8.28',\n    settings: {\n      optimizer: {\n        enabled: true,\n        runs: 200,\n      },\n    },\n  },\n  networks: {\n    polkadotTestnet: {\n      url: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      accounts: [vars.get('PRIVATE_KEY')],\n    },\n  },\n};\n\nexport default config;\n```\n\n!!! tip\n    Visit the Hardhat [Configuration variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) documentation to learn how to use Hardhat to handle your private keys securely."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#create-the-contract", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 4, "depth": 2, "title": "Create the Contract", "anchor": "create-the-contract", "start_char": 2940, "end_char": 3836, "estimated_token_count": 188, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create the Contract\n\nFollow these steps to create your smart contract:\n\n1. Delete the default contract file(s) in the `contracts` directory.\n\n2. Create a new file named `MyNFT.sol` inside the `contracts` directory.\n\n3. Add the following code to create the `MyNFT.sol` smart contract:\n    ```solidity title=\"contracts/MyNFT.sol\"\n    // SPDX-License-Identifier: MIT\n    pragma solidity ^0.8.20;\n    \n    import \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\n    import \"@openzeppelin/contracts/access/Ownable.sol\";\n    \n    contract MyNFT is ERC721, Ownable {\n        uint256 private _nextTokenId;\n    \n        constructor(\n            address initialOwner\n        ) ERC721(\"MyToken\", \"MTK\") Ownable(initialOwner) {}\n    \n        function safeMint(address to) public onlyOwner {\n            uint256 tokenId = _nextTokenId++;\n            _safeMint(to, tokenId);\n        }\n    }\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#compile-the-contract", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 5, "depth": 2, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 3836, "end_char": 4455, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile the Contract\n\nCompile your `MyNFT.sol` contract using the following command:\n\n```bash\nnpx hardhat compile\n```\n\nYou will see a message in the terminal confirming the contract was successfully compiled, similar to the following:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat compile</span>\n  <span data-ty>Downloading solc 0.8.28</span>\n  <span data-ty>Downloading solc 0.8.28 (WASM build)</span>\n  <span data-ty>Compiled 1 Solidity file with solc 0.8.28 (evm target: cancun)</span>\n  <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#deploy-the-contract", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 6, "depth": 2, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 4455, "end_char": 6799, "estimated_token_count": 592, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contract\n\nYou are now ready to deploy the contract to your chosen network. This example demonstrates deployment to the Polkadot TestNet. Deploy the contract as follows:\n\n1. Delete the default file(s) inside the `ignition/modules` directory.\n\n2. Create a new file named `MyNFT.ts` inside the `ignition/modules` directory.\n\n3. Open `ignition/modules/MyNFT.ts` and add the following code to create your deployment module:\n    ```typescript title=\"ignition/modules/MyNFT.ts\"\n    import { buildModule } from '@nomicfoundation/hardhat-ignition/modules';\n    \n    export default buildModule('MyNFTModule', (m) => {\n      const initialOwner = m.getParameter('initialOwner', 'INSERT_OWNER_ADDRESS');\n      const myNFT = m.contract('MyNFT', [initialOwner]);\n      return { myNFT };\n    });\n    \n    ```\n\n    Replace `INSERT_OWNER_ADDRESS` with your desired owner address.\n\n4. Deploy your contract to Polkadot Hub TestNet using the following command:\n\n    ```bash\n    npx hardhat ignition deploy ignition/modules/MyNFT.ts --network polkadotTestnet\n    ```\n\n5. Confirm the target deployment network name and chain ID when prompted:\n\n    <div id=\"termynal\" data-termynal markdown>\n      <span data-ty=\"input\">npx hardhat ignition deploy ignition/modules/MyNFT.ts --network polkadotHubTestnet</span>\n      <span data-ty>✔ Confirm deploy to network polkadotTestnet (420420417)? … yes</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Hardhat Ignition 🚀</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Deploying [ MyNFTModule ]</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Batch #1</span>\n      <span data-ty> Executed MyNFTModule#MyNFT</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Batch #2</span>\n      <span data-ty> Executed MyNFTModule#MyNFT.safeMint</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>[ TokenModule ] successfully deployed 🚀</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>Deployed Addresses</span>\n      <span data-ty>&nbsp;</span>\n      <span data-ty>MyNFTModule#MyNFT - 0x1234.......</span>\n      <span data-ty=\"input\"><span class=\"file-path\"></span></span>\n    </div>\n\nCongratulations! You've successfully deployed an ERC-721 NFT contract to Polkadot Hub TestNet using Hardhat. Consider the following resources to build upon your progress."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-hardhat", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/#where-to-go-next", "page_title": "Deploy an ERC-721 Using Hardhat", "index": 7, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 6799, "end_char": 7419, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5666c0d2d4f4345b53916c1a15640093a1b98531348ad783f524bec1bcfc290d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an ERC-20__\n\n    ---\n\n    Walk through deploying a fully-functional ERC-20 to Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Create a DApp__\n\n    ---\n\n    Learn step-by-step how to build a fully functional dApp that interacts with a smart contract deployed via Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/dapps/zero-to-hero/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/#introduction", "page_title": "Deploy an ERC-721 NFT Using Remix", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 700, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e28795a9f86e91ff614771a8ef5466bd3bcd65096e993cf06e42535681e5cbc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nNon-Fungible Tokens (NFTs) represent unique digital assets commonly used for digital art, collectibles, gaming, and identity verification.\n\nThis guide demonstrates how to deploy an [ERC-721](https://eips.ethereum.org/EIPS/eip-721) NFT contract to [Polkadot Hub](/smart-contracts/overview/#smart-contract-development). You'll use [OpenZeppelin's battle-tested NFT implementation](https://github.com/OpenZeppelin/openzeppelin-contracts) and [Remix](https://remix.ethereum.org/), a visual, browser-based environment perfect for rapid prototyping and learning. It requires no local installation and provides an intuitive interface for contract development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/#prerequisites", "page_title": "Deploy an ERC-721 NFT Using Remix", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 700, "end_char": 1225, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e28795a9f86e91ff614771a8ef5466bd3bcd65096e993cf06e42535681e5cbc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\n- A basic understanding of [Solidity](https://www.soliditylang.org/) programming and [ERC-721 NFT](https://ethereum.org/developers/docs/standards/tokens/erc-721/) standards.\n- An EVM-compatible [wallet](/smart-contracts/connect/) connected to Polkadot Hub. This example utilizes [MetaMask](https://metamask.io/).\n- Test tokens for gas fees (available from the [Polkadot faucet](https://faucet.polkadot.io/)). See [Get Test Tokens](/smart-contracts/faucet/#get-test-tokens) for a guide to using the faucet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/#create-your-contract", "page_title": "Deploy an ERC-721 NFT Using Remix", "index": 2, "depth": 2, "title": "Create Your Contract", "anchor": "create-your-contract", "start_char": 1225, "end_char": 2547, "estimated_token_count": 306, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e28795a9f86e91ff614771a8ef5466bd3bcd65096e993cf06e42535681e5cbc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create Your Contract\n\nFollow the steps below to create the ERC-721 contract:\n\n1. Navigate to [Remix IDE](https://remix.ethereum.org/) in your web browser.\n2. Select the **Create new file** button under the **contracts** folder, and name your contract `MyNFT.sol`.\n\n    ![](/images/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/remix-01.webp)\n\n3. Now, paste the following ERC-721 contract code into `MyNFT.sol`:\n\n    ```solidity title=\"contracts/MyNFT.sol\"\n    // SPDX-License-Identifier: MIT\n    pragma solidity ^0.8.20;\n    \n    import \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\n    import \"@openzeppelin/contracts/access/Ownable.sol\";\n    \n    contract MyNFT is ERC721, Ownable {\n        uint256 private _nextTokenId;\n    \n        constructor(\n            address initialOwner\n        ) ERC721(\"MyToken\", \"MTK\") Ownable(initialOwner) {}\n    \n        function safeMint(address to) public onlyOwner {\n            uint256 tokenId = _nextTokenId++;\n            _safeMint(to, tokenId);\n        }\n    }\n    \n    ```\n\n    !!! tip\n        The [OpenZeppelin Contracts Wizard for Polkadot](https://wizard.openzeppelin.com/polkadot) was used to generate this example ERC-721 contract. Use it to customize and generate your own ERC-20, ERC-721, or other OpenZeppelin-standard contracts for Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/#compile-the-contract", "page_title": "Deploy an ERC-721 NFT Using Remix", "index": 3, "depth": 2, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 2547, "end_char": 3376, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e28795a9f86e91ff614771a8ef5466bd3bcd65096e993cf06e42535681e5cbc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile the Contract\n\nSolidity source code compiles into bytecode that can be deployed on the blockchain. During this process, the compiler checks the contract for syntax errors, ensures type safety, and generates the machine-readable instructions needed for blockchain execution.\n\nEnsure your `MyNFT.sol` contract is open in the Remix IDE Editor, and use the following steps to compile:\n\n1. Select the **Solidity Compiler** plugin from the left panel.\n2. Select the **Compile MyToken.sol** button.\n\nThe **Solidity Compiler** icon will display a green checkmark once the contract compiles successfully. If any issues arise during contract compilation, errors and warnings will appear in the terminal panel at the bottom of the screen.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/remix-02.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/#deploy-the-contract", "page_title": "Deploy an ERC-721 NFT Using Remix", "index": 4, "depth": 2, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 3376, "end_char": 4527, "estimated_token_count": 249, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e28795a9f86e91ff614771a8ef5466bd3bcd65096e993cf06e42535681e5cbc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contract\n\nFollow these steps to deploy the contract using Remix:\n\n1. Select **Deploy & Run Transactions** from the left panel.\n2. Ensure your MetaMask wallet is connected to Polkadot Hub TestNet, then select the **Environment** dropdown and select **Injected Provider - MetaMask**.\n\n    ![](/images/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/remix-03.webp)\n\n3. Configure the contract parameters by entering the address that will own the deployed NFT contract.\n4. Select the **Deploy** button to initiate the deployment.\n5. Approve the transaction in your MetaMask wallet when prompted.\n6. You will see the transaction details in the terminal when the deployment succeeds, including the contract address and deployment transaction hash.\n\n![](/images/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/remix-04.webp)\n\nOnce successfully deployed, your contract will appear in the **Deployed Contracts** section, ready for interaction.\n\nCongratulations! You've successfully deployed an ERC-721 NFT contract to Polkadot Hub TestNet using Remix IDE. Consider the following resources to build upon your progress."}
{"source": "polkadot-docs", "page_id": "smart-contracts-cookbook-smart-contracts-deploy-nft-nft-remix", "url": "https://developer.polkadot.com/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/#where-to-go-next", "page_title": "Deploy an ERC-721 NFT Using Remix", "index": 5, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 4527, "end_char": 4860, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e28795a9f86e91ff614771a8ef5466bd3bcd65096e993cf06e42535681e5cbc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an ERC-20__\n\n    ---\n\n    Walk through deploying a fully-functional ERC-20 to Polkadot Hub using Remix.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#introduction", "page_title": "Use Foundry with Polkadot Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 1718, "estimated_token_count": 392, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Foundry](https://www.getfoundry.sh/) is a blazing fast, portable, and modular toolkit for Ethereum application development written in Rust. It consists of:\n\n- **Forge**: Command-line tool to test, build, and deploy smart contracts\n- **Cast**: Swiss army knife for interacting with contracts, sending transactions, and getting chain data\n- **Anvil**: Local Ethereum node for development and testing\n- **Chisel**: Solidity REPL for testing code snippets\n\nThis page demonstrates how to set up Foundry to work with Polkadot Hub, including installation, compilation, deployment, and verification.\n\n!!! info \"Limitations when using the built-in test framework\"\n    **`forge test`** runs against standard **Anvil** (Ethereum node), not a Polkadot node. Anvil does not enforce [Existential Deposit](/smart-contracts/for-eth-devs/evm-vs-pvm/#account-management-existential-deposit), and balances, timestamps, block numbers, and runtime behavior (gas, precompiles) follow Ethereum semantics—so tests that pass locally may behave differently on Polkadot. Use `forge test` for unit tests; for Polkadot-specific behavior, run against a [local dev node](/smart-contracts/dev-environments/local-dev-node/) or TestNet. See [Differences between Ethereum-native tools and Polkadot EVM networks](/smart-contracts/get-started/#differences-between-ethereum-native-tools-and-polkadot-evm-networks) for more.\n\n!!! tip \"Native Polkadot Support\"\n    Foundry's nightly build includes native support for Polkadot chains, allowing you to use `--chain polkadot-testnet`, `--chain polkadot`, or `--chain kusama` without manually specifying RPC URLs. This makes development more streamlined and reduces configuration."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#prerequisites", "page_title": "Use Foundry with Polkadot Hub", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1718, "end_char": 2073, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore setting up Foundry, make sure you have:\n\n- A Unix-based operating system (Linux or macOS) or Windows with [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)\n- [Git](https://git-scm.com/) installed\n- A funded account on Polkadot Hub (see the [Connect to Polkadot](/smart-contracts/connect/) guide to get TestNet tokens)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#install-foundry", "page_title": "Use Foundry with Polkadot Hub", "index": 2, "depth": 2, "title": "Install Foundry", "anchor": "install-foundry", "start_char": 2073, "end_char": 3048, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Foundry\n\n!!! warning \"Use Nightly Build\"\n    To use Foundry with Polkadot Hub, you must install the **nightly build** instead of the stable release. The nightly build includes features required for contract verification on Polkadot Hub.\n\nTo install the Foundry nightly build, run:\n\n```bash\ncurl -L https://foundry.paradigm.xyz | bash\n```\n\nThis installs `foundryup`, the Foundry toolchain installer. Then, run:\n\n```bash\nfoundryup --version nightly\n```\n\nThis installs the latest nightly versions of `forge`, `cast`, `anvil`, and `chisel`.\n\nTo verify the installation:\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>forge --version</span>\n    <br>\n    <span data-ty>forge Version: 1.6.0-nightly</span>\n    <span data-ty>Commit SHA: 8b4f318e6a3e83a06dc4e989b9aba87894dca88e</span>\n    <span data-ty>Build Timestamp: 2026-01-28T06:06:35.086737000Z (1769580395)</span>\n    <span data-ty>Build Profile: dist</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#initialize-a-foundry-project", "page_title": "Use Foundry with Polkadot Hub", "index": 3, "depth": 2, "title": "Initialize a Foundry Project", "anchor": "initialize-a-foundry-project", "start_char": 3048, "end_char": 3603, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize a Foundry Project\n\nCreate a new Foundry project:\n\n```bash\nforge init my-foundry-project\ncd my-foundry-project\n```\n\nThis creates a new directory with the following structure:\n\n- **`src/`**: Contains your Solidity smart contracts\n- **`script/`**: Holds deployment scripts\n- **`test/`**: Contains test files written in Solidity\n- **`lib/`**: Stores project dependencies\n- **`foundry.toml`**: Configuration file for Foundry settings\n\nA sample `Counter.sol` contract will be created in the `src/` directory along with a corresponding test file."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#compile-contracts", "page_title": "Use Foundry with Polkadot Hub", "index": 4, "depth": 2, "title": "Compile Contracts", "anchor": "compile-contracts", "start_char": 3603, "end_char": 4168, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile Contracts\n\nTo compile your contracts, run:\n\n```bash\nforge build\n```\n\nYou should see output similar to:\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>forge build</span>\n    <br>\n    <span data-ty>[⠊] Compiling...</span>\n    <span data-ty>[⠒] Compiling 3 files with Solc 0.8.28</span>\n    <span data-ty>[⠢] Solc 0.8.28 finished in 1.23s</span>\n    <span data-ty>Compiler run successful!</span>\n</div>\n\nForge compiles all contracts in the `src/` directory and outputs the artifacts to the `out/` directory."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#configure-foundry-for-polkadot-hub", "page_title": "Use Foundry with Polkadot Hub", "index": 5, "depth": 2, "title": "Configure Foundry for Polkadot Hub", "anchor": "configure-foundry-for-polkadot-hub", "start_char": 4168, "end_char": 5318, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Foundry for Polkadot Hub\n\nFoundry's nightly build includes native support for Polkadot chains with `polkadot-testnet`, `polkadot`, and `kusama` as recognized chains with default RPC endpoints.\n\nCreate or modify your `foundry.toml` file:\n\n!!! note\n    The `[etherscan]` section is used for contract verification. Routescan requires an API key; Blockscout does not.\n\n=== \"Blockscout\"\n\n    ```toml title='foundry.toml'\n    [profile.default]\n    src = \"src\"\n    out = \"out\"\n    libs = [\"lib\"]\n    solc_version = \"0.8.28\"\n\n    [etherscan] # Contract verification configuration\n    polkadot-testnet = { key = \"\", url = \"https://blockscout-testnet.polkadot.io/api?\" }\n    ```\n\n=== \"Routescan\"\n\n    ```toml title='foundry.toml'\n    [profile.default]\n    src = \"src\"\n    out = \"out\"\n    libs = [\"lib\"]\n    solc_version = \"0.8.28\"\n\n    [etherscan] # Contract verification configuration\n    polkadot-testnet = { key = \"verifyContract\", url = \"https://api.routescan.io/v2/network/testnet/evm/420420417/etherscan\" }\n    ```\n\nWith this configuration, you can use `--chain polkadot-testnet` in your commands without specifying the RPC URL explicitly."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#available-networks-and-rpc-endpoints", "page_title": "Use Foundry with Polkadot Hub", "index": 6, "depth": 3, "title": "Available Networks and RPC Endpoints", "anchor": "available-networks-and-rpc-endpoints", "start_char": 5318, "end_char": 6003, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Available Networks and RPC Endpoints\n\nFoundry's nightly build supports three Polkadot chains:\n\n|       Network        |         Chain Flag         |             Built-in RPC Endpoint              |  Chain ID   |\n| :------------------: | :------------------------: | :--------------------------------------------: | :---------: |\n| **Polkadot TestNet** | `--chain polkadot-testnet` | `https://services.polkadothub-rpc.com/testnet` | `420420417` |\n|     **Polkadot**     |     `--chain polkadot`     | `https://services.polkadothub-rpc.com/mainnet` | `420420419` |\n|      **Kusama**      |      `--chain kusama`      | `https://kusama-asset-hub-eth-rpc.polkadot.io` | `420420418` |"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#deploy-a-contract", "page_title": "Use Foundry with Polkadot Hub", "index": 7, "depth": 2, "title": "Deploy a Contract", "anchor": "deploy-a-contract", "start_char": 6003, "end_char": 6025, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy a Contract"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#set-up-environment-variables", "page_title": "Use Foundry with Polkadot Hub", "index": 8, "depth": 3, "title": "Set Up Environment Variables", "anchor": "set-up-environment-variables", "start_char": 6025, "end_char": 6496, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Set Up Environment Variables\n\nCreate a `.env` file in your project root (make sure to add it to `.gitignore`):\n\n```text title='.env'\nPRIVATE_KEY=INSERT_PRIVATE_KEY_HERE\n```\n\n!!! warning \"Never commit your private key\"\n    Replace `INSERT_PRIVATE_KEY_HERE` with your actual private key. Always keep your `.env` file in `.gitignore` to prevent accidentally committing sensitive information to version control.\n\nLoad the environment variables:\n\n```bash\nsource .env\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#deploy-using-forge", "page_title": "Use Foundry with Polkadot Hub", "index": 9, "depth": 3, "title": "Deploy Using Forge", "anchor": "deploy-using-forge", "start_char": 6496, "end_char": 7558, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Deploy Using Forge\n\nTo deploy a contract to Polkadot Hub TestNet:\n\n```bash\nforge create src/Counter.sol:Counter \\\n    --chain polkadot-testnet \\\n    --rpc-url https://services.polkadothub-rpc.com/testnet \\\n    --private-key $PRIVATE_KEY \\\n    --broadcast\n```\n\nYou'll see output with the deployed contract address:\n\n<div class=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>forge create src/Counter.sol:Counter \\\n    <br>\n    <span data-ty>--chain polkadot-testnet</span>\n    <span data-ty>--rpc-url https://services.polkadothub-rpc.com/testnet</span>\n    <span data-ty>--private-key $PRIVATE_KEY</span>\n    <span data-ty>--broadcast</span>\n    <span data-ty>[⠊] Compiling...</span>\n    <span data-ty>No files changed, compilation skipped</span>\n    <span data-ty>Deployer: 0x3427D90f1Ee5c5D3627c2EBb37f90393526066fd</span>\n    <span data-ty>Deployed to: 0xF1fbAf96A16458A512A33b31c4414C4a81f50EF4</span>\n    <span data-ty>Transaction hash: 0x1cba7b61c771192b297024766bed8b6e607f218e12899739fe61a3eed2690779</span>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#deploy-using-scripts", "page_title": "Use Foundry with Polkadot Hub", "index": 10, "depth": 3, "title": "Deploy Using Scripts", "anchor": "deploy-using-scripts", "start_char": 7558, "end_char": 8523, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Deploy Using Scripts\n\nFor more complex deployments, create a deployment script in the `script/` directory:\n\n```solidity title='script/Counter.s.sol'\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {Script} from \"forge-std/Script.sol\";\nimport {Counter} from \"../src/Counter.sol\";\n\ncontract CounterScript is Script {\n    function run() external {\n        // Get the deployer's private key from environment\n        uint256 deployerPrivateKey = vm.envUint(\"PRIVATE_KEY\");\n        \n        // Start broadcasting transactions\n        vm.startBroadcast(deployerPrivateKey);\n        \n        // Deploy the contract\n        Counter counter = new Counter();\n        \n        // Stop broadcasting\n        vm.stopBroadcast();\n    }\n}\n```\n\nRun the deployment script:\n\n```bash\nforge script script/Counter.s.sol:CounterScript \\\n    --chain polkadot-testnet \\\n    --broadcast\n```\n\nThe `--broadcast` flag tells Forge to submit the transactions to the network."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#verify-a-contract", "page_title": "Use Foundry with Polkadot Hub", "index": 11, "depth": 2, "title": "Verify a Contract", "anchor": "verify-a-contract", "start_char": 8523, "end_char": 8666, "estimated_token_count": 25, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify a Contract\n\nTo verify your deployed contract on Polkadot Hub, use the verification feature with the Polkadot Hub explorer verifier."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#basic-verification", "page_title": "Use Foundry with Polkadot Hub", "index": 12, "depth": 3, "title": "Basic Verification", "anchor": "basic-verification", "start_char": 8666, "end_char": 11527, "estimated_token_count": 676, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Basic Verification\n\n=== \"Blockscout\"\n\n    ```bash\n    forge verify-contract INSERT_CONTRACT_ADDRESS \\\n        src/Counter.sol:Counter \\\n        --chain polkadot-testnet\n    ```\n\n    Blockscout does not require an API key. With Foundry's native Polkadot support, `--verifier` and `--verifier-url` are not needed.\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>forge verify-contract 0xc29C4ebCdd1c49bc77362A13Ab921f22005828A0 \\\n        src/Counter.sol:Counter \\</span>\n        <br>\n        <span data-ty>--chain polkadot-testnet</span>\n        <span data-ty>Start verifying contract `0xc29C4ebCdd1c49bc77362A13Ab921f22005828A0` deployed on polkadot-testnet</span>\n        <span data-ty>Submitting verification for [src/Counter.sol:Counter] 0xc29C4ebCdd1c49bc77362A13Ab921f22005828A0.</span>\n        <span data-ty>Submitted contract for verification:</span>\n        <span data-ty>\tResponse: `OK`</span>\n        <span data-ty>\tGUID: `c29c4ebcdd1c49bc77362a13ab921f22005828a0698f2622`</span>\n        <span data-ty>\tURL: https://blockscout-testnet.polkadot.io/address/0xc29c4ebcdd1c49bc77362a13ab921f22005828a0</span>\n    </div>\n\n=== \"Routescan\"\n\n    ```bash\n    forge verify-contract INSERT_CONTRACT_ADDRESS \\\n        src/Counter.sol:Counter \\\n        --verifier-url 'https://api.routescan.io/v2/network/testnet/evm/420420417/etherscan' \\\n        --etherscan-api-key \"verifyContract\" \\\n        --chain polkadot-testnet\n    ```\n\n    The Routescan API v2 structure is `https://api.routescan.io/v2/network/{testnet|mainnet}/evm/{CHAIN_ID}/etherscan`. The `--verifier-url` is the URL of the Polkadot Hub explorer verifier.\n\n    You should see output similar to:\n\n    <div class=\"termynal\" data-termynal>\n        <span data-ty=\"input\"><span class=\"file-path\"></span>forge verify-contract 0xF1fbAf96A16458A512A33b31c4414C4a81f50EF4 \\\n        src/Counter.sol:Counter \\</span>\n        <br>\n        <span data-ty>--verifier-url 'https://api.routescan.io/v2/network/testnet/evm/420420417/etherscan'</span>\n        <span data-ty>--etherscan-api-key \"verifyContract\"</span>\n        <span data-ty>--chain polkadot-testnet</span>\n        <span data-ty>Start verifying contract `0xF1fbAf96A16458A512A33b31c4414C4a81f50EF4` deployed on polkadot-testnet</span>\n        <span data-ty>Submitting verification for [src/Counter.sol:Counter] 0xF1fbAf96A16458A512A33b31c4414C4a81f50EF4.</span>\n        <span data-ty>Submitted contract for verification:</span>\n        <span data-ty>\tResponse: `OK`</span>\n        <span data-ty>\tGUID: `71d14e5b-eda1-5e85-98c5-2faf93306526`</span>\n        <span data-ty>\tURL: https://polkadot.testnet.routescan.io/address/0xf1fbaf96a16458a512a33b31c4414c4a81f50ef4</span>\n    </div>\n\nReplace `INSERT_CONTRACT_ADDRESS` with your deployed contract's address."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#verification-with-constructor-arguments", "page_title": "Use Foundry with Polkadot Hub", "index": 13, "depth": 3, "title": "Verification with Constructor Arguments", "anchor": "verification-with-constructor-arguments", "start_char": 11527, "end_char": 12358, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verification with Constructor Arguments\n\nFor contracts with constructor arguments:\n\n=== \"Blockscout\"\n\n    ```bash\n    forge verify-contract INSERT_CONTRACT_ADDRESS \\\n        src/Counter.sol:Counter \\\n        --chain polkadot-testnet \\\n        --constructor-args $(cast abi-encode \"constructor(uint256,address)\" 42 INSERT_DEPLOYER_ADDRESS)\n    ```\n\n=== \"Routescan\"\n\n    ```bash\n    forge verify-contract INSERT_CONTRACT_ADDRESS \\\n        src/Counter.sol:Counter \\\n        --verifier-url 'https://api.routescan.io/v2/network/testnet/evm/420420417/etherscan' \\\n        --etherscan-api-key \"verifyContract\" \\\n        --chain polkadot-testnet \\\n        --constructor-args $(cast abi-encode \"constructor(uint256,address)\" 42 INSERT_DEPLOYER_ADDRESS)\n    ```\n\nReplace `INSERT_CONTRACT_ADDRESS` with your deployed contract's address."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#interact-with-contracts", "page_title": "Use Foundry with Polkadot Hub", "index": 14, "depth": 2, "title": "Interact with Contracts", "anchor": "interact-with-contracts", "start_char": 12358, "end_char": 12386, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with Contracts"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#using-cast", "page_title": "Use Foundry with Polkadot Hub", "index": 15, "depth": 3, "title": "Using Cast", "anchor": "using-cast", "start_char": 12386, "end_char": 12867, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Using Cast\n\nCast is a powerful command-line tool for interacting with deployed contracts.\n\n#### Read from a Contract\n\n```bash\ncast call INSERT_CONTRACT_ADDRESS \"number()(uint256)\" \\\n    --chain polkadot-testnet\n```\n\n#### Write to a Contract\n\n```bash\ncast send INSERT_CONTRACT_ADDRESS \"setNumber(uint256)\" 42 \\\n    --chain polkadot-testnet \\\n    --private-key $PRIVATE_KEY\n```\n\n#### Get Account Balance\n\n```bash\ncast balance INSERT_ACCOUNT_ADDRESS --chain polkadot-testnet\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#using-forge-scripts", "page_title": "Use Foundry with Polkadot Hub", "index": 16, "depth": 3, "title": "Using Forge Scripts", "anchor": "using-forge-scripts", "start_char": 12867, "end_char": 13023, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Using Forge Scripts\n\nFor more complex interactions, create scripts in the `script/` directory that can read and write contract state programmatically."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#run-tests", "page_title": "Use Foundry with Polkadot Hub", "index": 17, "depth": 2, "title": "Run Tests", "anchor": "run-tests", "start_char": 13023, "end_char": 13406, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run Tests\n\nFoundry uses Solidity for writing tests, allowing you to test your contracts in the same language they're written in:\n\n```bash\nforge test\n```\n\nFor verbose output showing gas usage and detailed logs:\n\n```bash\nforge test -vvv\n```\n\nRun specific tests:\n\n```bash\nforge test --match-test testIncrement\n```\n\nRun tests with gas reporting:\n\n```bash\nforge test --gas-report\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#additional-resources", "page_title": "Use Foundry with Polkadot Hub", "index": 18, "depth": 2, "title": "Additional Resources", "anchor": "additional-resources", "start_char": 13406, "end_char": 13801, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Additional Resources\n\n- **[Foundry Documentation](https://www.getfoundry.sh/)**: Comprehensive Foundry documentation\n- **[Forge Documentation](https://www.getfoundry.sh/forge)**: Detailed guide to the Forge tool\n- **[Cast Documentation](https://www.getfoundry.sh/cast)**: Learn about Cast commands\n- **[Foundry GitHub](https://github.com/foundry-rs/foundry)**: Source code and issue tracker"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-foundry", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/foundry/#where-to-go-next", "page_title": "Use Foundry with Polkadot Hub", "index": 19, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 13801, "end_char": 14344, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fd994b2093e6b0af937a460d7185e32147cc4c82decdba80fd0a5e032b18c86d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge reference\">Reference</span> __Connect to Polkadot Hub__\n\n    ---\n\n    View network details and learn how to connect your development tools to Polkadot Hub.\n\n    [:octicons-arrow-right-24: View Network Details](/smart-contracts/connect/)\n\n-   <span class=\"badge guide\">Guide</span> __For Ethereum Developers__\n\n    ---\n\n    Learn how smart contracts work on Polkadot Hub.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/for-eth-devs/accounts/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#introduction", "page_title": "Use Hardhat with Polkadot Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 11, "end_char": 763, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Hardhat](https://hardhat.org/) is a flexible development environment for building, testing, and deploying smart contracts on Polkadot. Its task runner and plugin system support organizing contract code, running tests, managing deployments, and adding custom tooling. This page demonstrates how to set up a Hardhat project for Polkadot Hub.\n\n!!! info \"Testing and debugging against Polkadot\"\n    When using standard Hardhat against Polkadot nodes, some behaviors differ (e.g., network helpers like `time.increase()` or `loadFixture` may not work). See [Differences between Ethereum-native tools and Polkadot EVM networks](/smart-contracts/get-started/#differences-between-ethereum-native-tools-and-polkadot-evm-networks) for details."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#prerequisites", "page_title": "Use Hardhat with Polkadot Hub", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 763, "end_char": 1080, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore setting up Hardhat, make sure the following are installed:\n\n- [Node.js](https://nodejs.org/) (Hardhat requires an LTS Node version, even major numbers like 18.x, 20.x, or 22.x)\n- A package manager like [npm](https://www.npmjs.com/), [pnpm](https://pnpm.io/), or [yarn](https://yarnpkg.com/)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#initialize-a-hardhat-project", "page_title": "Use Hardhat with Polkadot Hub", "index": 2, "depth": 2, "title": "Initialize a Hardhat Project", "anchor": "initialize-a-hardhat-project", "start_char": 1080, "end_char": 2918, "estimated_token_count": 382, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize a Hardhat Project\n\n1. Create a directory to hold your project files:\n\n    ```bash\n    mkdir hardhat-example\n    cd hardhat-example\n    ```\n\n2. Initialize a Hardhat project:\n\n    === \"npm\"\n\n        This single command sets up your project, installs Hardhat (and optionally the Toolbox), and intializes the project:\n\n        ```bash\n        npx hardhat@^2.27.0 init\n        ```\n\n    === \"pnpm\"\n\n        This single command sets up your project, installs Hardhat (and optionally the Toolbox), and intializes the project:\n\n        ```bash\n        pnpm dlx hardhat@^2.27.0 init\n        ```\n\n    === \"yarn\"\n\n        These commands manually set up your project, install Hardhat (and optionally the Toolbox), and initializes the project:\n\n        ```bash\n        # Initialize a new Node.js project\n        yarn init -y\n\n        # Install Hardhat and the Hardhat Toolbox locally\n        yarn add --dev hardhat@^2.27.0 @nomicfoundation/hardhat-toolbox\n\n        # Initialize a Hardhat project\n        npx hardhat init\n        ```\n\n3. You will be prompted to select certain configurations for your project. To quickly create a working setup, you can accept the default answers, which will create a JavaScript project, initialize it in the current directory, add a `.gitignore`, and install all dependencies.\n\nAfter completing the setup, your Hardhat project will be fully initialized with all necessary files and dependencies. You'll see the following core components in your project:\n\n- **`contracts`**: Stores your Solidity smart contracts.\n- **`ignition`**: Contains deployment modules for safely deploying your contracts to various networks.\n- **`test`**: Contains test files that validate contract functionality.\n- **`hardhat.config.js | .ts`**: Defines your project's settings, including networks, compiler options, and plugins."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#configure-hardhat-for-polkadot-hub", "page_title": "Use Hardhat with Polkadot Hub", "index": 3, "depth": 2, "title": "Configure Hardhat for Polkadot Hub", "anchor": "configure-hardhat-for-polkadot-hub", "start_char": 2918, "end_char": 3976, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Hardhat for Polkadot Hub\n\nTo use Hardhat with Polkadot Hub, define the network configuration in your `hardhat.config.ts` file:\n\n=== \"Polkadot TestNet\"\n\n    ```ts title='hardhat.config.ts'\n    import type { HardhatUserConfig } from 'hardhat/config';\n    import '@nomicfoundation/hardhat-toolbox';\n\n    // If you want to use a variable for your private key\n    import { vars } from 'hardhat/config';\n\n    const config: HardhatUserConfig = {\n      solidity: '0.8.28',\n      networks: {\n        polkadotTestnet: {\n          url: 'https://services.polkadothub-rpc.com/testnet',\n          chainId: 420420417,\n          accounts: [vars.get('PRIVATE_KEY')],\n        },\n      },\n    };\n\n    export default config;\n    ```\n\n!!! tip\n\n    To define a [configuration variable](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) for your private key, run:\n\n    ```bash\n    npx hardhat vars set PRIVATE_KEY\n    ```\n\n    Hardhat will prompt you to enter your private key and store it so it can be referenced in your configuration file."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#verify-a-contract", "page_title": "Use Hardhat with Polkadot Hub", "index": 4, "depth": 2, "title": "Verify a Contract", "anchor": "verify-a-contract", "start_char": 3976, "end_char": 4140, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Verify a Contract\n\nTo verify your deployed contract on Polkadot Hub, install the Hardhat verification plugin and add the explorer configuration to your config."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#install-the-verification-plugin", "page_title": "Use Hardhat with Polkadot Hub", "index": 5, "depth": 3, "title": "Install the Verification Plugin", "anchor": "install-the-verification-plugin", "start_char": 4140, "end_char": 4480, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Install the Verification Plugin\n\n```bash\nnpm install --save-dev @nomicfoundation/hardhat-verify@^2.0.0\n```\n\n!!! note \"Hardhat 2 Compatibility\"\n    Use `@nomicfoundation/hardhat-verify@^2.0.0` for Hardhat 2.x. The 3.x release requires Hardhat 3.\n\nAdd the plugin to your config file:\n\n```ts\nimport \"@nomicfoundation/hardhat-verify\";\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#add-verification-config", "page_title": "Use Hardhat with Polkadot Hub", "index": 6, "depth": 3, "title": "Add Verification Config", "anchor": "add-verification-config", "start_char": 4480, "end_char": 6798, "estimated_token_count": 502, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Add Verification Config\n\nAdd the `etherscan` configuration to your `hardhat.config.ts`. Choose Blockscout or Routescan:\n\n=== \"Blockscout\"\n\n    Blockscout does not require an API key. Add the following to your config:\n\n    ```ts title='hardhat.config.ts'\n    import type { HardhatUserConfig } from 'hardhat/config';\n    import '@nomicfoundation/hardhat-toolbox';\n    import '@nomicfoundation/hardhat-verify';\n    import { vars } from 'hardhat/config';\n\n    const config: HardhatUserConfig = {\n      solidity: '0.8.28',\n      networks: {\n        polkadotTestnet: {\n          url: 'https://services.polkadothub-rpc.com/testnet',\n          chainId: 420420417,\n          accounts: [vars.get('PRIVATE_KEY')],\n        },\n      },\n      etherscan: {\n        apiKey: {\n          polkadotTestnet: 'no-api-key-needed',\n        },\n        customChains: [\n          {\n            network: 'polkadotTestnet',\n            chainId: 420420417,\n            urls: {\n              apiURL: 'https://blockscout-testnet.polkadot.io/api',\n              browserURL: 'https://blockscout-testnet.polkadot.io/',\n            },\n          },\n        ],\n      },\n    };\n\n    export default config;\n    ```\n\n=== \"Routescan\"\n\n    Routescan uses an Etherscan-compatible API. Get an API key from [Routescan](https://routescan.io/) or use `verifyContract` for testnets:\n\n    ```ts title='hardhat.config.ts'\n    import type { HardhatUserConfig } from 'hardhat/config';\n    import '@nomicfoundation/hardhat-toolbox';\n    import '@nomicfoundation/hardhat-verify';\n    import { vars } from 'hardhat/config';\n\n    const config: HardhatUserConfig = {\n      solidity: '0.8.28',\n      networks: {\n        polkadotTestnet: {\n          url: 'https://services.polkadothub-rpc.com/testnet',\n          chainId: 420420417,\n          accounts: [vars.get('PRIVATE_KEY')],\n        },\n      },\n      etherscan: {\n        apiKey: {\n          polkadotTestnet: 'verifyContract',\n        },\n        customChains: [\n          {\n            network: 'polkadotTestnet',\n            chainId: 420420417,\n            urls: {\n              apiURL: 'https://api.routescan.io/v2/network/testnet/evm/420420417/etherscan',\n              browserURL: 'https://polkadot.testnet.routescan.io/',\n            },\n          },\n        ],\n      },\n    };\n\n    export default config;\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#basic-verification", "page_title": "Use Hardhat with Polkadot Hub", "index": 7, "depth": 3, "title": "Basic Verification", "anchor": "basic-verification", "start_char": 6798, "end_char": 7023, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Basic Verification\n\nReplace `INSERT_CONTRACT_ADDRESS` with your deployed contract's address. For contracts without constructor arguments:\n\n```bash\nnpx hardhat verify --network polkadotTestnet INSERT_CONTRACT_ADDRESS\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#verification-with-constructor-arguments", "page_title": "Use Hardhat with Polkadot Hub", "index": 8, "depth": 3, "title": "Verification with Constructor Arguments", "anchor": "verification-with-constructor-arguments", "start_char": 7023, "end_char": 7456, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verification with Constructor Arguments\n\nFor contracts with constructor arguments, pass them as additional arguments:\n\n```bash\nnpx hardhat verify --network polkadotTestnet INSERT_CONTRACT_ADDRESS \"arg1\" \"arg2\"\n```\n\nExample for a contract with constructor `(uint256 initialValue, address owner)`:\n\n```bash\nnpx hardhat verify --network polkadotTestnet INSERT_CONTRACT_ADDRESS \"42\" \"0x1234567890123456789012345678901234567890\"\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#where-to-go-next", "page_title": "Use Hardhat with Polkadot Hub", "index": 9, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 7456, "end_char": 8636, "estimated_token_count": 311, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy a Basic Contract__\n\n    ---\n\n    Ready to start using Hardhat? Learn how to compile, test, and deploy a basic contract.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an ERC-20__\n\n    ---\n\n    Walk through deploying a fully-functional ERC-20 to Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an NFT__\n\n    ---\n\n    Walk through deploying an NFT to Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Create a DApp__\n\n    ---\n\n    Learn step-by-step how to build a fully functional dApp that interacts with a smart contract deployed via Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/dapps/zero-to-hero/)\n\n</div>\n\n# Hardhat Polkadot"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#introduction", "page_title": "Use Hardhat with Polkadot Hub", "index": 10, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 8636, "end_char": 9032, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Hardhat](https://hardhat.org/) is a flexible development environment for building, testing, and deploying smart contracts. With the [`@parity/hardhat-polkadot`](https://github.com/paritytech/hardhat-polkadot) plugin, you can compile Solidity contracts to PVM bytecode and deploy them to Polkadot Hub. This page demonstrates how to set up a Hardhat project for PVM development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#prerequisites", "page_title": "Use Hardhat with Polkadot Hub", "index": 11, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 9032, "end_char": 9344, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore setting up Hardhat, make sure the following are installed:\n\n- [Node.js](https://nodejs.org/) version 22.5+ and [npm](https://www.npmjs.com/) version 10.9.0+ to avoid issues with the Polkadot plugin\n- A package manager like npm, [pnpm](https://pnpm.io/), or [yarn](https://yarnpkg.com/)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#initialize-a-hardhat-project", "page_title": "Use Hardhat with Polkadot Hub", "index": 12, "depth": 2, "title": "Initialize a Hardhat Project", "anchor": "initialize-a-hardhat-project", "start_char": 9344, "end_char": 10512, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize a Hardhat Project\n\n1. Create a directory to hold your project files:\n\n    ```bash\n    mkdir hardhat-pvm-example\n    cd hardhat-pvm-example\n    ```\n\n2. Initialize a new npm project:\n\n    ```bash\n    npm init -y\n    ```\n\n3. Install the Polkadot plugin for Hardhat:\n\n    ```bash\n    npm install --save-dev @parity/hardhat-polkadot@0.3.0\n    ```\n\n4. Install the resolc compiler (required for compiling Solidity to PVM):\n\n    ```bash\n    npm install --save-dev @parity/resolc@1.4.0\n    ```\n\n5. Initialize a Hardhat project:\n\n    ```bash\n    npx hardhat-polkadot init\n    ```\n\n    Follow the project creation wizard. Your project will be created with three main folders:\n\n    - **`contracts`**: Stores your Solidity smart contracts.\n    - **`ignition`**: Contains deployment modules for safely deploying your contracts to various networks.\n    - **`test`**: Contains test files that validate contract functionality.\n\n6. Add the following folder to the `.gitignore` file if it is not already there:\n\n    ```bash\n    echo '/ignition/deployments/' >> .gitignore\n    ```\n\n7. Complete the setup by installing all dependencies:\n\n    ```bash\n    npm install\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#compile-your-contract", "page_title": "Use Hardhat with Polkadot Hub", "index": 13, "depth": 2, "title": "Compile Your Contract", "anchor": "compile-your-contract", "start_char": 10512, "end_char": 10933, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile Your Contract\n\nThe plugin will compile your Solidity contracts (version `0.8.0` and higher) to PVM bytecode using the resolc compiler:\n\n```bash\nnpx hardhat compile\n```\n\nAfter successful compilation, you'll see the artifacts generated in the `artifacts` directory:\n\n```bash\nls artifacts/contracts/*.sol/\n```\n\nYou should see JSON files containing the contract ABIs and bytecodes for the contracts you compiled."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#test-your-contract-locally", "page_title": "Use Hardhat with Polkadot Hub", "index": 14, "depth": 2, "title": "Test Your Contract Locally", "anchor": "test-your-contract-locally", "start_char": 10933, "end_char": 11112, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test Your Contract Locally\n\nHardhat provides a local testing environment through the `hardhat-polkadot` plugin, which spins up a local Substrate node with an ETH-RPC adapter."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#start-a-local-node", "page_title": "Use Hardhat with Polkadot Hub", "index": 15, "depth": 3, "title": "Start a Local Node", "anchor": "start-a-local-node", "start_char": 11112, "end_char": 13439, "estimated_token_count": 738, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Start a Local Node\n\nTo obtain the `dev-node` and `eth-rpc` binaries, check this [release](https://github.com/paritytech/hardhat-polkadot/releases/tag/nodes-19071579107) and download the binaries for your platform, then update the paths in your config.\n\n!!! note\n    You might need to give executable permissions to the binaries:\n    \n    ```bash\n    chmod +x /path/to/your/binary\n    ```\n    \n    In macOS environments, binaries are sometimes quarantined. To remove this, run:\n    \n    ```bash\n    xattr -d com.apple.quarantine /path/to/your/binary\n    ```\n\nOnce you have set up the binaries, start your local testing node:\n\n```bash\nnpx hardhat node\n```\n\nThis command launches a local node with the ETH-RPC adapter. By default, the Substrate node runs on `localhost:8000`, and the ETH-RPC adapter on `localhost:8545`.\n\nThe output will be something like this:\n\n<div id=\"termynal\" data-termynal>\n    <span data-ty=\"input\"><span class=\"file-path\"></span>npx hardhat node</span>\n    <br />\n    <span data-ty>Starting server at 127.0.0.1:8000</span>\n    <span data-ty>../bin/substrate-node --rpc-port=8000 --dev</span>\n    <span data-ty>Starting the Eth RPC Adapter at 127.0.0.1:8545</span>\n    <span data-ty>../bin/eth-rpc --node-rpc-url=ws://localhost:8000 --dev</span>\n    <span data-ty>2025-05-29 13:00:32 Running in --dev mode, RPC CORS has been disabled.</span>\n    <span data-ty>2025-05-29 13:00:32 Running in --dev mode, RPC CORS has been disabled.</span>\n    <span data-ty>2025-05-29 13:00:32 🌐 Connecting to node at: ws://localhost:8000 ...</span>\n    <span data-ty>2025-05-29 13:00:32 Substrate Node</span>\n    <span data-ty>2025-05-29 13:00:32 ✌️ version 3.0.0-dev-f73c228b7a1</span>\n    <span data-ty>2025-05-29 13:00:32 ❤️ by Parity Technologies &lt;admin@parity.io&gt;, 2017-2025</span>\n    <span data-ty>2025-05-29 13:00:32 📋 Chain specification: Development</span>\n    <span data-ty>2025-05-29 13:00:32 🏷 Node name: electric-activity-4221</span>\n    <span data-ty>2025-05-29 13:00:32 👤 Role: AUTHORITY</span>\n    <span data-ty>2025-05-29 13:00:32 💾 Database: RocksDb at /var/folders/f4/7rdt2m9d7j361dm453cpggbm0000gn/T/substrateOaoecu/chains/dev/db/full</span>\n    <span data-ty>2025-05-29 13:00:36 [0] 💸 generated 1 npos voters, 1 from validators and 0 nominators</span>\n    <span data-ty>...</span>\n  </div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#run-tests", "page_title": "Use Hardhat with Polkadot Hub", "index": 16, "depth": 3, "title": "Run Tests", "anchor": "run-tests", "start_char": 13439, "end_char": 14324, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Run Tests\n\nTo run your contract tests:\n\n```bash\nnpx hardhat test\n```\n\n!!! warning \"Compatibility Note\"\n    Be aware that [`@nomicfoundation/hardhat-toolbox/network-helpers`](https://hardhat.org/hardhat-network-helpers/docs/overview) is not fully compatible with Polkadot Hub's available RPCs. Specifically, helpers like `time` and `loadFixture` may not work due to missing RPC calls in the node. For a broader overview of how Ethereum-native tools differ when used against Polkadot EVM networks, see [Differences between Ethereum-native tools and Polkadot EVM networks](/smart-contracts/get-started/#differences-between-ethereum-native-tools-and-polkadot-evm-networks). For plugin-specific details, refer to the [Compatibility](https://github.com/paritytech/hardhat-polkadot/tree/main/packages/hardhat-polkadot-node#compatibility) section in the `hardhat-polkadot` documentation."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#deploy-to-local-node", "page_title": "Use Hardhat with Polkadot Hub", "index": 17, "depth": 3, "title": "Deploy to Local Node", "anchor": "deploy-to-local-node", "start_char": 14324, "end_char": 14954, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Deploy to Local Node\n\nBefore deploying to a live network, you can deploy your contract to a local node using [Ignition](https://hardhat.org/ignition/docs/getting-started#overview) modules:\n\n1. Ensure your local node is running:\n\n    ```bash\n    npx hardhat node\n    ```\n\n2. In a new terminal window, deploy the contract using Ignition:\n\n    ```bash\n    npx hardhat ignition deploy ./ignition/modules/MyToken.js --network localNode\n    ```\n\n!!! tip\n    The `ignition.requiredConfirmations: 1` setting in your config ensures that deployment doesn't hang on local nodes that only produce blocks when transactions are submitted."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#deploy-to-polkadot-hub-testnet", "page_title": "Use Hardhat with Polkadot Hub", "index": 18, "depth": 2, "title": "Deploy to Polkadot Hub TestNet", "anchor": "deploy-to-polkadot-hub-testnet", "start_char": 14954, "end_char": 15723, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy to Polkadot Hub TestNet\n\nAfter testing locally, you can deploy to the Polkadot Hub TestNet:\n\n1. Fund your deployment account with PAS test tokens from the [Polkadot faucet](https://faucet.polkadot.io/).\n\n2. Set your private key as a configuration variable:\n\n    ```bash\n    npx hardhat vars set PRIVATE_KEY\n    ```\n\n    !!! warning\n        Never reveal your private key. Anyone with access to it can control your wallet and steal your funds. Store it securely and never share it publicly or commit it to version control systems.\n\n3. Verify your private key is set:\n\n    ```bash\n    npx hardhat vars get PRIVATE_KEY\n    ```\n\n4. Deploy your contract:\n\n    ```bash\n    npx hardhat ignition deploy ./ignition/modules/MyToken.js --network polkadotTestnet\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#common-issues", "page_title": "Use Hardhat with Polkadot Hub", "index": 19, "depth": 3, "title": "Common Issues", "anchor": "common-issues", "start_char": 15723, "end_char": 16148, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Common Issues\n\n- **Compilation fails with resolc errors**: Ensure you have `@parity/resolc@1.4.0` installed and the version is specified in your `hardhat.config.js`\n- **Deployment hangs on local node**: You might need to set `ignition.requiredConfirmations: 1` in your config file\n- **Binary permission issues**: Run `chmod +x /path/to/your/binary` and on macOS, use `xattr -d com.apple.quarantine /path/to/your/binary`"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-hardhat", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/hardhat/#where-to-go-next", "page_title": "Use Hardhat with Polkadot Hub", "index": 20, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 16148, "end_char": 17256, "estimated_token_count": 285, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81112c9679a123eb53c89b4b04925481e418e67d4dcf48c1905a5e5c9d5e8862", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy a Basic Contract__\n\n    ---\n\n    Ready to start using Hardhat with PVM? Learn how to compile, test, and deploy a basic contract.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-hardhat/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an ERC-20__\n\n    ---\n\n    Walk through deploying a fully-functional ERC-20 to Polkadot Hub using Hardhat.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-hardhat/)\n\n-   <span class=\"badge external\">External</span> __Hardhat Documentation__\n\n    ---\n\n    Learn more about Hardhat's advanced features and best practices.\n\n    [:octicons-arrow-right-24: Get Started](https://hardhat.org/docs)\n\n-   <span class=\"badge external\">External</span> __Hardhat Polkadot Plugin__\n\n    ---\n\n    Explore the full capabilities of the Hardhat Polkadot plugin.\n\n    [:octicons-arrow-right-24: Get Started](https://github.com/paritytech/hardhat-polkadot)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-local-dev-node", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/local-dev-node/#introduction", "page_title": "Local Development Node", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 27, "end_char": 1022, "estimated_token_count": 205, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b520e6ab4f2b90aa24332f30de0a9d5e638ed87010ab4ceac851f09fa5bf634f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nA local development node provides an isolated blockchain environment where you can deploy, test, and debug smart contracts without incurring network fees or waiting for block confirmations. This guide demonstrates how to set up a local Polkadot SDK-based node with smart contract capabilities.\n\nBy the end of this guide, you'll have:\n\n- A running node with smart contract support.\n- An ETH-RPC adapter for Ethereum-compatible tooling integration accessible at `http://localhost:8545`.\n\n!!! info \"Tooling differences\"\n    The local node exposes a subset of the Ethereum JSON-RPC API. Some methods used by Foundry, Hardhat, or other Ethereum-native tools (e.g., for time manipulation or debugging) may be missing or behave differently. See [Differences between Ethereum-native tools and Polkadot EVM networks](/smart-contracts/get-started/#differences-between-ethereum-native-tools-and-polkadot-evm-networks) for implications when running tests and tools against Polkadot nodes."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-local-dev-node", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/local-dev-node/#prerequisites", "page_title": "Local Development Node", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 1022, "end_char": 1319, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b520e6ab4f2b90aa24332f30de0a9d5e638ed87010ab4ceac851f09fa5bf634f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have done the following:\n\n- Completed the [Install Polkadot SDK Dependencies](/parachains/install-polkadot-sdk/) guide and successfully installed [Rust](https://rust-lang.org/) and the required packages to set up your development environment."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-local-dev-node", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/local-dev-node/#install-the-revive-dev-node-and-eth-rpc-adapter", "page_title": "Local Development Node", "index": 2, "depth": 2, "title": "Install the Revive Dev Node and ETH-RPC Adapter", "anchor": "install-the-revive-dev-node-and-eth-rpc-adapter", "start_char": 1319, "end_char": 2766, "estimated_token_count": 328, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b520e6ab4f2b90aa24332f30de0a9d5e638ed87010ab4ceac851f09fa5bf634f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install the Revive Dev Node and ETH-RPC Adapter\n\nThe Polkadot SDK repository contains both the [Revive Dev node](https://github.com/paritytech/polkadot-sdk/tree/8e2b6f742a38bb13688e12abacded0aab2dbbb23/substrate/frame/revive/dev-node) implementation and the [ETH-RPC adapter](https://github.com/paritytech/polkadot-sdk/tree/8e2b6f742a38bb13688e12abacded0aab2dbbb23/substrate/frame/revive/rpc) required for Ethereum compatibility. Start by cloning the repository and navigating to the project directory:\n\n```bash\ngit clone https://github.com/paritytech/polkadot-sdk.git\ncd polkadot-sdk\n```\n\nNext, you need to compile the two essential components for your development environment. The Substrate node provides the core blockchain runtime with smart contract support, while the ETH-RPC adapter enables Ethereum JSON-RPC compatibility for existing tooling:\n\n```bash\ncargo build -p revive-dev-node --bin revive-dev-node --release\ncargo build -p pallet-revive-eth-rpc --bin eth-rpc --release\n```\n\nThe compilation process may take some time depending on your system specifications, potentially up to 30 minutes. Release builds are optimized for performance but take longer to compile than debug builds. After successful compilation, you can verify the binaries are available in the `target/release` directory:\n\n- **Revive Dev node path**: `polkadot-sdk/target/release/revive-dev-node`\n- **ETH-RPC adapter path**: `polkadot-sdk/target/release/eth-rpc`"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-local-dev-node", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/local-dev-node/#run-the-local-node", "page_title": "Local Development Node", "index": 3, "depth": 2, "title": "Run the Local Node", "anchor": "run-the-local-node", "start_char": 2766, "end_char": 9259, "estimated_token_count": 1912, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b520e6ab4f2b90aa24332f30de0a9d5e638ed87010ab4ceac851f09fa5bf634f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run the Local Node\n\nWith the binaries compiled, you can now start your local development environment. The setup requires running two processes.\n\nStart the node first, which will initialize a local blockchain with the `dev` chain specification. This configuration includes `pallet-revive` for smart contract functionality and uses pre-funded development accounts for testing:\n\n```bash\n./target/release/revive-dev-node --dev\n```\n\nThe node will begin producing blocks immediately and display initialization logs:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>./target/release/revive-dev-node --dev</span>\n  <br />\n  <span data-ty>2025-05-29 10:42:35 Substrate Node</span>\n  <span data-ty>2025-05-29 10:42:35 ✌️ version 3.0.0-dev-38b7581fc04</span>\n  <span data-ty>2025-05-29 10:42:35 ❤️ by Parity Technologies &lt;admin@parity.io&gt;, 2017-2025</span>\n  <span data-ty>2025-05-29 10:42:35 📋 Chain specification: Development</span>\n  <span data-ty>2025-05-29 10:42:35 🏷 Node name: annoyed-aunt-3163</span>\n  <span data-ty>2025-05-29 10:42:35 👤 Role: AUTHORITY</span>\n  <span data-ty>2025-05-29 10:42:35 💾 Database: RocksDb at /var/folders/x0/xl_kjddj3ql3bx7752yr09hc0000gn/T/substrate2P85EF/chains/dev/db/full</span>\n  <span data-ty>2025-05-29 10:42:40 🔨 Initializing Genesis block/state (state: 0xfc05…482e, header-hash: 0x1ae1…b8b4)</span>\n  <span data-ty>2025-05-29 10:42:40 Creating transaction pool txpool_type=SingleState ready=Limit { count: 8192, total_bytes: 20971520 } future=Limit { count: 819, total_bytes: 2097152 }</span>\n  <span data-ty>2025-05-29 10:42:40 👴 Loading GRANDPA authority set from genesis on what appears to be first startup.</span>\n  <span data-ty>2025-05-29 10:42:40 👶 Creating empty BABE epoch changes on what appears to be first startup.</span>\n  <span data-ty>2025-05-29 10:42:40 Using default protocol ID \"sup\" because none is configured in the chain specs</span>\n  <span data-ty>2025-05-29 10:42:40 🏷 Local node identity is: 12D3KooWAH8fgJv3hce7Yv4yKG4YXQiRqESFu6755DBnfZQU8Znm</span>\n  <span data-ty>2025-05-29 10:42:40 Running libp2p network backend</span>\n  <span data-ty>2025-05-29 10:42:40 local_peer_id=12D3KooWAH8fgJv3hce7Yv4yKG4YXQiRqESFu6755DBnfZQU8Znm</span>\n  <span data-ty>2025-05-29 10:42:40 💻 Operating system: macos</span>\n  <span data-ty>2025-05-29 10:42:40 💻 CPU architecture: aarch64</span>\n  <span data-ty>2025-05-29 10:42:40 📦 Highest known block at #0</span>\n  <span data-ty>2025-05-29 10:42:40 Error binding to '127.0.0.1:9615': Os { code: 48, kind: AddrInUse, message: \"Address already in use\" }</span>\n  <span data-ty>2025-05-29 10:42:40 Running JSON-RPC server: addr=127.0.0.1:63333,[::1]:63334</span>\n  <span data-ty>2025-05-29 10:42:40 🏁 CPU single core score: 1.24 GiBs, parallelism score: 1.08 GiBs with expected cores: 8</span>\n  <span data-ty>2025-05-29 10:42:40 🏁 Memory score: 49.42 GiBs</span>\n  <span data-ty>2025-05-29 10:42:40 🏁 Disk score (seq. writes): 1.91 GiBs</span>\n  <span data-ty>2025-05-29 10:42:40 🏁 Disk score (rand. writes): 529.02 MiBs</span>\n  <span data-ty>2025-05-29 10:42:40 👶 Starting BABE Authorship worker</span>\n  <span data-ty>2025-05-29 10:42:40 🥩 BEEFY gadget waiting for BEEFY pallet to become available...</span>\n  <span data-ty>2025-05-29 10:42:40 Failed to trigger bootstrap: No known peers.</span>\n  <span data-ty>2025-05-29 10:42:42 🙌 Starting consensus session on top of parent 0x1ae19030b13592b5e6fd326f26efc7b31a4f588303d348ef89ae9ebca613b8b4 (#0)</span>\n  <span data-ty>2025-05-29 10:42:42 🎁 Prepared block for proposing at 1 (5 ms) hash: 0xe046f22307fba58a3bd0cc21b1a057843d4342da8876fd44aba206f124528df0; parent_hash: 0x1ae1…b8b4; end: NoMoreTransactions; extrinsics_count: 2</span>\n  <span data-ty>2025-05-29 10:42:42 🔖 Pre-sealed block for proposal at 1. Hash now 0xa88d36087e7bf8ee59c1b17e0003092accf131ff8353a620410d7283657ce36a, previously 0xe046f22307fba58a3bd0cc21b1a057843d4342da8876fd44aba206f124528df0.</span>\n  <span data-ty>2025-05-29 10:42:42 👶 New epoch 0 launching at block 0xa88d…e36a (block slot 582842054 >= start slot 582842054).</span>\n  <span data-ty>2025-05-29 10:42:42 👶 Next epoch starts at slot 582842254</span>\n  <span data-ty>2025-05-29 10:42:42 🏆 Imported #1 (0x1ae1…b8b4 → 0xa88d…e36a)</span>\n</div>\n\n\nFor debugging purposes or to monitor low-level operations, you can enable detailed logging by setting environment variables before running the command:\n\n```bash\nRUST_LOG=\"error,evm=debug,sc_rpc_server=info,runtime::revive=debug\" ./target/release/revive-dev-node --dev\n```\n\nOnce the node is running, open a new terminal window and start the ETH-RPC adapter. This component translates Ethereum JSON-RPC calls into Substrate-compatible requests, allowing you to use familiar Ethereum tools like MetaMask, Hardhat, or Ethers.js:\n\n```bash\n./target/release/eth-rpc --dev\n```\n\nYou should see logs indicating that the adapter is ready to accept connections:\n\n<div id=\"termynal\" data-termynal>\n  <span data-ty=\"input\"><span class=\"file-path\"></span>./target/release/eth-rpc --dev</span>\n  <br />\n  <span data-ty>2025-05-29 10:48:48 Running in --dev mode, RPC CORS has been disabled.</span>\n  <span data-ty>2025-05-29 10:48:48 Running in --dev mode, RPC CORS has been disabled.</span>\n  <span data-ty>2025-05-29 10:48:48 🌐 Connecting to node at: ws://127.0.0.1:9944 ...</span>\n  <span data-ty>2025-05-29 10:48:48 🌟 Connected to node at: ws://127.0.0.1:9944</span>\n  <span data-ty>2025-05-29 10:48:48 💾 Using in-memory database, keeping only 256 blocks in memory</span>\n  <span data-ty>2025-05-29 10:48:48 〽️ Prometheus exporter started at 127.0.0.1:9616</span>\n  <span data-ty>2025-05-29 10:48:48 Running JSON-RPC server: addr=127.0.0.1:8545,[::1]:8545</span>\n  <span data-ty>2025-05-29 10:48:48 🔌 Subscribing to new blocks (BestBlocks)</span>\n  <span data-ty>2025-05-29 10:48:48 🔌 Subscribing to new blocks (FinalizedBlocks)</span>\n</div>\n\n\nSimilar to the Revive Dev node, you can enable detailed logging for the ETH-RPC adapter to troubleshoot issues:\n\n```bash\nRUST_LOG=\"info,eth-rpc=debug\" ./target/release/eth-rpc --dev\n```\n\nYour local development environment is now active and accessible at `http://localhost:8545`. This endpoint accepts standard Ethereum JSON-RPC requests, enabling seamless integration with existing Ethereum development tools and workflows. \n\nYou can connect wallets, deploy contracts using Remix or Hardhat, and interact with your smart contracts as you would on any Ethereum-compatible network."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-remix", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/remix/#introduction", "page_title": "Use the Remix IDE on Polkadot Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 673, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f80af2f7550ebff7ccf339fbcbb8e06446e0dc06531940d20202a6750487862f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Remix](https://remix.ethereum.org/) is a browser-based IDE that makes it easy to write, compile, and deploy smart contracts without installing any local tools. It’s a great place to experiment, learn, and quickly test contracts on Polkadot. You can generate ERC-20, ERC-721, or other OpenZeppelin-standard contracts with the [OpenZeppelin Contracts Wizard for Polkadot](https://wizard.openzeppelin.com/polkadot), then paste the code into Remix to compile and deploy. This page introduces the main parts of the Remix interface and shows how to connect it to Polkadot so you can deploy and interact with contracts directly from your browser."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-remix", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/remix/#prerequisites", "page_title": "Use the Remix IDE on Polkadot Hub", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 673, "end_char": 944, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f80af2f7550ebff7ccf339fbcbb8e06446e0dc06531940d20202a6750487862f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have:\n\n- A browser with the [MetaMask](https://metamask.io/) extension installed\n- MetaMask connected to Polkadot (see the [Wallet Integrations](/smart-contracts/integrations/wallets/#metamask) guide for setup steps)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-remix", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/remix/#access-remix-ide", "page_title": "Use the Remix IDE on Polkadot Hub", "index": 2, "depth": 2, "title": "Access Remix IDE", "anchor": "access-remix-ide", "start_char": 944, "end_char": 2819, "estimated_token_count": 406, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f80af2f7550ebff7ccf339fbcbb8e06446e0dc06531940d20202a6750487862f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Access Remix IDE\n\nNavigate to [https://remix.ethereum.org/](https://remix.ethereum.org/). The interface will load with a default workspace containing sample contracts. In this interface, you can access the following:\n\n- **Editor panel**: The main coding area where you write and modify your smart contract files. Supports syntax highlighting, auto-completion, and linting.\n- **Terminal**: Shows logs from the compiler, deployment events, transactions, and console.log output. Useful for debugging and tracking execution.\n- **Plugin panel**: Displays icons for each of the preloaded plugins, the plugin manager, and the settings menu. You'll see a few icons there for each of the preloaded plugins:\n\n    - **File explorer**: Displays your project workspace. You can create, open, rename, and organize Solidity files, scripts, and folders.\n    - **File search**: A quick search tool for finding symbols, functions, or text within your project files.\n    - **Solidity compiler**: A plugin that compiles your Solidity contracts. It allows you to select compiler versions, enable optimizations, and view compilation errors or warnings.\n    - **Deploy & run transactions**: Used to deploy contracts and interact with them. Allows you to choose an environment (JavaScript VM, injected provider, or custom RPC), deploy contracts, send transactions, and call read/write functions.\n    - **Debugger**: Allows you to step through a transaction execution line-by-line. You can inspect variables, stack values, storage slots, and opcodes to understand exactly how your contract behaved during a specific transaction.\n    - **Git**: Enables basic Git version control directly inside Remix. You can initialize repositories, view diffs, commit changes, and browse project history without needing an external Git client.\n\n![](/images/smart-contracts/dev-environments/remix/remix-01.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-remix", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/remix/#connect-remix-to-polkadot", "page_title": "Use the Remix IDE on Polkadot Hub", "index": 3, "depth": 2, "title": "Connect Remix to Polkadot", "anchor": "connect-remix-to-polkadot", "start_char": 2819, "end_char": 3483, "estimated_token_count": 156, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f80af2f7550ebff7ccf339fbcbb8e06446e0dc06531940d20202a6750487862f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Connect Remix to Polkadot\n\nYou can connect Remix to Polkadot from the **Deploy & run transactions** tab in the plugin panel:\n\n1. Switch your MetaMask network to Polkadot. For detailed steps on setting up MetaMask for Polkadot, see the [Wallet Integrations](/smart-contracts/integrations/wallets/#metamask) guide.\n2. Click on the **Environment** dropdown.\n3. Hover over **browser extension**.\n4. Select **Injected Provider - MetaMask**.\n\n![](/images/smart-contracts/dev-environments/remix/remix-02.webp)\n\nOnce connected, Remix will display your MetaMask account address under **Accounts**. To switch accounts, change it in MetaMask—Remix updates automatically."}
{"source": "polkadot-docs", "page_id": "smart-contracts-dev-environments-remix", "url": "https://developer.polkadot.com/smart-contracts/dev-environments/remix/#where-to-go-next", "page_title": "Use the Remix IDE on Polkadot Hub", "index": 4, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 3483, "end_char": 4346, "estimated_token_count": 234, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f80af2f7550ebff7ccf339fbcbb8e06446e0dc06531940d20202a6750487862f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Deploy a Basic Contract__\n\n    ---\n\n    Ready to start using Remix? Learn how to compile, test, and deploy a basic contract.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an ERC-20__\n\n    ---\n\n    Walk through deploying a fully-functional ERC-20 to Polkadot Hub using Remix.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/)\n\n-   <span class=\"badge guide\">Guide</span> __Deploy an NFT__\n\n    ---\n\n    Walk through deploying an NFT to Polkadot Hub using Remix.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-explorers", "url": "https://developer.polkadot.com/smart-contracts/explorers/#introduction", "page_title": "Block Explorers", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 20, "end_char": 328, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9258c7a8a0c8cb0e3a3449e5a9a620550652950788c30f390eae1ce576bb8a93", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nBlock explorers serve as comprehensive blockchain analytics platforms that provide access to on-chain data. These web applications function as search engines for blockchain networks, allowing users to query, visualize, and analyze blockchain data in real time through intuitive interfaces."}
{"source": "polkadot-docs", "page_id": "smart-contracts-explorers", "url": "https://developer.polkadot.com/smart-contracts/explorers/#core-functionality", "page_title": "Block Explorers", "index": 1, "depth": 2, "title": "Core Functionality", "anchor": "core-functionality", "start_char": 328, "end_char": 1012, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9258c7a8a0c8cb0e3a3449e5a9a620550652950788c30f390eae1ce576bb8a93", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Functionality\n\nBlock explorers provide essential capabilities for interacting with smart contracts on Polkadot Hub:\n\n- **Transaction tracking**: Monitor transaction status, confirmations, fees, and metadata.\n- **Address analysis**: View account balances, transaction history, and associated contracts.\n- **Block information**: Examine block contents.\n- **Smart contract interaction**: Review contract code, verification status, and interaction history.\n- **Token tracking**: Monitor ERC-20, ERC-721, and other token standards with transfer history and holder analytics.\n- **Network statistics**: Access metrics on transaction volume, gas usage, and other network parameters."}
{"source": "polkadot-docs", "page_id": "smart-contracts-explorers", "url": "https://developer.polkadot.com/smart-contracts/explorers/#available-block-explorers", "page_title": "Block Explorers", "index": 2, "depth": 2, "title": "Available Block Explorers", "anchor": "available-block-explorers", "start_char": 1012, "end_char": 1197, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9258c7a8a0c8cb0e3a3449e5a9a620550652950788c30f390eae1ce576bb8a93", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Available Block Explorers\n\nThe following block explorers are available for Polkadot Hub smart contracts, providing specialized tools for monitoring and analyzing contract activity."}
{"source": "polkadot-docs", "page_id": "smart-contracts-explorers", "url": "https://developer.polkadot.com/smart-contracts/explorers/#blockscout", "page_title": "Block Explorers", "index": 3, "depth": 3, "title": "BlockScout", "anchor": "blockscout", "start_char": 1197, "end_char": 1713, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9258c7a8a0c8cb0e3a3449e5a9a620550652950788c30f390eae1ce576bb8a93", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### BlockScout\n\nBlockScout is an open-source explorer platform hosted by Parity under the `polkadot.io` domain. It excels at EVM-focused analytics, contract verification without an API key, and provides developers with a full Etherscan-compatible API.\n\n- [Polkadot Hub BlockScout](https://blockscout.polkadot.io/)\n- [Polkadot Hub TestNet BlockScout](https://blockscout-testnet.polkadot.io/)\n- [Kusama Hub BlockScout](https://blockscout-kusama.polkadot.io/)\n\n![](/images/smart-contracts/explorers/explorers-01.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-explorers", "url": "https://developer.polkadot.com/smart-contracts/explorers/#subscan", "page_title": "Block Explorers", "index": 4, "depth": 3, "title": "Subscan", "anchor": "subscan", "start_char": 1713, "end_char": 2261, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9258c7a8a0c8cb0e3a3449e5a9a620550652950788c30f390eae1ce576bb8a93", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Subscan\n\nSubscan is the flagship Polkadot ecosystem block explorer. It is Substrate-native and provides comprehensive support for both Substrate-level data (pallets, extrinsics, events) and EVM transactions and smart contracts, making it well-suited for inspecting both layers simultaneously.\n\n- [Polkadot Hub Subscan](https://assethub-polkadot.subscan.io/)\n- [Polkadot Hub TestNet Subscan](https://assethub-paseo.subscan.io/)\n- [Kusama Hub Subscan](https://assethub-kusama.subscan.io/)\n\n![](/images/smart-contracts/explorers/explorers-03.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-faucet", "url": "https://developer.polkadot.com/smart-contracts/faucet/#get-test-tokens", "page_title": "Get Tokens from the Official Faucet", "index": 0, "depth": 2, "title": "Get Test Tokens", "anchor": "get-test-tokens", "start_char": 474, "end_char": 1100, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:12d62d2fc73478eb480f5b83fc34369aa09a67f20d880951aed46a36683917de", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Get Test Tokens\n\nFor Polkadot Hub TestNet, you can use the [Polkadot Faucet](https://faucet.polkadot.io/) to obtain test tokens. Here's how to do it:\n\n1. Navigate to the [Polkadot Faucet](https://faucet.polkadot.io/). If the desired network is not already selected, choose it from the **Network** drop-down. This example uses the Polkadot Hub TestNet.\n2. Copy your address linked to the TestNet and paste it into the designated field.\n3. Click the **Get Some PASs** button to request free test PAS tokens. These tokens will be sent to your wallet shortly.\n\n![Polkadot Faucet](/images/smart-contracts/faucet/faucet-01.gif)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-faucet", "url": "https://developer.polkadot.com/smart-contracts/faucet/#things-to-consider", "page_title": "Get Tokens from the Official Faucet", "index": 1, "depth": 2, "title": "Things to Consider", "anchor": "things-to-consider", "start_char": 1100, "end_char": 1524, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:12d62d2fc73478eb480f5b83fc34369aa09a67f20d880951aed46a36683917de", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Things to Consider\n\n!!! info \"Rate Limiting\"\n    Faucets typically implement rate limiting to prevent abuse. You may need to wait between requests if you've recently obtained tokens from the same faucet.\n\n!!! warning \"Network Compatibility\"\n    Ensure your wallet is connected to the correct network (Polkadot Hub TestNet) before requesting tokens. Tokens sent to addresses on different networks will not be accessible."}
{"source": "polkadot-docs", "page_id": "smart-contracts-faucet", "url": "https://developer.polkadot.com/smart-contracts/faucet/#using-your-test-tokens", "page_title": "Get Tokens from the Official Faucet", "index": 2, "depth": 2, "title": "Using Your Test Tokens", "anchor": "using-your-test-tokens", "start_char": 1524, "end_char": 1829, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:12d62d2fc73478eb480f5b83fc34369aa09a67f20d880951aed46a36683917de", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Using Your Test Tokens\n\nGetting started with test tokens is the first step in your Polkadot development journey. These free resources enable you to build, experiment with, and refine your applications without financial constraints, ensuring your projects are robust and ready for deployment on MainNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#introduction", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 816, "end_char": 1669, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub natively utilizes Polkadot's 32-byte account system while providing interoperability with Ethereum's 20-byte addresses through an automatic conversion system. When interacting with smart contracts:\n\n- Ethereum-compatible wallets (like MetaMask) can use their familiar 20-byte addresses.\n- Polkadot accounts continue using their native 32-byte format.\n- The Polkadot Hub chain automatically handles conversion between the two formats behind the scenes:\n\n    - 20-byte Ethereum addresses are padded with `0xEE` bytes to create valid 32-byte Polkadot accounts.\n    - 32-byte Polkadot accounts can optionally register a mapping to a 20-byte address for Ethereum compatibility.\n\nThis dual-format approach enables Polkadot Hub to maintain compatibility with Ethereum tooling while fully integrating with the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#address-types-and-mappings", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 1, "depth": 2, "title": "Address Types and Mappings", "anchor": "address-types-and-mappings", "start_char": 1669, "end_char": 1934, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Address Types and Mappings\n\nThe platform handles two distinct address formats:\n\n- [Ethereum-style addresses (20 bytes)](https://ethereum.org/developers/docs/accounts/#account-creation)\n- [Polkadot native account IDs (32 bytes)](/reference/parachains/accounts/)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#ethereum-to-polkadot-mapping", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 2, "depth": 3, "title": "Ethereum to Polkadot Mapping", "anchor": "ethereum-to-polkadot-mapping", "start_char": 1934, "end_char": 2931, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Ethereum to Polkadot Mapping\n\nThe [`AccountId32Mapper`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/struct.AccountId32Mapper.html) implementation in [`pallet_revive`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/index.html) handles the core address conversion logic. For converting a 20-byte Ethereum address to a 32-byte Polkadot address, the pallet uses a simple concatenation approach:\n\n- [**Core mechanism**](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.to_fallback_account_id): Takes a 20-byte Ethereum address and extends it to 32 bytes by adding twelve `0xEE` bytes at the end. The key benefits of this approach are:\n    - Able to fully revert, allowing a smooth transition back to the Ethereum format.\n    - Provides clear identification of Ethereum-controlled accounts through the `0xEE` suffix pattern.\n    - Maintains cryptographic security with a `2^96` difficulty for pattern reproduction."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#polkadot-to-ethereum-mapping", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 3, "depth": 3, "title": "Polkadot to Ethereum Mapping", "anchor": "polkadot-to-ethereum-mapping", "start_char": 2931, "end_char": 5190, "estimated_token_count": 485, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Polkadot to Ethereum Mapping\n\nThe conversion from 32-byte Polkadot accounts to 20-byte Ethereum addresses is more complex than the reverse direction due to the lossy nature of the conversion. The [`AccountId32Mapper`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/struct.AccountId32Mapper.html) handles this through two distinct approaches:\n\n- **For Ethereum-derived accounts**: The system uses the [`is_eth_derived`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.is_eth_derived) function to detect accounts that were originally Ethereum addresses (identified by the `0xEE` suffix pattern). For these accounts, the conversion strips the last 12 bytes to recover the original 20-byte Ethereum address.\n\n- **For native Polkadot accounts**: Since these accounts utilize the whole 32-byte space and weren't derived from Ethereum addresses, direct truncation would result in lost information. Instead, the system:\n\n    1. Hashes the entire 32-byte account using Keccak-256.\n    2. Takes the last 20 bytes of the hash to create the Ethereum address.\n    3. This ensures a deterministic mapping while avoiding simple truncation.\n\nThe conversion process is implemented through the [`to_address`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.to_address) function, which automatically detects the account type and applies the appropriate conversion method.\n\n**Stateful Mapping for Reversibility** : Since the conversion from 32-byte to 20-byte addresses is inherently lossy, the system provides an optional stateful mapping through the [`OriginalAccount`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/pallet/storage_types/struct.OriginalAccount.html) storage. When a Polkadot account registers a mapping (via the [`map`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.map) function), the system stores the original 32-byte account ID, enabling the [`to_account_id`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.to_account_id) function to recover the exact original account rather than falling back to a default conversion."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#interacting-with-unmapped-substrate-accounts", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 4, "depth": 3, "title": "Interacting with Unmapped Substrate Accounts", "anchor": "interacting-with-unmapped-substrate-accounts", "start_char": 5190, "end_char": 7033, "estimated_token_count": 332, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Interacting with Unmapped Substrate Accounts\n\nNative Polkadot accounts (32-byte format) that haven't been explicitly mapped have limited interaction capabilities with the Ethereum-compatible smart contract layer. Understanding these limitations and when mapping is required is essential for developers working with Polkadot Hub smart contracts.\n\n#### Limitations of Unmapped Accounts\n\nUnmapped Substrate accounts (those created with Ed25519 or Sr25519 keypairs) face the following restrictions:\n\n- Cannot initiate transactions through Ethereum-compatible interfaces (like MetaMask or other EVM-compatible wallets).\n- Cannot directly call smart contracts using Ethereum RPC methods.\n- Cannot transfer funds to or from 20-byte Ethereum-compatible addresses without proper mapping.\n- Limited interoperability with Ethereum tooling and existing EVM infrastructure.\n\nThe system can *receive* funds at the hashed 20-byte address derived from the 32-byte account, but the original account owner cannot control or access those funds through Ethereum-compatible methods without first establishing a proper mapping.\n\n#### When Mapping is Required\n\nAccount mapping is **required** when:\n\n- You want to interact with smart contracts using Ethereum-compatible tools (MetaMask, Web3.js, Ethers.js).\n- You need to transfer funds using 20-byte address format.\n- You want your existing Polkadot account to be accessible through EVM-compatible interfaces.\n- You need bidirectional compatibility between Polkadot and Ethereum address formats.\n\nAccount mapping is **not required** when:\n\n- Using native Polkadot addresses (32-byte) exclusively with Substrate-native interfaces.\n- Interacting with parachains that don't use the Ethereum-compatible layer.\n- Using accounts that were originally created with secp256k1 keys (Ethereum-compatible from the start)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#account-mapping-for-native-polkadot-accounts", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 5, "depth": 3, "title": "Account Mapping for Native Polkadot Accounts", "anchor": "account-mapping-for-native-polkadot-accounts", "start_char": 7033, "end_char": 8744, "estimated_token_count": 363, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Account Mapping for Native Polkadot Accounts\n\nIf you have a native Polkadot account (32-byte format) that was created with a Polkadot/Substrate keypair (Ed25519/Sr25519) rather than an Ethereum-compatible keypair (secp256k1), you'll need to map your account to enable Ethereum compatibility.\n\nTo map your account, call the [`map_account`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/pallet/dispatchables/fn.map_account.html) extrinsic of the [`pallet_revive`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/index.html) pallet using your original Substrate account. This creates a stateful mapping that allows your 32-byte account to interact with the Ethereum-compatible smart contract system.\n\n**Mapping Process:**\n\n1. **Call the extrinsic**: Use your Substrate wallet to call `pallet_revive.map_account()`.\n2. **Pay the deposit**: A deposit is required and held while the mapping exists (refundable upon unmapping).\n3. **Receive confirmation**: Once mapped, your account can be used with both Polkadot and Ethereum interfaces.\n\nOnce mapped, you'll be able to:\n\n- Transfer funds between 20-byte format addresses.\n- Interact with smart contracts using Ethereum-compatible tools like MetaMask.\n- Maintain full reversibility to your original 32-byte account format.\n- Access funds at both your 32-byte Polkadot address and the mapped 20-byte Ethereum address.\n\n!!! warning \"Mapping Requirement\"\n    Without this mapping, native Polkadot accounts cannot transfer funds or interact with the Ethereum-compatible layer on the Hub. Attempting to send funds to an unmapped account's hashed Ethereum address may result in funds being inaccessible through standard Ethereum tools."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#account-registration", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 6, "depth": 2, "title": "Account Registration", "anchor": "account-registration", "start_char": 8744, "end_char": 9173, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Account Registration\n\nThe registration process is implemented through the [`map`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.map) function. This process involves:\n\n- Checking if the account is already mapped.\n- Calculating and collecting required deposits based on data size.\n- Storing the address suffix for future reference.\n- Managing the currency holds for security."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#fallback-accounts", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 7, "depth": 2, "title": "Fallback Accounts", "anchor": "fallback-accounts", "start_char": 9173, "end_char": 9802, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fallback Accounts\n\nThe fallback mechanism is integrated into the [`to_account_id`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.to_account_id) function. It provides a safety net for address conversion by:\n\n- First, attempting to retrieve stored mapping data from [`OriginalAccount`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/pallet/storage_types/struct.OriginalAccount.html) storage.\n- Falling back to the default conversion method (Keccak-256 hash) if no explicit mapping exists.\n- Maintaining consistency in address representation across the system."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#how-fallback-works-with-unmapped-accounts", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 8, "depth": 3, "title": "How Fallback Works with Unmapped Accounts", "anchor": "how-fallback-works-with-unmapped-accounts", "start_char": 9802, "end_char": 11096, "estimated_token_count": 266, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How Fallback Works with Unmapped Accounts\n\nWhen an unmapped 32-byte Polkadot account needs to be represented as a 20-byte Ethereum address, the system:\n\n1. **Checks for explicit mapping**: First looks in the `OriginalAccount` storage to see if the account has been explicitly mapped via `map_account`.\n2. **Applies fallback conversion**: If no mapping exists, automatically converts the 32-byte account to a 20-byte address by:\n   - Hashing the full 32-byte account with Keccak-256.\n   - Taking the last 20 bytes of the resulting hash.\n3. **Uses the derived address**: This fallback address can receive funds, but the account owner cannot spend those funds through Ethereum-compatible interfaces without explicit mapping.\n\n**Important Considerations:**\n\n- The fallback mechanism is **one-way for unmapped accounts**. While you can derive the 20-byte address from a 32-byte account, you cannot recover the original 32-byte account from the 20-byte hash without the stored mapping.\n- Funds sent to a fallback address of an unmapped account are not lost, but require explicit mapping to be accessible through Ethereum tools.\n- For security and usability, it's recommended to establish explicit mappings rather than relying on fallback addresses for accounts that need Ethereum compatibility."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#contract-address-generation", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 9, "depth": 2, "title": "Contract Address Generation", "anchor": "contract-address-generation", "start_char": 11096, "end_char": 11662, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Contract Address Generation\n\nThe system supports two methods for generating contract addresses:\n\n- [CREATE1 method](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/fn.create1.html):\n\n    - Uses the deployer address and nonce.\n    - Generates deterministic addresses for standard contract deployment.\n\n- [CREATE2 method](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/fn.create2.html):\n\n    - Uses the deployer address, initialization code, input data, and salt.\n    - Enables predictable address generation for advanced use cases."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-accounts", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/accounts/#security-considerations", "page_title": "Accounts in Polkadot Hub Smart Contracts", "index": 10, "depth": 2, "title": "Security Considerations", "anchor": "security-considerations", "start_char": 11662, "end_char": 12727, "estimated_token_count": 244, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642188b8ff7542b53b0fc594f98c649e629103961741590d7f2fbc2104d76a1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Security Considerations\n\nThe address mapping system maintains security through several design choices evident in the implementation:\n\n- The stateless mapping requires no privileged operations, as shown in the [`to_fallback_account_id`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/trait.AddressMapper.html#tymethod.to_fallback_account_id) implementation.\n- The stateful mapping requires a deposit managed through the [`Currency`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/pallet/trait.Config.html#associatedtype.Currency) trait.\n- Mapping operations are protected against common errors through explicit checks.\n- The system prevents double-mapping through the [`ensure!(!Self::is_mapped(account_id))`](https://github.com/paritytech/polkadot-sdk/blob/stable2412/substrate/frame/revive/src/address.rs#L125) check.\n\nAll source code references are from the [`address.rs`](https://github.com/paritytech/polkadot-sdk/blob/stable2412/substrate/frame/revive/src/address.rs) file in the Revive pallet of the Polkadot SDK repository."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#introduction", "page_title": "Transactions and Fees on Asset Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 35, "end_char": 463, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nAsset Hub smart contracts operate within the Polkadot ecosystem using the [`pallet_revive`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/) implementation, which provides EVM compatibility. While many aspects of blocks and transactions are inherited from the underlying parachain architecture, there are specific considerations and mechanisms unique to smart contract operations on Asset Hub."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#smart-contract-blocks", "page_title": "Transactions and Fees on Asset Hub", "index": 1, "depth": 2, "title": "Smart Contract Blocks", "anchor": "smart-contract-blocks", "start_char": 463, "end_char": 1054, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Smart Contract Blocks\n\nSmart contract blocks in Asset Hub follow the same fundamental structure as parachain blocks, inheriting all standard parachain block components. The `pallet_revive` implementation maintains this consistency while adding necessary [EVM-specific features](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/evm). For detailed implementation specifics, the [`Block`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/evm/struct.Block.html) struct in `pallet_revive` demonstrates how parachain and smart contract block implementations align."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#smart-contract-transactions", "page_title": "Transactions and Fees on Asset Hub", "index": 2, "depth": 2, "title": "Smart Contract Transactions", "anchor": "smart-contract-transactions", "start_char": 1054, "end_char": 1278, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Smart Contract Transactions\n\nAsset Hub implements a sophisticated transaction system that supports various transaction types and formats, encompassing both traditional parachain operations and EVM-specific interactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#evm-transaction-types", "page_title": "Transactions and Fees on Asset Hub", "index": 3, "depth": 3, "title": "EVM Transaction Types", "anchor": "evm-transaction-types", "start_char": 1278, "end_char": 3232, "estimated_token_count": 401, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### EVM Transaction Types\n\nThe system provides a fundamental [`eth_transact`](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/pallet/dispatchables/fn.eth_transact.html) interface for processing raw EVM transactions dispatched through [Ethereum JSON-RPC APIs](/smart-contracts/for-eth-devs/json-rpc-apis/). This interface acts as a wrapper for Ethereum transactions, requiring an encoded signed transaction payload, though it cannot be dispatched directly. Building upon this foundation, the system supports multiple transaction formats to accommodate different use cases and optimization needs:\n\n- **[Legacy transactions](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/evm/struct.TransactionLegacyUnsigned.html)**: The original Ethereum transaction format, providing basic transfer and contract interaction capabilities. These transactions use a simple pricing mechanism and are supported for backward compatibility.\n\n- **[EIP-1559 transactions](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/evm/struct.Transaction1559Unsigned.html)**: An improved transaction format that introduces a more predictable fee mechanism with base fee and priority fee components. This format helps optimize gas fee estimation and network congestion management.\n\n- **[EIP-2930 transactions](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/evm/struct.Transaction2930Unsigned.html)**: Introduces access lists to optimize gas costs for contract interactions by pre-declaring accessed addresses and storage slots.\n\n- **[EIP-4844 transactions](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/evm/struct.Transaction4844Unsigned.html)**: Implements blob-carrying transactions, designed to optimize Layer 2 scaling solutions by providing dedicated space for roll-up data.\n\nEach transaction type can exist in both signed and unsigned states, with appropriate validation and processing mechanisms for each."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#fees-and-gas", "page_title": "Transactions and Fees on Asset Hub", "index": 4, "depth": 2, "title": "Fees and Gas", "anchor": "fees-and-gas", "start_char": 3232, "end_char": 3440, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fees and Gas\n\nAsset Hub implements a sophisticated resource management system that combines parachain transaction fees with EVM gas mechanics, providing both Ethereum compatibility and enhanced features."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#gas-model-overview", "page_title": "Transactions and Fees on Asset Hub", "index": 5, "depth": 3, "title": "Gas Model Overview", "anchor": "gas-model-overview", "start_char": 3440, "end_char": 5087, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Gas Model Overview\n\nGas serves as the fundamental unit for measuring computational costs, with each network operation consuming a specified amount. This implementation maintains compatibility with Ethereum's approach while adding parachain-specific optimizations.\n\n- **Dynamic gas scaling**: Asset Hub implements a dynamic pricing mechanism that reflects actual execution performance. This results in:\n\n    - More efficient pricing for computational instructions relative to I/O operations.\n    - Better correlation between gas costs and actual resource consumption.\n    - Need for developers to implement flexible gas calculation rather than hardcoding values.\n\n- **Multi-dimensional resource metering**: Asset Hub extends beyond the traditional single-metric gas model to track three distinct resources.\n\n    - `ref_time` (computation time):\n\n        - Functions as traditional gas equivalent.\n        - Measures actual computational resource usage.\n        - Primary metric for basic operation costs.\n\n\n    - `proof_size` (verification overhead):\n\n        - Tracks state proof size required for validator verification.\n        - Helps manage consensus-related resource consumption.\n        - Important for cross-chain operations.\n\n\n    - `storage_deposit` (state management):\n\n        - Manages blockchain state growth.\n        - Implements a deposit-based system for long-term storage.\n        - Refundable when storage is freed.\n\nThese resources can be limited at both transaction and contract levels, similar to Ethereum's gas limits. For more information, check the [Gas Model](/smart-contracts/for-eth-devs/gas-model/) documentation."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#fee-components", "page_title": "Transactions and Fees on Asset Hub", "index": 6, "depth": 3, "title": "Fee Components", "anchor": "fee-components", "start_char": 5087, "end_char": 5563, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fee Components\n\n- Base fees:\n\n    - Storage deposit for contract deployment.\n    - Minimum transaction fee for network access.\n    - Network maintenance costs.\n\n- Execution fees:\n\n    - Computed based on gas consumption.\n    - Converted to native currency using network-defined rates.\n    - Reflects actual computational resource usage.\n\n- Storage fees:\n\n    - Deposit for long-term storage usage.\n    - Refundable when storage is freed.\n    - Helps prevent state bloat."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-blocks-transactions-fees", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/blocks-transactions-fees/#gas-calculation-and-conversion", "page_title": "Transactions and Fees on Asset Hub", "index": 7, "depth": 3, "title": "Gas Calculation and Conversion", "anchor": "gas-calculation-and-conversion", "start_char": 5563, "end_char": 5911, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:79598e761f150f6b602a114fbb25c73c899c756ceecacb317df75fad1192c2c1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Gas Calculation and Conversion\n\nThe system maintains precise conversion mechanisms between:\n\n- Substrate weights and EVM gas units.\n- Native currency and gas costs.\n- Different resource metrics within the multi-dimensional model.\n\nThis ensures accurate fee calculation while maintaining compatibility with existing Ethereum tools and workflows."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#introduction", "page_title": "Contract Deployment", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 24, "end_char": 555, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot's smart contract platform supports two distinct virtual machine backends: Rust Ethereum Virtual Machine (REVM) and PVM. Each backend has its own deployment characteristics and optimization strategies. REVM provides full Ethereum compatibility with familiar single-step deployment, while the RISC-V-based PVM uses a more structured two-step approach optimized for its architecture. Understanding these differences ensures smooth deployment regardless of which backend you choose for your smart contracts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#revm-deployment", "page_title": "Contract Deployment", "index": 1, "depth": 2, "title": "REVM Deployment", "anchor": "revm-deployment", "start_char": 555, "end_char": 1089, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## REVM Deployment\n\nThe REVM backend enables seamless deployment of Ethereum contracts without modification. Contracts deploy exactly as they would on Ethereum, using familiar tools and workflows.\n\nWith REVM, deployment mirrors the Ethereum flow exactly including:\n\n- Contracts are bundled and deployed in a single transaction.\n- Factory contracts can create new contracts at runtime.\n- Runtime code generation, including inline assembly, is supported.\n- Existing familiar tools like Hardhat, Foundry, and Remix work out of the box."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#pvm-deployment", "page_title": "Contract Deployment", "index": 2, "depth": 2, "title": "PVM Deployment", "anchor": "pvm-deployment", "start_char": 1089, "end_char": 1353, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PVM Deployment\n\nPVM implements a fundamentally different deployment model optimized for its RISC-V architecture. While simple contract deployments work seamlessly, advanced patterns like factory contracts require understanding the two-step deployment process."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#standard-contract-deployment", "page_title": "Contract Deployment", "index": 3, "depth": 3, "title": "Standard Contract Deployment", "anchor": "standard-contract-deployment", "start_char": 1353, "end_char": 1684, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Standard Contract Deployment\n\nFor most use cases, such as deploying ERC-20 tokens, NFT collections, or standalone contracts, deployment is transparent and requires no special steps. The [Revive compiler](https://github.com/paritytech/revive) handles the deployment process automatically when using standard Solidity patterns."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#two-step-deployment-model", "page_title": "Contract Deployment", "index": 4, "depth": 3, "title": "Two-Step Deployment Model", "anchor": "two-step-deployment-model", "start_char": 1684, "end_char": 2094, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Two-Step Deployment Model\n\nPVM separates contract deployment into distinct phases:\n\n1. **Code upload**: Contract bytecode must be uploaded to the chain before instantiation.\n2. **Contract instantiation**: Contracts are created by referencing previously uploaded code via its hash.\n\nThis architecture differs from the EVM's bundled approach and has important implications for specific deployment patterns."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#factory-pattern-considerations", "page_title": "Contract Deployment", "index": 5, "depth": 3, "title": "Factory Pattern Considerations", "anchor": "factory-pattern-considerations", "start_char": 2094, "end_char": 2917, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Factory Pattern Considerations\n\nThe common EVM pattern, where contracts dynamically create other contracts, requires adaptation for PVM as follows:\n\n**EVM Factory Pattern:**\n```solidity\n// This works on REVM but requires modification for PVM\ncontract Factory {\n    function createToken() public returns (address) {\n        // EVM bundles bytecode in the factory\n        return address(new Token());\n    }\n}\n```\n\n**PVM Requirements:**\n\n- **Pre-upload dependent contracts**: All contracts that will be instantiated at runtime must be uploaded to the chain before the factory attempts to create them.\n- **Code hash references**: Factory contracts work with pre-uploaded code hashes rather than embedding bytecode.\n- **No runtime code generation**: Dynamic bytecode generation is not supported due to PVM's RISC-V format."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#migration-strategy-for-factory-contracts", "page_title": "Contract Deployment", "index": 6, "depth": 3, "title": "Migration Strategy for Factory Contracts", "anchor": "migration-strategy-for-factory-contracts", "start_char": 2917, "end_char": 3438, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Migration Strategy for Factory Contracts\n\nWhen migrating factory contracts from Ethereum to PVM:\n\n1. **Identify all contracts**: Determine which contracts will be instantiated at runtime.\n2. **Upload dependencies first**: Deploy all dependent contracts to the chain before deploying the factory.\n3. **Use on-chain constructors**: Leverage PVM's on-chain constructor feature for flexible instantiation.\n4. **Avoid assembly creation**: Don't use `create` or `create2` opcodes in assembly blocks for manual deployment."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#architecture-specific-limitations", "page_title": "Contract Deployment", "index": 7, "depth": 3, "title": "Architecture-Specific Limitations", "anchor": "architecture-specific-limitations", "start_char": 3438, "end_char": 4054, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Architecture-Specific Limitations\n\nPVM's deployment model creates several specific constraints:\n\n- **`EXTCODECOPY` limitations**: Contracts using `EXTCODECOPY` to manipulate code at runtime will encounter issues.\n- **Runtime code modification**: Patterns that construct and mutate contract code on-the-fly are not supported.\n- **Assembly-based factories**: Factory contracts written in YUL assembly that generate code at runtime will fail with `CodeNotFound` errors.\n\nThese patterns are rare in practice and typically require dropping down to assembly, making them non-issues for standard Solidity development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#on-chain-constructors", "page_title": "Contract Deployment", "index": 8, "depth": 3, "title": "On-Chain Constructors", "anchor": "on-chain-constructors", "start_char": 4054, "end_char": 4388, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### On-Chain Constructors\n\nPVM provides on-chain constructors as an elegant alternative to runtime code modification:\n\n- Enable contract instantiation without runtime code generation.\n- Support flexible initialization patterns.\n- Maintain separation between code upload and contract creation.\n- Provide predictable deployment costs."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#gas-estimation-vs-actual-consumption", "page_title": "Contract Deployment", "index": 9, "depth": 2, "title": "Gas Estimation vs Actual Consumption", "anchor": "gas-estimation-vs-actual-consumption", "start_char": 4388, "end_char": 4933, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Gas Estimation vs Actual Consumption\n\nBoth REVM and PVM deployments may show significant differences between gas estimation and actual consumption. You might see estimates that are several times higher than the actual gas consumed (often around 30% of the estimate). This is normal behavior because pre-dispatch estimation cannot distinguish between computation weight and storage deposits, leading to conservative overestimation. Contract deployments are particularly affected as they consume significant storage deposits for code storage."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#deployment-comparison", "page_title": "Contract Deployment", "index": 10, "depth": 2, "title": "Deployment Comparison", "anchor": "deployment-comparison", "start_char": 4933, "end_char": 5648, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deployment Comparison\n\n|        Feature        |      REVM Backend       |           PVM Backend           |\n|:---------------------:|:-----------------------:|:-------------------------------:|\n| **Deployment Model**  |   Single-step bundled   | Two-step upload and instantiate |\n| **Factory Patterns**  | Direct runtime creation |   Requires pre-uploaded code    |\n|   **Code Bundling**   | Bytecode in transaction |      Code hash references       |\n|  **Runtime Codegen**  |     Fully supported     |          Not supported          |\n| **Simple Contracts**  | No modifications needed |     No modifications needed     |\n| **Assembly Creation** |        Supported        |  Discouraged, limited support   |"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-contract-deployment", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/contract-deployment/#conclusion", "page_title": "Contract Deployment", "index": 11, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 5648, "end_char": 6077, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:11a10477d15bf18b55b65bc21f0c965430e5da64089b436f2c3a89415a8cef34", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nBoth backends support contract deployment effectively, with REVM offering drop-in Ethereum compatibility and PVM providing a more structured two-step approach. For the majority of use cases—deploying standard contracts like tokens or applications—both backends work seamlessly. Advanced patterns like factory contracts may require adjustment for PVM, but these adaptations are straightforward with proper planning."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#introduction", "page_title": "Dual Virtual Machine Stack", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 31, "end_char": 752, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot's smart contract platform supports two distinct virtual machine (VM) architectures, providing developers with flexibility in selecting the optimal execution backend for their specific needs. This approach strikes a balance between immediate Ethereum compatibility and long-term innovation, enabling developers to deploy either unmodified (Ethereum Virtual Machine) EVM contracts using Rust Ethereum Virtual Machine (REVM) or optimize for higher performance using PolkaVM (PVM).\n\nBoth VM options share common infrastructure, including RPC interfaces, tooling support, and precompiles. The following sections compare architectures and guide you in selecting the best VM for your project's needs."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#revm-backend", "page_title": "Dual Virtual Machine Stack", "index": 1, "depth": 2, "title": "REVM Backend", "anchor": "revm-backend", "start_char": 752, "end_char": 953, "estimated_token_count": 43, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## REVM Backend\n\nThe [REVM backend](https://github.com/bluealloy/revm) is a complete Rust implementation of the Ethereum Virtual Machine, enabling Solidity contracts to run unchanged on Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#key-benefits", "page_title": "Dual Virtual Machine Stack", "index": 2, "depth": 3, "title": "Key Benefits", "anchor": "key-benefits", "start_char": 953, "end_char": 1420, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key Benefits\n\n- **Zero modifications required**: Deploy existing Ethereum contracts exactly as they are.\n- **Full EVM compatibility**: Exact EVM behavior for audit tools and bytecode inspection.\n- **Familiar tooling**: Use Hardhat, Foundry, Remix, and all standard Ethereum development tools.\n- **Rapid deployment**: Get your contracts running on Polkadot immediately.\n- **Established infrastructure**: Work with the Ethereum tooling ecosystem you already know."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#how-it-works", "page_title": "Dual Virtual Machine Stack", "index": 3, "depth": 3, "title": "How It Works", "anchor": "how-it-works", "start_char": 1420, "end_char": 1622, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How It Works\n\nREVM enables Ethereum developers to seamlessly migrate to Polkadot, achieving improved performance and lower fees without modifying their existing contracts or development workflows."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#architecture", "page_title": "Dual Virtual Machine Stack", "index": 4, "depth": 2, "title": "Architecture", "anchor": "architecture", "start_char": 1622, "end_char": 1639, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Architecture"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#revive-pallet", "page_title": "Dual Virtual Machine Stack", "index": 5, "depth": 3, "title": "Revive Pallet", "anchor": "revive-pallet", "start_char": 1639, "end_char": 2743, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Revive Pallet\n\n[**`pallet_revive`**](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/index.html) is the runtime module that executes smart contracts. It processes Ethereum-style transactions through the following workflow:\n\n```mermaid\nsequenceDiagram\n    participant User as User/dApp\n    participant Proxy as Ethereum JSON RPC Proxy\n    participant Chain as Blockchain Node\n    participant Pallet as pallet_revive\n\n    User->>Proxy: Submit Ethereum Transaction\n    Proxy->>Chain: Repackage as Polkadot Compatible Transaction\n    Chain->>Pallet: Process Transaction\n    Pallet->>Pallet: Decode Ethereum Transaction\n    Pallet->>Pallet: Execute Contract\n    Pallet->>Chain: Return Results\n    Chain->>Proxy: Forward Results\n    Proxy->>User: Return Ethereum-compatible Response\n```\n\nThis proxy-based approach eliminates the need for node binary modifications, maintaining compatibility across different client implementations. Preserving the original Ethereum transaction payload simplifies the adaptation of existing tools, which can continue processing familiar transaction formats."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#alternative-pvm-backend", "page_title": "Dual Virtual Machine Stack", "index": 6, "depth": 2, "title": "Alternative: PVM Backend", "anchor": "alternative-pvm-backend", "start_char": 2743, "end_char": 3431, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Alternative: PVM Backend\n\nFor advanced use cases requiring maximum performance, Polkadot Hub also supports the [PVM (Polkadot Virtual Machine)](https://github.com/paritytech/polkavm) backend. PVM uses a RISC-V-based architecture that can provide performance optimizations for computationally intensive workloads. Solidity contracts can be compiled to PVM bytecode using the `resolc` compiler.\n\nRust is also well-suited for PVM. Tooling is still limited, so consider using LLMs and coding agents to supplement development.\n\nMost developers should start with REVM for its simplicity and full Ethereum compatibility. PVM is available for projects with specific performance requirements."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-dual-vm-stack", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/dual-vm-stack/#where-to-go-next", "page_title": "Dual Virtual Machine Stack", "index": 7, "depth": 2, "title": "Where To Go Next", "anchor": "where-to-go-next", "start_char": 3431, "end_char": 3756, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9eac4bc873b3b0a7808cbb18698c10bb78d61027c60bcd1c6c1a2d8941750b05", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where To Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge learn\">Learn</span> __Contract Deployment__\n\n    ---\n\n    Understand deployment mechanics, gas estimation behavior, and storage considerations.\n\n    [:octicons-arrow-right-24: Reference](/smart-contracts/for-eth-devs/contract-deployment/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#introduction", "page_title": "EVM vs PVM", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 15, "end_char": 384, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nWhile Polkadot Virtual Machine (PVM) strives for maximum Ethereum compatibility, several fundamental design decisions create necessary divergences from the [EVM](https://ethereum.org/developers/docs/evm/). These differences represent trade-offs that enhance performance and resource management while maintaining accessibility for Solidity developers."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#core-virtual-machine-architecture", "page_title": "EVM vs PVM", "index": 1, "depth": 2, "title": "Core Virtual Machine Architecture", "anchor": "core-virtual-machine-architecture", "start_char": 384, "end_char": 2739, "estimated_token_count": 454, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Core Virtual Machine Architecture\n\nThe most significant departure from Ethereum comes from PVM's foundation itself. Rather than implementing the EVM, PVM utilizes a RISC-V instruction set. For most Solidity developers, this architectural change remains transparent thanks to the [Revive compiler's](https://github.com/paritytech/revive) complete Solidity support, including inline assembler functionality.\n\n```mermaid\ngraph TD\n    Solidity[\"Solidity Source Code\"]\n\n    subgraph \"Ethereum Path\"\n        EthCompile[\"Standard Solidity Compiler (solc)\"]\n        EVM_Bytecode[\"EVM Bytecode\"]\n        EVM[\"Stack-based EVM\"]\n    end\n\n    subgraph \"PVM Path\"\n        ReviveCompile[\"Revive Compiler\"]\n        RISCV_Bytecode[\"RISC-V Bytecode\"]\n        PVMNode[\"RISC-V-based PVM\"]\n    end\n\n    Execution[\"Contract Execution\"]\n\n    Solidity --> EthCompile\n    Solidity --> ReviveCompile\n    EthCompile --> EVM_Bytecode\n    EVM_Bytecode --> EVM\n    EVM --> Execution\n    ReviveCompile --> RISCV_Bytecode\n    RISCV_Bytecode --> PVMNode\n    PVMNode --> Execution\n```\n\nHowever, this architectural difference becomes relevant in specific scenarios. Tools that attempt to download and inspect contract bytecode will fail, as they expect EVM bytecode rather than PVM's RISC-V format. Most applications typically pass bytecode as an opaque blob, making this a non-issue for standard use cases.\n\nThis primarily affects contracts using [`EXTCODECOPY`](https://www.evm.codes/?fork=cancun#3c) to manipulate code at runtime. A contract encounters problems specifically when it uses `EXTCODECOPY` to copy contract code into memory and then attempts to mutate it. This pattern is not possible in standard Solidity and requires dropping down to YUL assembly. An example would be a factory contract written in assembly that constructs and instantiates new contracts by generating code at runtime. Such contracts are rare in practice.\n\nPVM offers an elegant alternative through its [on-chain constructors](https://paritytech.github.io/polkadot-sdk/master/pallet_revive/pallet/struct.Pallet.html#method.bare_instantiate), enabling contract instantiation without runtime code modification, making this pattern unnecessary. This architectural difference also impacts how contract deployment works more broadly, as discussed in the [Contract Deployment](#contract-deployment) section."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#high-level-architecture-comparison", "page_title": "EVM vs PVM", "index": 2, "depth": 3, "title": "High-Level Architecture Comparison", "anchor": "high-level-architecture-comparison", "start_char": 2739, "end_char": 4718, "estimated_token_count": 376, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### High-Level Architecture Comparison\n\n|            Feature            |                            Ethereum Virtual Machine (EVM)                            |                        PVM                         |\n|:-----------------------------:|:------------------------------------------------------------------------------------:|:------------------------------------------------------:|\n|      **Instruction Set**      |                               Stack-based architecture                               |                 RISC-V instruction set                 |\n|      **Bytecode Format**      |                                     EVM bytecode                                     |                     RISC-V format                      |\n|    **Contract Size Limit**    |                                 24KB code size limit                                 |            Contract-specific memory limits             |\n|         **Compiler**          |                                  Solidity Compiler                                   |                    Revive Compiler                     |\n|      **Inline Assembly**      |                                      Supported                                       |         Supported with the compatibility layer         |\n|    **Code Introspection**     | Supported via [`EXTCODECOPY`](https://www.evm.codes/?fork=cancun#3c) | Limited support, alternative via on-chain constructors |\n|     **Resource Metering**     |                                  Single gas metric                                   |                   Multi-dimensional                    |\n| **Runtime Code Modification** |                                      Supported                                       |               Limited, with alternatives               |\n|  **Contract Instantiation**   |                                 Standard deployment                                  |    On-chain constructors for flexible instantiation    |"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#gas-model", "page_title": "EVM vs PVM", "index": 3, "depth": 2, "title": "Gas Model", "anchor": "gas-model", "start_char": 4718, "end_char": 5194, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Gas Model\n\nEthereum's resource model relies on a single metric: [gas](https://ethereum.org/developers/docs/gas/#what-is-gas), which serves as the universal unit for measuring computational costs. Each operation on the network consumes a specific amount of gas. Most platforms aiming for Ethereum compatibility typically adopt identical gas values to ensure seamless integration.\n\nThe significant changes to Ethereum's gas model will be outlined in the following sections."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#dynamic-gas-value-scaling", "page_title": "EVM vs PVM", "index": 4, "depth": 3, "title": "Dynamic Gas Value Scaling", "anchor": "dynamic-gas-value-scaling", "start_char": 5194, "end_char": 5533, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Dynamic Gas Value Scaling\n\nInstead of adhering to Ethereum's fixed gas values, PVM implements benchmark-based pricing that better reflects its improved execution performance. This makes instructions cheaper relative to I/O-bound operations but requires developers to avoid hardcoding gas values, particularly in cross-contract calls."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#multi-dimensional-resource-metering", "page_title": "EVM vs PVM", "index": 5, "depth": 3, "title": "Multi-Dimensional Resource Metering", "anchor": "multi-dimensional-resource-metering", "start_char": 5533, "end_char": 7627, "estimated_token_count": 443, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Multi-Dimensional Resource Metering\n\nMoving beyond Ethereum's single gas metric, PVM meters three distinct resources:\n\n- **`ref_time`**: Equivalent to traditional gas, measuring computation time.\n- **`proof_size`**: Tracks state proof size for validator verification.\n- **`storage_deposit`**: Manages state bloat through a deposit system.\n\nAll three resources can be limited at the transaction level, just like gas on Ethereum. The [Ethereum RPC proxy](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive/rpc) maps all three dimensions into the single gas dimension, ensuring everything behaves as expected for users.\n\nThese resources can also be limited when making cross-contract calls, which is essential for security when interacting with untrusted contracts. However, Solidity only allows specifying `gas_limit` for cross-contract calls. The `gas_limit` is most similar to Polkadots `ref_time_limit`, but the Revive compiler doesn't supply any imposed `gas_limit` for cross-contract calls for two key reasons:\n\n- **Semantic differences**: `gas_limit` and `ref_time_limit` are not semantically identical; blindly passing EVM gas as `ref_time_limit` can lead to unexpected behavior.\n- **Incomplete protection**: The other two resources (`proof_size` and `storage_deposit`) would remain uncapped anyway, making it insufficient to prevent malicious callees from performing DOS attacks.\n\nWhen resources are \"uncapped\" in cross-contract calls, they remain constrained by transaction-specified limits, preventing abuse of the transaction signer.\n\n!!! note\n    The runtime will provide a special precompile, allowing cross-contract calls with limits specified for all weight dimensions in the future.\n\nAll gas-related opcodes like [`GAS`](https://www.evm.codes/?fork=cancun#5a) or [`GAS_LIMIT`](https://www.evm.codes/?fork=cancun#45) return only the `ref_time` value as it's the closest match to traditional gas. Extended APIs will be provided through precompiles to make full use of all resources, including cross-contract calls with all three resources specified."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#memory-management", "page_title": "EVM vs PVM", "index": 6, "depth": 2, "title": "Memory Management", "anchor": "memory-management", "start_char": 7627, "end_char": 9599, "estimated_token_count": 413, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Memory Management\n\nThe EVM and the PVM take fundamentally different approaches to memory constraints:\n\n|         Feature          |      Ethereum Virtual Machine (EVM)       |                    PVM                     |\n|:------------------------:|:-----------------------------------------:|:----------------------------------------------:|\n|  **Memory Constraints**  |      Indirect control via gas costs       |        Hard memory limits per contract         |\n|      **Cost Model**      | Increasing gas curve with allocation size |    Fixed costs separated from execution gas    |\n|    **Memory Limits**     | Soft limits through prohibitive gas costs |         Hard fixed limits per contract         |\n|  **Pricing Efficiency**  |     Potential overcharging for memory     | More efficient through separation of concerns  |\n|   **Contract Nesting**   |         Limited by available gas          |    Limited by constant memory per contract     |\n|   **Memory Metering**    |     Dynamic based on total allocation     |      Static limits per contract instance       |\n| **Future Improvements**  |       Incremental gas cost updates        | Potential dynamic metering for deeper nesting  |\n| **Cross-Contract Calls** |      Handled through gas forwarding       | Requires careful boundary limit implementation |\n\nThe architecture establishes a constant memory limit per contract, which is the basis for calculating maximum contract nesting depth. This calculation assumes worst-case memory usage for each nested contract, resulting in a straightforward but conservative limit that operates independently of actual memory consumption. Future iterations may introduce dynamic memory metering, allowing deeper nesting depths for contracts with smaller memory footprints. However, such an enhancement would require careful implementation of cross-contract boundary limits before API stabilization, as it would introduce an additional resource metric to the system."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#current-memory-limits", "page_title": "EVM vs PVM", "index": 7, "depth": 3, "title": "Current Memory Limits", "anchor": "current-memory-limits", "start_char": 9599, "end_char": 10424, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Current Memory Limits\n\nThe following table depicts memory-related limits at the time of writing:\n\n|                   Limit                    |     Maximum     |\n|:------------------------------------------:|:---------------:|\n|              Call stack depth              |        5        |\n|                Event topics                |        4        |\n| Event data payload size (including topics) |    416 bytes    |\n|             Storage value size             |    416 bytes    |\n|        Transient storage variables         | 128 uint values |\n|            Immutable variables             | 16 uint values  |\n|          Contract code blob size           | ~100 kilobytes  |\n\n!!! note\n    Limits might be increased in the future. To guarantee existing contracts work as expected, limits will never be decreased."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#account-management-existential-deposit", "page_title": "EVM vs PVM", "index": 8, "depth": 2, "title": "Account Management - Existential Deposit", "anchor": "account-management-existential-deposit", "start_char": 10424, "end_char": 10586, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Account Management - Existential Deposit\n\nEthereum and Polkadot handle account persistence differently, affecting state management and contract interactions:"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#account-management-comparison", "page_title": "EVM vs PVM", "index": 9, "depth": 3, "title": "Account Management Comparison", "anchor": "account-management-comparison", "start_char": 10586, "end_char": 12943, "estimated_token_count": 470, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Account Management Comparison\n\n|          Feature          |                   Ethereum Approach                   |               PVM/Polkadot Approach                |\n|:-------------------------:|:-----------------------------------------------------:|:------------------------------------------------------:|\n|  **Account Persistence**  | Accounts persist indefinitely, even with zero balance | Requires existential deposit (ED) to maintain account  |\n|    **Minimum Balance**    |                         None                          |                      ED required                       |\n|   **Account Deletion**    |               Accounts remain in state                |      Accounts below ED are automatically deleted       |\n|   **Contract Accounts**   |                  Exist indefinitely                   |                    Must maintain ED                    |\n|   **Balance Reporting**   |                 Reports full balance                  |      Reports ED-adjusted balance via Ethereum RPC      |\n| **New Account Transfers** |                   Standard transfer                   |     Includes ED automatically with extra fee cost      |\n| **Contract-to-Contract**  |                   Direct transfers                    | ED drawn from transaction signer, not sending contract |\n|   **State Management**    |      Potential bloat from zero-balance accounts       |     Optimized with auto-deletion of dust accounts      |\n\nThis difference introduces potential compatibility challenges for Ethereum-based contracts and tools, particularly wallets. To mitigate this, PVM implements several transparent adjustments:\n\n- Balance queries via Ethereum RPC automatically deduct the ED, ensuring reported balances match spendable amounts.\n- Account balance checks through EVM opcodes reflect the ED-adjusted balance.\n- Transfers to new accounts automatically include the ED (`x + ED`), with the extra cost incorporated into transaction fees.\n- Contract-to-contract transfers handle ED requirements by:\n    - Drawing ED from the transaction signer instead of the sending contract.\n    - Keeping transfer amounts transparent for contract logic.\n    - Treating ED like other storage deposit costs.\n\nThis approach ensures that Ethereum contracts work without modifications while maintaining Polkadot's optimized state management."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#contract-deployment", "page_title": "EVM vs PVM", "index": 10, "depth": 2, "title": "Contract Deployment", "anchor": "contract-deployment", "start_char": 12943, "end_char": 14777, "estimated_token_count": 327, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Contract Deployment\n\nFor most users deploying contracts (like ERC-20 tokens), contract deployment works seamlessly without requiring special steps. However, when using advanced patterns like factory contracts that dynamically create other contracts at runtime, you'll need to understand PVM's unique deployment model.\n\nIn the PVM, contract deployment follows a fundamentally different model from EVM. The EVM allows contracts to be deployed with a single transaction, where the contract code is bundled with the deployment transaction. In contrast, PVM has a different process for contract instantiation.\n\n- **Code must be pre-uploaded**: Unlike EVM, where contract code is bundled within the deploying contract, PVM requires all contract bytecode to be uploaded to the chain before instantiation.\n- **Factory pattern limitations**: The common EVM pattern, where contracts dynamically create other contracts, will fail with a `CodeNotFound` error unless the dependent contract code was previously uploaded.\n- **Separate upload and instantiation**: This creates a two-step process where developers must first upload all contract code, then instantiate relationships between contracts.\n\nThis architecture impacts several common EVM patterns and requires developers to adapt their deployment strategies accordingly. _Factory contracts must be modified to work with pre-uploaded code rather than embedding bytecode_, and runtime code generation is not supported due to PVM's RISC-V bytecode format. The specific behavior of contract creation opcodes is detailed in the [YUL IR Translation](#yul-function-translation-differences) section.\n\nWhen migrating EVM projects to PVM, developers should identify all contracts that will be instantiated at runtime and ensure they are pre-uploaded to the chain before any instantiation attempts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#solidity-and-yul-ir-translation-incompatibilities", "page_title": "EVM vs PVM", "index": 11, "depth": 2, "title": "Solidity and YUL IR Translation Incompatibilities", "anchor": "solidity-and-yul-ir-translation-incompatibilities", "start_char": 14777, "end_char": 15118, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Solidity and YUL IR Translation Incompatibilities\n\nWhile PVM maintains high-level compatibility with Solidity, several low-level differences exist in the translation of YUL IR and specific Solidity constructs. These differences are particularly relevant for developers working with assembly code or utilizing advanced contract patterns."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#contract-code-structure", "page_title": "EVM vs PVM", "index": 12, "depth": 3, "title": "Contract Code Structure", "anchor": "contract-code-structure", "start_char": 15118, "end_char": 16066, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Contract Code Structure\n\nPVM's contract runtime does not differentiate between runtime code and deploy (constructor) code. Instead, both are emitted into a single PVM contract code blob and live on-chain. Therefore, in EVM terminology, the deploy code equals the runtime code. For most standard Solidity contracts, this is transparent. However, if you are analyzing raw bytecode or building tools that expect separate deploy and runtime sections, you'll need to adjust for this unified structure.\n\nIn the constructor code, the `codesize` instruction returns the call data size instead of the actual code blob size, which differs from standard EVM behavior. Developers might consider that the constructor logic uses `codesize` to inspect the deployed contract's size (e.g., for self-validation or specific deployment patterns); this will return an incorrect value on PVM. Re-evaluate such logic or use alternative methods to achieve your goal."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#solidity-specific-differences", "page_title": "EVM vs PVM", "index": 13, "depth": 3, "title": "Solidity-Specific Differences", "anchor": "solidity-specific-differences", "start_char": 16066, "end_char": 16606, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Solidity-Specific Differences\n\nSolidity constructs behave differently under PVM:\n\n- **`address.creationCode`**: Returns the bytecode keccak256 hash instead of the actual creation code, reflecting PVM's hash-based code referencing system.\n    - If your contract relies on `address.creationCode` to verify or interact with the full raw bytecode of a newly deployed contract, this will not work as expected. You will receive a hash, not the code itself. This typically affects highly specialized factory contracts or introspection tools."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#yul-function-translation-differences", "page_title": "EVM vs PVM", "index": 14, "depth": 3, "title": "YUL Function Translation Differences", "anchor": "yul-function-translation-differences", "start_char": 16606, "end_char": 23770, "estimated_token_count": 1348, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### YUL Function Translation Differences\n\nThe following YUL functions exhibit notable behavioral differences in PVM:\n\n- Memory operations:\n\n    - **`mload`, `mstore`, `msize`, `mcopy`**: PVM preserves memory layout but implements several constraints.\n\n        - EVM linear heap memory is emulated using a fixed 64KB byte buffer, limiting maximum contract memory usage.\n        - Accessing memory offsets larger than the buffer size traps the contract with an `OutOfBound` error.\n        - Compiler optimizations may eliminate unused memory operations, potentially causing `msize` to differ from EVM behavior.\n\n        For Solidity developers, the compiler generally handles memory efficiently within this 64KB limit. However, if you are writing low-level YUL assembly and perform direct memory manipulations, you must respect the 64KB buffer limit. Attempting to access memory outside this range will cause your transaction to revert. Be aware that `msize` might not always reflect the exact EVM behavior if compiler optimizations occur.\n\n- Call data operations:\n\n    - **`calldataload`, `calldatacopy`**: In constructor code, the offset parameter is ignored and these functions always return `0`, diverging from EVM behavior where call data represents constructor arguments.\n\n        - If your constructor logic in YUL assembly attempts to read constructor arguments using `calldataload` or `calldatacopy` with specific offsets, this will not yield the expected constructor arguments. Instead, these functions will return `zeroed` values. Standard Solidity constructors are handled correctly by the compiler, but manual YUL assembly for constructor argument parsing will need adjustment.\n\n- Code operations:\n\n    - **`codecopy`**: Only supported within constructor code, reflecting PVM's different approach to code handling and the unified code blob structure.\n\n        - If your contracts use `codecopy` (e.g., for self-modifying code or inspecting other contract's runtime bytecode) outside of the constructor, this will not be supported and will likely result in a compile-time error or runtime trap. This implies that patterns like dynamically generating or modifying contract code at runtime are not directly feasible with `codecopy` on PVM.\n\n- Control flow:\n\n    - **`invalid`**: Traps the contract execution but does not consume remaining gas, unlike EVM where it consumes all available gas.\n\n        - While `invalid` still reverts the transaction, the difference in gas consumption could subtly affect very specific error handling or gas accounting patterns that rely on `invalid` to consume all remaining gas. For most error scenarios, `revert()` is the standard and recommended practice.\n\n- Cross-contract calls:\n\n    - **`call`, `delegatecall`, `staticall`**: These functions ignore supplied gas limits and forward all remaining resources due to PVM's multi-dimensional resource model. This creates important security implications:\n\n        - Contract authors must implement reentrancy protection since gas stipends don't provide protection.\n        - The compiler detects `address payable.{send,transfer}` patterns and disables call reentrancy as a protective heuristic.\n        - Using `address payable.{send,transfer}` is already deprecated; PVM will provide dedicated precompiles for safe balance transfers.\n\n        The traditional EVM pattern of limiting gas in cross-contract calls (especially with the 2300 gas stipend for send/transfer) does not provide reentrancy protection on PVM. Developers must explicitly implement reentrancy guards (e.g., using a reentrancy lock mutex) in their Solidity code when making external calls to untrusted contracts. Relying on gas limits alone for reentrancy prevention is unsafe and will lead to vulnerabilities on PVM.\n\n        !!! warning\n            The 2300 gas stipend that is provided by solc for address payable.{send, transfer} calls offers no reentrancy protection in PVM. While the compiler attempts to detect and mitigate this pattern, developers should avoid these deprecated functions.\n\n- Contract creation:\n\n    - **`create`, `create2`**: Contract instantiation works fundamentally differently in PVM. Instead of supplying deploy code concatenated with constructor arguments, the runtime expects:\n\n        1. A buffer containing the code hash to deploy.\n        2. The constructor arguments buffer.\n\n        PVM translates `dataoffset` and `datasize` instructions to handle contract hashes instead of contract code, enabling seamless use of the `new` keyword in Solidity. However, this translation may fail for contracts creating other contracts within `assembly` blocks.\n\n        If you use the Solidity `new` keyword to deploy contracts, the Revive compiler handles this transparently. However, if you are creating contracts manually in YUL assembly using `create` or `create2` opcodes, you must provide the code hash of the contract to be deployed, not its raw bytecode. Attempting to pass raw bytecode will fail. This fundamentally changes how manual contract creation is performed in assembly.\n\n        !!! warning\n            Avoid using `create` family opcodes for manual deployment crafting in `assembly` blocks. This pattern is discouraged due to translation complexity and offers no gas savings benefits in PVM.\n\n- Data operations:\n\n    - **`dataoffset`**: Returns the contract hash instead of code offset, aligning with PVM's hash-based code referencing.\n    - **`datasize`**: Returns the constant contract hash size (32 bytes) rather than variable code size.\n\n    These changes are primarily relevant for low-level YUL assembly developers who are trying to inspect or manipulate contract code directly. `dataoffset` will provide a hash, not a memory offset to the code, and `datasize` will always be 32 bytes (the size of a hash). This reinforces that direct manipulation of contract bytecode at runtime, as might be done in some EVM patterns, is not supported.\n\n- Resource queries:\n\n    - **`gas`, `gaslimit`**: Return only the `ref_time` component of PVM's multi-dimensional weight system, providing the closest analog to traditional gas measurements.\n\n        - While `gas` and `gaslimit` still provide a useful metric, consider that they represent `ref_time` (computation time) only. If your contract logic depends on precise knowledge of other resource costs (like `proof_size` or `storage_deposit`), you won't get that information from these opcodes. You'll need to use future precompiles for full multi-dimensional resource queries.\n\n- Blockchain state:\n\n    - **`prevrandao`, `difficulty`**: Both translate to a constant value of `2500000000000000`, as PVM doesn't implement Ethereum's difficulty adjustment or randomness mechanisms.\n\n        - If your Solidity contract relies on `block.difficulty` (or its equivalent YUL opcode `difficulty`) for randomness generation or any logic tied to Ethereum's proof-of-work difficulty, this will not provide true randomness on PVM. The value will always be constant. Developers needing on-chain randomness should utilize Polkadot's native randomness sources or dedicated VRF (Verifiable Random Function) solutions if available."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#unsupported-operations", "page_title": "EVM vs PVM", "index": 15, "depth": 3, "title": "Unsupported Operations", "anchor": "unsupported-operations", "start_char": 23770, "end_char": 25161, "estimated_token_count": 270, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Unsupported Operations\n\nSeveral EVM operations are not supported in PVM and produce compile-time errors:\n\n- **`pc`, `extcodecopy`**: These operations are EVM-specific and have no equivalent functionality in PVM's RISC-V architecture.\n\n    - Any Solidity contracts that utilize inline assembly to interact with `pc` (program counter) or `extcodecopy` will fail to compile or behave unexpectedly. This means patterns involving introspection of the current execution location or copying external contract bytecode at runtime are not supported.\n\n- **`blobhash`, `blobbasefee`**: Related to Ethereum's rollup model and blob data handling, these operations are unnecessary given Polkadot's superior rollup architecture.\n\n    - If you are porting contracts designed for Ethereum's EIP-4844 (proto-danksharding) and rely on these blob-related opcodes, they will not be available on PVM.\n\n- **`extcodecopy`, `selfdestruct`**: These deprecated operations are not supported and generate compile-time errors.\n\n    - The `selfdestruct` opcode, which allowed contracts to remove themselves from the blockchain, is not supported. Contracts cannot be self-destroyed on PVM. This affects contract upgradeability patterns that rely on self-destruction and redeployment. Similarly, `extcodecopy` is unsupported, impacting contracts that intend to inspect or copy the bytecode of other deployed contracts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#compilation-pipeline-considerations", "page_title": "EVM vs PVM", "index": 16, "depth": 3, "title": "Compilation Pipeline Considerations", "anchor": "compilation-pipeline-considerations", "start_char": 25161, "end_char": 25832, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compilation Pipeline Considerations\n\nPVM processes YUL IR exclusively, meaning all contracts exhibit behavior consistent with Solidity's `via-ir` compilation mode. Developers familiar with the legacy compilation pipeline should expect [IR-based codegen behavior](https://docs.soliditylang.org/en/latest/ir-breaking-changes.html) when working with PVM contracts.\n\nIf you've previously worked with older Solidity compilers that did not use the `via-ir` pipeline by default, you might observe subtle differences in compiled bytecode size or gas usage. It's recommended to familiarize yourself with Solidity's IR-based codegen behavior, as this is the standard for PVM."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-evm-vs-pvm", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/evm-vs-pvm/#memory-pointer-limitations", "page_title": "EVM vs PVM", "index": 17, "depth": 3, "title": "Memory Pointer Limitations", "anchor": "memory-pointer-limitations", "start_char": 25832, "end_char": 27081, "estimated_token_count": 216, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d894868a3eabc20ab72bb1a3043d3a97c65c3a36248c54e9ae1ad080d27c9d36", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Memory Pointer Limitations\n\nYUL functions accepting memory buffer offset pointers or size arguments are limited by PVM's 32-bit pointer size. Supplying values above `2^32-1` will trap the contract immediately. The Solidity compiler typically generates valid memory references, making this primarily a concern for low-level assembly code.\n\nFor standard Solidity development, this limitation is unlikely to be hit as the compiler handles memory addresses correctly within typical contract sizes. However, if you are writing extremely large contracts using YUL assembly that manually and extensively manipulate memory addresses, ensure that your memory offsets and sizes do not exceed PVM's **fixed 64KB memory limit per contract**. While the YUL functions might accept 32-bit pointers (up to 2^32-1), attempting to access memory beyond the allocated 64KB buffer will trap the contract immediately.\n\nThese incompatibilities reflect the fundamental architectural differences between EVM and PVM while maintaining high-level Solidity compatibility. Most developers using standard Solidity patterns will encounter no issues, but those working with assembly code or advanced contract patterns should carefully review these differences during migration."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-gas-model", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/gas-model/#introduction", "page_title": "Gas Model on the Polkadot Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 295, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:baa018dacc32921ddc8bdfab2d2dd22d96de0438a1a5e0b429fa39f2854cffa8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Polkadot Hub implements a gas model that bridges Ethereum's familiar gas concept with Polkadot's more sophisticated resource metering system. This page explains how gas works in the Polkadot Hub and what developers need to know when building smart contracts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-gas-model", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/gas-model/#understanding-resources-in-the-polkadot-hub", "page_title": "Gas Model on the Polkadot Hub", "index": 1, "depth": 2, "title": "Understanding Resources in the Polkadot Hub", "anchor": "understanding-resources-in-the-polkadot-hub", "start_char": 295, "end_char": 1295, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:baa018dacc32921ddc8bdfab2d2dd22d96de0438a1a5e0b429fa39f2854cffa8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understanding Resources in the Polkadot Hub\n\nUnlike Ethereum, which uses a single gas value to measure everything, the Polkadot Hub tracks three separate resources:\n\n- **`ref_time`**: Measures computational time. It is the closest equivalent to traditional gas and represents the amount of CPU time your contract execution consumes.\n- **`proof_size`**: Measures the amount of state data that validators need to verify. When your contract reads from storage or makes state queries, this metric tracks the size of the proofs needed to validate those operations.\n- **`storage_deposit`**: Is a native balance that gets temporarily locked when your contract creates new storage entries. This prevents state bloat by requiring contracts to pay for the storage they use. The deposit is returned when the storage is freed.\n\nFor Ethereum wallet compatibility, the Polkadot Hub's RPC layer automatically maps these three dimensions into a single gas value that wallets can understand and display to users."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-gas-model", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/gas-model/#gas-vs-weight", "page_title": "Gas Model on the Polkadot Hub", "index": 2, "depth": 2, "title": "Gas vs Weight", "anchor": "gas-vs-weight", "start_char": 1295, "end_char": 1711, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:baa018dacc32921ddc8bdfab2d2dd22d96de0438a1a5e0b429fa39f2854cffa8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Gas vs Weight\n\nWhen you interact with the Polkadot Hub through an Ethereum wallet, you see familiar gas values. Under the hood, the runtime works with `weight` - a two-dimensional metric that combines `ref_time` and `proof_size`.\n\nThe system continuously translates between these representations: converting `weight` to gas when estimating costs, and converting gas back to `weight` when executing transactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-gas-model", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/gas-model/#how-gas-estimation-works", "page_title": "Gas Model on the Polkadot Hub", "index": 3, "depth": 2, "title": "How Gas Estimation Works", "anchor": "how-gas-estimation-works", "start_char": 1711, "end_char": 2552, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:baa018dacc32921ddc8bdfab2d2dd22d96de0438a1a5e0b429fa39f2854cffa8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Gas Estimation Works\n\nWhen your wallet requests a gas estimate (`eth_estimateGas`), the Polkadot Hub performs a dry-run of your transaction. This test execution discovers:\n\n- How much computational time the contract will consume (`ref_time`).\n- How much state data needs to be verified (`proof_size`).\n- Whether any storage deposits are required (`storage_deposit`).\n\nThe system then calculates a gas estimate that covers all these costs, including:\n\n- Base transaction overhead (intrinsic costs like signature verification, nonce/account checks, and dispatch setup).\n- Transaction length fees (charges for the transaction size in bytes).\n- The actual contract execution costs.\n- Any storage deposits.\n\nThe gas estimate also includes a small safety buffer to account for slight differences between the test run and actual execution."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-gas-model", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/gas-model/#dynamic-gas-pricing", "page_title": "Gas Model on the Polkadot Hub", "index": 4, "depth": 2, "title": "Dynamic Gas Pricing", "anchor": "dynamic-gas-pricing", "start_char": 2552, "end_char": 3445, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:baa018dacc32921ddc8bdfab2d2dd22d96de0438a1a5e0b429fa39f2854cffa8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Dynamic Gas Pricing\n\nPallet revive uses dynamic pricing through a \"fee multiplier\" that adjusts based on network congestion:\n\n- When blocks are full, the multiplier increases, making transactions more expensive.\n- When blocks are empty, the multiplier decreases, making transactions cheaper.\n- The multiplier updates after every block based on utilization.\n\nThis creates a market-based pricing mechanism similar to Ethereum's base fee, helping to manage network resources efficiently.\n\nThe gas price returned during estimation is simply the current fee multiplier value.\n\n!!! warning \"Important for Users\"\n    Because the fee multiplier can change between when you estimate gas and when your transaction executes, you can add a safety buffer (10-20%) to both your gas limit and gas price. This ensures your transaction will execute successfully even if network conditions change slightly."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-gas-model", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/gas-model/#transaction-execution-flow", "page_title": "Gas Model on the Polkadot Hub", "index": 5, "depth": 2, "title": "Transaction Execution Flow", "anchor": "transaction-execution-flow", "start_char": 3445, "end_char": 4925, "estimated_token_count": 347, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:baa018dacc32921ddc8bdfab2d2dd22d96de0438a1a5e0b429fa39f2854cffa8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Transaction Execution Flow\n\nThe following diagram illustrates the complete lifecycle of a transaction from submission to settlement:\n\n```mermaid\ngraph TD\n    U[User/Wallet] --> M[Transaction pool]\n    M --> P[Pre-dispatch convert gas to weight and create hold]\n    P --> C{Sufficient funds}\n    C -->|No| R[Rejected]\n    C -->|Yes| X[Execute contract within limits]\n    X --> S[Settle fee from actual weight and length; refund]\n    S --> B[Included in block]\n```\n\nThe transaction execution flow is as follows:\n\n- **Pool and pre-dispatch**: The transaction enters the pool, `gas` is mapped to `weight`, and a temporary hold is created for the maximum fee exposure. Weight is a two-dimensional tuple (`ref_time`, `proof_size`). Each dimension is tracked independently. The [`WeightToFee`](https://docs.rs/pallet-transaction-payment/latest/pallet_transaction_payment/pallet/trait.Config.html#associatedtype.WeightToFee) conversion takes the maximum of the two dimensions (after applying their respective coefficients) to determine the fee.\n- **Funds check**: If the hold is insufficient, the transaction is rejected before any execution.\n- **Execution**: If sufficient, the contract runs within the derived weight limits; a `storage_deposit` may be reserved when new storage is created.\n- **Settlement**: Fees are charged from the actual `weight` used plus the length fee; any unused hold is refunded.\n- **Inclusion**: After settlement, the transaction is included in the block."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-gas-model", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/gas-model/#conclusion", "page_title": "Gas Model on the Polkadot Hub", "index": 6, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 4925, "end_char": 5222, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:baa018dacc32921ddc8bdfab2d2dd22d96de0438a1a5e0b429fa39f2854cffa8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nThe Polkadot Hub's gas model is designed to be Ethereum-compatible while providing the flexibility and efficiency of Polkadot's resource metering system. Developers can build on Ethereum tooling while leveraging Polkadot's advanced features like multi-dimensional resource tracking."}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#introduction", "page_title": "JSON-RPC APIs", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 18, "end_char": 492, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub provides Ethereum compatibility through its JSON-RPC interface, allowing developers to interact with the chain using familiar Ethereum tooling and methods. This document outlines the supported [Ethereum JSON-RPC methods](https://ethereum.org/developers/docs/apis/json-rpc/#json-rpc-methods) and provides examples of how to use them.\n\nThis guide uses the Polkadot Hub TestNet endpoint:\n\n```text\nhttps://services.polkadothub-rpc.com/testnet\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#available-methods", "page_title": "JSON-RPC APIs", "index": 1, "depth": 2, "title": "Available Methods", "anchor": "available-methods", "start_char": 492, "end_char": 514, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Available Methods"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_accounts", "page_title": "JSON-RPC APIs", "index": 2, "depth": 3, "title": "eth_accounts", "anchor": "eth_accounts", "start_char": 514, "end_char": 927, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_accounts\n\nReturns a list of addresses owned by the client. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_accounts).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"eth_accounts\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_accounts\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_blocknumber", "page_title": "JSON-RPC APIs", "index": 3, "depth": 3, "title": "eth_blockNumber", "anchor": "eth_blocknumber", "start_char": 927, "end_char": 1348, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_blockNumber\n\nReturns the number of the most recent block. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_blocknumber).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"eth_blockNumber\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_blockNumber\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_call", "page_title": "JSON-RPC APIs", "index": 4, "depth": 3, "title": "eth_call", "anchor": "eth_call", "start_char": 1348, "end_char": 6242, "estimated_token_count": 1321, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_call\n\nExecutes a new message call immediately without creating a transaction. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_call).\n\n**Parameters**:\n\n- **`transaction` ++\"object\"++**: The transaction call object.\n    - **`to` ++\"string\"++**: Recipient address of the call. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`data` ++\"string\"++**: Hash of the method signature and encoded parameters. Must be a [data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`from` ++\"string\"++**: (Optional) Sender's address for the call. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`gas` ++\"string\"++**: (Optional) Gas limit to execute the call. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`gasPrice` ++\"string\"++**: (Optional) Gas price per unit of gas. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`value` ++\"string\"++**: (Optional) Value in wei to send with the call. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n- **`blockValue` ++\"string\"++**: (Optional) Block tag or block number to execute the call at. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n- **`stateOverrides` ++\"object\"++**: (Optional) A mapping of addresses to state overrides. Allows temporary modification of account state for the duration of the call without persisting changes on-chain. Conforms to the [Geth state override specification](https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-eth#state-override-set).\n    - **Key**: Account address as a hex string (e.g., `\"0x1234...\"`)\n    - **Value**: An object with the following optional fields:\n        - **`balance` ++\"string\"++**: (Optional) Fake balance to set for the account. Must be a quantity string.\n        - **`nonce` ++\"string\"++**: (Optional) Fake nonce to set for the account. Must be a quantity string.\n        - **`code` ++\"string\"++**: (Optional) Fake bytecode to inject at the account address. On Polkadot Hub, this field accepts both EVM bytecode and PolkaVM (PVM) bytecode, which is detected automatically via magic bytes.\n        - **`state` ++\"object\"++**: (Optional) Completely replaces all storage slots for the account. A mapping of storage keys to storage values (both as 32-byte hex strings). Unspecified slots are zeroed. Mutually exclusive with `stateDiff`.\n        - **`stateDiff` ++\"object\"++**: (Optional) Patches only the specified storage slots, leaving all other slots unchanged. A mapping of storage keys to storage values (both as 32-byte hex strings). Mutually exclusive with `state`.\n        - **`movePrecompileToAddress` ++\"string\"++**: (Optional) Accepted for Geth compatibility but has no effect, as Polkadot Hub does not use relocatable precompile addresses.\n\n**Example**:\n\n=== \"Basic\"\n\n    ```bash\n    curl -X POST https://services.polkadothub-rpc.com/testnet \\\n    -H \"Content-Type: application/json\" \\\n    --data '{\n        \"jsonrpc\":\"2.0\",\n        \"method\":\"eth_call\",\n        \"params\":[{\n            \"to\": \"INSERT_RECIPIENT_ADDRESS\",\n            \"data\": \"INSERT_ENCODED_CALL\"\n        }, \"INSERT_BLOCK_VALUE\"],\n        \"id\":1\n    }'\n    ```\n\n    Ensure to replace `INSERT_RECIPIENT_ADDRESS`, `INSERT_ENCODED_CALL`, and `INSERT_BLOCK_VALUE` with the appropriate values.\n\n=== \"With state overrides\"\n\n    ```bash\n    curl -X POST https://services.polkadothub-rpc.com/testnet \\\n    -H \"Content-Type: application/json\" \\\n    --data '{\n        \"jsonrpc\":\"2.0\",\n        \"method\":\"eth_call\",\n        \"params\":[{\n            \"to\": \"INSERT_RECIPIENT_ADDRESS\",\n            \"data\": \"INSERT_ENCODED_CALL\"\n        }, \"latest\", {\n            \"INSERT_ADDRESS\": {\n                \"balance\": \"0xDE0B6B3A7640000\"\n            }\n        }],\n        \"id\":1\n    }'\n    ```\n\n    In this example, the account at `INSERT_ADDRESS` is temporarily assigned a balance of 1 native token (10^18 in its smallest denomination) for the duration of the call. Ensure to replace `INSERT_RECIPIENT_ADDRESS`, `INSERT_ENCODED_CALL`, and `INSERT_ADDRESS` with the appropriate values.\n\n!!! note \"Differences from Ethereum\"\n    Polkadot Hub's `eth_call` state overrides are fully compatible with the [Geth state override specification](https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-eth#state-override-set). One Polkadot-specific extension is that the `code` field accepts both EVM bytecode and PolkaVM (PVM) bytecode, detected automatically via magic bytes at the start of the blob.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_chainid", "page_title": "JSON-RPC APIs", "index": 5, "depth": 3, "title": "eth_chainId", "anchor": "eth_chainid", "start_char": 6242, "end_char": 6654, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_chainId\n\nReturns the chain ID used for signing transactions. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_chainid).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"eth_chainId\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_chainId\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_estimategas", "page_title": "JSON-RPC APIs", "index": 6, "depth": 3, "title": "eth_estimateGas", "anchor": "eth_estimategas", "start_char": 6654, "end_char": 8694, "estimated_token_count": 636, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_estimateGas\n\nEstimates gas required for a transaction. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_estimategas).\n\n**Parameters**:\n\n- **`transaction` ++\"object\"++**: The transaction call object.\n    - **`to` ++\"string\"++**: Recipient address of the call. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`data` ++\"string\"++**: Hash of the method signature and encoded parameters. Must be a [data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`from` ++\"string\"++**: (Optional) Sender's address for the call. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`gas` ++\"string\"++**: (Optional) Gas limit to execute the call. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`gasPrice` ++\"string\"++**: (Optional) Gas price per unit of gas. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`value` ++\"string\"++**: (Optional) Value in wei to send with the call. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n- **`blockValue` ++\"string\"++**: (Optional) Block tag or block number to execute the call at. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n\n**Example**:\n\n```bash title=\"eth_estimateGas\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_estimateGas\",\n    \"params\":[{\n        \"to\": \"INSERT_RECIPIENT_ADDRESS\",\n        \"data\": \"INSERT_ENCODED_FUNCTION_CALL\"\n    }],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_RECIPIENT_ADDRESS` and `INSERT_ENCODED_CALL` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_gasprice", "page_title": "JSON-RPC APIs", "index": 7, "depth": 3, "title": "eth_gasPrice", "anchor": "eth_gasprice", "start_char": 8694, "end_char": 9096, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_gasPrice\n\nReturns the current gas price in Wei. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_gasprice).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"eth_gasPrice\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_gasPrice\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getbalance", "page_title": "JSON-RPC APIs", "index": 8, "depth": 3, "title": "eth_getBalance", "anchor": "eth_getbalance", "start_char": 9096, "end_char": 10072, "estimated_token_count": 302, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getBalance\n\nReturns the balance of a given address. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getbalance).\n\n**Parameters**:\n\n- **`address` ++\"string\"++**: Address to query balance. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n- **`blockValue` ++\"string\"++**: (Optional) The block value to be fetched. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n\n**Example**:\n\n```bash title=\"eth_getBalance\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getBalance\",\n    \"params\":[\"INSERT_ADDRESS\", \"INSERT_BLOCK_VALUE\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_ADDRESS` and `INSERT_BLOCK_VALUE` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getblockbyhash", "page_title": "JSON-RPC APIs", "index": 9, "depth": 3, "title": "eth_getBlockByHash", "anchor": "eth_getblockbyhash", "start_char": 10072, "end_char": 10933, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getBlockByHash\n\nReturns information about a block by its hash. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getblockbyhash).\n\n**Parameters**:\n\n- **`blockHash` ++\"string\"++**: The hash of the block to retrieve. Must be a [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n- **`fullTransactions` ++\"boolean\"++**: If `true`, returns full transaction details; if `false`, returns only transaction hashes.\n\n**Example**:\n\n```bash title=\"eth_getBlockByHash\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getBlockByHash\",\n    \"params\":[\"INSERT_BLOCK_HASH\", INSERT_BOOLEAN],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_BLOCK_HASH` and `INSERT_BOOLEAN` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getblockbynumber", "page_title": "JSON-RPC APIs", "index": 10, "depth": 3, "title": "eth_getBlockByNumber", "anchor": "eth_getblockbynumber", "start_char": 10933, "end_char": 11902, "estimated_token_count": 279, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getBlockByNumber\n\nReturns information about a block by its number. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getblockbynumber).\n\n**Parameters**:\n\n- **`blockValue` ++\"string\"++**: (Optional) The block value to be fetched. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n- **`fullTransactions` ++\"boolean\"++**: If `true`, returns full transaction details; if `false`, returns only transaction hashes.\n\n**Example**:\n\n```bash title=\"eth_getBlockByNumber\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getBlockByNumber\",\n    \"params\":[\"INSERT_BLOCK_VALUE\", INSERT_BOOLEAN],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_BLOCK_VALUE` and `INSERT_BOOLEAN` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getblocktransactioncountbynumber", "page_title": "JSON-RPC APIs", "index": 11, "depth": 3, "title": "eth_getBlockTransactionCountByNumber", "anchor": "eth_getblocktransactioncountbynumber", "start_char": 11902, "end_char": 12775, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getBlockTransactionCountByNumber\n\nReturns the number of transactions in a block from a block number. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbynumber).\n\n**Parameters**:\n\n- **`blockValue` ++\"string\"++**: The block value to be fetched. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n\n**Example**:\n\n```bash title=\"eth_getBlockTransactionCountByNumber\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getBlockTransactionCountByNumber\",\n    \"params\":[\"INSERT_BLOCK_VALUE\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_BLOCK_VALUE` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getblocktransactioncountbyhash", "page_title": "JSON-RPC APIs", "index": 12, "depth": 3, "title": "eth_getBlockTransactionCountByHash", "anchor": "eth_getblocktransactioncountbyhash", "start_char": 12775, "end_char": 13551, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getBlockTransactionCountByHash\n\nReturns the number of transactions in a block from a block hash. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getblocktransactioncountbyhash).\n\n**Parameters**:\n\n- **`blockHash` ++\"string\"++**: The hash of the block to retrieve. Must be a [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_getBlockTransactionCountByHash\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getBlockTransactionCountByHash\",\n    \"params\":[\"INSERT_BLOCK_HASH\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_BLOCK_HASH` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getcode", "page_title": "JSON-RPC APIs", "index": 13, "depth": 3, "title": "eth_getCode", "anchor": "eth_getcode", "start_char": 13551, "end_char": 14529, "estimated_token_count": 305, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getCode\n\nReturns the code at a given address. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getcode).\n\n**Parameters**:\n\n- **`address` ++\"string\"++**: Contract or account address to query code. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n- **`blockValue` ++\"string\"++**: (Optional) The block value to be fetched. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n\n**Example**:\n\n```bash title=\"eth_getCode\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getCode\",\n    \"params\":[\"INSERT_ADDRESS\", \"INSERT_BLOCK_VALUE\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_ADDRESS` and `INSERT_BLOCK_VALUE` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getlogs", "page_title": "JSON-RPC APIs", "index": 14, "depth": 3, "title": "eth_getLogs", "anchor": "eth_getlogs", "start_char": 14529, "end_char": 16350, "estimated_token_count": 578, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getLogs\n\nReturns an array of all logs matching a given filter object. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getlogs).\n\n**Parameters**:\n\n- **`filter` ++\"object\"++**: The filter object.\n    - **`fromBlock` ++\"string\"++**: (Optional) Block number or tag to start from. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n    - **`toBlock` ++\"string\"++**: (Optional) Block number or tag to end at. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n    - **`address` ++\"string\" or \"array of strings\"++**: (Optional) Contract address or a list of addresses from which to get logs. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`topics` ++\"array of strings\"++**: (Optional) Array of topics for filtering logs. Each topic can be a single [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string or an array of such strings (meaning OR).\n    - **`blockhash` ++\"string\"++**: (Optional) Hash of a specific block. Cannot be used with `fromBlock` or `toBlock`. Must be a [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_getLogs\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getLogs\",\n    \"params\":[{\n        \"fromBlock\": \"latest\",\n        \"toBlock\": \"latest\"\n    }],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_getstorageat", "page_title": "JSON-RPC APIs", "index": 15, "depth": 3, "title": "eth_getStorageAt", "anchor": "eth_getstorageat", "start_char": 16350, "end_char": 17596, "estimated_token_count": 374, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getStorageAt\n\nReturns the value from a storage position at a given address. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_getstorageat).\n\n**Parameters**:\n\n- **`address` ++\"string\"++**: Contract or account address to query code. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n- **`storageKey` ++\"string\"++**: Position in storage to retrieve data from. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n- **`blockValue` ++\"string\"++**: (Optional) The block value to be fetched. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n\n**Example**:\n\n```bash title=\"eth_getStorageAt\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getStorageAt\",\n    \"params\":[\"INSERT_ADDRESS\", \"INSERT_STORAGE_KEY\", \"INSERT_BLOCK_VALUE\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_ADDRESS`, `INSERT_STORAGE_KEY`, and `INSERT_BLOCK_VALUE` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_gettransactioncount", "page_title": "JSON-RPC APIs", "index": 16, "depth": 3, "title": "eth_getTransactionCount", "anchor": "eth_gettransactioncount", "start_char": 17596, "end_char": 18633, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getTransactionCount\n\nReturns the number of transactions sent from an address (nonce). [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_gettransactioncount).\n\n**Parameters**:\n\n- **`address` ++\"string\"++**: Address to query balance. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n- **`blockValue` ++\"string\"++**: (Optional) The block value to be fetched. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n\n**Example**:\n\n```bash title=\"eth_getTransactionCount\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getTransactionCount\",\n    \"params\":[\"INSERT_ADDRESS\", \"INSERT_BLOCK_VALUE\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_ADDRESS` and `INSERT_BLOCK_VALUE` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_gettransactionbyhash", "page_title": "JSON-RPC APIs", "index": 17, "depth": 3, "title": "eth_getTransactionByHash", "anchor": "eth_gettransactionbyhash", "start_char": 18633, "end_char": 19369, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getTransactionByHash\n\nReturns information about a transaction by its hash. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_gettransactionbyhash).\n\n**Parameters**:\n\n- **`transactionHash` ++\"string\"++**: The hash of the transaction. Must be a [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_getTransactionByHash\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getTransactionByHash\",\n    \"params\":[\"INSERT_TRANSACTION_HASH\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_TRANSACTION_HASH` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_gettransactionbyblocknumberandindex", "page_title": "JSON-RPC APIs", "index": 18, "depth": 3, "title": "eth_getTransactionByBlockNumberAndIndex", "anchor": "eth_gettransactionbyblocknumberandindex", "start_char": 19369, "end_char": 20509, "estimated_token_count": 302, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getTransactionByBlockNumberAndIndex\n\nReturns information about a transaction by block number and transaction index. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_gettransactionbyblocknumberandindex).\n\n**Parameters**:\n\n- **`blockValue` ++\"string\"++**: The block value to be fetched. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n- **`transactionIndex` ++\"string\"++**: The index of the transaction in the block. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_getTransactionByBlockNumberAndIndex\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getTransactionByBlockNumberAndIndex\",\n    \"params\":[\"INSERT_BLOCK_VALUE\", \"INSERT_TRANSACTION_INDEX\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_BLOCK_VALUE` and `INSERT_TRANSACTION_INDEX` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_gettransactionbyblockhashandindex", "page_title": "JSON-RPC APIs", "index": 19, "depth": 3, "title": "eth_getTransactionByBlockHashAndIndex", "anchor": "eth_gettransactionbyblockhashandindex", "start_char": 20509, "end_char": 21540, "estimated_token_count": 274, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getTransactionByBlockHashAndIndex\n\nReturns information about a transaction by block hash and transaction index. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_gettransactionbyblockhashandindex).\n\n**Parameters**:\n\n- **`blockHash` ++\"string\"++**: The hash of the block. Must be a [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n- **`transactionIndex` ++\"string\"++**: The index of the transaction in the block. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_getTransactionByBlockHashAndIndex\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getTransactionByBlockHashAndIndex\",\n    \"params\":[\"INSERT_BLOCK_HASH\", \"INSERT_TRANSACTION_INDEX\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_BLOCK_HASH` and `INSERT_TRANSACTION_INDEX` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_gettransactionreceipt", "page_title": "JSON-RPC APIs", "index": 20, "depth": 3, "title": "eth_getTransactionReceipt", "anchor": "eth_gettransactionreceipt", "start_char": 21540, "end_char": 22285, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_getTransactionReceipt\n\nReturns the receipt of a transaction by transaction hash. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_gettransactionreceipt).\n\n**Parameters**:\n\n- **`transactionHash` ++\"string\"++**: The hash of the transaction. Must be a [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_getTransactionReceipt\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_getTransactionReceipt\",\n    \"params\":[\"INSERT_TRANSACTION_HASH\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_TRANSACTION_HASH` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_maxpriorityfeepergas", "page_title": "JSON-RPC APIs", "index": 21, "depth": 3, "title": "eth_maxPriorityFeePerGas", "anchor": "eth_maxpriorityfeepergas", "start_char": 22285, "end_char": 22698, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_maxPriorityFeePerGas\n\nReturns an estimate of the current priority fee per gas, in Wei, to be included in a block.\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"eth_maxPriorityFeePerGas\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_maxPriorityFeePerGas\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_sendrawtransaction", "page_title": "JSON-RPC APIs", "index": 22, "depth": 3, "title": "eth_sendRawTransaction", "anchor": "eth_sendrawtransaction", "start_char": 22698, "end_char": 23367, "estimated_token_count": 198, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_sendRawTransaction\n\nSubmits a raw transaction. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_sendrawtransaction).\n\n**Parameters**:\n\n- **`callData` ++\"string\"++**: Signed transaction data. Must be a [data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_sendRawTransaction\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_sendRawTransaction\",\n    \"params\":[\"INSERT_CALL_DATA\"],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_CALL_DATA` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_sendtransaction", "page_title": "JSON-RPC APIs", "index": 23, "depth": 3, "title": "eth_sendTransaction", "anchor": "eth_sendtransaction", "start_char": 23367, "end_char": 25592, "estimated_token_count": 662, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_sendTransaction\n\nCreates and sends a new transaction. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_sendtransaction).\n\n**Parameters**:\n\n- **`transaction` ++\"object\"++**: The transaction object.\n    - **`from` ++\"string\"++**: Address sending the transaction. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`to` ++\"string\"++**: (Optional) Recipient address. No need to provide this value when deploying a contract. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`gas` ++\"string\"++**: (optional, default: `90000`) gas limit for execution. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`gasPrice` ++\"string\"++**: (Optional) Gas price per unit. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`value` ++\"string\"++**: (Optional) Amount of Ether to send. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`data` ++\"string\"++**: (Optional) Contract bytecode or encoded method call. Must be a [data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`nonce` ++\"string\"++**: (Optional) Transaction nonce. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n\n**Example**:\n\n```bash title=\"eth_sendTransaction\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_sendTransaction\",\n    \"params\":[{\n        \"from\": \"INSERT_SENDER_ADDRESS\",\n        \"to\": \"INSERT_RECIPIENT_ADDRESS\",\n        \"gas\": \"INSERT_GAS_LIMIT\",\n        \"gasPrice\": \"INSERT_GAS_PRICE\",\n        \"value\": \"INSERT_VALUE\",\n        \"input\": \"INSERT_INPUT_DATA\",\n        \"nonce\": \"INSERT_NONCE\"\n    }],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_SENDER_ADDRESS`, `INSERT_RECIPIENT_ADDRESS`, `INSERT_GAS_LIMIT`, `INSERT_GAS_PRICE`, `INSERT_VALUE`, `INSERT_INPUT_DATA`, and `INSERT_NONCE` with the proper values.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#eth_syncing", "page_title": "JSON-RPC APIs", "index": 24, "depth": 3, "title": "eth_syncing", "anchor": "eth_syncing", "start_char": 25592, "end_char": 26015, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### eth_syncing\n\nReturns an object with syncing data or `false` if not syncing. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#eth_syncing).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"eth_syncing\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"eth_syncing\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#net_listening", "page_title": "JSON-RPC APIs", "index": 25, "depth": 3, "title": "net_listening", "anchor": "net_listening", "start_char": 26015, "end_char": 26478, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### net_listening\n\nReturns `true` if the client is actively listening for network connections, otherwise `false`. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#net_listening).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"net_listening\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"net_listening\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#net_peercount", "page_title": "JSON-RPC APIs", "index": 26, "depth": 3, "title": "net_peerCount", "anchor": "net_peercount", "start_char": 26478, "end_char": 26819, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### net_peerCount\n\nReturns the number of peers connected to the client.\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"net_peerCount\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"net_peerCount\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#net_version", "page_title": "JSON-RPC APIs", "index": 27, "depth": 3, "title": "net_version", "anchor": "net_version", "start_char": 26819, "end_char": 27223, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### net_version\n\nReturns the current network ID as a string. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#net_version).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"net_version\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"net_version\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#system_health", "page_title": "JSON-RPC APIs", "index": 28, "depth": 3, "title": "system_health", "anchor": "system_health", "start_char": 27223, "end_char": 27563, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### system_health\n\nReturns information about the health of the system.\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"system_health\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"system_health\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#web3_clientversion", "page_title": "JSON-RPC APIs", "index": 29, "depth": 3, "title": "web3_clientVersion", "anchor": "web3_clientversion", "start_char": 27563, "end_char": 27987, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### web3_clientVersion\n\nReturns the current client version. [Reference](https://ethereum.org/developers/docs/apis/json-rpc/#web3_clientversion).\n\n**Parameters**:\n\nNone.\n\n**Example**:\n\n```bash title=\"web3_clientVersion\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"web3_clientVersion\",\n    \"params\":[],\n    \"id\":1\n}'\n```\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#debug_traceblockbynumber", "page_title": "JSON-RPC APIs", "index": 30, "depth": 3, "title": "debug_traceBlockByNumber", "anchor": "debug_traceblockbynumber", "start_char": 27987, "end_char": 29029, "estimated_token_count": 308, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### debug_traceBlockByNumber \n\nTraces a block's execution by its number and returns a detailed execution trace for each transaction.\n\n**Parameters**:\n\n- **`blockValue` ++\"string\"++**: The block number or tag to trace. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n- **`options` ++\"object\"++**: (Optional) An object containing tracer options.\n    - **`tracer` ++\"string\"++**: The name of the tracer to use (e.g., `\"callTracer\"`, `\"opTracer\"`).\n    - Other tracer-specific options may be supported.\n\n**Example**:\n\n```bash title=\"debug_traceBlockByNumber\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"debug_traceBlockByNumber\",\n    \"params\":[\"INSERT_BLOCK_VALUE\", {\"tracer\": \"callTracer\"}],\n    \"id\":1\n}'\n```\n\nEnsure to replace `INSERT_BLOCK_VALUE` with a proper block number if needed.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#debug_tracetransaction", "page_title": "JSON-RPC APIs", "index": 31, "depth": 3, "title": "debug_traceTransaction", "anchor": "debug_tracetransaction", "start_char": 29029, "end_char": 30482, "estimated_token_count": 387, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### debug_traceTransaction\n\nTraces the execution of a single transaction by its hash and returns a detailed execution trace.\n\n**Parameters**:\n\n- **`transactionHash` ++\"string\"++**: The hash of the transaction to trace. Must be a [32 byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n- **`options` ++\"object\"++**: (Optional) An object containing tracer options (e.g., `tracer: \"callTracer\"`).\n\n**Example**:\n\n```bash title=\"debug_traceTransaction\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"debug_traceTransaction\",\n    \"params\":[\"INSERT_TRANSACTION_HASH\", {\"tracer\": \"callTracer\"}],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_TRANSACTION_HASH` with the proper value.\n\n!!! note \"Differences from Ethereum (Geth)\"\n    When using the default struct logger (opcode tracer), there is a difference in how `gasCost` is calculated for CALL-like opcodes (`CALL`, `DELEGATECALL`, `STATICCALL`, `CREATE`, `CREATE2`):\n\n    - **Geth behavior**: The `gasCost` includes the opcode's intrinsic cost plus all gas forwarded to child calls.\n    - **Polkadot Hub behavior**: The `gasCost` includes only the opcode's intrinsic cost, excluding forwarded gas. The intrinsic cost covers:\n        - Base cost of the CALL opcode.\n        - Post-call costs (for example, copying return data back to the caller's memory).\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#debug_tracecall", "page_title": "JSON-RPC APIs", "index": 32, "depth": 3, "title": "debug_traceCall", "anchor": "debug_tracecall", "start_char": 30482, "end_char": 32785, "estimated_token_count": 699, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### debug_traceCall\n\nExecutes a new message call and returns a detailed execution trace without creating a transaction on the blockchain.\n\n**Parameters**:\n\n- **`transaction` ++\"object\"++**: The transaction call object, similar to `eth_call` parameters.\n    - **`to` ++\"string\"++**: Recipient address of the call. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`data` ++\"string\"++**: Hash of the method signature and encoded parameters. Must be a [data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`from` ++\"string\"++**: (Optional) Sender's address for the call. Must be a [20-byte data](https://ethereum.org/developers/docs/apis/json-rpc/#unformatted-data-encoding) string.\n    - **`gas` ++\"string\"++**: (Optional) Gas limit to execute the call. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`gasPrice` ++\"string\"++**: (Optional) Gas price per unit of gas. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n    - **`value` ++\"string\"++**: (Optional) Value in wei to send with the call. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string.\n- **`blockValue` ++\"string\"++**: (Optional) Block tag or block number to execute the call at. Must be a [quantity](https://ethereum.org/developers/docs/apis/json-rpc/#quantities-encoding) string or a [default block parameter](https://ethereum.org/developers/docs/apis/json-rpc/#default-block).\n- **`options` ++\"object\"++**: (Optional) An object containing tracer options (e.g., `tracer: \"callTracer\"`).\n\n**Example**:\n\n```bash title=\"debug_traceCall\"\ncurl -X POST https://services.polkadothub-rpc.com/testnet \\\n-H \"Content-Type: application/json\" \\\n--data '{\n    \"jsonrpc\":\"2.0\",\n    \"method\":\"debug_traceCall\",\n    \"params\":[{\n        \"from\": \"INSERT_SENDER_ADDRESS\",\n        \"to\": \"INSERT_RECIPIENT_ADDRESS\",\n        \"data\": \"INSERT_ENCODED_CALL\"\n    }, \"INSERT_BLOCK_VALUE\", {\"tracer\": \"callTracer\"}],\n    \"id\":1\n}'\n```\n\nEnsure to replace the `INSERT_SENDER_ADDRESS`, `INSERT_RECIPIENT_ADDRESS`, `INSERT_ENCODED_CALL`, and `INSERT_BLOCK_VALUE` with the proper value.\n\n---"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#response-format", "page_title": "JSON-RPC APIs", "index": 33, "depth": 2, "title": "Response Format", "anchor": "response-format", "start_char": 32785, "end_char": 32968, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Response Format\n\nAll responses follow the standard JSON-RPC 2.0 format:\n\n```json\n{\n    \"jsonrpc\": \"2.0\",\n    \"id\": 1,\n    \"result\": ... // The return value varies by method\n}\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-for-eth-devs-json-rpc-apis", "url": "https://developer.polkadot.com/smart-contracts/for-eth-devs/json-rpc-apis/#error-handling", "page_title": "JSON-RPC APIs", "index": 34, "depth": 2, "title": "Error Handling", "anchor": "error-handling", "start_char": 32968, "end_char": 33186, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a4288afd08bb910fd83f9bf30119ccc17d959e159d91738d013043705a827ffc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Error Handling\n\nIf an error occurs, the response will include an error object:\n\n```json\n{\n    \"jsonrpc\": \"2.0\",\n    \"id\": 1,\n    \"error\": {\n        \"code\": -32000,\n        \"message\": \"Error message here\"\n    }\n}\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#quick-starts", "page_title": "Get Started with Smart Contracts", "index": 0, "depth": 2, "title": "Quick Starts", "anchor": "quick-starts", "start_char": 195, "end_char": 1039, "estimated_token_count": 270, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Quick Starts\n\nUse these curated links to get connected, get funded, and deploy your first contract.\n\n|                     Quick Start                     |         Tools         |                           Description                           |\n|-----------------------------------------------------|-----------------------|-----------------------------------------------------------------|\n|  [Connect to Polkadot](/smart-contracts/connect/)   | Polkadot.js, MetaMask | Add the network, configure RPC, verify activity in the explorer |\n|     [Get Test Tokens](/smart-contracts/faucet/)     |           -           |    Request test funds to deploy and interact with contracts     |\n| [Explore Transactions](/smart-contracts/explorers/) | BlockScout, Routescan, Subscan | Inspect transactions, logs, token transfers, and contract state |"}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#build-and-test-locally", "page_title": "Get Started with Smart Contracts", "index": 1, "depth": 2, "title": "Build and Test Locally", "anchor": "build-and-test-locally", "start_char": 1039, "end_char": 1180, "estimated_token_count": 24, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Build and Test Locally\n\nSet up local environments and CI-friendly workflows to iterate quickly and validate changes before deploying."}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#ethereum-tool-differences-on-polkadot-evm", "page_title": "Get Started with Smart Contracts", "index": 2, "depth": 2, "title": "Ethereum Tool Differences on Polkadot EVM", "anchor": "ethereum-tool-differences-on-polkadot-evm", "start_char": 1180, "end_char": 2200, "estimated_token_count": 281, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ethereum Tool Differences on Polkadot EVM\n\nTools like **Foundry** and **Hardhat** are built for standard Ethereum nodes. Polkadot EVM networks (such as Polkadot Hub) use the same [Ethereum JSON-RPC](https://ethereum.org/developers/docs/apis/json-rpc/) interface, but run on a different execution environment (Substrate with REVM or PVM). As a result:\n\n- **Local tests** (e.g., `forge test`, Hardhat's default network) run in the tool's own EVM, not Polkadot's—so behavior can differ from the real chain.\n- **Time and snapshot helpers** (e.g., `evm_increaseTime`, `loadFixture`) are often not supported on Polkadot nodes.\n- **Gas reports** from these tools may not match what you see on-chain.\n\n**Recommendation:** To check chain-specific behavior, run your contracts against a [local dev node](/smart-contracts/dev-environments/local-dev-node/) or a TestNet. For more details, see [EVM vs PVM](/smart-contracts/for-eth-devs/evm-vs-pvm/) and [Contract Deployment](/smart-contracts/for-eth-devs/contract-deployment/)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#ethereum-developer-resources", "page_title": "Get Started with Smart Contracts", "index": 3, "depth": 2, "title": "Ethereum Developer Resources", "anchor": "ethereum-developer-resources", "start_char": 2200, "end_char": 2346, "estimated_token_count": 26, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ethereum Developer Resources\n\nBridge your Ethereum knowledge with Polkadot Hub specifics: account mapping, fees, JSON-RPC, and deployment."}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#cookbook-hands-on-tutorials", "page_title": "Get Started with Smart Contracts", "index": 4, "depth": 2, "title": "Cookbook: Hands-on Tutorials", "anchor": "cookbook-hands-on-tutorials", "start_char": 2346, "end_char": 3622, "estimated_token_count": 393, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Cookbook: Hands-on Tutorials\n\nFollow step-by-step guides that walk through common tasks and complete dApp examples.\n\n|                                            Tutorial                                            |        Tools        |                Description                |\n|------------------------------------------------------------------------------------------------|---------------------|-------------------------------------------|\n| [Deploy a Basic Contract](/smart-contracts/cookbook/smart-contracts/deploy-basic/basic-remix/) |        Remix        |      Minimal deployment walkthrough       |\n|    [Deploy an ERC-20](/smart-contracts/cookbook/smart-contracts/deploy-erc20/erc20-remix/)     | Remix, OpenZeppelin | Create, deploy, and mint a fungible token |\n|   [Deploy an NFT (ERC-721)](/smart-contracts/cookbook/smart-contracts/deploy-nft/nft-remix/)   | Remix, OpenZeppelin |    Build and deploy an NFT collection     |\n|                 [Uniswap V2](/smart-contracts/cookbook/eth-dapps/uniswap-v2/)                  |       Hardhat       | Full dApp project: compile, test, deploy  |\n|               [Zero‑to‑Hero dApp](/smart-contracts/cookbook/dapps/zero-to-hero/)               |      Multiple       |  End‑to‑end dApp patterns and practices   |"}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#libraries", "page_title": "Get Started with Smart Contracts", "index": 5, "depth": 2, "title": "Libraries", "anchor": "libraries", "start_char": 3622, "end_char": 3734, "estimated_token_count": 18, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Libraries\n\nChoose the client libraries that fit your stack for connecting wallets and calling contracts."}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#integrations", "page_title": "Get Started with Smart Contracts", "index": 6, "depth": 2, "title": "Integrations", "anchor": "integrations", "start_char": 3734, "end_char": 3844, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Integrations\n\nIntegrate essential services like wallets, indexers, and oracles to round out your dApp."}
{"source": "polkadot-docs", "page_id": "smart-contracts-get-started", "url": "https://developer.polkadot.com/smart-contracts/get-started/#precompiles", "page_title": "Get Started with Smart Contracts", "index": 7, "depth": 2, "title": "Precompiles", "anchor": "precompiles", "start_char": 3844, "end_char": 4304, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:01b224f90af64fa541d101c1c0d2ea7ef887ded4079adc2f299fc666a0618b92", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Precompiles\n\nDiscover precompiled system contracts available on the Hub and how to use them.\n\n\n\n\nFrom here, follow the quick starts to get connected, iterate locally with your preferred tools, and use the guides, libraries, integrations, and precompiles as you grow into production‑ready dApps. If you get stuck, [open an issue](https://github.com/polkadot-developers/polkadot-docs/issues/new?template=docs-issue.yml) or reach out in the community channels."}
{"source": "polkadot-docs", "page_id": "smart-contracts-integrations-wallets", "url": "https://developer.polkadot.com/smart-contracts/integrations/wallets/#introduction", "page_title": "Wallets for Polkadot Hub", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 29, "end_char": 496, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d078bc44bd2ca1d639bd24086d834b15de1799d580b5956be46a0b0226b6abeb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nConnecting a compatible wallet is the first essential step for interacting with the Polkadot Hub ecosystem. This guide explores wallet options that support both Substrate and Ethereum compatible layers, enabling transactions and smart contract interactions. Whether you're a developer testing on Polkadot Hub or a user accessing the MainNet, understanding wallet configuration is crucial for accessing the full range of Polkadot Hub's capabilities."}
{"source": "polkadot-docs", "page_id": "smart-contracts-integrations-wallets", "url": "https://developer.polkadot.com/smart-contracts/integrations/wallets/#connect-your-wallet", "page_title": "Wallets for Polkadot Hub", "index": 1, "depth": 2, "title": "Connect Your Wallet", "anchor": "connect-your-wallet", "start_char": 496, "end_char": 520, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d078bc44bd2ca1d639bd24086d834b15de1799d580b5956be46a0b0226b6abeb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Connect Your Wallet"}
{"source": "polkadot-docs", "page_id": "smart-contracts-integrations-wallets", "url": "https://developer.polkadot.com/smart-contracts/integrations/wallets/#metamask", "page_title": "Wallets for Polkadot Hub", "index": 2, "depth": 3, "title": "MetaMask", "anchor": "metamask", "start_char": 520, "end_char": 2187, "estimated_token_count": 390, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d078bc44bd2ca1d639bd24086d834b15de1799d580b5956be46a0b0226b6abeb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### MetaMask\n\n[MetaMask](https://metamask.io/) is a popular wallet for interacting with Ethereum-compatible chains. It allows users to connect to test networks that support Ethereum-based smart contracts. However, it's important to emphasize that MetaMask primarily facilitates interactions with smart contracts, giving users access to various chain functionalities. \n\nTo get started with MetaMask, you need to install the [MetaMask extension](https://metamask.io/download/) and add it to the browser. Once you install MetaMask, you can set up a new wallet and securely store your seed phrase. This phrase is crucial for recovery in case you lose access.\n\nFor example, to connect to the Polkadot Hub TestNet via MetaMask, you need to follow these steps:\n\n1. Open the MetaMask extension and click on the network dropdown to switch to the Polkadot Hub TestNet.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-1.webp)\n\n2. Click on the **Custom** tab.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-2.webp)\n\n3. Click on the **Add a custom network** button.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-3.webp)\n\n4. Complete the necessary fields, then click the **Save** button (refer to the [Networks](/smart-contracts/connect/#networks-details) section for copy and paste parameters).\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-3.webp)\n\n5. Click on **Polkadot Hub TestNet** to switch the network.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-4.webp)\n\nThe steps in the preceding section can be used to connect to any chain by modifying the network specification and endpoint parameters."}
{"source": "polkadot-docs", "page_id": "smart-contracts-integrations-wallets", "url": "https://developer.polkadot.com/smart-contracts/integrations/wallets/#talisman", "page_title": "Wallets for Polkadot Hub", "index": 3, "depth": 3, "title": "Talisman", "anchor": "talisman", "start_char": 2187, "end_char": 3561, "estimated_token_count": 326, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d078bc44bd2ca1d639bd24086d834b15de1799d580b5956be46a0b0226b6abeb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Talisman\n\n[Talisman](https://talisman.xyz/) is a specialized wallet for the Polkadot ecosystem that supports both Substrate and EVM accounts, making it an excellent choice for Polkadot Hub interactions. Talisman offers a more integrated experience for Polkadot-based chains while still providing Ethereum compatibility.\n\nTo use Talisman with Polkadot Hub TestNet:\n\n1. Install the [Talisman extension](https://talisman.xyz/download) and set up your wallet by following the on-screen instructions.\n\n2. Once installed, click on the Talisman icon in your browser extensions and click on the **More** button.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-5.webp)\n\n3. Click the button **Manage Networks**.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-6.webp)\n\n4. Click on the **+ Add network** button.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-7.webp)\n\n5. Fill in the form with the required parameters and click the Save** button.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-8.webp)\n\n6. After that, you will see the **Polkadot Hub TestNet** in the list.\n\n    ![](/images/smart-contracts/integrations/wallets/wallets-9.webp)\n\nAfter selecting the network, Talisman will automatically configure the necessary RPC URL and chain ID for you. You can now use Talisman to interact with the Polkadot Hub TestNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-integrations-wallets", "url": "https://developer.polkadot.com/smart-contracts/integrations/wallets/#conclusion", "page_title": "Wallets for Polkadot Hub", "index": 4, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 3561, "end_char": 4184, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d078bc44bd2ca1d639bd24086d834b15de1799d580b5956be46a0b0226b6abeb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nChoosing the right wallet for Polkadot Hub interactions depends on your specific requirements and familiarity with different interfaces. MetaMask provides a familiar entry point for developers with Ethereum experience, while Talisman offers deeper integration with Polkadot's unique features and native support for both EVM and Substrate accounts. By properly configuring your wallet connection, you gain access to the full spectrum of Polkadot Hub's capabilities.\n\n!!!info\n    Remember to always verify network parameters when connecting to ensure a secure and reliable connection to the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#introduction", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 14, "end_char": 524, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Ethers.js](https://docs.ethers.org/v6/) is a lightweight library that enables interaction with Ethereum Virtual Machine (EVM)-compatible blockchains through JavaScript. Ethers is widely used as a toolkit to establish connections and read and write blockchain data. This article demonstrates using Ethers.js to interact and deploy smart contracts to Polkadot Hub.\n\nThis guide is intended for developers who are familiar with JavaScript and want to interact with Polkadot Hub using Ethers.js."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#prerequisites", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 524, "end_char": 864, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have the following installed:\n\n- **Node.js**: v22.13.1 or later, check the [Node.js installation guide](https://nodejs.org/en/download/current/).\n- **npm**: v6.13.4 or later (comes bundled with Node.js).\n- **Solidity**: This guide uses Solidity `^0.8.9` for smart contract development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#project-structure", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 2, "depth": 2, "title": "Project Structure", "anchor": "project-structure", "start_char": 864, "end_char": 1372, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Project Structure\n\nThis project organizes contracts, scripts, and compiled artifacts for easy development and deployment.\n\n```text title=\"Ethers.js Polkadot Hub\"\nethers-project\n├── contracts\n│   ├── Storage.sol\n├── scripts\n│   ├── connectToProvider.js\n│   ├── fetchLastBlock.js\n│   ├── compile.js\n│   ├── deploy.js\n│   ├── checkStorage.js\n├── abis\n│   ├── Storage.json\n├── artifacts\n│   ├── Storage.bin\n├── contract-address.json\n├── node_modules/\n├── package.json\n├── package-lock.json\n└── README.md\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#set-up-the-project", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 3, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 1372, "end_char": 1593, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nTo start working with Ethers.js, create a new folder and initialize your project by running the following commands in your terminal:\n\n```bash\nmkdir ethers-project\ncd ethers-project\nnpm init -y\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#install-dependencies", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 4, "depth": 2, "title": "Install Dependencies", "anchor": "install-dependencies", "start_char": 1593, "end_char": 1877, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies\n\nNext, run the following command to install the Ethers.js library:\n\n```bash\nnpm install ethers\n```\n\nAdd the Solidity compiler so you can generate standard EVM bytecode:\n\n```bash\nnpm install --save-dev solc@0.8.38\n```\n\nThis guide uses `solc` version `0.8.38`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#set-up-the-ethersjs-provider", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 5, "depth": 2, "title": "Set Up the Ethers.js Provider", "anchor": "set-up-the-ethersjs-provider", "start_char": 1877, "end_char": 4481, "estimated_token_count": 564, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Ethers.js Provider\n\nA [`Provider`](https://docs.ethers.org/v6/api/providers/#Provider) is an abstraction of a connection to the Ethereum network, allowing you to query blockchain data and send transactions. It serves as a bridge between your application and the blockchain.\n\nTo interact with Polkadot Hub, you must set up an Ethers.js provider. This provider connects to a blockchain node, allowing you to query blockchain data and interact with smart contracts. In the root of your project, create a file named `connectToProvider.js` and add the following code:\n\n```js title=\"scripts/connectToProvider.js\"\nconst { JsonRpcProvider } = require('ethers');\n\nconst createProvider = (rpcUrl, chainId, chainName) => {\n  const provider = new JsonRpcProvider(rpcUrl, {\n    chainId: chainId,\n    name: chainName,\n  });\n\n  return provider;\n};\n\nconst PROVIDER_RPC = {\n  rpc: 'INSERT_RPC_URL',\n  chainId: 'INSERT_CHAIN_ID',\n  name: 'INSERT_CHAIN_NAME',\n};\n\ncreateProvider(PROVIDER_RPC.rpc, PROVIDER_RPC.chainId, PROVIDER_RPC.name);\n\n```\n\n!!! note\n    Replace `INSERT_RPC_URL`, `INSERT_CHAIN_ID`, and `INSERT_CHAIN_NAME` with the appropriate values. For example, to connect to Polkadot Hub TestNet's Ethereum RPC instance, you can use the following parameters:\n\n    ```js\n    const PROVIDER_RPC = {\n        rpc: 'https://services.polkadothub-rpc.com/testnet',\n        chainId: 420420417,\n        name: 'polkadot-hub-testnet'\n    };\n    ```\n\nTo connect to the provider, execute:\n\n```bash\nnode scripts/connectToProvider.js\n```\n\nWith the provider set up, you can start querying the blockchain. For instance, to fetch the latest block number:\n\n??? code \"fetchLastBlock.js code\"\n\n    ```js title=\"scripts/fetchLastBlock.js\"\n    const { JsonRpcProvider } = require('ethers');\n    \n    const createProvider = (rpcUrl, chainId, chainName) => {\n      const provider = new JsonRpcProvider(rpcUrl, {\n        chainId: chainId,\n        name: chainName,\n      });\n    \n      return provider;\n    };\n    \n    const PROVIDER_RPC = {\n      rpc: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      name: 'polkadot-hub-testnet',\n    };\n    \n    const main = async () => {\n      try {\n        const provider = createProvider(\n          PROVIDER_RPC.rpc,\n          PROVIDER_RPC.chainId,\n          PROVIDER_RPC.name,\n        );\n        const latestBlock = await provider.getBlockNumber();\n        console.log(`Latest block: ${latestBlock}`);\n      } catch (error) {\n        console.error('Error connecting to Polkadot Hub TestNet: ' + error.message);\n      }\n    };\n    \n    main();\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#compile-contracts", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 6, "depth": 2, "title": "Compile Contracts", "anchor": "compile-contracts", "start_char": 4481, "end_char": 4794, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile Contracts\n\nPolkadot Hub exposes an Ethereum JSON-RPC endpoint, so you can compile Solidity contracts to familiar EVM bytecode with the upstream [`solc`](https://www.npmjs.com/package/solc) compiler. The resulting artifacts work with any EVM-compatible toolchain and can be deployed through Ethers.js."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#sample-storage-smart-contract", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 7, "depth": 3, "title": "Sample Storage Smart Contract", "anchor": "sample-storage-smart-contract", "start_char": 4794, "end_char": 5619, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sample Storage Smart Contract\n\nThis example demonstrates compiling a `Storage.sol` Solidity contract for deployment to Polkadot Hub. The contract's functionality stores a number and permits users to update it with a new value.\n\n```solidity title=\"contracts/Storage.sol\"\n//SPDX-License-Identifier: MIT\n\n// Solidity files have to start with this pragma.\n// It will be used by the Solidity compiler to validate its version.\npragma solidity ^0.8.9;\n\ncontract Storage {\n    // Public state variable to store a number\n    uint256 public storedNumber;\n\n    /**\n    * Updates the stored number.\n    *\n    * The `public` modifier allows anyone to call this function.\n    *\n    * @param _newNumber - The new value to store.\n    */\n    function setNumber(uint256 _newNumber) public {\n        storedNumber = _newNumber;\n    }\n}\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#compile-the-smart-contract", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 8, "depth": 3, "title": "Compile the Smart Contract", "anchor": "compile-the-smart-contract", "start_char": 5619, "end_char": 9176, "estimated_token_count": 810, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compile the Smart Contract\n\nTo compile this contract, use the following script:\n\n```js title=\"scripts/compile.js\"\nconst solc = require('solc');\nconst { readFileSync, writeFileSync, mkdirSync, existsSync } = require('fs');\nconst { basename, join } = require('path');\n\nconst ensureDir = (dirPath) => {\n  if (!existsSync(dirPath)) {\n    mkdirSync(dirPath, { recursive: true });\n  }\n};\n\nconst compileContract = (solidityFilePath, abiDir, artifactsDir) => {\n  try {\n    // Read the Solidity file\n    const source = readFileSync(solidityFilePath, 'utf8');\n    const fileName = basename(solidityFilePath);\n    \n    // Construct the input object for the Solidity compiler\n    const input = {\n      language: 'Solidity',\n      sources: {\n        [fileName]: {\n          content: source,\n        },\n      },\n      settings: {\n        outputSelection: {\n          '*': {\n            '*': ['abi', 'evm.bytecode'],\n          },\n        },\n      },\n    };\n    \n    console.log(`Compiling contract: ${fileName}...`);\n    \n    // Compile the contract\n    const output = JSON.parse(solc.compile(JSON.stringify(input)));\n    \n    // Check for errors\n    if (output.errors) {\n      const errors = output.errors.filter(error => error.severity === 'error');\n      if (errors.length > 0) {\n        console.error('Compilation errors:');\n        errors.forEach(err => console.error(err.formattedMessage));\n        return;\n      }\n      // Show warnings\n      const warnings = output.errors.filter(error => error.severity === 'warning');\n      warnings.forEach(warn => console.warn(warn.formattedMessage));\n    }\n    \n    // Ensure output directories exist\n    ensureDir(abiDir);\n    ensureDir(artifactsDir);\n\n    // Process compiled contracts\n    for (const [sourceFile, contracts] of Object.entries(output.contracts)) {\n      for (const [contractName, contract] of Object.entries(contracts)) {\n        console.log(`Compiled contract: ${contractName}`);\n        \n        // Write the ABI\n        const abiPath = join(abiDir, `${contractName}.json`);\n        writeFileSync(abiPath, JSON.stringify(contract.abi, null, 2));\n        console.log(`ABI saved to ${abiPath}`);\n        \n        // Write the bytecode\n        const bytecodePath = join(artifactsDir, `${contractName}.bin`);\n        writeFileSync(bytecodePath, contract.evm.bytecode.object);\n        console.log(`Bytecode saved to ${bytecodePath}`);\n      }\n    }\n  } catch (error) {\n    console.error('Error compiling contracts:', error);\n  }\n};\n\nconst solidityFilePath = join(__dirname, '../contracts/Storage.sol');\nconst abiDir = join(__dirname, '../abis');\nconst artifactsDir = join(__dirname, '../artifacts');\n\ncompileContract(solidityFilePath, abiDir, artifactsDir);\n```\n\n!!! note \n     The script above is tailored to the `Storage.sol` contract. It can be adjusted for other contracts by changing the file name or modifying the ABI and bytecode paths.\n\nThe ABI (Application Binary Interface) is a JSON representation of your contract's functions, events, and their parameters. It serves as the interface between your JavaScript code and the deployed smart contract, allowing your application to know how to format function calls and interpret returned data.\n\nExecute the script above by running:\n\n```bash\nnode scripts/compile.js\n```\n\nAfter executing the script, the Solidity contract is compiled into standard EVM bytecode. The ABI and bytecode are saved into files with `.json` and `.bin` extensions, respectively. You can now proceed with deploying the contract to Polkadot Hub, as outlined in the next section."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#deploy-the-compiled-contract", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 9, "depth": 2, "title": "Deploy the Compiled Contract", "anchor": "deploy-the-compiled-contract", "start_char": 9176, "end_char": 16959, "estimated_token_count": 1618, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Compiled Contract\n\nTo deploy your compiled contract to Polkadot Hub, you'll need a wallet with a private key to sign the deployment transaction.\n\nYou can create a `deploy.js` script in the root of your project to achieve this. The deployment script can be divided into key components:\n\n1. Set up the required imports and utilities:\n\n    ```js title=\"scripts/deploy.js\"\n    const { writeFileSync, existsSync, readFileSync } = require('fs');\n    const { join } = require('path');\n    const { ethers, JsonRpcProvider } = require('ethers');\n    \n    ```\n\n2. Create a provider to connect to Polkadot Hub:\n\n    ```js title=\"scripts/deploy.js\"\n    \n    // Creates a provider with specified RPC URL and chain details\n    const createProvider = (rpcUrl, chainId, chainName) => {\n      const provider = new JsonRpcProvider(rpcUrl, {\n        chainId: chainId,\n        name: chainName,\n      });\n      return provider;\n    };\n    ```\n \n3. Set up functions to read contract artifacts:\n\n    ```js title=\"scripts/deploy.js\"\n    // Reads and parses the ABI file for a given contract\n    const getAbi = (contractName) => {\n      try {\n        const abiPath = join(artifactsDir, `${contractName}.json`);\n        return JSON.parse(readFileSync(abiPath, 'utf8'));\n      } catch (error) {\n        console.error(\n          `Could not find ABI for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    \n    // Reads the compiled bytecode for a given contract\n    const getByteCode = (contractName) => {\n      try {\n        const bytecodePath = join(artifactsDir, `${contractName}.bin`);\n        const bytecode = readFileSync(bytecodePath, 'utf8').trim();\n        // Add 0x prefix if not present\n        return bytecode.startsWith('0x') ? bytecode : `0x${bytecode}`;\n      } catch (error) {\n        console.error(\n          `Could not find bytecode for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    \n    ```\n\n4. Create the main deployment function:\n\n    ```js title=\"scripts/deploy.js\"\n    const deployContract = async (contractName, mnemonic, providerConfig) => {\n      console.log(`Deploying ${contractName}...`);\n      try {\n        // Step 1: Set up provider and wallet\n        const provider = createProvider(\n          providerConfig.rpc,\n          providerConfig.chainId,\n          providerConfig.name,\n        );\n        const walletMnemonic = ethers.Wallet.fromPhrase(mnemonic);\n        const wallet = walletMnemonic.connect(provider);\n    \n        // Step 2: Create and deploy the contract\n        const factory = new ethers.ContractFactory(\n          getAbi(contractName),\n          getByteCode(contractName),\n          wallet,\n        );\n        const contract = await factory.deploy();\n        await contract.waitForDeployment();\n    \n        // Step 3: Save deployment information\n        const address = await contract.getAddress();\n        console.log(`Contract ${contractName} deployed at: ${address}`);\n    \n        const addressesFile = join(scriptsDir, 'contract-address.json');\n        const addresses = existsSync(addressesFile)\n          ? JSON.parse(readFileSync(addressesFile, 'utf8'))\n          : {};\n    \n        addresses[contractName] = address;\n        writeFileSync(addressesFile, JSON.stringify(addresses, null, 2), 'utf8');\n      } catch (error) {\n        console.error(`Failed to deploy contract ${contractName}:`, error);\n      }\n    };\n    ```\n\n5. Configure and execute the deployment:\n\n    ```js title=\"scripts/deploy.js\"\n    const providerConfig = {\n      rpc: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      name: 'polkadot-hub-testnet',\n    };\n    \n    const mnemonic = 'INSERT_MNEMONIC';\n    \n    deployContract('Storage', mnemonic, providerConfig);\n    ```\n\n    !!! note\n        A mnemonic (seed phrase) is a series of words that can generate multiple private keys and their corresponding addresses. It's used here to derive the wallet that will sign and pay for the deployment transaction. **Always keep your mnemonic secure and never share it publicly**.\n\n        Ensure to replace the `INSERT_MNEMONIC` placeholder with your actual mnemonic.\n\n??? code \"View complete script\"\n\n    ```js title=\"scripts/deploy.js\"\n    const { writeFileSync, existsSync, readFileSync } = require('fs');\n    const { join } = require('path');\n    const { ethers, JsonRpcProvider } = require('ethers');\n    \n    const scriptsDir = __dirname;\n    const artifactsDir = join(__dirname, '../contracts');\n    \n    // Creates a provider with specified RPC URL and chain details\n    const createProvider = (rpcUrl, chainId, chainName) => {\n      const provider = new JsonRpcProvider(rpcUrl, {\n        chainId: chainId,\n        name: chainName,\n      });\n      return provider;\n    };\n    \n    // Reads and parses the ABI file for a given contract\n    const getAbi = (contractName) => {\n      try {\n        const abiPath = join(artifactsDir, `${contractName}.json`);\n        return JSON.parse(readFileSync(abiPath, 'utf8'));\n      } catch (error) {\n        console.error(\n          `Could not find ABI for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    \n    // Reads the compiled bytecode for a given contract\n    const getByteCode = (contractName) => {\n      try {\n        const bytecodePath = join(artifactsDir, `${contractName}.bin`);\n        const bytecode = readFileSync(bytecodePath, 'utf8').trim();\n        // Add 0x prefix if not present\n        return bytecode.startsWith('0x') ? bytecode : `0x${bytecode}`;\n      } catch (error) {\n        console.error(\n          `Could not find bytecode for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    \n    const deployContract = async (contractName, mnemonic, providerConfig) => {\n      console.log(`Deploying ${contractName}...`);\n      try {\n        // Step 1: Set up provider and wallet\n        const provider = createProvider(\n          providerConfig.rpc,\n          providerConfig.chainId,\n          providerConfig.name,\n        );\n        const walletMnemonic = ethers.Wallet.fromPhrase(mnemonic);\n        const wallet = walletMnemonic.connect(provider);\n    \n        // Step 2: Create and deploy the contract\n        const factory = new ethers.ContractFactory(\n          getAbi(contractName),\n          getByteCode(contractName),\n          wallet,\n        );\n        const contract = await factory.deploy();\n        await contract.waitForDeployment();\n    \n        // Step 3: Save deployment information\n        const address = await contract.getAddress();\n        console.log(`Contract ${contractName} deployed at: ${address}`);\n    \n        const addressesFile = join(scriptsDir, 'contract-address.json');\n        const addresses = existsSync(addressesFile)\n          ? JSON.parse(readFileSync(addressesFile, 'utf8'))\n          : {};\n    \n        addresses[contractName] = address;\n        writeFileSync(addressesFile, JSON.stringify(addresses, null, 2), 'utf8');\n      } catch (error) {\n        console.error(`Failed to deploy contract ${contractName}:`, error);\n      }\n    };\n    \n    const providerConfig = {\n      rpc: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      name: 'polkadot-hub-testnet',\n    };\n    \n    const mnemonic = 'INSERT_MNEMONIC';\n    \n    deployContract('Storage', mnemonic, providerConfig);\n    ```\n\nTo run the script, execute the following command:\n\n```bash\nnode scripts/deploy.js\n```\n\nAfter running this script, your contract will be deployed to Polkadot Hub, and its address will be saved in `contract-address.json` within your project directory. You can use this address for future contract interactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#interact-with-the-contract", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 10, "depth": 2, "title": "Interact with the Contract", "anchor": "interact-with-the-contract", "start_char": 16959, "end_char": 20384, "estimated_token_count": 743, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the Contract\n\nOnce the contract is deployed, you can interact with it by calling its functions. For example, to set a number, read it and then modify that number by its double, you can create a file named `checkStorage.js` in the root of your project and add the following code:\n\n```js title=\"scripts/checkStorage.js\"\nconst { ethers } = require('ethers');\nconst { readFileSync } = require('fs');\nconst { join } = require('path');\n\nconst artifactsDir = join(__dirname, '../contracts');\n\nconst createProvider = (providerConfig) => {\n  return new ethers.JsonRpcProvider(providerConfig.rpc, {\n    chainId: providerConfig.chainId,\n    name: providerConfig.name,\n  });\n};\n\nconst createWallet = (mnemonic, provider) => {\n  return ethers.Wallet.fromPhrase(mnemonic).connect(provider);\n};\n\nconst loadContractAbi = (contractName, directory = artifactsDir) => {\n  const contractPath = join(directory, `${contractName}.json`);\n  const contractJson = JSON.parse(readFileSync(contractPath, 'utf8'));\n  return contractJson.abi || contractJson; // Depending on JSON structure\n};\n\nconst createContract = (contractAddress, abi, wallet) => {\n  return new ethers.Contract(contractAddress, abi, wallet);\n};\n\nconst interactWithStorageContract = async (\n  contractName,\n  contractAddress,\n  mnemonic,\n  providerConfig,\n  numberToSet,\n) => {\n  try {\n    console.log(`Setting new number in Storage contract: ${numberToSet}`);\n\n    // Create provider and wallet\n    const provider = createProvider(providerConfig);\n    const wallet = createWallet(mnemonic, provider);\n\n    // Load the contract ABI and create the contract instance\n    const abi = loadContractAbi(contractName);\n    const contract = createContract(contractAddress, abi, wallet);\n\n    // Send a transaction to set the stored number\n    const tx1 = await contract.setNumber(numberToSet);\n    await tx1.wait(); // Wait for the transaction to be mined\n    console.log(`Number successfully set to ${numberToSet}`);\n\n    // Retrieve the updated number\n    const storedNumber = await contract.storedNumber();\n    console.log(`Retrieved stored number:`, storedNumber.toString());\n\n    // Send a transaction to set the stored number\n    const tx2 = await contract.setNumber(numberToSet * 2);\n    await tx2.wait(); // Wait for the transaction to be mined\n    console.log(`Number successfully set to ${numberToSet * 2}`);\n\n    // Retrieve the updated number\n    const updatedNumber = await contract.storedNumber();\n    console.log(`Retrieved stored number:`, updatedNumber.toString());\n  } catch (error) {\n    console.error('Error interacting with Storage contract:', error.message);\n  }\n};\n\nconst providerConfig = {\n  name: 'polkadot-hub',\n  rpc: 'https://services.polkadothub-rpc.com/testnet',\n  chainId: 420420417,\n};\n\nconst mnemonic = 'INSERT_MNEMONIC'\nconst contractName = 'Storage';\nconst contractAddress = 'INSERT_CONTRACT_ADDRESS'\nconst newNumber = 42;\n\ninteractWithStorageContract(\n  contractName,\n  contractAddress,\n  mnemonic,\n  providerConfig,\n  newNumber,\n);\n```\n\nEnsure you replace the `INSERT_MNEMONIC` and `INSERT_CONTRACT_ADDRESS` placeholders with actual values. Also, ensure the contract ABI file (`Storage.json`) is correctly referenced. The script prints the balance for `ADDRESS_TO_CHECK` before it writes and doubles the stored value, so pick any account you want to monitor.\n\nTo interact with the contract, run:\n\n```bash\nnode scripts/checkStorage.js\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-ethers-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/ethers-js/#where-to-go-next", "page_title": "Deploy Contracts to Polkadot Hub with Ethers.js", "index": 11, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 20384, "end_char": 20956, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:feeb7eb3704a0f79bd70787ea87fab0d7dac0fcac55ee2a6ddb5632e593f60a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you have the foundational knowledge to use Ethers.js with Polkadot Hub, you can:\n\n- **Dive into Ethers.js utilities**: Discover additional Ethers.js features, such as wallet management, signing messages, etc.\n- **Implement batch transactions**: Use Ethers.js to execute batch transactions for efficient multi-step contract interactions.\n- **Build scalable applications**: Combine Ethers.js with frameworks like [`Next.js`](https://nextjs.org/docs) or [`Node.js`](https://nodejs.org/en) to create full-stack decentralized applications (dApps)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#introduction", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 9, "end_char": 270, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[viem](https://viem.sh/) is a lightweight TypeScript library designed for interacting with Ethereum-compatible blockchains. This comprehensive guide will walk you through using viem to interact with and deploy smart contracts to Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#prerequisites", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 270, "end_char": 610, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have the following installed:\n\n- **Node.js**: v22.13.1 or later, check the [Node.js installation guide](https://nodejs.org/en/download/current/).\n- **npm**: v6.13.4 or later (comes bundled with Node.js).\n- **Solidity**: This guide uses Solidity `^0.8.9` for smart contract development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#project-structure", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 2, "depth": 2, "title": "Project Structure", "anchor": "project-structure", "start_char": 610, "end_char": 1036, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Project Structure\n\nThis project organizes contracts, scripts, and compiled artifacts for easy development and deployment.\n\n```text\nviem-project/\n├── package.json\n├── tsconfig.json\n├── src/\n│   ├── chainConfig.ts\n│   ├── createClient.ts\n│   ├── createWallet.ts\n│   ├── compile.ts\n│   ├── deploy.ts\n│   └── interact.ts\n├── contracts/\n│   └── Storage.sol\n├── abis/\n│   └── Storage.json\n└── artifacts/\n    └── Storage.bin\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#set-up-the-project", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 3, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 1036, "end_char": 1175, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\nFirst, create a new folder and initialize your project:\n\n```bash\nmkdir viem-project\ncd viem-project\nnpm init -y\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#install-dependencies", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 4, "depth": 2, "title": "Install Dependencies", "anchor": "install-dependencies", "start_char": 1175, "end_char": 1537, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies\n\nInstall viem along with other necessary dependencies, including [`solc`](https://www.npmjs.com/package/solc), which enables compiling smart contracts' EVM bytecode.\n\n```bash\n# Install viem and solc\nnpm install viem solc@0.8.38\n\n# Install TypeScript and development dependencies\nnpm install --save-dev typescript ts-node @types/node\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#initialize-project", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 5, "depth": 2, "title": "Initialize Project", "anchor": "initialize-project", "start_char": 1537, "end_char": 2047, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initialize Project\n\nInitialize a TypeScript project by running the following command:\n\n```bash\nnpx tsc --init\n```\n\nAdd the following scripts to your `package.json` file to enable running TypeScript files:\n\n```json\n{\n    \"scripts\": {\n        \"client\": \"ts-node src/createClient.ts\",\n        \"compile\": \"ts-node src/compile.ts\",\n        \"deploy\": \"ts-node src/deploy.ts\",\n        \"interact\": \"ts-node src/interact.ts\"\n    },\n}\n```\n\nCreate a directory for your TypeScript source files:\n\n```bash\nmkdir src\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#set-up-the-chain-configuration", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 6, "depth": 2, "title": "Set Up the Chain Configuration", "anchor": "set-up-the-chain-configuration", "start_char": 2047, "end_char": 2986, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Chain Configuration\n\nThe first step is to set up the chain configuration. Create a new file at `src/chainConfig.ts`:\n\n```typescript title=\"src/chainConfig.ts\"\nimport { http } from 'viem';\n\nexport const TRANSPORT = http('INSERT_RPC_URL');\n\n// Configure the Polkadot Hub chain\nexport const POLKADOT_HUB = {\n  id: INSERT_CHAIN_ID,\n  name: 'INSERT_CHAIN_NAME',\n  network: 'INSERT_NETWORK_NAME',\n  nativeCurrency: {\n    decimals: INSERT_CHAIN_DECIMALS,\n    name: 'INSERT_CURRENCY_NAME',\n    symbol: 'INSERT_CURRENCY_SYMBOL',\n  },\n  rpcUrls: {\n    default: {\n      http: ['INSERT_RPC_URL'],\n    },\n  },\n} as const;\n```\n\nEnsure to replace `INSERT_RPC_URL`, `INSERT_CHAIN_ID`, `INSERT_CHAIN_NAME`, `INSERT_NETWORK_NAME`, `INSERT_CHAIN_DECIMALS`, `INSERT_CURRENCY_NAME`, and `INSERT_CURRENCY_SYMBOL` with the proper values. Check the [Connect to Polkadot](/smart-contracts/connect/) page for more information on the possible values."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#set-up-the-viem-client", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 7, "depth": 2, "title": "Set Up the viem Client", "anchor": "set-up-the-viem-client", "start_char": 2986, "end_char": 5102, "estimated_token_count": 469, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the viem Client\n\nTo interact with the chain, you need to create a client that is used solely for reading data. To accomplish this, create a new file at `src/createClient.ts`:\n\n```typescript title=\"src/createClient.ts\"\nimport { createPublicClient, createWalletClient, http } from 'viem';\n\nconst transport = http('INSERT_RPC_URL');\n\n// Configure the Polkadot Hub chain\nconst assetHub = {\n  id: INSERT_CHAIN_ID,\n  name: 'INSERT_CHAIN_NAME',\n  network: 'INSERT_NETWORK_NAME',\n  nativeCurrency: {\n    decimals: INSERT_CHAIN_DECIMALS,\n    name: 'INSERT_CURRENCY_NAME',\n    symbol: 'INSERT_CURRENCY_SYMBOL',\n  },\n  rpcUrls: {\n    default: {\n      http: ['INSERT_RPC_URL'],\n    },\n  },\n} as const;\n\n// Create a public client for reading data\nexport const publicClient = createPublicClient({\n  chain: assetHub,\n  transport,\n});\n\n```\n\nAfter setting up the [Public Client](https://viem.sh/docs/clients/public#public-client), you can begin querying the blockchain. Here's an example of fetching the latest block number:\n\n??? code \"Fetch Last Block code\"\n\n    ```js title=\"src/fetchLastBlock.ts\"\n    import { createPublicClient, http } from 'viem';\n    \n    const transport = http('https://services.polkadothub-rpc.com/testnet');\n    \n    // Configure the Polkadot Hub chain\n    const polkadotHubTestnet = {\n      id: 420420417,\n      name: 'Polkadot Hub TestNet',\n      network: 'polkadot-hub-testnet',\n      nativeCurrency: {\n        decimals: 18,\n        name: 'PAS',\n        symbol: 'PAS',\n      },\n      rpcUrls: {\n        default: {\n          http: ['https://services.polkadothub-rpc.com/testnet'],\n        },\n      },\n    } as const;\n    \n    // Create a public client for reading data\n    export const publicClient = createPublicClient({\n      chain: polkadotHubTestnet,\n      transport,\n    });\n    \n    const main = async () => {\n      try {\n        const block = await publicClient.getBlock();\n        console.log('Last block: ' + block.number.toString());\n      } catch (error: unknown) {\n        console.error('Error connecting to Polkadot Hub TestNet: ' + error);\n      }\n    };\n    \n    main();\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#set-up-a-wallet", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 8, "depth": 2, "title": "Set Up a Wallet", "anchor": "set-up-a-wallet", "start_char": 5102, "end_char": 6443, "estimated_token_count": 293, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up a Wallet\n\nIn case you need to sign transactions, you will need to instantiate a [Wallet Client](https://viem.sh/docs/clients/wallet#wallet-client) object within your project. To do so, create `src/createWallet.ts`:\n\n```typescript title=\"src/createWallet.ts\"\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { createWalletClient, http } from 'viem';\n\nconst transport = http('INSERT_RPC_URL');\n\n// Configure the Polkadot Hub chain\nconst assetHub = {\n  id: INSERT_CHAIN_ID,\n  name: 'INSERT_CHAIN_NAME',\n  network: 'INSERT_NETWORK_NAME',\n  nativeCurrency: {\n    decimals: INSERT_CHAIN_DECIMALS,\n    name: 'INSERT_CURRENCY_NAME',\n    symbol: 'INSERT_CURRENCY_SYMBOL',\n  },\n  rpcUrls: {\n    default: {\n      http: ['INSERT_RPC_URL'],\n    },\n    public: {\n      http: ['INSERT_RPC_URL'],\n    },\n  },\n} as const;\n\n// Create a wallet client for writing data\nexport const createWallet = (privateKey: `0x${string}`) => {\n  const account = privateKeyToAccount(privateKey);\n  return createWalletClient({\n    account,\n    chain: assetHub,\n    transport,\n  });\n};\n```\n\n!!!note\n    The wallet you import with your private key must have sufficient funds to pay for transaction fees when deploying contracts or interacting with them. Make sure to fund your wallet with the appropriate native tokens for the network you're connecting to."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#sample-smart-contract", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 9, "depth": 2, "title": "Sample Smart Contract", "anchor": "sample-smart-contract", "start_char": 6443, "end_char": 7424, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Sample Smart Contract\n\nThis example demonstrates compiling a `Storage.sol` Solidity contract for deployment to Polkadot Hub. The contract's functionality stores a number and permits users to update it with a new value.\n\n```bash\nmkdir contracts artifacts\n```\n\nYou can use the following contract to interact with the blockchain. Paste the following contract in `contracts/Storage.sol`:\n\n```solidity title=\"contracts/Storage.sol\"\n//SPDX-License-Identifier: MIT\n\n// Solidity files have to start with this pragma.\n// It will be used by the Solidity compiler to validate its version.\npragma solidity ^0.8.9;\n\ncontract Storage {\n    // Public state variable to store a number\n    uint256 public storedNumber;\n\n    /**\n    * Updates the stored number.\n    *\n    * The `public` modifier allows anyone to call this function.\n    *\n    * @param _newNumber - The new value to store.\n    */\n    function setNumber(uint256 _newNumber) public {\n        storedNumber = _newNumber;\n    }\n}\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#compile-the-contract", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 10, "depth": 2, "title": "Compile the Contract", "anchor": "compile-the-contract", "start_char": 7424, "end_char": 10483, "estimated_token_count": 723, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile the Contract\n\nCreate a new file at `src/compile.ts` for handling contract compilation:\n\n```typescript title=\"src/compile.ts\"\nimport solc from 'solc';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';\nimport { basename, join } from 'path';\n\nconst ensureDir = (dirPath: string): void => {\n  if (!existsSync(dirPath)) {\n    mkdirSync(dirPath, { recursive: true });\n  }\n};\n\nconst compileContract = (\n  solidityFilePath: string,\n  abiDir: string,\n  artifactsDir: string\n): void => {\n  try {\n    // Read the Solidity file\n    const source: string = readFileSync(solidityFilePath, 'utf8');\n    const fileName: string = basename(solidityFilePath);\n    \n    // Construct the input object for the Solidity compiler\n    const input = {\n      language: 'Solidity',\n      sources: {\n        [fileName]: {\n          content: source,\n        },\n      },\n      settings: {\n        outputSelection: {\n          '*': {\n            '*': ['abi', 'evm.bytecode'],\n          },\n        },\n      },\n    };\n    \n    console.log(`Compiling contract: ${fileName}...`);\n    \n    // Compile the contract\n    const output = JSON.parse(solc.compile(JSON.stringify(input)));\n    \n    // Check for errors\n    if (output.errors) {\n      const errors = output.errors.filter((error: any) => error.severity === 'error');\n      if (errors.length > 0) {\n        console.error('Compilation errors:');\n        errors.forEach((err: any) => console.error(err.formattedMessage));\n        return;\n      }\n      // Show warnings\n      const warnings = output.errors.filter((error: any) => error.severity === 'warning');\n      warnings.forEach((warn: any) => console.warn(warn.formattedMessage));\n    }\n    \n    // Ensure output directories exist\n    ensureDir(abiDir);\n    ensureDir(artifactsDir);\n    \n    // Process compiled contracts\n    for (const [sourceFile, contracts] of Object.entries(output.contracts)) {\n      for (const [contractName, contract] of Object.entries(contracts as any)) {\n        console.log(`Compiled contract: ${contractName}`);\n        \n        // Write the ABI\n        const abiPath = join(abiDir, `${contractName}.json`);\n        writeFileSync(abiPath, JSON.stringify((contract as any).abi, null, 2));\n        console.log(`ABI saved to ${abiPath}`);\n        \n        // Write the bytecode\n        const bytecodePath = join(artifactsDir, `${contractName}.bin`);\n        writeFileSync(bytecodePath, (contract as any).evm.bytecode.object);\n        console.log(`Bytecode saved to ${bytecodePath}`);\n      }\n    }\n  } catch (error) {\n    console.error('Error compiling contracts:', error);\n  }\n};\n\nconst solidityFilePath: string = './contracts/Storage.sol';\nconst abiDir: string = './abis';\nconst artifactsDir: string = './artifacts';\n\ncompileContract(solidityFilePath, abiDir, artifactsDir);\n```\n\nTo compile your contract:\n\n```bash\nnpm run compile\n```\n\nAfter executing this script, you will see the compilation results including the generated `Storage.json` (containing the contract's ABI) and `Storage.bin` (containing the compiled bytecode)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#deploy-the-contract", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 11, "depth": 2, "title": "Deploy the Contract", "anchor": "deploy-the-contract", "start_char": 10483, "end_char": 13092, "estimated_token_count": 604, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Contract\n\nCreate a new file at `src/deploy.ts` for handling contract deployment:\n\n```typescript title=\"src/deploy.ts\"\nimport { existsSync, readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { createWallet } from './createWallet.ts';\nimport { publicClient } from './createClient.ts';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst ABIS_DIR = join(__dirname, '../abis');\nconst ARTIFACTS_DIR = join(__dirname, '../artifacts');\n\nconst deployContract = async (\n  contractName: string,\n  privateKey: `0x${string}`\n) => {\n  try {\n    console.log(`Deploying ${contractName}...`);\n\n    const abiPath = join(ABIS_DIR, `${contractName}.json`);\n    const bytecodePath = join(ARTIFACTS_DIR, `${contractName}.bin`);\n\n    if (!existsSync(abiPath) || !existsSync(bytecodePath)) {\n      throw new Error(\n        `Missing artifacts for ${contractName}. Try running \"npm run compile\" first.`\n      );\n    }\n\n    // Read contract artifacts\n    const abi = JSON.parse(\n      readFileSync(abiPath, 'utf8')\n    );\n    const bytecode = `0x${readFileSync(bytecodePath, 'utf8').trim()}` as `0x${string}`;\n\n    // Create wallet\n    const wallet = createWallet(privateKey);\n\n    // Deploy contract\n    const hash = await wallet.deployContract({\n      abi,\n      bytecode,\n      args: [], // Add constructor arguments if needed\n    });\n\n    // Wait for deployment\n    const receipt = await publicClient.waitForTransactionReceipt({ hash });\n    const contractAddress = receipt.contractAddress;\n\n    console.log(`Contract deployed at: ${contractAddress}`);\n    return contractAddress;\n  } catch (error) {\n    console.error('Deployment failed:', error);\n    throw error;\n  }\n};\n\nconst privateKey = 'INSERT_PRIVATE_KEY';\ndeployContract('Storage', privateKey);\n```\n\nEnsure to replace `INSERT_PRIVATE_KEY` with the proper value. For further details on private key exportation, refer to the article [How to export an account's private key](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/).\n\n!!! warning\n    Never commit or share your private key. Exposed keys can lead to immediate theft of all associated funds. Use environment variables instead.\n\nTo deploy, run the following command:\n\n```bash\nnpm run deploy\n```\n\nIf everything is successful, you will see the address of your deployed contract displayed in the terminal. This address is unique to your contract on the network you defined in the chain configuration, and you'll need it for any future interactions with your contract."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#interact-with-the-contract", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 12, "depth": 2, "title": "Interact with the Contract", "anchor": "interact-with-the-contract", "start_char": 13092, "end_char": 15465, "estimated_token_count": 510, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the Contract\n\nCreate a new file at `src/interact.ts` for interacting with your deployed contract:\n\n```typescript title=\"src/interact.ts\"\nimport { readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { publicClient } from './createClient.ts';\nimport { createWallet } from './createWallet.ts';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst ABI_PATH = join(__dirname, '../abis/Storage.json');\n\nconst STORAGE_ABI = JSON.parse(readFileSync(ABI_PATH, 'utf8'));\n\nconst interactWithStorage = async (\n  contractAddress: `0x${string}`,\n  privateKey: `0x${string}`\n) => {\n  try {\n    const wallet = createWallet(privateKey);\n    const currentNumber = await publicClient.readContract({\n      address: contractAddress,\n      abi: STORAGE_ABI,\n      functionName: 'storedNumber',\n      args: [],\n    });\n    console.log(`Stored number: ${currentNumber}`);\n\n    const newNumber = BigInt(42);\n    const { request } = await publicClient.simulateContract({\n      address: contractAddress,\n      abi: STORAGE_ABI,\n      functionName: 'setNumber',\n      args: [newNumber],\n      account: wallet.account,\n    });\n\n    const hash = await wallet.writeContract(request);\n    await publicClient.waitForTransactionReceipt({ hash });\n    console.log(`Number updated to ${newNumber}`);\n\n    const updatedNumber = await publicClient.readContract({\n      address: contractAddress,\n      abi: STORAGE_ABI,\n      functionName: 'storedNumber',\n      args: [],\n    });\n    console.log('Updated stored number:', updatedNumber);\n  } catch (error) {\n    console.error('Interaction failed:', error);\n  }\n};\n\nconst PRIVATE_KEY = 'INSERT_PRIVATE_KEY';\nconst CONTRACT_ADDRESS = 'INSERT_CONTRACT_ADDRESS';\n\ninteractWithStorage(CONTRACT_ADDRESS, PRIVATE_KEY);\n```\n\nEnsure to replace `INSERT_PRIVATE_KEY` and `INSERT_CONTRACT_ADDRESS` with the proper values.\n\nTo interact with the contract:\n\n```bash\nnpm run interact\n```\n\nFollowing a successful interaction, you will see the stored value before and after the transaction. The output will show the initial stored number (0 if you haven't modified it yet), confirm when the transaction to set the number to 42 is complete, and then display the updated stored number value. This demonstrates both reading from and writing to your smart contract."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-viem", "url": "https://developer.polkadot.com/smart-contracts/libraries/viem/#where-to-go-next", "page_title": "viem for Polkadot Hub Smart Contracts", "index": 13, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 15465, "end_char": 17110, "estimated_token_count": 499, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ba05d41efc2da66412614598a88374a6f1b3449b3e4710a06771a8908872f03", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you have the foundation for using viem with Polkadot Hub, consider exploring:\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Advanced viem Features__\n\n    ---\n\n    Explore viem's documentation:\n\n    <ul class=\"card-list\">\n    <li>[:octicons-arrow-right-24: Multi call](https://viem.sh/docs/contract/multicall#multicall)</li>\n    <li>[:octicons-arrow-right-24: Batch transactions](https://viem.sh/docs/clients/transports/http#batch-json-rpc)</li>\n    <li>[:octicons-arrow-right-24: Custom actions](https://viem.sh/docs/clients/custom#extending-with-actions-or-configuration)</li>\n    </ul>\n\n-   <span class=\"badge external\">External</span> __Test Frameworks__\n\n    ---\n\n    Integrate viem with the following frameworks for comprehensive testing:\n\n    <ul class=\"card-list\">\n    <li>[:octicons-arrow-right-24: Hardhat](https://hardhat.org/)</li>\n    <li>[:octicons-arrow-right-24: Foundry](https://www.getfoundry.sh/)</li>\n    </ul>\n\n-   <span class=\"badge external\">External</span> __Event Handling__\n\n    ---\n\n    Learn how to subscribe to and process contract events:\n\n    <ul class=\"card-list\">\n    <li>[:octicons-arrow-right-24: Event subscription](https://viem.sh/docs/actions/public/watchEvent#watchevent)</li>\n    </ul>\n\n-   <span class=\"badge external\">External</span> __Building dApps__\n\n    ---\n\n    Combine viem the following technologies to create full-stack applications:\n\n    <ul class=\"card-list\">\n    <li>[:octicons-arrow-right-24: Next.js](https://nextjs.org/docs)</li>\n    <li>[:octicons-arrow-right-24: Node.js](https://nodejs.org/en)</li>\n    </ul>\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#introduction", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 10, "end_char": 406, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\n[Wagmi](https://wagmi.sh/) is a collection of [React Hooks](https://wagmi.sh/react/api/hooks) for interacting with Ethereum-compatible blockchains, focusing on developer experience, feature richness, and reliability.\n\nThis guide demonstrates how to use Wagmi to interact with and deploy smart contracts to Polkadot Hub, providing a seamless frontend integration for your dApps."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#set-up-the-project", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 1, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 406, "end_char": 637, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nTo start working with Wagmi, create a new React project and initialize it by running the following commands in your terminal:\n\n```bash\nnpx create-next-app@latest wagmi-polkadot-hub\ncd wagmi-polkadot-hub\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#install-dependencies", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 2, "depth": 2, "title": "Install Dependencies", "anchor": "install-dependencies", "start_char": 637, "end_char": 767, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies\n\nInstall Wagmi v3 and its peer dependencies:\n\n```bash\nnpm install wagmi@3 viem @tanstack/react-query\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#configure-wagmi-for-polkadot-hub", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 3, "depth": 2, "title": "Configure Wagmi for Polkadot Hub", "anchor": "configure-wagmi-for-polkadot-hub", "start_char": 767, "end_char": 2461, "estimated_token_count": 377, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Configure Wagmi for Polkadot Hub\n\nCreate a configuration file to initialize Wagmi with Polkadot Hub. In your project, create a file named `app/lib/wagmi.ts` and add the code below. Be sure to replace `INSERT_RPC_URL`, `INSERT_CHAIN_ID`, `INSERT_CHAIN_NAME`, `INSERT_NETWORK_NAME`, `INSERT_CHAIN_DECIMALS`, `INSERT_CURRENCY_NAME`, and `INSERT_CURRENCY_SYMBOL` with your specific values.\n\n```typescript title=\"app/lib/wagmi.ts\"\nimport { http, createConfig } from 'wagmi'\n\n// Configure the Polkadot Hub chain\nconst assetHub = {\n  id: INSERT_CHAIN_ID,\n  name: 'INSERT_CHAIN_NAME',\n  network: 'INSERT_NETWORK_NAME',\n  nativeCurrency: {\n    decimals: INSERT_CHAIN_DECIMALS,\n    name: 'INSERT_CURRENCY_NAME',\n    symbol: 'INSERT_CURRENCY_SYMBOL',\n  },\n  rpcUrls: {\n    default: {\n      http: ['INSERT_RPC_URL'],\n    },\n  },\n} as const;\n\n// Create Wagmi config\nexport const config = createConfig({\n  chains: [assetHub],\n  transports: {\n    [assetHub.id]: http(),\n  },\n})\n```\n\n??? code \"Example Polkadot Hub TestNet Configuration\"\n\n    ```typescript title=\"src/lib/wagmi.ts\"\n    import { http, createConfig } from 'wagmi';\n    \n    // Configure the Polkadot Hub chain\n    const assetHub = {\n      id: 420420417,\n      name: 'polkadot-hub-testnet',\n      network: 'polkadot-hub-testnet',\n      nativeCurrency: {\n        decimals: 18,\n        name: 'PAS',\n        symbol: 'PAS',\n      },\n      rpcUrls: {\n        default: {\n          http: ['https://services.polkadothub-rpc.com/testnet'],\n        },\n      },\n    } as const;\n    \n    // Create wagmi config\n    export const config = createConfig({\n      chains: [assetHub],\n      transports: {\n        [assetHub.id]: http(),\n      },\n    });\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#set-up-the-wagmi-provider", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 4, "depth": 2, "title": "Set Up the Wagmi Provider", "anchor": "set-up-the-wagmi-provider", "start_char": 2461, "end_char": 3489, "estimated_token_count": 257, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Wagmi Provider\n\nTo enable Wagmi in your React application, you need to wrap your app with the [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider#wagmiprovider). Update your `app/layout.tsx` file (for Next.js app router) with the following code:\n\n```typescript title=\"app/layout.tsx\"\n// For app router (src/app/layout.tsx)\n\"use client\";\n\nimport { WagmiProvider } from \"wagmi\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { config } from \"./lib/wagmi\";\n\n// Create a query client\nconst queryClient = new QueryClient();\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    <html lang=\"en\">\n      <body>\n        <WagmiProvider config={config}>\n          <QueryClientProvider client={queryClient}>\n            {children}\n          </QueryClientProvider>\n        </WagmiProvider>\n      </body>\n    </html>\n  );\n}\n\n```\n\n!!!note\n    If you are using a Next.js pages router, you should modify the `src/pages/_app.tsx` instead."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#connect-a-wallet", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 5, "depth": 2, "title": "Connect a Wallet", "anchor": "connect-a-wallet", "start_char": 3489, "end_char": 4970, "estimated_token_count": 364, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Connect a Wallet\n\nCreate a component to connect wallets to your dApp. Create a file named `app/components/ConnectWallet.tsx`:\n\n```typescript title=\"app/components/ConnectWallet.tsx\"\n\"use client\";\n\nimport React from \"react\";\nimport { useConnect, useConnection, useDisconnect } from \"wagmi\";\nimport { injected } from \"wagmi/connectors\";\n\nexport function ConnectWallet() {\n  const { connect } = useConnect();\n  const { address, isConnected } = useConnection();\n  const { disconnect } = useDisconnect();\n\n  if (isConnected) {\n    return (\n      <div>\n        <div>Connected to {address}</div>\n        <button onClick={() => disconnect()}>Disconnect</button>\n      </div>\n    );\n  }\n\n  return (\n    <button onClick={() => connect({ connector: injected() })}>\n      Connect Wallet\n    </button>\n  );\n}\n\n```\n\nThis component uses the following React hooks:\n\n- **[`useConnect`](https://wagmi.sh/react/api/hooks/useConnect#useconnect)**: Provides functions and state for connecting the user's wallet to your dApp. The `connect` function initiates the connection flow with the specified connector.\n- **[`useDisconnect`](https://wagmi.sh/react/api/hooks/useDisconnect#usedisconnect)**: Provides a function to disconnect the currently connected wallet.\n- **[`useConnection`](https://wagmi.sh/react/api/hooks/useConnection#useconnection)**: Returns data about the connected account, including the address and connection status. In Wagmi v3, `useAccount` has been renamed to `useConnection`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#fetch-blockchain-data", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 6, "depth": 2, "title": "Fetch Blockchain Data", "anchor": "fetch-blockchain-data", "start_char": 4970, "end_char": 6424, "estimated_token_count": 347, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fetch Blockchain Data\n\nWagmi provides various hooks to fetch blockchain data. Here's an example component that demonstrates some of these hooks:\n\n```typescript title=\"app/components/BlockchainInfo.tsx\"\n\"use client\";\n\nimport { useBlockNumber, useBalance, useConnection } from \"wagmi\";\n\nexport function BlockchainInfo() {\n  const { address } = useConnection();\n  // Get the latest block number\n  const { data: blockNumber } = useBlockNumber({ watch: true });\n\n  // Get balance for the connected wallet\n  const { data: balance } = useBalance({\n    address,\n  });\n\n  return (\n    <div>\n      <h2>Blockchain Information</h2>\n      <div>\n        <p>Current Block: {blockNumber?.toString() || \"Loading...\"}</p>\n\n        {address && balance && (\n          <p>\n            Balance:{\" \"}\n            {(\n              BigInt(balance.value) / BigInt(10 ** balance.decimals)\n            ).toLocaleString()}{\" \"}\n            {balance.symbol}\n          </p>\n        )}\n      </div>\n    </div>\n  );\n}\n\n```\n\nThis component uses the following React hooks:\n\n- **[`useBlockNumber`](https://wagmi.sh/react/api/hooks/useBlockNumber#useBlockNumber)**: Fetches the current block number of the connected chain. The `watch` parameter enables real-time updates when new blocks are mined.\n- **[`useBalance`](https://wagmi.sh/react/api/hooks/useBalance#useBalance)**: Retrieves the native token balance for a specified address, including value, symbol, and decimals information."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#interact-with-deployed-contract", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 7, "depth": 2, "title": "Interact with Deployed Contract", "anchor": "interact-with-deployed-contract", "start_char": 6424, "end_char": 10831, "estimated_token_count": 966, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with Deployed Contract\n\nThis guide uses a simple Storage contract already deployed to the Polkadot Hub TestNet. The code of that contract is:\n\n??? code \"Storage.sol\"\n\n    ```solidity title=\"Storage.sol\"\n    //SPDX-License-Identifier: MIT\n    \n    // Solidity files have to start with this pragma.\n    // It will be used by the Solidity compiler to validate its version.\n    pragma solidity ^0.8.9;\n    \n    contract Storage {\n        // Public state variable to store a number\n        uint256 public storedNumber;\n    \n        /**\n        * Updates the stored number.\n        *\n        * The `public` modifier allows anyone to call this function.\n        *\n        * @param _newNumber - The new value to store.\n        */\n        function setNumber(uint256 _newNumber) public {\n            storedNumber = _newNumber;\n        }\n    }\n    ```\n\nCreate a component to interact with your deployed contract. Create a file named `app/components/StorageContract.tsx`:\n\n```typescript title=\"app/components/StorageContract.tsx\"\n\"use client\";\n\nimport { useState } from \"react\";\nimport {\n  useReadContract,\n  useWriteContract,\n  useWaitForTransactionReceipt,\n} from \"wagmi\";\n\nconst CONTRACT_ADDRESS =\n  \"INSERT_CONTRACT_ADDRESS\" as `0x${string}`;\n\nexport function StorageContract() {\n  const [number, setNumber] = useState<string>(\"42\");\n\n  // Contract ABI (should match your compiled contract)\n  const abi = [\n    {\n      inputs: [],\n      name: \"storedNumber\",\n      outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n    {\n      inputs: [\n        { internalType: \"uint256\", name: \"_newNumber\", type: \"uint256\" },\n      ],\n      name: \"setNumber\",\n      outputs: [],\n      stateMutability: \"nonpayable\",\n      type: \"function\",\n    },\n  ];\n\n  // Read the current stored number\n  const { data: storedNumber, refetch } = useReadContract({\n    address: CONTRACT_ADDRESS,\n    abi,\n    functionName: \"storedNumber\",\n  });\n\n  // Write to the contract\n  const { writeContract, data: hash, error, isPending } = useWriteContract();\n\n  // Wait for transaction to be mined\n  const { isLoading: isConfirming, isSuccess: isConfirmed } =\n    useWaitForTransactionReceipt({\n      hash,\n    });\n\n  const handleSetNumber = () => {\n    writeContract({\n      address: CONTRACT_ADDRESS,\n      abi,\n      functionName: \"setNumber\",\n      args: [BigInt(number)],\n    });\n  };\n\n  return (\n    <div>\n      <h2>Storage Contract Interaction</h2>\n      <div>\n        <p>Contract Address: {CONTRACT_ADDRESS}</p>\n        <p>Current Stored Number: {storedNumber?.toString() || \"Loading...\"}</p>\n      </div>\n\n      <div>\n        <input\n          type=\"number\"\n          value={number}\n          onChange={(e) => setNumber(e.target.value)}\n          disabled={isPending || isConfirming}\n        />\n        <button onClick={handleSetNumber} disabled={isPending || isConfirming}>\n          {isPending\n            ? \"Waiting for approval...\"\n            : isConfirming\n            ? \"Confirming...\"\n            : \"Set Number\"}\n        </button>\n      </div>\n\n      {error && <div className=\"error-message\">Error: {error.message}</div>}\n\n      {isConfirmed && (\n        <div className=\"success-message\">\n          Successfully updated!{\" \"}\n          <button onClick={() => refetch()}>Refresh</button>\n        </div>\n      )}\n    </div>\n  );\n}\n\n```\n\nThis component demonstrates how to interact with a smart contract using Wagmi's hooks:\n\n- **[`useReadContract`](https://wagmi.sh/react/api/hooks/useReadContract#useReadContract)**: Calls a read-only function on your smart contract to retrieve data without modifying the blockchain state.\n- **[`useWriteContract`](https://wagmi.sh/react/api/hooks/useWriteContract#useWriteContract)**: Calls a state-modifying function on your smart contract, which requires a transaction to be signed and sent.\n- **[`useWaitForTransactionReceipt`](https://wagmi.sh/react/api/hooks/useWaitForTransactionReceipt#useWaitForTransactionReceipt)**: Tracks the status of a transaction after it's been submitted, allowing you to know when it's been confirmed.\n\nThe component also includes proper state handling to:\n\n- Show the current value stored in the contract.\n- Allow users to input a new value.\n- Display transaction status (pending, confirming, or completed).\n- Handle errors.\n- Provide feedback when a transaction is successful."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#integrate-components", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 8, "depth": 2, "title": "Integrate Components", "anchor": "integrate-components", "start_char": 10831, "end_char": 11589, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Integrate Components\n\nUpdate your main page to combine all the components. Create or update the file `src/app/page.tsx`:\n\n```typescript title=\"src/app/page.tsx\"\n\"use client\";\n\nimport { BlockchainInfo } from \"./components/BlockchainInfo\";\nimport { ConnectWallet } from \"./components/ConnectWallet\";\nimport { StorageContract } from \"./components/StorageContract\";\nimport { useConnection } from \"wagmi\";\n\nexport default function Home() {\n  const { isConnected } = useConnection();\n\n  return (\n    <main>\n      <h1>Wagmi - Polkadot Hub Smart Contracts</h1>\n      <ConnectWallet />\n      {isConnected ? <BlockchainInfo /> : <span>Connect your wallet</span>}\n      {isConnected ? <StorageContract /> : <span>Connect your wallet</span>}\n    </main>\n  );\n}\n\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-wagmi", "url": "https://developer.polkadot.com/smart-contracts/libraries/wagmi/#where-to-go-next", "page_title": "Wagmi for Polkadot Hub Smart Contracts", "index": 9, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 11589, "end_char": 13103, "estimated_token_count": 464, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5f68b98e530990664e83455cb6a452299f7281b1ddc7e5960f2e92d680e95aa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\nNow that you have the foundational knowledge to use Wagmi with Polkadot Hub, consider exploring:\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Advanced Wagmi__\n\n    ---\n\n    Explore Wagmi's advanced features:\n\n    <ul class=\"card-list\">\n    <li>[:octicons-arrow-right-24: Watch Contract Events](https://wagmi.sh/core/api/actions/watchContractEvent#eventname)</li>\n    <li>[:octicons-arrow-right-24: Different Transports](https://wagmi.sh/react/api/transports)</li>\n    <li>[:octicons-arrow-right-24: Actions](https://wagmi.sh/react/api/actions)</li>\n    </ul>\n\n-   <span class=\"badge external\">External</span> __Wallet Integration__\n\n    ---\n\n    Connect your dApp with popular wallet providers:\n\n    <ul class=\"card-list\">\n    <li>[:octicons-arrow-right-24: MetaMask](https://wagmi.sh/core/api/connectors/metaMask)</li>\n    <li>[:octicons-arrow-right-24: WalletConnect](https://wagmi.sh/core/api/connectors/walletConnect)</li>\n    <li>[:octicons-arrow-right-24: Coinbase Wallet](https://wagmi.sh/core/api/connectors/coinbaseWallet)</li>\n    </ul>\n\n-   <span class=\"badge external\">External</span> __Testing & Development__\n\n    ---\n\n    Enhance your development workflow:\n\n    <ul class=\"card-list\">\n    <li>[:octicons-arrow-right-24: Test Suite](https://wagmi.sh/dev/contributing#_6-running-the-test-suite)</li>\n    <li>[:octicons-arrow-right-24: Dev Playground](https://wagmi.sh/dev/contributing#_5-running-the-dev-playgrounds)</li>\n    </ul>\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#introduction", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 206, "end_char": 749, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nInteracting with blockchains typically requires an interface between your application and the network. [Web3.js](https://web3js.readthedocs.io/) offers this interface through a comprehensive collection of libraries, facilitating seamless interaction with the nodes using HTTP or WebSocket protocols. This guide illustrates how to utilize Web3.js specifically for interactions with Polkadot Hub.\n\nThis guide is intended for developers who are familiar with JavaScript and want to interact with the Polkadot Hub using Web3.js."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#prerequisites", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 1, "depth": 2, "title": "Prerequisites", "anchor": "prerequisites", "start_char": 749, "end_char": 1089, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Prerequisites\n\nBefore getting started, ensure you have the following installed:\n\n- **Node.js**: v22.13.1 or later, check the [Node.js installation guide](https://nodejs.org/en/download/current/).\n- **npm**: v6.13.4 or later (comes bundled with Node.js).\n- **Solidity**: This guide uses Solidity `^0.8.9` for smart contract development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#project-structure", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 2, "depth": 2, "title": "Project Structure", "anchor": "project-structure", "start_char": 1089, "end_char": 1567, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Project Structure\n\nThis project organizes contracts, scripts, and compiled artifacts for easy development and deployment.\n\n```text\nweb3js-project\n├── contracts\n│   ├── Storage.sol\n├── scripts\n│   ├── connectToProvider.js\n│   ├── fetchLastBlock.js\n│   ├── compile.js\n│   ├── deploy.js\n│   ├── updateStorage.js\n├── abis\n│   ├── Storage.json\n├── artifacts\n│   ├── Storage.bin\n├── contract-address.json\n├── node_modules/\n├── package.json\n├── package-lock.json\n└── README.md\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#set-up-the-project", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 3, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 1567, "end_char": 1786, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\nTo start working with Web3.js, create a new folder and initialize your project by running the following commands in your terminal:\n\n```bash\nmkdir web3js-project\ncd web3js-project\nnpm init -y\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#install-dependencies", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 4, "depth": 2, "title": "Install Dependencies", "anchor": "install-dependencies", "start_char": 1786, "end_char": 2024, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Install Dependencies\n\nNext, run the following command to install the Web3.js library:\n\n```bash\nnpm install web3\n```\n\nAdd the Solidity compiler so you can generate standard EVM bytecode:\n\n```bash\nnpm install --save-dev solc@0.8.38\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#set-up-the-web3-provider", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 5, "depth": 2, "title": "Set Up the Web3 Provider", "anchor": "set-up-the-web3-provider", "start_char": 2024, "end_char": 4234, "estimated_token_count": 492, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Web3 Provider\n\nThe provider configuration is the foundation of any Web3.js application. It serves as a bridge between your application and the blockchain, allowing you to query blockchain data and interact with smart contracts.\n\nTo interact with Polkadot Hub, you must set up a Web3.js provider. This provider connects to a blockchain node, allowing you to query blockchain data and interact with smart contracts. In the `scripts` directory of your project, create a file named `connectToProvider.js` and add the following code:\n\n```js title=\"scripts/connectToProvider.js\"\nconst { Web3 } = require('web3');\n\nconst createProvider = (rpcUrl) => {\n  const web3 = new Web3(rpcUrl);\n  return web3;\n};\n\nconst PROVIDER_RPC = {\n  rpc: 'INSERT_RPC_URL',\n  chainId: 'INSERT_CHAIN_ID',\n  name: 'INSERT_CHAIN_NAME',\n};\n\ncreateProvider(PROVIDER_RPC.rpc);\n\n```\n\n!!! note\n    Replace `INSERT_RPC_URL`, `INSERT_CHAIN_ID`, and `INSERT_CHAIN_NAME` with the appropriate values. For example, to connect to Polkadot Hub TestNet's Ethereum RPC instance, you can use the following parameters:\n\n    ```js\n    const PROVIDER_RPC = {\n      rpc: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      name: 'polkadot-hub-testnet'\n    };\n    ```\n\nTo connect to the provider, execute:\n\n```bash\nnode scripts/connectToProvider.js\n```\n\nWith the provider set up, you can start querying the blockchain. For instance, to fetch the latest block number.\n\n??? code \"Fetch last block example\"\n\n    ```js title=\"scripts/fetchLastBlock.js\"\n    const { Web3 } = require('web3');\n    \n    const createProvider = (rpcUrl) => {\n      const web3 = new Web3(rpcUrl);\n      return web3;\n    };\n    \n    const PROVIDER_RPC = {\n      rpc: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      name: 'polkadotTestNet',\n    };\n    \n    const main = async () => {\n      try {\n        const web3 = createProvider(PROVIDER_RPC.rpc);\n        const latestBlock = await web3.eth.getBlockNumber();\n        console.log('Last block: ' + latestBlock);\n      } catch (error) {\n        console.error('Error connecting to Polkadot Hub TestNet: ' + error.message);\n      }\n    };\n    \n    main();\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#compile-contracts", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 6, "depth": 2, "title": "Compile Contracts", "anchor": "compile-contracts", "start_char": 4234, "end_char": 4545, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile Contracts\n\nPolkadot Hub exposes an Ethereum JSON-RPC endpoint, so you can compile Solidity contracts to familiar EVM bytecode with the upstream [`solc`](https://www.npmjs.com/package/solc) compiler. The resulting artifacts work with any EVM-compatible toolchain and can be deployed through Web3.js."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#sample-storage-smart-contract", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 7, "depth": 3, "title": "Sample Storage Smart Contract", "anchor": "sample-storage-smart-contract", "start_char": 4545, "end_char": 5250, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sample Storage Smart Contract\n\nThis example demonstrates compiling a `Storage.sol` Solidity contract for deployment to Polkadot Hub. The contract's functionality stores a number and permits users to update it with a new value.\n\n```solidity title=\"contracts/Storage.sol\"\n//SPDX-License-Identifier: MIT\npragma solidity ^0.8.9;\n\ncontract Storage {\n    // Public state variable to store a number\n    uint256 public storedNumber;\n\n    /**\n    * Updates the stored number.\n    *\n    * The `public` modifier allows anyone to call this function.\n    *\n    * @param _newNumber - The new value to store.\n    */\n    function setNumber(uint256 _newNumber) public {\n        storedNumber = _newNumber;\n    }\n}\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#compile-the-smart-contract", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 8, "depth": 3, "title": "Compile the Smart Contract", "anchor": "compile-the-smart-contract", "start_char": 5250, "end_char": 8807, "estimated_token_count": 810, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compile the Smart Contract\n\nTo compile this contract, use the following script:\n\n```js title=\"scripts/compile.js\"\nconst solc = require('solc');\nconst { readFileSync, writeFileSync, mkdirSync, existsSync } = require('fs');\nconst { basename, join } = require('path');\n\nconst ensureDir = (dirPath) => {\n  if (!existsSync(dirPath)) {\n    mkdirSync(dirPath, { recursive: true });\n  }\n};\n\nconst compileContract = (solidityFilePath, abiDir, artifactsDir) => {\n  try {\n    // Read the Solidity file\n    const source = readFileSync(solidityFilePath, 'utf8');\n    const fileName = basename(solidityFilePath);\n    \n    // Construct the input object for the Solidity compiler\n    const input = {\n      language: 'Solidity',\n      sources: {\n        [fileName]: {\n          content: source,\n        },\n      },\n      settings: {\n        outputSelection: {\n          '*': {\n            '*': ['abi', 'evm.bytecode'],\n          },\n        },\n      },\n    };\n    \n    console.log(`Compiling contract: ${fileName}...`);\n    \n    // Compile the contract\n    const output = JSON.parse(solc.compile(JSON.stringify(input)));\n    \n    // Check for errors\n    if (output.errors) {\n      const errors = output.errors.filter(error => error.severity === 'error');\n      if (errors.length > 0) {\n        console.error('Compilation errors:');\n        errors.forEach(err => console.error(err.formattedMessage));\n        return;\n      }\n      // Show warnings\n      const warnings = output.errors.filter(error => error.severity === 'warning');\n      warnings.forEach(warn => console.warn(warn.formattedMessage));\n    }\n    \n    // Ensure output directories exist\n    ensureDir(abiDir);\n    ensureDir(artifactsDir);\n\n    // Process compiled contracts\n    for (const [sourceFile, contracts] of Object.entries(output.contracts)) {\n      for (const [contractName, contract] of Object.entries(contracts)) {\n        console.log(`Compiled contract: ${contractName}`);\n        \n        // Write the ABI\n        const abiPath = join(abiDir, `${contractName}.json`);\n        writeFileSync(abiPath, JSON.stringify(contract.abi, null, 2));\n        console.log(`ABI saved to ${abiPath}`);\n        \n        // Write the bytecode\n        const bytecodePath = join(artifactsDir, `${contractName}.bin`);\n        writeFileSync(bytecodePath, contract.evm.bytecode.object);\n        console.log(`Bytecode saved to ${bytecodePath}`);\n      }\n    }\n  } catch (error) {\n    console.error('Error compiling contracts:', error);\n  }\n};\n\nconst solidityFilePath = join(__dirname, '../contracts/Storage.sol');\nconst abiDir = join(__dirname, '../abis');\nconst artifactsDir = join(__dirname, '../artifacts');\n\ncompileContract(solidityFilePath, abiDir, artifactsDir);\n```\n\n!!! note \n     The script above is tailored to the `Storage.sol` contract. It can be adjusted for other contracts by changing the file name or modifying the ABI and bytecode paths.\n\nThe ABI (Application Binary Interface) is a JSON representation of your contract's functions, events, and their parameters. It serves as the interface between your JavaScript code and the deployed smart contract, allowing your application to know how to format function calls and interpret returned data.\n\nExecute the script above by running:\n\n```bash\nnode scripts/compile.js\n```\n\nAfter executing the script, the Solidity contract is compiled into standard EVM bytecode. The ABI and bytecode are saved into files with `.json` and `.bin` extensions, respectively. You can now proceed with deploying the contract to Polkadot Hub, as outlined in the next section."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#deploy-the-compiled-contract", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 9, "depth": 2, "title": "Deploy the Compiled Contract", "anchor": "deploy-the-compiled-contract", "start_char": 8807, "end_char": 16841, "estimated_token_count": 1739, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Deploy the Compiled Contract\n\nTo deploy your compiled contract to Polkadot Hub, you'll need a wallet with a private key to sign the deployment transaction.\n\nYou can create a `deploy.js` script in the `scripts` directory of your project to achieve this. The deployment script can be divided into key components:\n\n1. Set up the required imports and utilities:\n\n    ```js title=\"scripts/deploy.js\"\n    const { writeFileSync, existsSync, readFileSync } = require('fs');\n    const { join } = require('path');\n    const { Web3 } = require('web3');\n    \n    const scriptsDir = __dirname;\n    const abisDir = join(__dirname, '../abis');\n    const artifactsDir = join(__dirname, '../artifacts');\n    ```\n\n2. Create a provider to connect to Polkadot Hub:\n\n    ```js title=\"scripts/deploy.js\"\n    const createProvider = (rpcUrl, chainId, chainName) => {\n      const web3 = new Web3(rpcUrl);\n      return web3;\n    };\n    ```\n\n3. Set up functions to read contract artifacts:\n\n    ```js title=\"scripts/deploy.js\"\n    const getAbi = (contractName) => {\n      try {\n        const abiPath = join(abisDir, `${contractName}.json`);\n        return JSON.parse(readFileSync(abiPath, 'utf8'));\n      } catch (error) {\n        console.error(\n          `Could not find ABI for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    \n    const getByteCode = (contractName) => {\n      try {\n        const bytecodePath = join(artifactsDir, `${contractName}.bin`);\n        const bytecode = readFileSync(bytecodePath, 'utf8').trim();\n        return bytecode.startsWith('0x') ? bytecode : `0x${bytecode}`;\n      } catch (error) {\n        console.error(\n          `Could not find bytecode for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    ```\n\n4. Create the main deployment function:\n\n    ```js title=\"scripts/deploy.js\"\n    const deployContract = async (contractName, privateKey, providerConfig) => {\n      console.log(`Deploying ${contractName}...`);\n      try {\n        const web3 = createProvider(\n          providerConfig.rpc,\n          providerConfig.chainId,\n          providerConfig.name,\n        );\n    \n        const formattedPrivateKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;\n        const account = web3.eth.accounts.privateKeyToAccount(formattedPrivateKey);\n        web3.eth.accounts.wallet.add(account);\n        web3.eth.defaultAccount = account.address;\n    \n        const abi = getAbi(contractName);\n        const bytecode = getByteCode(contractName);\n        const contract = new web3.eth.Contract(abi);\n        const deployTx = contract.deploy({\n          data: bytecode,\n        });\n    \n        const gas = await deployTx.estimateGas();\n        const gasPrice = await web3.eth.getGasPrice();\n    \n        console.log(`Estimated gas: ${gas}`);\n        console.log(`Gas price: ${web3.utils.fromWei(gasPrice, 'gwei')} gwei`);\n    \n        const deployedContract = await deployTx.send({\n          from: account.address,\n          gas: gas,\n          gasPrice: gasPrice,\n        });\n    \n        const address = deployedContract.options.address;\n        console.log(`Contract ${contractName} deployed at: ${address}`);\n    \n        const addressesFile = join(scriptsDir, 'contract-address.json');\n        const addresses = existsSync(addressesFile)\n          ? JSON.parse(readFileSync(addressesFile, 'utf8'))\n          : {};\n    \n        addresses[contractName] = address;\n        writeFileSync(addressesFile, JSON.stringify(addresses, null, 2), 'utf8');\n      } catch (error) {\n        console.error(`Failed to deploy contract ${contractName}:`, error);\n      }\n    };\n    ```\n\n5. Configure and execute the deployment:\n\n    ```js title=\"scripts/deploy.js\"\n    const providerConfig = {\n      rpc: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      name: 'polkadotTestNet',\n    };\n    \n    const privateKey = 'INSERT_PRIVATE_KEY';\n    \n    deployContract('Storage', privateKey, providerConfig);\n    ```\n\n    !!! note\n\n        A private key is a hexadecimal string that is used to sign and pay for the deployment transaction. **Always keep your private key secure and never share it publicly**.\n\n        Ensure to replace the `INSERT_PRIVATE_KEY` placeholder with your actual private key.\n\n??? code \"View complete script\"\n\n    ```js title=\"scripts/deploy.js\"\n    const { writeFileSync, existsSync, readFileSync } = require('fs');\n    const { join } = require('path');\n    const { Web3 } = require('web3');\n    \n    const scriptsDir = __dirname;\n    const abisDir = join(__dirname, '../abis');\n    const artifactsDir = join(__dirname, '../artifacts');\n    \n    const createProvider = (rpcUrl, chainId, chainName) => {\n      const web3 = new Web3(rpcUrl);\n      return web3;\n    };\n    \n    const getAbi = (contractName) => {\n      try {\n        const abiPath = join(abisDir, `${contractName}.json`);\n        return JSON.parse(readFileSync(abiPath, 'utf8'));\n      } catch (error) {\n        console.error(\n          `Could not find ABI for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    \n    const getByteCode = (contractName) => {\n      try {\n        const bytecodePath = join(artifactsDir, `${contractName}.bin`);\n        const bytecode = readFileSync(bytecodePath, 'utf8').trim();\n        return bytecode.startsWith('0x') ? bytecode : `0x${bytecode}`;\n      } catch (error) {\n        console.error(\n          `Could not find bytecode for contract ${contractName}:`,\n          error.message,\n        );\n        throw error;\n      }\n    };\n    \n    const deployContract = async (contractName, privateKey, providerConfig) => {\n      console.log(`Deploying ${contractName}...`);\n      try {\n        const web3 = createProvider(\n          providerConfig.rpc,\n          providerConfig.chainId,\n          providerConfig.name,\n        );\n    \n        const formattedPrivateKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;\n        const account = web3.eth.accounts.privateKeyToAccount(formattedPrivateKey);\n        web3.eth.accounts.wallet.add(account);\n        web3.eth.defaultAccount = account.address;\n    \n        const abi = getAbi(contractName);\n        const bytecode = getByteCode(contractName);\n        const contract = new web3.eth.Contract(abi);\n        const deployTx = contract.deploy({\n          data: bytecode,\n        });\n    \n        const gas = await deployTx.estimateGas();\n        const gasPrice = await web3.eth.getGasPrice();\n    \n        console.log(`Estimated gas: ${gas}`);\n        console.log(`Gas price: ${web3.utils.fromWei(gasPrice, 'gwei')} gwei`);\n    \n        const deployedContract = await deployTx.send({\n          from: account.address,\n          gas: gas,\n          gasPrice: gasPrice,\n        });\n    \n        const address = deployedContract.options.address;\n        console.log(`Contract ${contractName} deployed at: ${address}`);\n    \n        const addressesFile = join(scriptsDir, 'contract-address.json');\n        const addresses = existsSync(addressesFile)\n          ? JSON.parse(readFileSync(addressesFile, 'utf8'))\n          : {};\n    \n        addresses[contractName] = address;\n        writeFileSync(addressesFile, JSON.stringify(addresses, null, 2), 'utf8');\n      } catch (error) {\n        console.error(`Failed to deploy contract ${contractName}:`, error);\n      }\n    };\n    \n    const providerConfig = {\n      rpc: 'https://services.polkadothub-rpc.com/testnet',\n      chainId: 420420417,\n      name: 'polkadotTestNet',\n    };\n    \n    const privateKey = 'INSERT_PRIVATE_KEY';\n    \n    deployContract('Storage', privateKey, providerConfig);\n    \n    \n    ```\n\nTo run the script, execute the following command:\n\n```bash\nnode scripts/deploy.js\n```\n\nAfter running this script, your contract will be deployed to Polkadot Hub, and its address will be saved in `contract-address.json` within your project directory. You can use this address for future contract interactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#interact-with-the-contract", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 10, "depth": 2, "title": "Interact with the Contract", "anchor": "interact-with-the-contract", "start_char": 16841, "end_char": 19517, "estimated_token_count": 642, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the Contract\n\nOnce the contract is deployed, you can interact with it by calling its functions. For example, to read the current stored value and then update it to a new value, you can create a file named `updateStorage.js` in the `scripts` directory of your project and add the following code:\n\n```js title=\"scripts/updateStorage.js\"\nconst { readFileSync } = require('fs');\nconst { join } = require('path');\nconst { Web3 } = require('web3');\n\nconst abisDir = join(__dirname, '../abis');\n\nconst getAbi = (contractName) => {\n  try {\n    const abiPath = join(abisDir, `${contractName}.json`);\n    return JSON.parse(readFileSync(abiPath, 'utf8'));\n  } catch (error) {\n    console.error(\n      `Could not find ABI for contract ${contractName}:`,\n      error.message,\n    );\n    throw error;\n  }\n};\n\nconst updateStorage = async (config) => {\n  try {\n    const web3 = new Web3(config.rpcUrl);\n    const formattedPrivateKey = config.privateKey.startsWith('0x') ? config.privateKey : `0x${config.privateKey}`;\n    const account = web3.eth.accounts.privateKeyToAccount(formattedPrivateKey);\n    web3.eth.accounts.wallet.add(account);\n\n    const abi = getAbi('Storage');\n    const contract = new web3.eth.Contract(abi, config.contractAddress);\n\n    const initialValue = await contract.methods.storedNumber().call();\n    console.log('Current stored value:', initialValue);\n\n    const updateTransaction = contract.methods.setNumber(1);\n    const gasEstimate = await updateTransaction.estimateGas({\n      from: account.address,\n    });\n    const gasPrice = await web3.eth.getGasPrice();\n\n    const receipt = await updateTransaction.send({\n      from: account.address,\n      gas: gasEstimate,\n      gasPrice: gasPrice,\n    });\n\n    console.log(`Transaction hash: ${receipt.transactionHash}`);\n\n    const newValue = await contract.methods.storedNumber().call();\n    console.log('New stored value:', newValue);\n\n    return receipt;\n  } catch (error) {\n    console.error('Update failed:', error);\n    throw error;\n  }\n};\n\nconst config = {\n  rpcUrl: 'https://services.polkadothub-rpc.com/testnet',\n  privateKey: 'INSERT_PRIVATE_KEY',\n  contractAddress: 'INSERT_CONTRACT_ADDRESS',\n};\n\nupdateStorage(config)\n  .then((receipt) => console.log('Update successful'))\n  .catch((error) => console.error('Update error'));\n```\n\nEnsure you replace the `INSERT_PRIVATE_KEY` and `INSERT_CONTRACT_ADDRESS` placeholders with actual values. Also, ensure the contract ABI file (`Storage.json`) is correctly referenced. The script reads the current stored value, sets it to 1, and then displays the updated value.\n\nTo interact with the contract, run:\n\n```bash\nnode scripts/updateStorage.js\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-js", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-js/#where-to-go-next", "page_title": "Deploy Contracts to Polkadot Hub with Web3.js", "index": 11, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 19517, "end_char": 19901, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4ce33fcacdf7ea0064a4d2eac491794a6ff63fd7d845004d2b474e7a85620799", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Web3.js Docs__\n\n    ---\n\n    Explore the Web3.js documentation to learn how to use additional features, such as wallet management, signing messages, subscribing to events, and more.\n\n    [:octicons-arrow-right-24: Get Started](https://web3js.readthedocs.io/en/v1.10.0/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#introduction", "page_title": "Web3.py", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 12, "end_char": 420, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nInteracting with blockchains typically requires an interface between your application and the network. [Web3.py](https://web3py.readthedocs.io/en/stable/index.html) offers this interface through a collection of libraries, facilitating seamless interaction with the nodes using HTTP or WebSocket protocols. \n\nThis guide illustrates how to utilize Web3.py for interactions with Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#set-up-the-project", "page_title": "Web3.py", "index": 1, "depth": 2, "title": "Set Up the Project", "anchor": "set-up-the-project", "start_char": 420, "end_char": 801, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Project\n\n1. To start working with Web3.py, begin by initializing your project:\n\n    ```bash\n    mkdir web3py-project\n    cd web3py-project\n    ```\n\n2. Create and activate a virtual environment for your project:\n\n    ```bash\n    python -m venv venv\n    source venv/bin/activate\n    ```\n\n3. Next, install the Web3.py library:\n\n    ```bash\n    pip install web3\n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#set-up-the-web3-provider", "page_title": "Web3.py", "index": 2, "depth": 2, "title": "Set Up the Web3 Provider", "anchor": "set-up-the-web3-provider", "start_char": 801, "end_char": 2418, "estimated_token_count": 337, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Set Up the Web3 Provider\n\nThe [provider](https://web3py.readthedocs.io/en/stable/providers.html) configuration is the foundation of any Web3.py application.  It serves as a bridge between your application and the blockchain, allowing you to query blockchain data and interact with smart contracts.\n\nTo interact with Polkadot Hub, you must set up a Web3.py provider. This provider connects to a blockchain node, allowing you to query blockchain data and interact with smart contracts. The following code sets up the provider configuration:\n\n```python\nfrom web3 import Web3\n\nPROVIDER_RPC = \"INSERT_RPC_URL\"\nweb3 = Web3(Web3.HTTPProvider(PROVIDER_RPC))\n\n```\n\n!!! note\n    Replace `INSERT_RPC_URL` with the appropriate value. For instance, to connect to Polkadot Hub TestNet, use the following parameter:\n\n    ```python\n    PROVIDER_RPC = 'https://services.polkadothub-rpc.com/testnet'\n    ```\n\nWith the Web3 provider set up, start querying the blockchain. For instance, you can use the following code snippet to fetch the latest block number of the chain.\n\n??? code \"Fetch last block example\"\n\n    ```python title=\"fetch_last_block.py\"\n    from web3 import Web3\n    \n    \n    def main():\n        try:\n            PROVIDER_RPC = \"https://services.polkadothub-rpc.com/testnet\"\n            web3 = Web3(Web3.HTTPProvider(PROVIDER_RPC))\n            latest_block = web3.eth.block_number\n            print(\"Last block: \" + str(latest_block))\n        except Exception as error:\n            print(\"Error connecting to Polkadot Hub TestNet: \" + str(error))\n    \n    \n    if __name__ == \"__main__\":\n        main()\n    \n    ```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#compile-contracts", "page_title": "Web3.py", "index": 3, "depth": 2, "title": "Compile Contracts", "anchor": "compile-contracts", "start_char": 2418, "end_char": 2806, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Compile Contracts\n\nPolkadot Hub exposes an Ethereum JSON-RPC endpoint, so you can compile Solidity contracts to familiar EVM bytecode with the [`py-solc-x`](https://solcx.readthedocs.io/en/latest/) compiler. The resulting artifacts work with any EVM-compatible toolchain and can be deployed through Web3.py.\n\nFirst, install the `py-solc-x` package:\n\n```bash\npip install py-solc-x\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#sample-storage-smart-contract", "page_title": "Web3.py", "index": 4, "depth": 3, "title": "Sample Storage Smart Contract", "anchor": "sample-storage-smart-contract", "start_char": 2806, "end_char": 3621, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sample Storage Smart Contract\n\nThis example demonstrates compiling a `Storage.sol` Solidity contract for deployment to Polkadot Hub. The contract's functionality stores a number and permits users to update it with a new value.\n\n```solidity title=\"Storage.sol\"\n//SPDX-License-Identifier: MIT\n\n// Solidity files have to start with this pragma.\n// It will be used by the Solidity compiler to validate its version.\npragma solidity ^0.8.9;\n\ncontract Storage {\n    // Public state variable to store a number\n    uint256 public storedNumber;\n\n    /**\n    * Updates the stored number.\n    *\n    * The `public` modifier allows anyone to call this function.\n    *\n    * @param _newNumber - The new value to store.\n    */\n    function setNumber(uint256 _newNumber) public {\n        storedNumber = _newNumber;\n    }\n}\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#compile-the-smart-contract", "page_title": "Web3.py", "index": 5, "depth": 3, "title": "Compile the Smart Contract", "anchor": "compile-the-smart-contract", "start_char": 3621, "end_char": 5894, "estimated_token_count": 529, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compile the Smart Contract\n\nTo compile this contract, create a Python script named `compile.py`:\n\n```python title=\"compile.py\"\nimport json\nimport solcx\nfrom pathlib import Path\n\nSOLC_VERSION = '0.8.9'\ntry:\n    solcx.install_solc(SOLC_VERSION)\nexcept Exception as e:\n    print(f\"Solc version {SOLC_VERSION} already installed or error: {e}\")\n\nsolcx.set_solc_version(SOLC_VERSION)\n\ncontract_path = Path('Storage.sol')\nwith open(contract_path, 'r') as file:\n    contract_source = file.read()\n\ncompiled_sol = solcx.compile_source(\n    contract_source,\n    output_values=['abi', 'bin'],\n    solc_version=SOLC_VERSION\n)\n\ncontract_id, contract_interface = compiled_sol.popitem()\n\nbytecode = contract_interface['bin']\nabi = contract_interface['abi']\n\nPath('abis').mkdir(exist_ok=True)\nPath('artifacts').mkdir(exist_ok=True)\n\nwith open('abis/Storage.json', 'w') as abi_file:\n    json.dump(abi, abi_file, indent=2)\n\nwith open('artifacts/Storage.bin', 'w') as bin_file:\n    bin_file.write(bytecode)\n\nprint(\"✅ Contract compiled successfully!\")\nprint(f\"📄 ABI saved to: abis/Storage.json\")\nprint(f\"📦 Bytecode saved to: artifacts/Storage.bin\")\n```\n\n!!! note \n    The script above is tailored to the `Storage.sol` contract. It can be adjusted for other contracts by changing the file name or modifying the ABI and bytecode paths.\n\nThe ABI (Application Binary Interface) is a JSON representation of your contract's functions, events, and their parameters. It serves as the interface between your Python code and the deployed smart contract, allowing your application to know how to format function calls and interpret returned data.\n\nExecute the script by running:\n\n```bash\npython compile.py\n```\n\nAfter executing the script, the Solidity contract is compiled into standard EVM bytecode. The ABI and bytecode are saved into files with `.json` and `.bin` extensions, respectively:\n\n- **ABI file (`abis/Storage.json`)**: Provides a JSON interface describing the contract's functions and how to interact with it.\n- **Bytecode file (`artifacts/Storage.bin`)**: Contains the low-level machine code executable on EVM that represents the compiled smart contract ready for blockchain deployment.\n\nYou can now proceed with deploying the contract to Polkadot Hub, as outlined in the next section."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#contract-deployment", "page_title": "Web3.py", "index": 6, "depth": 2, "title": "Contract Deployment", "anchor": "contract-deployment", "start_char": 5894, "end_char": 11169, "estimated_token_count": 1069, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Contract Deployment\n\nTo deploy your compiled contract to Polkadot Hub using Web3.py, you'll need an account with a private key to sign the deployment transaction. The deployment process is exactly the same as for any Ethereum-compatible chain, involving creating a contract instance, estimating gas, and sending a deployment transaction. Here's how to deploy the contract. Replace `INSERT_RPC_URL` and `INSERT_PRIVATE_KEY` with the appropriate values:\n\n```python title=\"deploy.py\"\nfrom web3 import Web3\nimport json\nimport time\nfrom pathlib import Path\n\nARTIFACTS_DIR = Path(__file__).parent\nABI_DIR = ARTIFACTS_DIR / \"abis\"\nBYTECODE_DIR = ARTIFACTS_DIR / \"artifacts\"\n\ndef get_abi(contract_name):\n    try:\n        with open(ABI_DIR / f\"{contract_name}.json\", 'r') as file:\n            return json.load(file)\n    except Exception as error:\n        print(f\"❌ Could not find ABI for contract {contract_name}: {error}\")\n        raise error\n\ndef get_bytecode(contract_name):\n    try:\n        with open(BYTECODE_DIR / f\"{contract_name}.bin\", 'r') as file:\n            bytecode = file.read().strip()\n            return bytecode if bytecode.startswith('0x') else f\"0x{bytecode}\"\n    except Exception as error:\n        print(f\"❌ Could not find bytecode for contract {contract_name}: {error}\")\n        raise error\n\ndef deploy_with_retry(config, max_retries=3):\n    \"\"\"Deploy with retry logic for RPC errors\"\"\"\n    for attempt in range(max_retries):\n        try:\n            return deploy(config)\n        except Exception as error:\n            error_str = str(error)\n            if \"500\" in error_str or \"Internal Server Error\" in error_str or \"Connection\" in error_str:\n                if attempt < max_retries - 1:\n                    wait_time = (attempt + 1) * 3\n                    print(f\"RPC error, retrying in {wait_time} seconds... (attempt {attempt + 1}/{max_retries})\")\n                    time.sleep(wait_time)\n                    continue\n            raise error\n\ndef deploy(config):\n    try:\n        # Initialize Web3 with RPC URL and longer timeout\n        web3 = Web3(Web3.HTTPProvider(\n            config[\"rpc_url\"],\n            request_kwargs={'timeout': 120}\n        ))\n        \n        # Prepare account\n        formatted_private_key = config[\"private_key\"] if config[\"private_key\"].startswith('0x') else f\"0x{config['private_key']}\"\n        account = web3.eth.account.from_key(formatted_private_key)\n        print(f\"Deploying from address: {account.address}\")\n        \n        # Load ABI and bytecode\n        abi = get_abi('Storage')\n        bytecode = get_bytecode('Storage')\n        print(f\"Bytecode length: {len(bytecode)}\")\n        \n        # Create contract instance\n        contract = web3.eth.contract(abi=abi, bytecode=bytecode)\n        \n        # Get current nonce (this will test the connection)\n        print(\"Getting nonce...\")\n        nonce = web3.eth.get_transaction_count(account.address)\n        print(f\"Nonce: {nonce}\")\n        \n        # Estimate gas\n        print(\"Estimating gas...\")\n        gas_estimate = web3.eth.estimate_gas({\n            'from': account.address,\n            'data': bytecode\n        })\n        print(f\"Estimated gas: {gas_estimate}\")\n        \n        # Get gas price\n        print(\"Getting gas price...\")\n        gas_price = web3.eth.gas_price\n        print(f\"Gas price: {web3.from_wei(gas_price, 'gwei')} gwei\")\n        \n        # Build deployment transaction\n        print(\"Building transaction...\")\n        construct_txn = contract.constructor().build_transaction({\n            'from': account.address,\n            'nonce': nonce,\n            'gas': gas_estimate,\n            'gasPrice': gas_price,\n        })\n        \n        # Sign transaction\n        print(\"Signing transaction...\")\n        signed_txn = web3.eth.account.sign_transaction(construct_txn, private_key=formatted_private_key)\n        \n        # Send transaction\n        print(\"Sending transaction...\")\n        tx_hash = web3.eth.send_raw_transaction(signed_txn.raw_transaction)\n        print(f\"Transaction hash: {tx_hash.hex()}\")\n        \n        # Wait for transaction receipt\n        print(\"Waiting for transaction receipt...\")\n        tx_receipt = web3.eth.wait_for_transaction_receipt(tx_hash, timeout=300)\n        contract_address = tx_receipt.contractAddress\n        \n        # Log results\n        print(f\"✅ Contract deployed at: {contract_address}\")\n        print(f\"Gas used: {tx_receipt.gasUsed}\")\n        print(f\"Block number: {tx_receipt.blockNumber}\")\n        \n        return web3.eth.contract(address=contract_address, abi=abi)\n    \n    except Exception as error:\n        print(f'❌ Deployment failed: {error}')\n        raise error\n\nif __name__ == \"__main__\":\n    deployment_config = {\n        \"rpc_url\": \"https://services.polkadothub-rpc.com/testnet\",\n        \"private_key\": \"INSERT_PRIVATE_KEY\"\n    }\n    \n    deploy_with_retry(deployment_config)\n```\n\n!!!warning\n    Never commit or share your private key. Exposed keys can lead to immediate theft of all associated funds.\n\nTo run the script, execute the following command:\n\n```bash\npython deploy.py\n```\n\nAfter running this script, your contract will be deployed to Polkadot Hub, and its address will be printed in your terminal. You can use this address for future contract interactions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#interact-with-the-contract", "page_title": "Web3.py", "index": 7, "depth": 2, "title": "Interact with the Contract", "anchor": "interact-with-the-contract", "start_char": 11169, "end_char": 13616, "estimated_token_count": 483, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the Contract\n\nAfter deployment, interact with your contract using Web3.py methods. The example below demonstrates how to set and retrieve a number.\n\n```python title=\"update_storage.py\"\nfrom web3 import Web3\nimport json\n\n\ndef get_abi(contract_name):\n    try:\n        with open(f\"{contract_name}.json\", \"r\") as file:\n            return json.load(file)\n    except Exception as error:\n        print(f\"❌ Could not find ABI for contract {contract_name}: {error}\")\n        raise error\n\n\nasync def update_storage(config):\n    try:\n        # Initialize Web3 with RPC URL\n        web3 = Web3(Web3.HTTPProvider(config[\"rpc_url\"]))\n\n        # Prepare account\n        account = web3.eth.account.from_key(config[\"private_key\"])\n\n        # Load ABI\n        abi = get_abi(\"Storage\")\n\n        # Create contract instance\n        contract = web3.eth.contract(address=config[\"contract_address\"], abi=abi)\n\n        # Get initial value\n        initial_value = contract.functions.storedNumber().call()\n        print(\"Current stored value:\", initial_value)\n\n        # Get current nonce\n        nonce = web3.eth.get_transaction_count(account.address)\n\n        # Prepare transaction\n        transaction = contract.functions.setNumber(1).build_transaction(\n            {\"from\": account.address, \"nonce\": nonce}\n        )\n\n        # Sign transaction\n        signed_txn = web3.eth.account.sign_transaction(\n            transaction, private_key=config[\"private_key\"]\n        )\n\n        # Send transaction\n        tx_hash = web3.eth.send_raw_transaction(signed_txn.raw_transaction)\n        print(f\"Transaction hash: {tx_hash.hex()}\")\n\n        # Wait for receipt\n        receipt = web3.eth.wait_for_transaction_receipt(tx_hash)\n\n        # Get updated value\n        new_value = contract.functions.storedNumber().call()\n        print(\"New stored value:\", new_value)\n\n        return receipt\n\n    except Exception as error:\n        print(\"Update failed:\", error)\n        raise error\n\n\nif __name__ == \"__main__\":\n    # Example usage\n    import asyncio\n\n    config = {\n        \"rpc_url\": \"INSERT_RPC_URL\",\n        \"private_key\": \"INSERT_PRIVATE_KEY\",\n        \"contract_address\": \"INSERT_CONTRACT_ADDRESS\",\n    }\n\n    asyncio.run(update_storage(config))\n\n```\n\nBe sure to replace the `INSERT_RPC_URL`, `INSERT_PRIVATE_KEY`, and `INSERT_CONTRACT_ADDRESS` placeholders with your specific values.\n\nTo interact with the contract, run:\n\n```bash\npython update_storage.py\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-libraries-web3-py", "url": "https://developer.polkadot.com/smart-contracts/libraries/web3-py/#where-to-go-next", "page_title": "Web3.py", "index": 8, "depth": 2, "title": "Where to Go Next", "anchor": "where-to-go-next", "start_char": 13616, "end_char": 13999, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1d455f699a06bf1ddbac7a183e7fe1f28416caf3ab4322fe38e168d870a6e1e7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where to Go Next\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge external\">External</span> __Web3.py Docs__\n\n    ---\n\n    Explore the Web3.py documentation to learn how to use additional features, such as wallet management, signing messages, subscribing to events, and more.\n\n    [:octicons-arrow-right-24: Get Started](https://web3py.readthedocs.io/en/stable/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-overview", "url": "https://developer.polkadot.com/smart-contracts/overview/#introduction", "page_title": "Smart Contracts Overview", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 36, "end_char": 707, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0c93fcc4283f2b9773aab36c494245107dd47851dbd0672f8e1b89c59b547c91", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPolkadot Hub provides a production-ready smart contract platform that combines Ethereum compatibility with the performance and cross-chain capabilities of the Polkadot ecosystem. Developers can deploy smart contracts directly on Polkadot Hub while using familiar Ethereum tooling, workflows, and programming languages.\n\nBuilt with a dual-VM approach, Polkadot Hub offers two execution backends: REVM for unmodified EVM compatibility and native PVM for optimized computationally expensive workloads. This dual-VM architecture enables developers to migrate existing Ethereum contracts instantly or optimize for speed and efficiency with native execution."}
{"source": "polkadot-docs", "page_id": "smart-contracts-overview", "url": "https://developer.polkadot.com/smart-contracts/overview/#why-build-on-polkadot-hub", "page_title": "Smart Contracts Overview", "index": 1, "depth": 2, "title": "Why Build on Polkadot Hub", "anchor": "why-build-on-polkadot-hub", "start_char": 707, "end_char": 737, "estimated_token_count": 7, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0c93fcc4283f2b9773aab36c494245107dd47851dbd0672f8e1b89c59b547c91", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why Build on Polkadot Hub"}
{"source": "polkadot-docs", "page_id": "smart-contracts-overview", "url": "https://developer.polkadot.com/smart-contracts/overview/#ethereum-compatibility", "page_title": "Smart Contracts Overview", "index": 2, "depth": 3, "title": "Ethereum Compatibility", "anchor": "ethereum-compatibility", "start_char": 737, "end_char": 1471, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0c93fcc4283f2b9773aab36c494245107dd47851dbd0672f8e1b89c59b547c91", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Ethereum Compatibility\n\nDeploy existing Ethereum contracts with zero modifications while maintaining full compatibility with your existing development stack:\n\n- **Complete JSON-RPC API support**: Use MetaMask, Hardhat, Remix, Foundry, and all standard Ethereum tooling.\n- **Standard libraries**: Integrate Ethers.js, Web3.js, Viem, Wagmi, and Web3.py without changes.\n- **Solidity development**: Write contracts in Solidity or migrate existing code directly. Use the [OpenZeppelin Contracts Wizard for Polkadot](https://wizard.openzeppelin.com/polkadot) to generate secure ERC-20, ERC-721, and other OpenZeppelin-standard contracts.\n- **Familiar workflows**: Maintain your existing deployment, testing, and monitoring processes."}
{"source": "polkadot-docs", "page_id": "smart-contracts-overview", "url": "https://developer.polkadot.com/smart-contracts/overview/#performance-options", "page_title": "Smart Contracts Overview", "index": 3, "depth": 3, "title": "Performance Options", "anchor": "performance-options", "start_char": 1471, "end_char": 2118, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0c93fcc4283f2b9773aab36c494245107dd47851dbd0672f8e1b89c59b547c91", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Performance Options\n\nChoose between two execution backends:\n\n- **REVM**: Run unmodified Ethereum contracts with full EVM/Ethereum compatibility.\n- **PVM**: Compile to optimized RISC-V bytecode for enhanced performance and lower fees while keeping Ethereum-compatibility. You can write PVM contracts in Solidity (via `resolc`) or Rust—for Rust, tooling is maturing; use LLMs and coding agents to assist development.\n\nBoth backends share the same RPC interface and tooling support, allowing seamless transitions. In addition, smart contracts can interact with Polkadot native services via [precompile contracts](/smart-contracts/precompiles/)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-overview", "url": "https://developer.polkadot.com/smart-contracts/overview/#cross-vm-cross-chain-capabilities", "page_title": "Smart Contracts Overview", "index": 4, "depth": 3, "title": "Cross-VM  & Cross-Chain Capabilities", "anchor": "cross-vm-cross-chain-capabilities", "start_char": 2118, "end_char": 2691, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0c93fcc4283f2b9773aab36c494245107dd47851dbd0672f8e1b89c59b547c91", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cross-VM  & Cross-Chain Capabilities\n\nSmart contracts written for one VM (for example, EVM) can interact directly with other smart contracts written for the RISC-V PVM, and back. This allows to use full EVM compatible contracts but extend to heavy/complex execution workloads to the PVM RISC-V backend.\n\nFurthermore, all smart contracts in Polkadot Hub can interact with any service in the Polkadot ecosystem through [XCM](/smart-contracts/precompiles/xcm/), enabling token transfers, remote execution, and cross-chain composability without bridges or intermediaries."}
{"source": "polkadot-docs", "page_id": "smart-contracts-overview", "url": "https://developer.polkadot.com/smart-contracts/overview/#other-smart-contract-environments", "page_title": "Smart Contracts Overview", "index": 5, "depth": 2, "title": "Other Smart Contract Environments", "anchor": "other-smart-contract-environments", "start_char": 2691, "end_char": 3324, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0c93fcc4283f2b9773aab36c494245107dd47851dbd0672f8e1b89c59b547c91", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Other Smart Contract Environments\n\nBeyond Polkadot Hub's native EVM and PVM support, the ecosystem offers one main alternative for smart contract development:\n\n- **EVM-compatible parachains**: Provide access to Ethereum's extensive developer ecosystem, smart contract portability, and established tooling like Hardhat, Remix, Foundry, and OpenZeppelin. The main options include Moonbeam (the first full Ethereum-compatible parachain serving as an interoperability hub), Astar (featuring dual VM support for both EVM and WebAssembly contracts), and Acala (DeFi-focused with enhanced Acala EVM+ offering advanced DeFi primitives)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-overview", "url": "https://developer.polkadot.com/smart-contracts/overview/#next-steps", "page_title": "Smart Contracts Overview", "index": 6, "depth": 2, "title": "Next Steps", "anchor": "next-steps", "start_char": 3324, "end_char": 4333, "estimated_token_count": 254, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0c93fcc4283f2b9773aab36c494245107dd47851dbd0672f8e1b89c59b547c91", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Next Steps\n\n<div class=\"grid cards\" markdown>\n\n-   <span class=\"badge guide\">Guide</span> __Get Started__\n\n    ---\n\n    Quick-start guides for connecting, deploying, and building your first smart contract.\n\n    [:octicons-arrow-right-24: Get Started](/smart-contracts/get-started/)\n\n-   <span class=\"badge guide\">Guide</span> __Cookbook__\n\n    ---\n\n    Step-by-step tutorials for deploying contracts, tokens, NFTs, and full dApps.\n\n    [:octicons-arrow-right-24: View Tutorials](/smart-contracts/cookbook/)\n\n-   <span class=\"badge guide\">Guide</span> __Ethereum Developers__\n\n    ---\n\n    Understand key differences in accounts, fees, gas model, and deployment on Polkadot Hub.\n\n    [:octicons-arrow-right-24: Learn More](/smart-contracts/for-eth-devs/accounts/)\n\n-   <span class=\"badge guide\">Guide</span> __Precompiles__\n\n    ---\n\n    Discover advanced functionalities including XCM for cross-chain interactions.\n\n    [:octicons-arrow-right-24: Explore Precompiles](/smart-contracts/precompiles/)\n\n</div>"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#introduction", "page_title": "Interact with the ERC20 Precompile", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 2879, "end_char": 3860, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe ERC20 precompile provides a standard ERC20 token interface for interacting with assets managed by the [Assets pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_assets/index.html), helping smart contracts to interact with native Polkadot assets (such as USDT, USDC, and other tokens) using familiar Ethereum-style ERC20 calls. Polkadot Hub runs three instances of the Assets pallet — Trust-Backed Assets, Foreign Assets, and Pool Assets — each mapped to a distinct ERC20 precompile address suffix.\n\nEach asset is mapped to a unique precompile address based on its asset ID or foreign asset index. The precompile implements core ERC20 functionality:\n\n- **Token transfers**: Send assets between accounts using standard `transfer` and `transferFrom` methods.\n- **Approvals and allowances**: Manage spending permissions with `approve` and `allowance`.\n- **Balance queries**: Check token balances with `balanceOf` and total supply with `totalSupply`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#supported-asset-types", "page_title": "Interact with the ERC20 Precompile", "index": 1, "depth": 2, "title": "Supported Asset Types", "anchor": "supported-asset-types", "start_char": 3860, "end_char": 3979, "estimated_token_count": 21, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Supported Asset Types\n\nThe ERC20 precompile supports three categories of assets, each with its own address suffix."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#trust-backed-assets", "page_title": "Interact with the ERC20 Precompile", "index": 2, "depth": 3, "title": "Trust-Backed Assets", "anchor": "trust-backed-assets", "start_char": 3979, "end_char": 4319, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Trust-Backed Assets\n\nTrust-Backed Assets are created directly in the Assets pallet on Polkadot Hub and assigned a u32 asset ID.\n\n- **Address suffix**: `01200000`\n- **Address format**: `0x` + assetId (8 hex digits, zero-padded) + 24 zero digits + `01200000`\n- **Example**: Asset ID `1984` → `0x000007C000000000000000000000000001200000`"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#foreign-assets", "page_title": "Interact with the ERC20 Precompile", "index": 3, "depth": 3, "title": "Foreign Assets", "anchor": "foreign-assets", "start_char": 4319, "end_char": 5657, "estimated_token_count": 315, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Foreign Assets\n\nForeign Assets originate from other chains and are identified on-chain by their XCM Location. The ERC20 precompile uses a u32 index—not the XCM Location directly—to derive the precompile address.\n\n- **Address suffix**: `02200000`\n- **Address format**: `0x` + foreignAssetIndex (8 hex digits, zero-padded) + 24 zero digits + `02200000`\n- **Example**: Foreign Asset Index `0` → `0x0000000000000000000000000000000002200000`\n\n#### Deriving the Foreign Asset Index\n\nSince foreign asset IDs are XCM Locations (not simple integers), the runtime assigns each foreign asset a sequential u32 index when it is registered. To derive the ERC20 precompile address for a foreign asset, follow these steps:\n\n1. Get the XCM location of the foreign asset (for example, `{ parents: 1, interior: X1(Parachain(2313)) }`).\n2. Query the index in [Polkadot.js Apps](https://polkadot.js.org/apps/):\n\n    1. Navigate to **Developer > Chain State**.\n    2. Select **assetsPrecompiles** from the module dropdown.\n    3. Select **foreignAssetIdToAssetIndex** from the call dropdown.\n    4. Pass the XCM Location and note the returned u32 value (for example, `5`).\n\n    ![](/images/smart-contracts/precompiles/erc20/erc20-01.webp)\n\n3. Enter that u32 index into the Foreign Asset mode of the converter above to derive the ERC20 precompile address."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#pool-assets", "page_title": "Interact with the ERC20 Precompile", "index": 4, "depth": 3, "title": "Pool Assets", "anchor": "pool-assets", "start_char": 5657, "end_char": 5982, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Pool Assets\n\nPool Assets are created by liquidity pool operations on Polkadot Hub and assigned a u32 asset ID.\n\n- **Address suffix**: `03200000`\n- **Address format**: `0x` + assetId (8 hex digits, zero-padded) + 24 zero digits + `03200000`\n- **Example**: Pool Asset ID `0` → `0x0000000000000000000000000000000003200000`"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#precompile-interface", "page_title": "Interact with the ERC20 Precompile", "index": 5, "depth": 2, "title": "Precompile Interface", "anchor": "precompile-interface", "start_char": 5982, "end_char": 7014, "estimated_token_count": 216, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Precompile Interface\n\nThe ERC20 precompile implements a subset of the standard ERC20 interface. The following functions are available:\n\n```solidity title=\"IERC20-precompile.sol\"\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IERC20 {\n    // Implemented functions\n    function totalSupply() external view returns (uint256);\n    function transfer(address to, uint256 amount) external returns (bool);\n    function balanceOf(address account) external view returns (uint256);\n    function allowance(address owner, address spender) external view returns (uint256);\n    function approve(address spender, uint256 amount) external returns (bool);\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n```\n\n!!!warning \"Metadata Functions Not Available\"\n    The optional ERC20 metadata functions (`name()`, `symbol()`, `decimals()`) are **not implemented** in this precompile. These functions are only available through the Assets pallet's storage, not via the ERC20 interface."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#query-functions", "page_title": "Interact with the ERC20 Precompile", "index": 6, "depth": 2, "title": "Query Functions", "anchor": "query-functions", "start_char": 7014, "end_char": 7034, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Query Functions"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#get-total-supply", "page_title": "Interact with the ERC20 Precompile", "index": 7, "depth": 3, "title": "Get Total Supply", "anchor": "get-total-supply", "start_char": 7034, "end_char": 7397, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Get Total Supply\n\nReturns the total number of tokens in circulation for this asset.\n\n```solidity\nfunction totalSupply() external view returns (uint256);\n```\n\n**Returns:**\n\n- **`uint256`**: The total supply of tokens\n\n**Example usage:**\n\n```solidity\nIERC20 token = IERC20(0x000007C000000000000000000000000001200000);\nuint256 supply = token.totalSupply();\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#get-balance", "page_title": "Interact with the ERC20 Precompile", "index": 8, "depth": 3, "title": "Get Balance", "anchor": "get-balance", "start_char": 7397, "end_char": 7883, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Get Balance\n\nReturns the token balance of a specific account address.\n\n```solidity\nfunction balanceOf(address account) external view returns (uint256);\n```\n\n**Parameters:**\n\n- **`account`**: The address to query\n\n**Returns:**\n\n- **`uint256`**: The token balance of the account\n\n**Example usage:**\n\n```solidity\nIERC20 token = IERC20(0x000007C000000000000000000000000001200000);\naddress user = 0x1234567890123456789012345678901234567890;\nuint256 balance = token.balanceOf(user);\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#check-allowance", "page_title": "Interact with the ERC20 Precompile", "index": 9, "depth": 3, "title": "Check Allowance", "anchor": "check-allowance", "start_char": 7883, "end_char": 8546, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Check Allowance\n\nReturns the amount of tokens that the spender is allowed to spend on behalf of the owner.\n\n```solidity\nfunction allowance(address owner, address spender) external view returns (uint256);\n```\n\n**Parameters:**\n\n- **`owner`**: The account that owns the tokens\n- **`spender`**: The account authorized to spend\n\n**Returns:**\n\n- **`uint256`**: The remaining allowance\n\n**Example usage:**\n\n```solidity\nIERC20 token = IERC20(0x000007C000000000000000000000000001200000);\naddress owner = 0x1111111111111111111111111111111111111111;\naddress spender = 0x2222222222222222222222222222222222222222;\nuint256 remaining = token.allowance(owner, spender);\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#token-operations", "page_title": "Interact with the ERC20 Precompile", "index": 10, "depth": 2, "title": "Token Operations", "anchor": "token-operations", "start_char": 8546, "end_char": 8567, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Token Operations"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#transfer-tokens", "page_title": "Interact with the ERC20 Precompile", "index": 11, "depth": 3, "title": "Transfer Tokens", "anchor": "transfer-tokens", "start_char": 8567, "end_char": 9312, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transfer Tokens\n\nTransfers tokens from the caller's account to the recipient address.\n\n```solidity\nfunction transfer(address to, uint256 amount) external returns (bool);\n```\n\n**Parameters:**\n\n- **`to`**: The recipient address\n- **`amount`**: The amount of tokens to transfer\n\n**Returns:**\n\n- **`bool`**: `true` if the transfer was successful\n\n**Example usage:**\n\n```solidity\nIERC20 token = IERC20(0x000007C000000000000000000000000001200000);\naddress recipient = 0x3333333333333333333333333333333333333333;\nuint256 amount = 1000 * 10**10; // Assuming 10 decimals\n\nbool success = token.transfer(recipient, amount);\nrequire(success, \"Transfer failed\");\n```\n\n!!!warning\n    The transfer will fail if the caller doesn't have sufficient balance."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#approve-spending", "page_title": "Interact with the ERC20 Precompile", "index": 12, "depth": 3, "title": "Approve Spending", "anchor": "approve-spending", "start_char": 9312, "end_char": 9995, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Approve Spending\n\nApproves the spender to withdraw up to a specified amount from the caller's account.\n\n```solidity\nfunction approve(address spender, uint256 amount) external returns (bool);\n```\n\n**Parameters:**\n\n- **`spender`**: The address authorized to spend tokens\n- **`amount`**: The maximum amount the spender can withdraw\n\n**Returns:**\n\n- **`bool`**: `true` if the approval was successful\n\n**Example usage:**\n\n```solidity\nIERC20 token = IERC20(0x000007C000000000000000000000000001200000);\naddress spender = 0x4444444444444444444444444444444444444444;\nuint256 amount = 500 * 10**10;\n\nbool success = token.approve(spender, amount);\nrequire(success, \"Approval failed\");\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#transfer-from", "page_title": "Interact with the ERC20 Precompile", "index": 13, "depth": 3, "title": "Transfer From", "anchor": "transfer-from", "start_char": 9995, "end_char": 11073, "estimated_token_count": 244, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transfer From\n\nTransfers tokens from one account to another using the allowance mechanism. The caller must have sufficient allowance from the `from` account.\n\n```solidity\nfunction transferFrom(address from, address to, uint256 amount) external returns (bool);\n```\n\n**Parameters:**\n\n- **`from`**: The account to transfer from\n- **`to`**: The recipient address\n- **`amount`**: The amount of tokens to transfer\n\n**Returns:**\n\n- **`bool`**: `true` if the transfer was successful\n\n**Example usage:**\n\n```solidity\nIERC20 token = IERC20(0x000007C000000000000000000000000001200000);\naddress owner = 0x5555555555555555555555555555555555555555;\naddress recipient = 0x6666666666666666666666666666666666666666;\nuint256 amount = 250 * 10**10;\n\nbool success = token.transferFrom(owner, recipient, amount);\nrequire(success, \"Transfer from failed\");\n```\n\nFor the complete implementation, refer to the [ERC20 precompile source code](https://github.com/paritytech/polkadot-sdk/blob/11be995be95ac1e25a5b2a6dd941006e7097bffc/substrate/frame/assets/precompiles/src/lib.rs) in the Polkadot SDK."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#common-trust-backed-asset-ids", "page_title": "Interact with the ERC20 Precompile", "index": 14, "depth": 2, "title": "Common Trust-Backed Asset IDs", "anchor": "common-trust-backed-asset-ids", "start_char": 11073, "end_char": 11624, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Common Trust-Backed Asset IDs\n\nThe following well-known Trust-Backed Assets are registered on Polkadot Hub and accessible via the ERC20 precompile:\n\n| Asset ID | Symbol | Name | Decimals | ERC20 Precompile Address |\n|:---:|:---:|:---:|:---:|:---:|\n| 1984 | USDt | Tether USD | 6 | `0x000007C000000000000000000000000001200000` |\n| 1337 | USDC | USD Coin | 6 | `0x0000053900000000000000000000000001200000` |\n\n!!! note\n    The on-chain symbol for Tether on Polkadot Hub is `USDt`, which is commonly referred to as \"USDT\" on exchanges and in wallets."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#interact-with-the-erc20-precompile", "page_title": "Interact with the ERC20 Precompile", "index": 15, "depth": 2, "title": "Interact with the ERC20 Precompile", "anchor": "interact-with-the-erc20-precompile", "start_char": 11624, "end_char": 12935, "estimated_token_count": 304, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the ERC20 Precompile\n\nTo interact with the ERC20 precompile in [Remix IDE](/smart-contracts/dev-environments/remix/):\n\n1. Create a new file called `IERC20-precompile.sol` in Remix\n2. Copy and paste the `IERC20` interface code shown above into the file\n\n    ![](/images/smart-contracts/precompiles/erc20/erc20-02.webp)\n\n3. Compile the interface by selecting the compile button or using **Ctrl + S**\n4. Calculate the ERC20 precompile address for your asset using the converter above. Select the appropriate asset type (Trust-Backed, Foreign, or Pool), then enter the asset ID or foreign asset index.\n\n    - **Trust-Backed example**: Asset ID `1984` (USDt) → `0x000007C000000000000000000000000001200000`\n    - **Foreign Asset example**: Foreign Asset Index `0` → `0x0000000000000000000000000000000002200000`\n\n5. In the **Deploy & Run Transactions** tab, select the `IERC20` interface from the contract dropdown\n6. Enter the calculated precompile address in the **At Address** input field\n7. Select the **At Address** button to connect to the precompile\n\n    ![](/images/smart-contracts/precompiles/erc20/erc20-03.webp)\n\nOnce connected, you can interact with any of the ERC20 precompile functions directly through the Remix interface.\n\n![](/images/smart-contracts/precompiles/erc20/erc20-04.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#conclusion", "page_title": "Interact with the ERC20 Precompile", "index": 16, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 12935, "end_char": 13473, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nThe ERC20 precompile provides seamless integration between Polkadot's native asset management and Ethereum's familiar token standard. By mapping asset IDs to deterministic precompile addresses, developers can interact with native Polkadot assets using standard ERC20 interfaces.\n\nWhether you're building DeFi protocols, token swaps, or any application requiring asset interactions, the ERC20 precompile enables you to leverage Polkadot's rich asset ecosystem with the same tools and patterns used in Ethereum development."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-erc20", "url": "https://developer.polkadot.com/smart-contracts/precompiles/erc20/#reference", "page_title": "Interact with the ERC20 Precompile", "index": 17, "depth": 2, "title": "Reference", "anchor": "reference", "start_char": 13473, "end_char": 13828, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1018c955471c49c455d396b79b8a7b25793a4ac040beb1f7c1b95ffacde4abb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Reference\n\n- [ERC20 precompile source code](https://github.com/paritytech/polkadot-sdk/blob/11be995be95ac1e25a5b2a6dd941006e7097bffc/substrate/frame/assets/precompiles/src/lib.rs)\n- [Assets pallet documentation](https://paritytech.github.io/polkadot-sdk/master/pallet_assets/index.html)\n- [EIP-20: Token Standard](https://eips.ethereum.org/EIPS/eip-20)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-eth-native", "url": "https://developer.polkadot.com/smart-contracts/precompiles/eth-native/#introduction", "page_title": "Ethereum-Native Precompiles", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 32, "end_char": 686, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25a5a9577ec989b5d8cb5428b956f63b236a894ac1fc67d113f0124e57a6d0da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nEthereum-native precompiles are special contract implementations that provide essential cryptographic and utility functions at the runtime level. These precompiles are available at predefined addresses and offer optimized, native implementations of commonly used operations that would be computationally expensive or impractical to implement in pure contract code.\n\nIn Polkadot Hub's Revive pallet, these precompiles maintain compatibility with standard Ethereum addresses, allowing developers familiar with Ethereum to seamlessly transition their smart contracts while benefiting from the performance optimizations of the PVM runtime."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-eth-native", "url": "https://developer.polkadot.com/smart-contracts/precompiles/eth-native/#how-to-use-precompiles", "page_title": "Ethereum-Native Precompiles", "index": 1, "depth": 2, "title": "How to Use Precompiles", "anchor": "how-to-use-precompiles", "start_char": 686, "end_char": 1534, "estimated_token_count": 158, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25a5a9577ec989b5d8cb5428b956f63b236a894ac1fc67d113f0124e57a6d0da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How to Use Precompiles\n\nTo use a precompile in your smart contract, simply call the precompile's address as you would any other contract. Each precompile has a specific address (shown in the table below) and expects input data in a particular format. The precompile executes natively at the runtime level and returns the result directly to your contract.\n\nFor example, to use the ECRecover precompile to verify a signature, you would call address `0x0000000000000000000000000000000000000001` with the properly formatted signature data. The precompile handles the complex cryptographic operations efficiently and returns the recovered public key.\n\nYou can find sample contracts for each precompile in the [`precompiles-hardhat`](https://github.com/polkadot-developers/polkavm-hardhat-examples/tree/master/precompiles-hardhat/contracts) project."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-eth-native", "url": "https://developer.polkadot.com/smart-contracts/precompiles/eth-native/#standard-precompiles-in-polkadot-hub", "page_title": "Ethereum-Native Precompiles", "index": 2, "depth": 2, "title": "Standard Precompiles in Polkadot Hub", "anchor": "standard-precompiles-in-polkadot-hub", "start_char": 1534, "end_char": 4621, "estimated_token_count": 825, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25a5a9577ec989b5d8cb5428b956f63b236a894ac1fc67d113f0124e57a6d0da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Standard Precompiles in Polkadot Hub\n\nRevive implements the standard set of Ethereum precompiles:\n\n|                                                                                   Contract Name                                                                                   | Address (Last Byte) |                                           Description                                           |\n| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------: | :---------------------------------------------------------------------------------------------: |\n|  [ECRecover](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/ecrecover.rs)   |        0x01         |                       Recovers the public key associated with a signature                       |\n|     [Sha256](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/sha256.rs)      |        0x02         |                              Implements the SHA-256 hash function                               |\n|  [Ripemd160](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/ripemd160.rs)   |        0x03         |                             Implements the RIPEMD-160 hash function                             |\n|   [Identity](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/identity.rs)    |        0x04         |                          Data copy function (returns input as output)                           |\n|     [Modexp](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/modexp.rs)      |        0x05         |                                     Modular exponentiation                                      |\n|   [Bn128Add](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/bn128.rs#L31)   |        0x06         |    Addition on the [alt_bn128 curve](https://eips.ethereum.org/EIPS/eip-196)    |\n|   [Bn128Mul](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/bn128.rs#L59)   |        0x07         | Multiplication on the [alt_bn128 curve](https://eips.ethereum.org/EIPS/eip-196) |\n| [Bn128Pairing](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/bn128.rs#L87) |        0x08         |                              Pairing check on the alt_bn128 curve                               |\n|    [Blake2F](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2609/substrate/frame/revive/src/precompiles/builtin/blake2f.rs)     |        0x09         |                                  Blake2 compression function F                                  |"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-eth-native", "url": "https://developer.polkadot.com/smart-contracts/precompiles/eth-native/#conclusion", "page_title": "Ethereum-Native Precompiles", "index": 3, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 4621, "end_char": 5063, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25a5a9577ec989b5d8cb5428b956f63b236a894ac1fc67d113f0124e57a6d0da", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nEthereum-native precompiles provide a powerful foundation for smart contract development on Polkadot Hub, offering high-performance implementations of essential cryptographic and utility functions. By maintaining compatibility with standard Ethereum precompile addresses and interfaces, Revive ensures that developers can leverage existing knowledge and tools while benefiting from the enhanced performance of native execution."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles", "url": "https://developer.polkadot.com/smart-contracts/precompiles/#introduction", "page_title": "Advanced Functionalities via Precompiles", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 45, "end_char": 623, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8ce252c48115b75636938a7f21e7f00b42a6320d03a0b2b78b2bb9385e2b71a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nPrecompiles serve a dual purpose in the Polkadot ecosystem: they not only enable high-performance smart contracts by providing native, optimized implementations of frequently used functions but will also eventually act as critical bridges, allowing contracts to interact with core platform capabilities.\n\nThis article explores how Polkadot leverages precompiles within the Revive pallet to enhance efficiency and how they will extend functionality for developers in the future, including planned access to native features like Cross-Consensus Messaging (XCM)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles", "url": "https://developer.polkadot.com/smart-contracts/precompiles/#what-are-precompiles", "page_title": "Advanced Functionalities via Precompiles", "index": 1, "depth": 2, "title": "What are Precompiles?", "anchor": "what-are-precompiles", "start_char": 623, "end_char": 1717, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8ce252c48115b75636938a7f21e7f00b42a6320d03a0b2b78b2bb9385e2b71a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What are Precompiles?\n\nPrecompiles are special contract implementations that run directly at the runtime level rather than as on-chain PVM contracts. In typical EVM environments, precompiles provide essential cryptographic and utility functionality at addresses that start with specific patterns. Revive follows this design pattern but with its own implementation optimized for PVM.\n\nUsers interact with the dApp/contract, which in turn calls the PVM. The PVM detects the precompile address and calls the corresponding precompile. The precompile executes the native code and returns the result to the dApp/contract. The dApp/contract then returns the result to the user.\n\n```mermaid\nflowchart LR\n    User([\"User\"])\n    dApp[\"DApp/Contract\"]\n    PVM[\"ETH RPC Adapter\"]\n    Precompiles[\"Precompiles\"]\n    Runtime[\"PVM\"]\n\n    User --> dApp\n    dApp -->|\"Call<br>function\"| PVM\n    PVM -->|\"Detect<br>precompile<br>address\"| Precompiles\n    Precompiles -->|\"Execute<br>optimized<br>native code\"| Runtime\n\n    subgraph \"Polkadot Hub\"\n        PVM\n        Precompiles\n        Runtime\n    end\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles", "url": "https://developer.polkadot.com/smart-contracts/precompiles/#conclusion", "page_title": "Advanced Functionalities via Precompiles", "index": 2, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 1717, "end_char": 2275, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8ce252c48115b75636938a7f21e7f00b42a6320d03a0b2b78b2bb9385e2b71a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nFor smart contract developers, precompiles offer a powerful way to access both low-level, high-performance operations and core platform capabilities within the smart contract execution context. Through Revive, Polkadot exposes these native functionalities, allowing developers to build faster, more efficient contracts that can take full advantage of the Polkadot ecosystem.\n\nUnderstanding and utilizing precompiles can unlock advanced functionality and performance gains, making them an essential tool for anyone building on the Polkadot Hub."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#introduction", "page_title": "Interact with the Storage Precompile", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 23, "end_char": 780, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe Storage precompile provides low-level access to contract storage operations at the runtime level. Located at the fixed address `0x0000000000000000000000000000000000000901`, it offers a comprehensive set of utilities, including:\n\n- **Direct storage access**: Read and write raw storage keys and values.\n- **Partial reads**: Retrieve specific segments of large values to optimize gas costs.\n- **Storage inspection**: Check for key existence and value sizes.\n- **Storage management**: Efficiently remove and manage storage entries.\n\nThis precompile is particularly useful for contracts that need fine-grained control over storage layout, want to optimize gas costs for large data structures, or need to implement custom storage patterns."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#precompile-interface", "page_title": "Interact with the Storage Precompile", "index": 1, "depth": 2, "title": "Precompile Interface", "anchor": "precompile-interface", "start_char": 780, "end_char": 3420, "estimated_token_count": 681, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Precompile Interface\n\nThe Storage precompile implements the `IStorage` interface, which is defined in the Polkadot SDK. The source code for the interface is as follows:\n\n```solidity title=\"IStorage.sol\"\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\naddress constant STORAGE_ADDR = 0x0000000000000000000000000000000000000901;\n\ninterface IStorage {\n\t/// Clear the value at the given key in the contract storage.\n\t///\n\t/// # Important\n\t///\n\t/// This function can only be called via a delegate call! For Solidity, the low level\n\t/// `delegatecall` function has to be used. For languages that use the FFI\n\t/// of `pallet-revive`, the [`crate::HostFn::delegate_call`] function can be used.\n\t///\n\t/// # Parameters\n\t///\n\t/// - `key`: The storage key.\n\t///\n\t/// # Return\n\t///\n\t/// If no entry existed for this key, `containedKey` is `false` and\n\t/// `valueLen` is `0`.\n\tfunction clearStorage(uint32 flags, bool isFixedKey, bytes memory key)\n\t\texternal returns (bool containedKey, uint valueLen);\n\n\t/// Checks whether there is a value stored under the given key.\n\t///\n\t/// The key length must not exceed the maximum defined by the contracts module parameter.\n\t///\n\t/// # Important\n\t///\n\t/// This function can only be called via a delegate call! For Solidity, the low level\n\t/// `delegatecall` function has to be used. For languages that use the FFI\n\t/// of `pallet-revive`, the [`crate::HostFn::delegate_call`] function can be used.\n\t///\n\t/// # Parameters\n\t///\n\t/// - `key`: The storage key.\n\t///\n\t/// # Return\n\t///\n\t/// Returns the size of the pre-existing value at the specified key.\n\t/// If no entry exists for this key `containedKey` is `false` and\n\t/// `valueLen` is `0`.\n\tfunction containsStorage(uint32 flags, bool isFixedKey, bytes memory key)\n\t\texternal view returns (bool containedKey, uint valueLen);\n\n\t/// Retrieve and remove the value under the given key from storage.\n\t///\n\t/// # Important\n\t///\n\t/// This function can only be called via a delegate call! For Solidity, the low level\n\t/// `delegatecall` function has to be used. For languages that use the FFI\n\t/// of `pallet-revive`, the [`crate::HostFn::delegate_call`] function can be used.\n\t///\n\t/// # Parameters\n\t///\n\t/// - `key`: The storage key.\n\t///\n\t/// # Errors\n\t///\n\t/// Returns empty bytes if no value was found under `key`.\n\tfunction takeStorage(uint32 flags, bool isFixedKey, bytes memory key)\n\t\texternal returns (bytes memory);\n}\n\n```\n\nFor the complete implementation, refer to the [IStorage.sol](https://github.com/paritytech/polkadot-sdk/blob/62fa27df30d985600963fd5bcec1080e4c63fd4b/substrate/frame/revive/uapi/sol/IStorage.sol) file in the Polkadot SDK."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#reading-storage", "page_title": "Interact with the Storage Precompile", "index": 2, "depth": 2, "title": "Reading Storage", "anchor": "reading-storage", "start_char": 3420, "end_char": 3440, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Reading Storage"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#read-full-value", "page_title": "Interact with the Storage Precompile", "index": 3, "depth": 3, "title": "Read Full Value", "anchor": "read-full-value", "start_char": 3440, "end_char": 4087, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Read Full Value\n\nRetrieves the complete value stored at a given storage key. This is the most straightforward way to access storage data.\n\n```solidity\nfunction get(bytes32 key) external view returns (bytes memory);\n```\n\n**Parameters:**\n\n- **`key`**: The storage key to read from.\n\n**Returns:**\n\n- **`bytes memory`**: The complete value stored at the key.\n\n**Example usage:**\n\n```solidity\nIStorage storage = IStorage(STORAGE_ADDR);\nbytes32 key = keccak256(\"myStorageKey\");\nbytes memory value = storage.get(key);\n```\n\n!!!note\n    This function will revert if the key does not exist in storage. Use `has_key` to check existence first if needed."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#read-partial-value", "page_title": "Interact with the Storage Precompile", "index": 4, "depth": 3, "title": "Read Partial Value", "anchor": "read-partial-value", "start_char": 4087, "end_char": 4993, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Read Partial Value\n\nReads a specific segment of a stored value, defined by an offset and length. This is useful for handling large values efficiently without loading the entire data into memory.\n\n```solidity\nfunction get_range(bytes32 key, uint32 offset, uint32 length) external view returns (bytes memory);\n```\n\n**Parameters:**\n\n- **`key`**: The storage key to read from.\n- **`offset`**: Starting byte position within the stored value.\n- **`length`**: Number of bytes to read.\n\n**Returns:**\n\n- **`bytes memory`**: The requested segment of the stored value.\n\n**Example usage:**\n\n```solidity\nIStorage storage = IStorage(STORAGE_ADDR);\nbytes32 key = keccak256(\"largeData\");\n\n// Read bytes 100-200 of a large stored value\nbytes memory segment = storage.get_range(key, 100, 100);\n```\n\n!!!warning\n    This function will revert if the sum of offset and length exceeds the actual length of the stored value."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#read-value-prefix", "page_title": "Interact with the Storage Precompile", "index": 5, "depth": 3, "title": "Read Value Prefix", "anchor": "read-value-prefix", "start_char": 4993, "end_char": 5752, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Read Value Prefix\n\nRetrieves up to a specified number of bytes from the beginning of a stored value. If the stored value is shorter than the requested length, only the available bytes are returned.\n\n```solidity\nfunction get_prefix(bytes32 key, uint32 max_length) external view returns (bytes memory);\n```\n\n**Parameters:**\n\n- **`key`**: The storage key to read from.\n- **`max_length`**: Maximum number of bytes to read from the start.\n\n**Returns:**\n\n- **`bytes memory`**: The prefix of the stored value (up to `max_length` bytes).\n\n**Example usage:**\n\n```solidity\nIStorage storage = IStorage(STORAGE_ADDR);\nbytes32 key = keccak256(\"userData\");\n\n// Read first 32 bytes (might be a header or metadata)\nbytes memory header = storage.get_prefix(key, 32);\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#writing-storage", "page_title": "Interact with the Storage Precompile", "index": 6, "depth": 2, "title": "Writing Storage", "anchor": "writing-storage", "start_char": 5752, "end_char": 5772, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Writing Storage"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#write-value", "page_title": "Interact with the Storage Precompile", "index": 7, "depth": 3, "title": "Write Value", "anchor": "write-value", "start_char": 5772, "end_char": 6395, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Write Value\n\nWrites or overwrites a value at a specified storage key. This operation completely replaces any existing value at the key.\n\n```solidity\nfunction set(bytes32 key, bytes memory value) external;\n```\n\n**Parameters:**\n\n- **`key`**: The storage key to write to.\n- **`value`**: The data to store.\n\n**Example usage:**\n\n```solidity\nIStorage storage = IStorage(STORAGE_ADDR);\nbytes32 key = keccak256(\"myData\");\nbytes memory data = abi.encode(\"Hello Polkadot!\");\n\nstorage.set(key, data);\n```\n\n!!!note\n    Large storage writes can be expensive in terms of gas. Breaking large data into smaller chunks is recommended."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#remove-value", "page_title": "Interact with the Storage Precompile", "index": 8, "depth": 3, "title": "Remove Value", "anchor": "remove-value", "start_char": 6395, "end_char": 6772, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Remove Value\n\nDeletes the value stored at a specified key, freeing up storage space and potentially refunding gas.\n\n```solidity\nfunction remove(bytes32 key) external;\n```\n\n**Parameters:**\n\n- **`key`**: The storage key to delete.\n\n**Example usage:**\n\n```solidity\nIStorage storage = IStorage(STORAGE_ADDR);\nbytes32 key = keccak256(\"obsoleteData\");\n\nstorage.remove(key);\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#storage-inspection", "page_title": "Interact with the Storage Precompile", "index": 9, "depth": 2, "title": "Storage Inspection", "anchor": "storage-inspection", "start_char": 6772, "end_char": 6795, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Storage Inspection"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#check-key-existence", "page_title": "Interact with the Storage Precompile", "index": 10, "depth": 3, "title": "Check Key Existence", "anchor": "check-key-existence", "start_char": 6795, "end_char": 7364, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Check Key Existence\n\nChecks whether a given storage key exists, even if the stored value is empty.\n\n```solidity\nfunction has_key(bytes32 key) external view returns (bool);\n```\n\n**Parameters:**\n\n- **`key`**: The storage key to check.\n\n**Returns:**\n\n- **`bool`**: `true` if the key exists, `false` otherwise.\n\n**Example usage:**\n\n```solidity\nIStorage storage = IStorage(STORAGE_ADDR);\nbytes32 key = keccak256(\"maybeExists\");\n\nif (storage.has_key(key)) {\n    bytes memory value = storage.get(key);\n    // Process value...\n} else {\n    // Handle missing data...\n}\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#get-value-length", "page_title": "Interact with the Storage Precompile", "index": 11, "depth": 3, "title": "Get Value Length", "anchor": "get-value-length", "start_char": 7364, "end_char": 8184, "estimated_token_count": 211, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Get Value Length\n\nReturns the byte length of the value stored at a key without reading the actual data. This is useful for determining how much data exists before reading it.\n\n```solidity\nfunction length(bytes32 key) external view returns (uint32);\n```\n\n**Parameters:**\n\n- **`key`**: The storage key to query.\n\n**Returns:**\n\n- **`uint32`**: The length in bytes of the stored value.\n\n**Example usage:**\n\n```solidity\nIStorage storage = IStorage(STORAGE_ADDR);\nbytes32 key = keccak256(\"largeFile\");\n\nuint32 size = storage.length(key);\nif (size > 10000) {\n    // Handle large value with partial reads\n    bytes memory chunk = storage.get_range(key, 0, 1000);\n} else {\n    // Small enough to read in full\n    bytes memory value = storage.get(key);\n}\n```\n\n!!!note\n    This function will revert if the key does not exist."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#interact-with-the-storage-precompile", "page_title": "Interact with the Storage Precompile", "index": 12, "depth": 2, "title": "Interact with the Storage Precompile", "anchor": "interact-with-the-storage-precompile", "start_char": 8184, "end_char": 9161, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the Storage Precompile\n\nTo interact with the Storage precompile in [Remix IDE](/smart-contracts/dev-environments/remix/):\n\n1. Create a new file called `IStorage.sol` in Remix.\n2. Copy and paste the `IStorage` interface code into the file.\n\n    ![](/images/smart-contracts/precompiles/storage/storage-precompile-01.webp)\n\n3. Compile the interface using the **Compile** button at the top or press **Ctrl + S**.\n4. In the **Deploy & Run Transactions** tab, select the `IStorage` interface from the contract dropdown.\n5. Enter the precompile address `0x0000000000000000000000000000000000000901` in the **At Address** input field.\n6. Select the **At Address** button to connect to the precompile.\n\n    ![](/images/smart-contracts/precompiles/storage/storage-precompile-02.webp)\n\nOnce connected, you can interact with any Storage precompile function directly through the Remix interface.\n\n![](/images/smart-contracts/precompiles/storage/storage-precompile-03.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#conclusion", "page_title": "Interact with the Storage Precompile", "index": 13, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 9161, "end_char": 9827, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nThe Storage precompile provides essential building blocks for smart contracts that need low-level access to storage operations. By offering direct control over storage keys and values, partial reads for optimization, and efficient storage management functions, it enables developers to build sophisticated applications with fine-grained storage control.\n\nWhether you're building custom data structures that require specific storage layouts, optimizing gas costs for large datasets through chunked reads, or implementing specialized storage systems, the Storage precompile offers the necessary tools to work directly with the runtime's storage layer."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-storage", "url": "https://developer.polkadot.com/smart-contracts/precompiles/storage/#reference", "page_title": "Interact with the Storage Precompile", "index": 14, "depth": 2, "title": "Reference", "anchor": "reference", "start_char": 9827, "end_char": 10148, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:41d59dabf90ad1bd6a50bce8cc3f0d44ae91a58c6c6e0a5cd34a028636b4dbb5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Reference\n\n- [IStorage.sol source code](https://github.com/paritytech/polkadot-sdk/blob/62fa27df30d985600963fd5bcec1080e4c63fd4b/substrate/frame/revive/uapi/sol/IStorage.sol)\n- [Revive uapi directory](https://github.com/paritytech/polkadot-sdk/tree/62fa27df30d985600963fd5bcec1080e4c63fd4b/substrate/frame/revive/uapi)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#introduction", "page_title": "Interact with the System Precompile", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 22, "end_char": 751, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe System precompile provides access to essential runtime-level functionality that smart contracts frequently need. Located at the fixed address `0x0000000000000000000000000000000000000900`, it offers a comprehensive set of utilities, including:\n\n- **Cryptographic operations**: BLAKE2 hashing, sr25519 signature verification, and ECDSA operations.\n- **Account management**: Account ID conversions and balance queries.\n- **Runtime queries**: Origin checks, code hash retrieval, and weight tracking.\n- **Contract lifecycle**: Safe contract termination.\n\nThis precompile is particularly useful for contracts that need to interact with Polkadot-native cryptographic primitives or query runtime state information."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#precompile-interface", "page_title": "Interact with the System Precompile", "index": 1, "depth": 2, "title": "Precompile Interface", "anchor": "precompile-interface", "start_char": 751, "end_char": 3985, "estimated_token_count": 738, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Precompile Interface\n\nThe System precompile implements the `ISystem` interface, which is defined in the Polkadot SDK. The source code for the interface is as follows:\n\n```solidity title=\"ISystem.sol\"\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\naddress constant SYSTEM_ADDR = 0x0000000000000000000000000000000000000900;\n\ninterface ISystem {\n\t/// Computes the BLAKE2 256-bit hash on the given input.\n\tfunction hashBlake256(bytes memory input) external pure returns (bytes32 digest);\n\n\t/// Computes the BLAKE2 128-bit hash on the given input.\n\tfunction hashBlake128(bytes memory input) external pure returns (bytes32 digest);\n\n\t/// Retrieve the account id for a specified `H160` address.\n\t///\n\t/// Calling this function on a native `H160` chain (`type AccountId = H160`)\n\t/// does not make sense, as it would just return the `address` that it was\n\t/// called with.\n\t///\n\t/// # Note\n\t///\n\t/// If no mapping exists for `addr`, the fallback account id will be returned.\n\tfunction toAccountId(address input) external view returns (bytes memory account_id);\n\n\t/// Checks whether the caller of the contract calling this function is the origin\n\t/// of the whole call stack.\n\tfunction callerIsOrigin() external view returns (bool);\n\n\t/// Checks whether the caller of the contract calling this function is root.\n\t///\n\t/// Note that only the origin of the call stack can be root. Hence this\n\t/// function returning `true` implies that the contract is being called by the origin.\n\t///\n\t/// A return value of `true` indicates that this contract is being called by a root origin,\n\t/// and `false` indicates that the caller is a signed origin.\n\tfunction callerIsRoot() external view returns (bool);\n\n\t/// Returns the minimum balance that is required for creating an account\n\t/// (the existential deposit).\n\tfunction minimumBalance() external view returns (uint);\n\n\t/// Returns the code hash of the caller.\n\tfunction ownCodeHash() external view returns (bytes32);\n\n\t/// Returns the amount of `Weight` left.\n\tfunction weightLeft() external view returns (uint64 refTime, uint64 proofSize);\n\n\t/// Terminate the calling contract of this function and send balance to `beneficiary`.\n\t/// This will revert if:\n\t/// - called from constructor\n\t/// - called from static context\n\t/// - called from delegate context\n\t/// - the contract introduced balance locks\n\tfunction terminate(address beneficiary) external;\n\n\t/// Verify a sr25519 signature\n\t///\n\t/// # Parameters\n\t///\n\t/// - `signature`: The signature bytes.\n\t/// - `message`: The message bytes.\n\t/// - `publicKey`: The public key bytes.\n\tfunction sr25519Verify(uint8[64] calldata signature, bytes calldata message, bytes32 publicKey) external view returns (bool);\n\n\t/// Calculates the Ethereum address from the ECDSA compressed public key.\n\t/// This fails if ECDSA recovery of the provided key fails. \n\t///\n\t/// # Parameters\n\t///\n\t/// - `publicKey`: The public key bytes.\n\tfunction ecdsaToEthAddress(uint8[33] calldata publicKey) external view returns (bytes20);\n}\n\n```\n\nFor the complete implementation, refer to the [ISystem.sol](https://github.com/paritytech/polkadot-sdk/blob/62fa27df30d985600963fd5bcec1080e4c63fd4b/substrate/frame/revive/uapi/sol/ISystem.sol) file in the Polkadot SDK."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#cryptographic-operations", "page_title": "Interact with the System Precompile", "index": 2, "depth": 2, "title": "Cryptographic Operations", "anchor": "cryptographic-operations", "start_char": 3985, "end_char": 4014, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Cryptographic Operations"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#compute-blake2-256-hash", "page_title": "Interact with the System Precompile", "index": 3, "depth": 3, "title": "Compute BLAKE2-256 Hash", "anchor": "compute-blake2-256-hash", "start_char": 4014, "end_char": 4606, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compute BLAKE2-256 Hash\n\nComputes the BLAKE2 256-bit hash of the provided input data. BLAKE2 is the native hashing algorithm used throughout the Polkadot ecosystem and is more efficient than SHA-256 for most operations.\n\n```solidity\nfunction hashBlake256(bytes memory input) external pure returns (bytes32 digest);\n```\n\n**Parameters:**\n\n- **`input`**: The data to hash.\n\n**Returns:**\n\n- **`digest`**: The 32-byte BLAKE2-256 hash.\n\n**Example usage:**\n\n```solidity\nISystem system = ISystem(SYSTEM_ADDR);\nbytes memory data = \"Hello Polkadot!\";\nbytes32 hash = system.hashBlake256(data);\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#compute-blake2-128-hash", "page_title": "Interact with the System Precompile", "index": 4, "depth": 3, "title": "Compute BLAKE2-128 Hash", "anchor": "compute-blake2-128-hash", "start_char": 4606, "end_char": 5018, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compute BLAKE2-128 Hash\n\nComputes the BLAKE2 128-bit hash of the provided input data. This variant is useful when a shorter hash is acceptable for your use case.\n\n```solidity\nfunction hashBlake128(bytes memory input) external pure returns (bytes32 digest);\n```\n\n**Parameters:**\n\n- **`input`**: The data to hash.\n\n**Returns:**\n\n- **`digest`**: The 16-byte BLAKE2-128 hash (returned as bytes32 with padding)."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#verify-sr25519-signature", "page_title": "Interact with the System Precompile", "index": 5, "depth": 3, "title": "Verify SR25519 Signature", "anchor": "verify-sr25519-signature", "start_char": 5018, "end_char": 5921, "estimated_token_count": 233, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify SR25519 Signature\n\nVerifies a sr25519 signature. Sr25519 is the signature scheme used by most accounts on Polkadot and is essential for verifying signatures from Polkadot native wallets.\n\n```solidity\nfunction sr25519Verify(uint8[64] calldata signature, bytes calldata message, bytes32 publicKey) external view returns (bool);\n```\n\n**Parameters:**\n\n- **`signature`**: The 64-byte signature to verify.\n- **`message`**: The message that was signed.\n- **`publicKey`**: The 32-byte public key.\n\n**Returns:**\n\n- **`bool`**: `true` if the signature is valid, `false` otherwise.\n\n**Example usage:**\n\n```solidity\nISystem system = ISystem(SYSTEM_ADDR);\nuint8[64] memory sig = ...; // The signature bytes\nbytes memory message = \"Sign this message\";\nbytes32 pubKey = 0x...; // The sr25519 public key\n\nbool isValid = system.sr25519Verify(sig, message, pubKey);\nrequire(isValid, \"Invalid signature\");\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#convert-ecdsa-public-key-to-ethereum-address", "page_title": "Interact with the System Precompile", "index": 6, "depth": 3, "title": "Convert ECDSA Public Key to Ethereum Address", "anchor": "convert-ecdsa-public-key-to-ethereum-address", "start_char": 5921, "end_char": 6391, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Convert ECDSA Public Key to Ethereum Address\n\nConverts a compressed ECDSA public key to an Ethereum address. This is useful when working with Ethereum-style accounts, and you need to derive addresses from public keys.\n\n```solidity\nfunction ecdsaToEthAddress(uint8[33] calldata publicKey) external view returns (bytes20);\n```\n\n**Parameters:**\n\n- **`publicKey`**: The 33-byte compressed ECDSA public key.\n\n**Returns:**\n\n- **`bytes20`**: The derived Ethereum address."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#account-management", "page_title": "Interact with the System Precompile", "index": 7, "depth": 2, "title": "Account Management", "anchor": "account-management", "start_char": 6391, "end_char": 6414, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Account Management"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#convert-address-to-account-id", "page_title": "Interact with the System Precompile", "index": 8, "depth": 3, "title": "Convert Address to Account ID", "anchor": "convert-address-to-account-id", "start_char": 6414, "end_char": 7190, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Convert Address to Account ID\n\nConverts an H160 Ethereum-style address to the native account ID format used by the runtime. This is crucial when contracts need to interact with runtime functionality that expects account IDs rather than addresses.\n\n```solidity\nfunction toAccountId(address input) external view returns (bytes memory account_id);\n```\n\n**Parameters:**\n\n- **`input`**: The Ethereum address to convert.\n\n**Returns:**\n\n- **`account_id`**: The native account ID bytes.\n\n!!!note\n    If no mapping exists for the provided address, a fallback account ID will be returned.\n\n**Example usage:**\n\n```solidity\nISystem system = ISystem(SYSTEM_ADDR);\naddress ethAddr = 0x1234567890123456789012345678901234567890;\nbytes memory accountId = system.toAccountId(ethAddr);\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#runtime-queries", "page_title": "Interact with the System Precompile", "index": 9, "depth": 2, "title": "Runtime Queries", "anchor": "runtime-queries", "start_char": 7190, "end_char": 7210, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Runtime Queries"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#check-if-caller-is-origin", "page_title": "Interact with the System Precompile", "index": 10, "depth": 3, "title": "Check if Caller is Origin", "anchor": "check-if-caller-is-origin", "start_char": 7210, "end_char": 7790, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Check if Caller is Origin\n\nChecks whether the immediate caller of your contract is the origin (the initial caller) of the entire call stack. This is useful for determining if your contract was called directly by a user or through another contract.\n\n```solidity\nfunction callerIsOrigin() external view returns (bool);\n```\n\n**Returns:**\n\n- **`bool`**: `true` if the caller is the origin, `false` if called through another contract.\n\n**Example usage:**\n\n```solidity\nISystem system = ISystem(SYSTEM_ADDR);\nrequire(system.callerIsOrigin(), \"Must be called directly by user\");\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#check-if-caller-is-root", "page_title": "Interact with the System Precompile", "index": 11, "depth": 3, "title": "Check if Caller is Root", "anchor": "check-if-caller-is-root", "start_char": 7790, "end_char": 8200, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Check if Caller is Root\n\nChecks whether the caller is a root origin. Root origins have elevated privileges and can perform privileged operations. Note that if this returns `true`, `callerIsOrigin()` will also return `true`, as only the origin can be root.\n\n```solidity\nfunction callerIsRoot() external view returns (bool);\n```\n\n**Returns:**\n\n- **`bool`**: `true` if the caller is root, `false` otherwise."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#get-minimum-balance", "page_title": "Interact with the System Precompile", "index": 12, "depth": 3, "title": "Get Minimum Balance", "anchor": "get-minimum-balance", "start_char": 8200, "end_char": 8750, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Get Minimum Balance\n\nReturns the existential deposit - the minimum balance required for an account to exist on the chain. Accounts with balances below this threshold are reaped (removed) from state.\n\n```solidity\nfunction minimumBalance() external view returns (uint);\n```\n\n**Returns:**\n\n- **`uint`**: The minimum balance in the smallest unit of the native token.\n\n**Example usage:**\n\n```solidity\nISystem system = ISystem(SYSTEM_ADDR);\nuint minBalance = system.minimumBalance();\nrequire(msg.value >= minBalance, \"Below existential deposit\");\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#get-own-code-hash", "page_title": "Interact with the System Precompile", "index": 13, "depth": 3, "title": "Get Own Code Hash", "anchor": "get-own-code-hash", "start_char": 8750, "end_char": 9067, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Get Own Code Hash\n\nReturns the code hash of the calling contract. This can be used for contract identity verification or to check if a contract has been upgraded.\n\n```solidity\nfunction ownCodeHash() external view returns (bytes32);\n```\n\n**Returns:**\n\n- **`bytes32`**: The BLAKE2-256 hash of the contract's code."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#get-weight-left", "page_title": "Interact with the System Precompile", "index": 14, "depth": 3, "title": "Get Weight Left", "anchor": "get-weight-left", "start_char": 9067, "end_char": 9716, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Get Weight Left\n\nReturns the amount of computational resources (weight) remaining in the current execution context. Weight is Polkadot's measure of computational cost, consisting of two components:\n\n```solidity\nfunction weightLeft() external view returns (uint64 refTime, uint64 proofSize);\n```\n\n**Returns:**\n\n- **`refTime`**: Remaining reference time (computational cycles).\n- **`proofSize`**: Remaining proof size allowance (storage proof bytes).\n\n**Example usage:**\n\n```solidity\nISystem system = ISystem(SYSTEM_ADDR);\n(uint64 refTime, uint64 proofSize) = system.weightLeft();\nrequire(refTime > 1000000, \"Insufficient weight remaining\");\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#contract-lifecycle", "page_title": "Interact with the System Precompile", "index": 15, "depth": 2, "title": "Contract Lifecycle", "anchor": "contract-lifecycle", "start_char": 9716, "end_char": 9739, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Contract Lifecycle"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#terminate-contract", "page_title": "Interact with the System Precompile", "index": 16, "depth": 3, "title": "Terminate Contract", "anchor": "terminate-contract", "start_char": 9739, "end_char": 10485, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Terminate Contract\n\nTerminates the calling contract and transfers its remaining balance to a specified beneficiary. This is useful for cleanup or when a contract has fulfilled its purpose.\n\n```solidity\nfunction terminate(address beneficiary) external;\n```\n\n**Parameters:**\n\n- **`beneficiary`**: The address that will receive the contract's remaining balance.\n\n!!!warning\n    This function will revert if called from:\n    \n    - A constructor\n    - A static context\n    - A delegate context\n    - A contract with balance locks\n\n**Example usage:**\n\n```solidity\nISystem system = ISystem(SYSTEM_ADDR);\naddress beneficiary = 0x1234567890123456789012345678901234567890;\nsystem.terminate(beneficiary); // Contract is terminated after this call\n```"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#interact-with-the-system-precompile", "page_title": "Interact with the System Precompile", "index": 17, "depth": 2, "title": "Interact with the System Precompile", "anchor": "interact-with-the-system-precompile", "start_char": 10485, "end_char": 11462, "estimated_token_count": 239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the System Precompile\n\nTo interact with the System precompile in the [Remix IDE](/smart-contracts/dev-environments/remix/):\n\n1. Create a new file called `ISystem.sol` in Remix.\n2. Copy and paste the `ISystem` interface code into the file.\n\n    ![](/images/smart-contracts/precompiles/system/system-precompile-01.webp)\n\n3. Compile the interface using the **Compile** button at the top or press **Ctrl + S**.\n4. In the **Deploy & Run Transactions** tab, select the `ISystem` interface from the contract dropdown.\n5. Enter the precompile address `0x0000000000000000000000000000000000000900` in the **At Address** input field.\n6. Select the **At Address** button to connect to the precompile.\n\n    ![](/images/smart-contracts/precompiles/system/system-precompile-02.webp)\n\nOnce connected, you can interact with any of the System precompile functions directly through the Remix interface.\n\n![](/images/smart-contracts/precompiles/system/system-precompile-03.webp)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#conclusion", "page_title": "Interact with the System Precompile", "index": 18, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 11462, "end_char": 12125, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nThe System precompile provides essential building blocks for smart contracts that need to interact with Polkadot-native functionality. By offering access to cryptographic primitives, runtime queries, and system utilities, it enables developers to build sophisticated applications that leverage the full power of the Polkadot runtime.\n\nWhether you're building identity systems that verify sr25519 signatures, contracts that need precise weight management, or applications that interact with Polkadot's native account system, the System precompile offers the necessary tools to bridge the gap between smart contract logic and runtime functionality."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-system", "url": "https://developer.polkadot.com/smart-contracts/precompiles/system/#reference", "page_title": "Interact with the System Precompile", "index": 19, "depth": 2, "title": "Reference", "anchor": "reference", "start_char": 12125, "end_char": 12444, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4bb3a7c4b9af5a64cd08a5b6367f49f47453e84ac8e2fe8a96155e9b91f28895", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Reference\n\n- [ISystem.sol source code](https://github.com/paritytech/polkadot-sdk/blob/62fa27df30d985600963fd5bcec1080e4c63fd4b/substrate/frame/revive/uapi/sol/ISystem.sol)\n- [Revive uapi directory](https://github.com/paritytech/polkadot-sdk/tree/62fa27df30d985600963fd5bcec1080e4c63fd4b/substrate/frame/revive/uapi)"}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#introduction", "page_title": "Interact with the XCM Precompile", "index": 0, "depth": 2, "title": "Introduction", "anchor": "introduction", "start_char": 19, "end_char": 878, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction\n\nThe [XCM (Cross-Consensus Message)](/parachains/interoperability/get-started/) precompile enables Polkadot Hub developers to access XCM functionality directly from their smart contracts using a Solidity interface.\n\nLocated at the fixed address `0x00000000000000000000000000000000000a0000`, the XCM precompile offers three primary functions:\n\n- **`execute`**: For local XCM execution.\n- **`send`**: For cross-chain message transmission.\n- **`weighMessage`**: For cost estimation.\n\nThis guide demonstrates how to interact with the XCM precompile through Solidity smart contracts using [Remix IDE](/smart-contracts/dev-environments/remix/).\n\n!!!note\n    The XCM precompile provides the barebones XCM functionality. While it provides a lot of flexibility, it doesn't provide abstractions to hide away XCM details. These have to be built on top."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#precompile-interface", "page_title": "Interact with the XCM Precompile", "index": 1, "depth": 2, "title": "Precompile Interface", "anchor": "precompile-interface", "start_char": 878, "end_char": 3984, "estimated_token_count": 692, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Precompile Interface\n\nThe XCM precompile implements the `IXcm` interface, which defines the structure for interacting with XCM functionality. The source code for the interface is as follows:\n\n```solidity title=\"IXcm.sol\"\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @dev The on-chain address of the XCM (Cross-Consensus Messaging) precompile.\naddress constant XCM_PRECOMPILE_ADDRESS = address(0xA0000);\n\n/// @title XCM Precompile Interface\n/// @notice A low-level interface for interacting with `pallet_xcm`.\n/// It forwards calls directly to the corresponding dispatchable functions,\n/// providing access to XCM execution and message passing.\n/// @dev Documentation:\n/// @dev - XCM: https://docs.polkadot.com/develop/interoperability\n/// @dev - SCALE codec: https://docs.polkadot.com/polkadot-protocol/parachain-basics/data-encoding\n/// @dev - Weights: https://docs.polkadot.com/polkadot-protocol/parachain-basics/blocks-transactions-fees/fees/#transactions-weights-and-fees\ninterface IXcm {\n    /// @notice Weight v2 used for measurement for an XCM execution\n    struct Weight {\n        /// @custom:property The computational time used to execute some logic based on reference hardware.\n        uint64 refTime;\n        /// @custom:property The size of the proof needed to execute some logic.\n        uint64 proofSize;\n    }\n\n    /// @notice Executes an XCM message locally on the current chain with the caller's origin.\n    /// @dev Internally calls `pallet_xcm::execute`.\n    /// @param message A SCALE-encoded Versioned XCM message.\n    /// @param weight The maximum allowed `Weight` for execution.\n    /// @dev Call @custom:function weighMessage(message) to ensure sufficient weight allocation.\n    function execute(bytes calldata message, Weight calldata weight) external;\n\n    /// @notice Sends an XCM message to another parachain or consensus system.\n    /// @dev Internally calls `pallet_xcm::send`.\n    /// @param destination SCALE-encoded destination MultiLocation.\n    /// @param message SCALE-encoded Versioned XCM message.\n    function send(bytes calldata destination, bytes calldata message) external;\n\n    /// @notice Estimates the `Weight` required to execute a given XCM message.\n    /// @param message SCALE-encoded Versioned XCM message to analyze.\n    /// @return weight Struct containing estimated `refTime` and `proofSize`.\n    function weighMessage(bytes calldata message) external view returns (Weight memory weight);\n}\n\n```\n\nThe interface defines a `Weight` struct that represents the computational cost of XCM operations. Weight has two components: \n\n- **`refTime`**: Computational time on reference hardware.\n- **`proofSize`**: The size of the proof required for execution.\n\nAll XCM messages must be encoded using the [SCALE codec](/reference/parachains/data-encoding/#data-encoding), Polkadot's standard serialization format.\n\nFor further information, check the [`precompiles/IXCM.sol`](https://github.com/paritytech/polkadot-sdk/blob/cb629d46ebf00aa65624013a61f9c69ebf02b0b4/polkadot/xcm/pallet-xcm/src/precompiles/IXcm.sol) file present in `pallet-xcm`."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#interact-with-the-xcm-precompile", "page_title": "Interact with the XCM Precompile", "index": 2, "depth": 2, "title": "Interact with the XCM Precompile", "anchor": "interact-with-the-xcm-precompile", "start_char": 3984, "end_char": 5109, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interact with the XCM Precompile\n\nTo interact with the XCM precompile, you can use the precompile interface directly in [Remix IDE](/smart-contracts/dev-environments/remix/):\n\n1. Create a new file called `IXcm.sol` in Remix.\n2. Copy and paste the `IXcm` interface code into the file.\n3. Compile the interface by selecting the button or using **Ctrl +S** keys:\n\n    ![](/images/smart-contracts/precompiles/xcm/xcm-01.webp)\n\n4. In the **Deploy & Run Transactions** tab, select the `IXcm` interface from the contract dropdown.\n5. Enter the precompile address `0x00000000000000000000000000000000000a0000` in the **At Address** input field.\n6. Select the **At Address** button to connect to the precompile.\n\n    ![](/images/smart-contracts/precompiles/xcm/xcm-02.webp)\n\n7. Once connected, you can use the Remix interface to interact with the XCM precompile's  `execute`, `send`, and `weighMessage` functions.\n\n    ![](/images/smart-contracts/precompiles/xcm/xcm-03.webp)\n\nThe main entrypoint of the precompile is the `execute` function. However, it's necessary to first call `weighMessage` to fill in the required parameters."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#weigh-a-message", "page_title": "Interact with the XCM Precompile", "index": 3, "depth": 3, "title": "Weigh a Message", "anchor": "weigh-a-message", "start_char": 5109, "end_char": 7224, "estimated_token_count": 449, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Weigh a Message\n\nThe `weighMessage` function estimates the computational cost required to execute an XCM message. This estimate is crucial for understanding the resources needed before actually executing or sending a message.\n\nTo test this functionality in Remix, you can call `callWeighMessage` with a SCALE-encoded XCM message. For example, for testing, you can use the following encoded XCM message:\n\n```text title=\"encoded-xcm-message-example\"\n0x050c000401000003008c86471301000003008c8647000d010101000000010100368e8759910dab756d344995f1d3c79374ca8f70066d3a709e48029f6bf0ee7e\n```\n\n![](/images/smart-contracts/precompiles/xcm/xcm-04.webp)\n\nThis encoded message represents a sequence of XCM instructions:\n\n- **[Withdraw Asset](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#withdrawasset)**: This instruction removes assets from the local chain's sovereign account or the caller's account, making them available for use in subsequent XCM instructions.\n- **[Buy Execution](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#buyexecution)**: This instruction purchases execution time on the destination chain using the withdrawn assets, ensuring the message can be processed.\n- **[Deposit Asset](https://github.com/polkadot-fellows/xcm-format?tab=readme-ov-file#depositasset)**: This instruction deposits the remaining assets into a specified account on the destination chain after execution costs have been deducted.\n\nThis encoded message is provided as an example. You can craft your own XCM message tailored to your specific use case as needed.\n\nThe function returns a `Weight` struct containing `refTime` and `proofSize` values, which indicate the estimated computational cost of executing this message. If successful, after calling the `callWeighMessage` function, you should see the `refTime` and `proofSize` of the message:\n\n![](/images/smart-contracts/precompiles/xcm/xcm-05.webp)\n\n!!!note\n    You can find many more examples of XCMs in this [gist](https://gist.github.com/franciscoaguirre/a6dea0c55e81faba65bedf700033a1a2), which connects to the Polkadot Hub TestNet."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#execute-a-message", "page_title": "Interact with the XCM Precompile", "index": 4, "depth": 3, "title": "Execute a Message", "anchor": "execute-a-message", "start_char": 7224, "end_char": 8654, "estimated_token_count": 297, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Execute a Message\n\nThe `execute` function runs an XCM message locally using the caller's origin.\nThis function is the main entrypoint to cross-chain interactions.\n\nFollow these steps to execute a message:\n\n1. Call `weighMessage` with your message to get the required weight.\n2. Pass the same message bytes and the weight obtained from the previous step to `execute`.\nFor example, using the same message from the weighing example, you would call `execute` with:\n\n    - **`message`**: The encoded XCM message bytes.\n    - **`weight`**: The `Weight` struct returned from `weighMessage`.\n\n    You can use the [papi console](https://dev.papi.how/extrinsics#networkId=localhost&endpoint=wss%3A%2F%2Ftestnet-passet-hub.polkadot.io&data=0x1f03050c000401000003008c86471301000003008c8647000d010101000000010100368e8759910dab756d344995f1d3c79374ca8f70066d3a709e48029f6bf0ee7e0750c61e2901daad0600) to examine the complete extrinsic structure for this operation.\n\n3. On Remix, click on the **Transact** button to execute the XCM message:\n  \n    ![](/images/smart-contracts/precompiles/xcm/xcm-06.webp)\n\n    If successful, you will see the following output in the Remix terminal:\n\n    ![](/images/smart-contracts/precompiles/xcm/xcm-07.webp)\n\nAdditionally, you can verify that the execution of this specific message was successful by checking that the beneficiary account associated with the XCM message has received the funds accordingly."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#send-a-message", "page_title": "Interact with the XCM Precompile", "index": 5, "depth": 3, "title": "Send a Message", "anchor": "send-a-message", "start_char": 8654, "end_char": 9380, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Send a Message\n\nWhile most cross-chain operations can be performed via `execute`, `send` is sometimes necessary, for example, when opening HRMP channels.\n\nTo send a message:\n\n1. Prepare your destination location encoded in XCM format.\n2. Prepare your XCM message (similar to the execute example).\n3. Call `send` with both parameters.\n\nThe destination parameter must be encoded according to XCM's location format, specifying the target parachain or consensus system. The message parameter contains the XCM instructions to be executed on the destination chain.\n\nUnlike `execute`, the `send` function doesn't require a weight parameter since the destination chain will handle execution costs according to its fee structure."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#cross-contract-calls", "page_title": "Interact with the XCM Precompile", "index": 6, "depth": 2, "title": "Cross Contract Calls", "anchor": "cross-contract-calls", "start_char": 9380, "end_char": 9878, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Cross Contract Calls\n\nBeyond direct interaction and wrapper contracts, you can integrate XCM functionality directly into your existing smart contracts by inheriting from or importing the `IXcm` interface. This approach enables you to embed cross-chain capabilities into your application logic seamlessly.\n\nWhether you're building DeFi protocols, governance systems, or any application requiring cross-chain coordination, you can incorporate XCM calls directly within your contract's functions."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#conclusion", "page_title": "Interact with the XCM Precompile", "index": 7, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 9878, "end_char": 10185, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Conclusion\n\nThe XCM precompile provides a simple yet powerful interface for cross-chain interactions within the Polkadot ecosystem and beyond.\nBy building and executing XCM programs, developers can build cross-chain applications that leverage the full potential of Polkadot's interoperability features."}
{"source": "polkadot-docs", "page_id": "smart-contracts-precompiles-xcm", "url": "https://developer.polkadot.com/smart-contracts/precompiles/xcm/#next-steps", "page_title": "Interact with the XCM Precompile", "index": 8, "depth": 2, "title": "Next Steps", "anchor": "next-steps", "start_char": 10185, "end_char": 10409, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:264dbddeb6c58a51976f1da72ea79c4f0e9fc2671334274e2287e75e4a13070c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Next Steps\n\nHead to the Polkadot Hub TestNet and start playing around with the precompile using [Hardhat](/smart-contracts/dev-environments/hardhat/).\n\nYou can use PAPI to build XCM programs and test them with Chopsticks."}
{"source": "polkadot-docs", "page_id": "tools", "url": "https://developer.polkadot.com/tools/#encoding-decoding", "page_title": "Polkadot Utilities", "index": 0, "depth": 2, "title": "Encoding & Decoding", "anchor": "encoding-decoding", "start_char": 455, "end_char": 663, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be8413cb3fe3cfde05ca25fa0dda1accb21fd18272cbce4cb9b413bfd93545f6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Encoding & Decoding\n\nConvert between strings, numbers, byte arrays, and their hexadecimal representations. Bidirectional tools update both fields in real time as you type.\n\n<div id=\"encoding-root\"></div>"}
{"source": "polkadot-docs", "page_id": "tools", "url": "https://developer.polkadot.com/tools/#hashing", "page_title": "Polkadot Utilities", "index": 1, "depth": 2, "title": "Hashing", "anchor": "hashing", "start_char": 663, "end_char": 1002, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be8413cb3fe3cfde05ca25fa0dda1accb21fd18272cbce4cb9b413bfd93545f6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Hashing\n\nHash arbitrary inputs using Blake2 and XXHash — the two hashing algorithms used throughout the Polkadot SDK for storage key derivation and other primitives. The **concat** variants append the original input to the hash output, matching the `Blake2_128Concat` and `Twox64Concat` storage hashers.\n\n<div id=\"hashing-root\"></div>"}
{"source": "polkadot-docs", "page_id": "tools", "url": "https://developer.polkadot.com/tools/#address-utilities", "page_title": "Polkadot Utilities", "index": 2, "depth": 2, "title": "Address Utilities", "anchor": "address-utilities", "start_char": 1002, "end_char": 1816, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be8413cb3fe3cfde05ca25fa0dda1accb21fd18272cbce4cb9b413bfd93545f6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Address Utilities\n\nDerive, convert, and re-encode Polkadot addresses. These tools cover the full range of address types used in the Polkadot ecosystem — from standard SS58 addresses and Ethereum-compatible addresses to pallet module accounts, sovereign accounts for parachains, and derived sub-accounts.\n\n!!! warning\n    Never enter seed phrases or private key URIs for accounts that hold real funds. Use only test accounts or development keys (e.g. `//Alice`) with the Seed → Address tool.\n\n<div id=\"address-root\"></div>\n\nConvert addresses between Ethereum (EVM) and Polkadot (SS58) formats. Use the network selector to target a specific chain's SS58 prefix. When converting SS58 → ETH, check the box to confirm the account was originally mapped from an Ethereum key.\n\n<div id=\"account-converter-root\"></div>"}
{"source": "polkadot-docs", "page_id": "tools", "url": "https://developer.polkadot.com/tools/#asset-id-to-erc20-address", "page_title": "Polkadot Utilities", "index": 3, "depth": 2, "title": "Asset ID to ERC20 Address", "anchor": "asset-id-to-erc20-address", "start_char": 1816, "end_char": 2058, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be8413cb3fe3cfde05ca25fa0dda1accb21fd18272cbce4cb9b413bfd93545f6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Asset ID to ERC20 Address\n\nDerive the ERC20 precompile address for a given asset ID. This is the address your smart contract uses to interact with Polkadot Hub assets via the standard ERC20 interface.\n\n<div id=\"erc20-converter-root\"></div>"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#about", "page_title": "Open Source Stack", "index": 0, "depth": 2, "title": "About", "anchor": "about", "start_char": 610, "end_char": 1500, "estimated_token_count": 377, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## About\n\nThe Polkadot Tech Stack is a subset of the Web 3.0 Tech Stack, which consists of the **open-source**\ntechnologies contributing to and relying on [Polkadot](https://polkadot.network/). It is meant to be used\nfor decentralized application (Dapp) development within numerous verticals, including DeFi, Gaming,\nProvenance and many others not pictured below.\n\n\n\n```\n|------|--------|------------|\n| DeFi | Gaming | Provenance |\n|______|________|____________|\n            Dapps\n|--------------------------/-|\n| Explorers, Wallets      /  |\n|------------------------/---|\n| Tools, Apis, Languages/    |\n|----------------------/-----|\n| 2nd layer protocols /      |\n|--------------------/-------|\n| Chains            /  other |\n|------------------/---    --|\n| *Polkadot*      |   tech   |\n|------------------\\---------|\n| P2P, Crypto, Wasm \\        |\n|--------------------\\-------|\n```"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#layers-of-polkadot-stack", "page_title": "Open Source Stack", "index": 1, "depth": 2, "title": "Layers of Polkadot Stack", "anchor": "layers-of-polkadot-stack", "start_char": 1500, "end_char": 1800, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Layers of Polkadot Stack\n\nIn the below sections, you can find a list of different layers of the Polkadot Stack.\n\n**Maintenance Status**:\n\n- 🟢 Actively maintained\n- 🟡 Stale (no activity on the main branch for one month)\n- ⚪ Unmaintained (no activity on the main branch for more than three months)"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#wallets", "page_title": "Open Source Stack", "index": 2, "depth": 3, "title": "Wallets", "anchor": "wallets", "start_char": 1800, "end_char": 8593, "estimated_token_count": 2308, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Wallets\n\n| Components             | Existing projects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | Potentially interesting projects                                                                                                                                                                                                                                                  |\n| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Web Wallets    | [Multix](https://github.com/ChainSafe/Multix) 🟢, [Polkasafe](https://github.com/polkasafe/polkasafe-ui) ⚪, [polkadot-js/apps](https://github.com/polkadot-js/apps) 🟢, [Talisman Web Application](https://github.com/TalismanSociety/talisman-web) 🟢, [mydotwallet](https://github.com/enkryptcom/mydotwallet) ⚪, [Sub ID](https://github.com/dappforce/subid) ⚪, [Primis](https://github.com/Primis-Labs/client) ⚪, [Sakura](https://github.com/w3finance/sakura) ⚪, [Web3Box](https://github.com/w3f-grants-archive/Web3Box-apps) ⚪, [Coong Wallet](https://github.com/CoongCrafts/coong-wallet) ⚪, [Subscan Multisig UI - React](https://github.com/itering/subscan-multisig-react) 🟡, [Subscan Multisig UI](https://github.com/itering/subscan-multisig-ui) ⚪, [Dorafactory-Multisig](https://github.com/DoraFactory/dorafactory-multisig) ⚪, [Capi Multisig App](https://github.com/paritytech/capi-multisig-app) ⚪| User-friendly Wallet based on the [Recovery Pallet](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/recovery), Web wallets focused on user-onboarding (e.g. using [localStorage](https://github.com/near/near-wallet)) |\n| Desktop Wallets | [nova-spektr](https://github.com/novasamatech/nova-spektr) 🟢, [Omni desktop](https://github.com/w3f-grants-archive/omni-desktop-prototype) ⚪| Enterprise Wallets |\n| Browser Extensions     | [Talisman-Extension](https://github.com/TalismanSociety/talisman) 🟢, [SubWallet-Extension](https://github.com/Koniverse/SubWallet-Extension) 🟢, [Enkrypt](https://github.com/enkryptcom/enKrypt) 🟡, [Polkadot-JS](https://github.com/polkadot-js/extension) 🟢, [PolkaGate](https://github.com/PolkaGate/polkagate-extension) 🟢, [Trust Wallet Extension](https://github.com/trustwallet) 🟢, [Doter](https://github.com/ChainBridgeNetworkTeam/Doter) ⚪, [Speckle OS](https://github.com/GetSpeckle/speckle-browser-extension) ⚪, [Kuma Cross-chain Wallet](https://github.com/blockcoders/kuma-wallet) ⚪| Sign-in with your Polkadot, Kusama, etc. account.                                                                                                                                                                                                                                 |\n| Mobile Wallets         | [Nova Wallet iOS](https://github.com/novasamatech/nova-wallet-ios) 🟢, [Nova Wallet Android](https://github.com/novasamatech/nova-wallet-android) 🟢, [Polkadot Vault](https://github.com/paritytech/parity-signer) 🟡, [Fearless Wallet Android](https://github.com/soramitsu/fearless-Android) 🟢, [Fearless Wallet iOS](https://github.com/soramitsu/fearless-iOS) ⚪, [Trust Wallet](https://github.com/trustwallet) 🟢, [SubWallet-Mobile](https://github.com/Koniverse/SubWallet-Mobile) 🟢, [Kampela](https://github.com/Kalapaja/kampela-firmware) ⚪, [AirGap](https://github.com/airgap-it/airgap-wallet) 🟢, [Interstellar Network](https://github.com/Interstellar-Network/wallet-app) ⚪, [Lunie](https://github.com/luniehq/lunie) ⚪, [Polkawallet](https://github.com/polkawallet-io/polkawallet-flutter) ⚪, [imToken](https://github.com/consenlabs/token-core) ⚪, [Stylo](https://github.com/stylo-app/stylo) ⚪, [Fractapp](https://github.com/fractapp/fractapp/) ⚪, [Hashed Wallet](https://github.com/hypha-dao/hashed-wallet) ⚪|\n| Burner Wallets/Faucet/Gifts  | [dotdrop](https://github.com/hamidra/dotdrop) ⚪, [KodaDot](https://github.com/vue-polkadot/apps) ⚪, [Astar Faucet Bot](https://github.com/AstarNetwork/astar-faucet-bot) ⚪, [Generic sybil-resistant faucet](https://github.com/karooolis/sybil-resistant-substrate-faucet) ⚪| Faucet (a sybil-resistant way to receive free tokens)                                                                                                                                                                                                                             |\n| Wallet Plugins         | [Metamask-Snap by Chainsafe](https://github.com/ChainSafe/metamask-snap-polkadot) ⚪|\n| CLI Wallet             | [Subwallet](https://github.com/yxf/subwallet) ⚪, [Proxy-hot-wallet](https://github.com/canontech/proxy-hot-wallet) ⚪|\n| Hardware Wallets       | [Ledger Polkadot](https://github.com/ZondaX/ledger-polkadot) ⚪, [Ledger Kusama](https://github.com/Zondax/ledger-kusama) ⚪, [Ledger Statemint](https://github.com/Zondax/ledger-statemint) ⚪, [Ledger Statemine](https://github.com/Zondax/ledger-statemine) ⚪| Trezor                                                                                                                                                                                                                                                                            |\n| OAuth2-compatible Wallets | [DOT Login](https://github.com/singkeo/dot-login) ⚪, [Kzero](https://github.com/kzero-xyz/kzero-circuit) ⚪| |"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#user-interface", "page_title": "Open Source Stack", "index": 3, "depth": 3, "title": "User Interface", "anchor": "user-interface", "start_char": 8593, "end_char": 18260, "estimated_token_count": 2974, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### User Interface\n\n| Components             | Existing projects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Potentially interesting projects                                                                                                                                                                                                                                                  |\n| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Block Explorers        | [Calamar](https://github.com/topmonks/calamar) ⚪, [Polkascan](https://github.com/polkascan/explorer-api) ⚪, [Polkastats](https://github.com/Colm3na/polkastats-backend) ⚪, [Subscan](https://github.com/itering/subscan) 🟡, [Statescan](https://github.com/opensquare-network/statescan-v2) 🟡, [Edgscan](https://github.com/edgeware-builders/edgscan) ⚪, [Sirato](https://github.com/web3labs/epirus-substrate) ⚪, [ink! Explorer API](https://github.com/blockcoders/ink-substrate-explorer-api) ⚪, [Substats](https://github.com/CESSProject/substats) ⚪, [Hybrid Block Explorer](https://github.com/hybrid-explorer/hybrid-dapp) ⚪|  Mempool focused explorer (including parachain transaction)                                                                                                                                                                                           |\n| Validator Dashboards   | [Polkadot Telemetry](https://github.com/paritytech/substrate-telemetry) ⚪, [Polkacube](https://github.com/hashquark-io/polkacube-frontend) ⚪, [YieldScan](https://github.com/buidl-labs/YieldScan) ⚪, [Hubble](https://github.com/w3f-community/hubble/tree/master/app/controllers/polkadot) ⚪, [Cyclops](https://github.com/ArthurHoeke/cyclops) ⚪, [Web3Go](https://github.com/web3go-xyz/web3go-xyz-v2) ⚪, [1kv insights](https://github.com/MathCryptoDoc/insights-1kv) ⚪|\n| Validator Dashboards   | [Polkadot Telemetry](https://github.com/paritytech/substrate-telemetry) ⚪, [Polkacube](https://github.com/hashquark-io/polkacube-frontend) ⚪, [YieldScan](https://github.com/buidl-labs/YieldScan) ⚪, [Hubble](https://github.com/w3f-community/hubble/tree/master/app/controllers/polkadot) ⚪, [Cyclops](https://github.com/ArthurHoeke/cyclops) ⚪, [Web3Go](https://github.com/web3go-xyz/web3go-xyz-v2) ⚪, [1kv insights](https://github.com/MathCryptoDoc/insights-1kv) ⚪|\n| Node Explorers         | [Polkadot Node Explorer](https://github.com/protos-research/polkadot-node-explorer) ⚪|\n| NFT Explorer           | [NFT Explorer for Kusama & Polkadot](https://github.com/kodadot/nft-gallery) ⚪|\n| Governance Dashboards  | [Polkadot Delegation Dashboard](https://github.com/paritytech/governance-ui) ⚪, [dotreasury](https://github.com/opensquare-network/dotreasury) 🟡, [Bright Treasury](https://github.com/bright/bright-tresury) ⚪, [OpenSquare offchain voting](https://github.com/opensquare-network/collaboration) 🟢, [OpenGov Insights](https://github.com/wpank/open-gov-insights) ⚪, [Treasury Tracker](https://github.com/stake-plus/treasury-tracker) ⚪, [OpenGov CLI](https://github.com/joepetrowski/opengov-cli) 🟢| UI for the Kusama and/or Polkadot treasury (see [bounty module](https://github.com/paritytech/substrate/pull/5715)), UI for Parachain Lease Offering (PLO)                                                                                               |\n| Staking                | [Staking Rewards Collector](https://github.com/w3f/staking-rewards-collector) 🟡, [Staking Rewards Viewer](https://github.com/jackson-harris-iii/staking-rewards-viewer) ⚪, [Polkadot Staking Site](https://github.com/cryptolab-network/polkadot-staking-site) ⚪, [Polkadot Staking Dashboard](https://github.com/paritytech/polkadot-staking-dashboard) 🟢, [Polkadot/Kusama Validator Selector](https://github.com/James-Sangalli/dot-validator-selector) ⚪, [Staking Income CSV Generator](https://github.com/James-Sangalli/dot-staking-income) ⚪|\n| Bridge UI              | [Parity Bridges UI](https://github.com/paritytech/parity-bridges-ui) ⚪, [Donut Interface (Steem - Dot)](https://github.com/nutbox-dao/donut-interface) ⚪, [Plutonication](https://github.com/RostislavLitovkin/PlutonicationServer) ⚪|                                                                                                                                                                                                                                                                                   |\n| Parachain/Crowdloan    | [PolkAuction](https://github.com/CrommVardek/polk-auction-ui) ⚪, [Crowdloan Front End Template](https://github.com/10clouds/crowdloan-template) ⚪, [Slothunter](https://github.com/hack-ink/slothunter/) ⚪|                                                                                                                                                                                                                                                                      |\n| Identicon              | [PolkadotWebIdenticon](https://github.com/RidOne-technologies/polkadot-web-identicon) ⚪, [Polkadot Angular IdentIcon](https://github.com/RidOne-technologies/polkadot-angular-identicon) ⚪, [Bird Identicon](https://github.com/Noc2/Bird-Identicon) ⚪|\n| Coretime               | [Lastic](https://github.com/LasticXYZ/LasticUI) ⚪, [RegionX](https://github.com/RegionX-Labs/RegionX-Node) ⚪|\n| Other                  | [Polkadot Cloud](https://polkadot.cloud) 🟢, [ĐÓTConsole](https://github.com/tien/dot-console) 🟢, [KappaSigmaMu Fratority](https://github.com/KappaSigmaMu/ksm-app) 🟢, [DAOSign](https://github.com/DAOsign/daosign-ink-js-sdk/tree/main) ⚪, [Quadratic Funding Webapp](https://github.com/OAK-Foundation/quadratic-funding-webapp) ⚪, [Polkawatch](https://gitlab.com/polkawatch/polkawatch), [Bytepay](https://github.com/bytepayment/bytepay) ⚪, [charging-management-platform](https://github.com/Delmonicos/charging-management-platform) ⚪, [subidentity-webapp](https://github.com/TDSoftware/subidentity-webapp) ⚪, [OpenSquare Paid QA](https://github.com/opensquare-network/paid-qa/) ⚪, [DotPulse](https://github.com/CrossChainLabs-DOT/dotpulse-api) ⚪, [Rubeus Keeper](https://github.com/bsn-si/rubeus-smartcontract) ⚪, [Polkaflow](https://github.com/justmert/eco-flow-frontend) ⚪, [ChainViz](https://github.com/helikon-labs/chainviz) ⚪, [Dotsight](https://github.com/fidi-tech/dotsight) ⚪| [zkLogin](https://docs.sui.io/build/zk_login), Portfolio Viewer like Zapper or Zerion                                                                                                                                                                                                                                            \n| Coretime               | [Lastic](https://github.com/LasticXYZ/LasticUI) ⚪, [RegionX](https://github.com/RegionX-Labs/RegionX-Node) ⚪|\n| Other                  | [Polkadot Cloud](https://polkadot.cloud) 🟢, [ĐÓTConsole](https://github.com/tien/dot-console) 🟢, [KappaSigmaMu Fratority](https://github.com/KappaSigmaMu/ksm-app) 🟢, [DAOSign](https://github.com/DAOsign/daosign-ink-js-sdk/tree/main) ⚪, [Quadratic Funding Webapp](https://github.com/OAK-Foundation/quadratic-funding-webapp) ⚪, [Polkawatch](https://gitlab.com/polkawatch/polkawatch), [Bytepay](https://github.com/bytepayment/bytepay) ⚪, [charging-management-platform](https://github.com/Delmonicos/charging-management-platform) ⚪, [subidentity-webapp](https://github.com/TDSoftware/subidentity-webapp) ⚪, [OpenSquare Paid QA](https://github.com/opensquare-network/paid-qa/) ⚪, [DotPulse](https://github.com/CrossChainLabs-DOT/dotpulse-api) ⚪, [Rubeus Keeper](https://github.com/bsn-si/rubeus-smartcontract) ⚪, [Polkaflow](https://github.com/justmert/eco-flow-frontend) ⚪, [ChainViz](https://github.com/helikon-labs/chainviz) ⚪, [Dotsight](https://github.com/fidi-tech/dotsight) ⚪| [zkLogin](https://docs.sui.io/build/zk_login), Portfolio Viewer like Zapper or Zerion"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#tools-apis-and-languages", "page_title": "Open Source Stack", "index": 4, "depth": 3, "title": "Tools, APIs, and Languages", "anchor": "tools-apis-and-languages", "start_char": 18260, "end_char": 33627, "estimated_token_count": 5093, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Tools, APIs, and Languages\n\n| Components                      | Existing projects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | Potentially interesting projects                                                                                 |\n| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| Runtime/Parachain frameworks                       | [Polkadot Blockchain SDK](https://github.com/paritytech/polkadot-sdk) 🟢, [Gosemble](https://github.com/LimeChain/gosemble) ⚪, [Subsembly](https://github.com/LimeChain/subsembly) ⚪, [Parachain utilities](https://github.com/AcalaNetwork/parachain-utilities) ⚪, [Gantree](https://github.com/gantree-io/gantree-core) ⚪, [Cryptex](https://github.com/ideal-lab5) 🟢, [Lollipop](https://github.com/LollipopHQ/sbpf-on-polkavm) ⚪| Tools to create parachains with other frameworks, like the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk) or [Polygon CDK](https://github.com/0xPolygon/cdk-validium-node)  |\n| Client Libraries | [Polkadot-API - TypeScript](https://github.com/polkadot-api/polkadot-api) 🟢, [Reactive DOT - TypeScript](https://github.com/tien/reactive-dot) 🟢, [Capi - TypeScript](https://github.com/paritytech/capi) ⚪, [sub-api](https://github.com/kodadot/packages/tree/main/sub-api) ⚪, [Go](https://github.com/centrifuge/go-substrate-rpc-client) ⚪, [.Net](https://github.com/usetech-llc/polkadot_api_dotnet) ⚪, [.NET Standard 2.0](https://github.com/SubstrateGaming/Substrate.NET.API) ⚪, [Substrate .NET Toolchain](https://github.com/SubstrateGaming/Substrate.NET.Toolchain) ⚪, [C++](https://github.com/usetech-llc/polkadot_api_cpp) ⚪, [C](https://github.com/finoabanking/substrate-c-tool) ⚪, [Haskell](https://github.com/airalab/hs-web3) 🟡, [JavaScript](https://github.com/polkadot-js/api) 🟢, [Substrate API Sidecar - TypeScript](https://github.com/paritytech/substrate-api-sidecar) 🟢, [Python](https://github.com/polkascan/py-substrate-interface) 🟡, [Java (+ Android)](https://github.com/emeraldpay/polkaj) ⚪, [Substrate Client Java](https://github.com/strategyobject/substrate-client-java) ⚪, [Rust SCS](https://github.com/scs/substrate-api-client) 🟡, [Rust Parity (subxt)](https://github.com/paritytech/subxt) 🟢, [subxtpy](https://github.com/philoniare/subxtpy) ⚪, [Rust pdotc](https://github.com/trevor-crypto) [PHP (gmajor-encrypt)](https://github.com/gmajor-encrypt/php-substrate-api) ⚪, [PHP (neha0921)](https://github.com/neha0921/substrate-interface-package) ⚪, [RPC-Ethereum](https://github.com/paritytech/frontier) 🟢, [Swift](https://github.com/tesseract-one/Substrate.swift) ⚪, [Kotlin](https://github.com/NodleCode/substrate-client-kotlin) ⚪, [substrate-client-kotlin](https://github.com/sublabdev/substrate-client-kotlin) ⚪, [substrate-client-swift](https://github.com/sublabdev/substrate-client-swift) ⚪, [Dart](https://github.com/rankanizer/polkadart) 🟢, [Substrate Core Polywrapper](https://github.com/polywrap/integrations) ⚪, [Substrate SDK iOS](https://github.com/novasamatech/substrate-sdk-ios) 🟢, [Substrate SDK Android](https://github.com/novasamatech/substrate-sdk-android) 🟡, [Dedot - TypeScript](https://github.com/dedotdev/dedot) 🟢, [Polkadart](https://github.com/leonardocustodio/polkadart) 🟢|                                                                                                                  |\n| RPC Gateway      | [Subway](https://github.com/AcalaNetwork/subway) 🟡|               |\n| Substrate Contract clients      | [PatractGo](https://github.com/patractlabs/go-patract) ⚪|                                                                                                                  |\n| Easy Runtime Development        | [Subalfred](https://github.com/hack-ink/subalfred) ⚪, [substrate-stencil](https://github.com/kaichaosun/substrate-stencil) ⚪, [Play Substrate](https://github.com/kaichaosun/play-substrate) ⚪, [Substrate Playground](https://github.com/paritytech/substrate-playground) ⚪, [AssemblyScript Runtime Generation](https://github.com/LimeChain/as-substrate-runtime) ⚪, [Substrate Package Manager](https://github.com/clearloop/sup) ⚪, [Subsembly: Framework for developing AssemblyScript Substrate Runtimes](https://github.com/LimeChain/subsembly) ⚪, [dependency diener](https://github.com/bkchr/diener) ⚪|                                                                                                                  |\n| IDE Plugins                  | [Substrate Marketplace VS Code Plugin](https://github.com/paritytech/vscode-substrate) ⚪, [VS Code Plugin](https://github.com/everstake/vscode-plugin-substrate) ⚪, [Atom Code Plugin](https://github.com/everstake/atom-plugin-substrate) ⚪, [Zombienet extension](https://github.com/paritytech/zombienet-vscode-extension) ⚪|                                       | Substrate Analyzer |\n| Runtime/Pallet Security                | [Substrate Runtime Fuzzer](https://github.com/srlabs/substrate-runtime-fuzzer) 🟢, [Substrate Toml Lint](https://github.com/shawntabrizi/substrate-toml-lint) ⚪, [K specifications](https://github.com/kframework/wasm-semantics) 🟢, [PolPatrol - Polkadot Runtime Checker](https://github.com/ChainSecurity/polpatrol) ⚪, [pallet-verifier](https://github.com/davidsemakula/pallet-verifier) 🟡| Automated Runtime checking tools, economic audit simulator such as [gauntlet.network](https://gauntlet.network/) | \n| Smart Contract Languages        | [ink!](#ink-smart-contracts) 🟢, [Ask!](https://github.com/ask-lang/ask) ⚪, [Subscript](https://github.com/slickup/subscript) ⚪, [Solang](https://github.com/hyperledger-labs/solang) 🟢, [pallet-move](https://github.com/eigerco/pallet-move) ⚪, [Move VM Substrate](https://github.com/pontem-network/sp-move) ⚪, [Move smart contract by Neatcoin](https://github.com/neatcoin/neatcoin) ⚪, [eBPF Contracts Hackathon](https://github.com/pepyakin/substrate-seal-ebpf) ⚪, [PolkaVM](https://github.com/koute/polkavm) 🟢| Functional Programming Languages, other languages with developed toolchains                                      |\n| Testing                         | [Polkadot introspector](https://github.com/paritytech/polkadot-introspector) 🟢, [Subshell](https://github.com/subdirectory/subshell) ⚪, [substrate-simnode](https://github.com/polytope-labs/sc-simnode) 🟡, [Halva](https://github.com/halva-suite/halva) ⚪, [Redspot](https://github.com/patractlabs/redspot) ⚪, [MixBytes Tank](https://github.com/mixbytes/tank) ⚪, [sub-flood](https://github.com/NikVolf/sub-flood) ⚪, [Substrate debug-kit](https://github.com/paritytech/substrate-debug-kit) ⚪, [Asset CLI tool](https://github.com/JesseAbram/asset_cli_tool) ⚪, [sub_crash](https://github.com/JesseAbram/unfinished_testing_tool) ⚪, [subwasm](https://github.com/chevdor/subwasm) ⚪, [subsee](https://github.com/ascjones/subsee) ⚪, [polkadot-lab](https://github.com/w3f/polkadot-lab) ⚪,  [RPC-perf](https://github.com/dwellir-public/rpc-perf/) ⚪|\n| Static Analysis                         | [Substrace](https://github.com/KaiserKarel/substrace) ⚪, [Static analyzer for Substrate FRAME's pallets](https://github.com/simon-perriard/saft) ⚪, [CoinFabrik Scout](https://github.com/CoinFabrik/scout-audit) 🟡, [pallet-verifier](https://github.com/davidsemakula/pallet-verifier) 🟡|\n| Formal Verification             | [pallet-verifier](https://github.com/davidsemakula/pallet-verifier) 🟡, [K specifications](https://github.com/kframework/wasm-semantics) 🟢|\n| Testnet                         | [Zombienet](https://github.com/paritytech/zombienet) 🟢, [Chopsticks](https://github.com/AcalaNetwork/chopsticks) 🟢, [Polkadot Launch](https://github.com/paritytech/polkadot-launch) ⚪, [polkadot-starship](https://github.com/koute/polkadot-starship) ⚪, [Fork off Substrate](https://github.com/maxsam4/fork-off-substrate) ⚪, [try-runtime-cli](https://github.com/paritytech/try-runtime-cli) 🟡, [Parachain Launch](https://github.com/open-web3-stack/parachain-launch) ⚪, [Larch Zombienet GUI](https://github.com/Zeeve-App/larch) ⚪|\n| Benchmarking                    | [Benchmarking CLI](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/utils/frame/benchmarking-cli) 🟢, [Polkadot sTPS](https://github.com/paritytech/polkadot-stps) ⚪, [Clockchain](https://github.com/0xekez/clockchain) ⚪, [Substrate Graph Benchmarks](https://github.com/shawntabrizi/substrate-graph-benchmarks) ⚪, [ink! & pallet benchmarking template](https://github.com/Nikhil-Desai-Talentica/substrate-node-template-benchmarking) ⚪, [smart-bench](https://github.com/paritytech/smart-bench) ⚪|\n| Blockchain Indexing Engine      | [Squid SDK](https://github.com/subsquid/squid-sdk) 🟢, [Hybrid Indexer](https://github.com/hybrid-explorer/hybrid-indexer) 🟡, [Substrate Archive](https://github.com/paritytech/substrate-archive) ⚪, [PSQL Indexer](https://github.com/usetech-llc/polkadot_psql_indexer) ⚪, [Substrate Graph](https://github.com/playzero/substrate-graph) ⚪, [Subquery](https://github.com/OnFinality-io/subql) 🟢, [MBELT3](https://github.com/p2p-org/polkadot-profit-transformer) 🟡, [stick](https://github.com/kodadot/stick) ⚪, [Hyperdot](https://github.com/Infra3-Network/hyperdot) ⚪, [Identics](https://github.com/vikiival/identics) ⚪|\n| Blockchain/Event Monitoring     | [Web3 Guardian](https://github.com/open-web3-stack/guardian) ⚪, [Aurras Event Manager](https://github.com/HugoByte/aurras-event-manager) ⚪, [@commonwealth/chain-events](https://github.com/hicommonwealth/chain-events) ⚪, [Massbit](https://github.com/w3f-grants-archive/massbitchain) ⚪, [Polkadot Basic Notifications](https://github.com/kianenigma/polkadot-basic-notification) ⚪, [Ocelloids](https://github.com/sodazone/ocelloids) ⚪, [Tracking Chain](https://github.com/TrackingChains/TrackingChain) ⚪,|\n| Gaming                          | [Polkadot SDK for Unity](https://github.com/PolkadotPlay/Polkadot.Unity.SDK) ⚪, [Crossbow](https://github.com/dodorare/crossbow) ⚪| [Unity Asset Store](https://assetstore.unity.com/packages/decentralization/infrastructure/polkadot-sdk-for-unity-273535)                                           |\n| No-code Platforms               | [EzCode's Polkadot-JS plugin on Bubble.io](https://github.com/NovaBloq/Bubble-Plugin-Polkadot.js) ⚪, [Blackprint Visual Programming Polkadot-JS module](https://github.com/Blackprint/nodes-polkadot.js) ⚪, [SubRelay](https://github.com/subrelay/interface) ⚪|                                                                                                                  |\n| Wallets                         | [LunoKit](https://github.com/Luno-lab/LunoKit) 🟢, [DOT Connect](https://github.com/tien/dot-connect) 🟡, [Talisman Connect](https://github.com/TalismanSociety/talisman-connect) ⚪, [SubWallet-SubConnect](https://github.com/Koniverse/SubConnect) ⚪, [Metadata Portal](https://github.com/nova-wallet/metadata-portal) 🟢, [Tesseract](https://github.com/tesseract-one/Tesseract.rs) ⚪, [WalletConnect](https://github.com/w3f-grants-archive/walletconnect-v2-monorepo) ⚪, [BitGoJS](https://github.com/BitGo/BitGoJS/tree/master) 🟢|                                                                                                                  |\n| XCM                             | [Trappist](https://github.com/paritytech/trappist) ⚪, [XCM-tools](https://github.com/Moonsong-Labs/xcm-tools) ⚪, [XCM-tools Golang](https://github.com/itering/substrate-api-rpc) ⚪,[ParaSpell XCM Tools](https://github.com/paraspell/xcm-tools) 🟢, [XBI](https://github.com/t3rn/xbi) ⚪, [XCM TS/JS SDK](https://github.com/blockcoders/xcm-sdk) ⚪, [XCMSend](https://github.com/XcmSend/app) ⚪, [XCM Monitoring Server](https://github.com/sodazone/xcm-monitoring/) 🟢, [Moonbeam Foundation XCM-SDK](https://github.com/moonbeam-foundation/xcm-sdk) 🟢|                                                                                                                  |\n| Other                           | [txwrapper-core](https://github.com/paritytech/txwrapper-core) ⚪, [open-web3 JS library](https://github.com/open-web3-stack/open-web3.js) ⚪, [VM-Bridge](https://github.com/CycanTech/GVM-Bridge) ⚪, [srtool](https://github.com/paritytech/srtool) 🟢, [srtool-cli](https://github.com/chevdor/srtool-cli) ⚪, [Substrate Tip Bot](https://github.com/paritytech/substrate-tip-bot) 🟢, [ORI (Onchain Risk Intelligence)](https://github.com/syntifi/ori) ⚪, [PolkaTools](https://github.com/albertov19/PolkaTools) 🟢, [polkadot-scripts](https://github.com/paritytech/polkadot-scripts) ⚪, [Sube](https://github.com/virto-network/sube) 🟢, [data-store-sidecar](https://github.com/CESSProject/data-store-sidecar) ⚪, [SugarFunge](https://github.com/SugarFunge/sugarfunge-node) ⚪, [substrate-wasmedge](https://github.com/second-state/substrate-wasmedge) ⚪, [EightFish](https://github.com/eightfish-org/eightfish) ⚪, [Sandox](https://github.com/sandoxio/sandox) ⚪, [APK verifier](https://github.com/darwinia-network/apk-verifier/) ⚪, [ElizaOS Plugin](https://github.com/Esscrypt/plugin-polkadot) ⚪|"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#ink-smart-contracts", "page_title": "Open Source Stack", "index": 5, "depth": 3, "title": "ink! Smart Contracts", "anchor": "ink-smart-contracts", "start_char": 33627, "end_char": 39322, "estimated_token_count": 1865, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### ink! Smart Contracts\n\n| Components      | Existing projects                                                                                                                                                                                                                                                                                                                                                                                                                          | Potentially interesting projects   |\n| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------- |\n| Core Libraries         | [ink!](https://github.com/paritytech/ink) 🟡, [cargo-contract](https://github.com/paritytech/cargo-contract) 🟡, [pallet-contracts](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/contracts) 🟢|                                    |\n| Local Nodes         | [substrate-contracts-node](https://github.com/paritytech/substrate-contracts-node) ⚪, [Swanky](https://github.com/swankyhub/swanky-cli) ⚪|                                    |\n| Smart Contract Development | [DRink!](https://github.com/Cardinal-Cryptography/drink) ⚪, [contracts-ui](https://github.com/paritytech/contracts-ui) ⚪, [SmartBeaver](https://github.com/Smart-Beaver), [OpenBrush](https://github.com/Brushfam/openbrush-contracts) ⚪, [Sol2Ink](https://github.com/727-Ventures/sol2ink) ⚪, [Polkadot Contract Wizard](https://github.com/protofire/polkadot-contract-wizard) ⚪, [ink-wrapper](https://github.com/Cardinal-Cryptography/ink-wrapper) ⚪, [ink-playground](https://github.com/paritytech/ink-playground) ⚪, [ink! Remix Plugin](https://github.com/blockchain-it-hr/ink-remix-plugin) ⚪, [Signac](https://github.com/standardweb3/signac/) ⚪, [ink!-boxes](https://github.com/avirajkhare00/ink-boxes/) ⚪, [ink!-smart-contract-wizard](https://github.com/avirajkhare00/ink-wizard) ⚪|\n| Security & Testing         | [ink! Waterfall](https://github.com/paritytech/ink-waterfall) ⚪, [Verifier Image for ink!](https://github.com/web3labs/ink-verifier-image) ⚪, [Patron](https://github.com/Brushfam/patron-backend/) ⚪, [Inkscope Fuzzer](https://github.com/inkscopexyz/inkscope-fuzzer) ⚪|                                    |\n| Frontend Development         | [ink!athon Boilerplate](https://github.com/scio-labs/inkathon) ⚪, [useink](https://github.com/paritytech/useink) ⚪, [useInkathon](https://github.com/scio-labs/use-inkathon) ⚪, [ink-typegen](https://github.com/subsquid/squid-sdk/tree/master/substrate/ink-typegen) 🟢, [Typechain Polkadot](https://github.com/Brushfam/typechain-polkadot) ⚪, [Typink!](https://github.com/dedotdev/typink) ⚪|                                    |\n| IDE Plugins         | [ink! Analyzer](https://github.com/ink-analyzer/ink-analyzer) ⚪|                                    |\n| Bridges         | [Dante Protocol](https://github.com/dantenetwork/protocol-stack-for-ink) ⚪|                                    |\n| DeFi            | [Pendulum-Ink-Wrapper](https://github.com/pendulum-chain/pendulum-ink-wrapper) ⚪, [Panorama Swap](https://github.com/RottenKiwi/Panorama-Swap-INK-SC) ⚪, [ink_bank](https://github.com/Juminstock/ink_bank) ⚪, [Polkadot AMM](https://github.com/realnimish/polkadot-amm) ⚪, [Vera](https://github.com/veradefi/defi) ⚪, [Everlasting Cash](https://github.com/CycanTech/ELC) ⚪, [Coinversation](https://github.com/Coinversation/coinpro) ⚪, [zenlink-dex-contract](https://github.com/zenlinkpro/zenlink-dex-contract) ⚪, [AlgoCash](https://github.com/ReserveLabs/AlgoCash) ⚪| New seigniorage-style stable coins |\n| Gaming          | [Open Emoji Battler](https://github.com/OpenEmojiBattler/open-emoji-battler) ⚪, [NewOmega](https://github.com/WiktorStarczewski/newomega.polkadot/blob/master/newomega_delegator/newomega/newomega.rs) ⚪|                                    |\n| DAO             | [subDAO](https://github.com/w3f-grants-archive/subDAO-contracts) ⚪, [RainbowDAO](https://github.com/RainbowcityFoundation/RainbowDAO-Protocol-Ink-milestone_1) ⚪, [MangoBox](https://github.com/Mangoboxlabs/Mangoboxink) ⚪, [MangoSale](https://github.com/Mangoboxlabs/MangoSaleV2) ⚪|                                    |\n| Identity/DID | [Dotflow](https://github.com/TheDotflow) 🟢| |\n| Oracles | [DIA Wasm Oracle](https://github.com/diadata-org/dia-wasm-oracle) ⚪| |\n| Spam Protection | [Prosopo](https://github.com/prosopo/captcha) 🟢|                                    |\n| Governance         | [Abax Governance](https://github.com/AbaxFinance/Governance) ⚪|                                    |\n| NFT         | [ArtZero](https://github.com/ArtZero-io/Contracts) ⚪|                                    |\n| Other           | [Polkadot Smart Account](https://github.com/pnsproject/ink-aa) ⚪, [magink](https://github.com/swankyhub/magink-dapp) ⚪, [ink-test-contracts](https://github.com/AstarNetwork/ink-test-contracts) ⚪, [Candle Auctions](https://github.com/agryaznov/candle-auction-ink) ⚪, [polkasign-contract](https://github.com/SubDAO-Network/polkasign-contract) ⚪, [OCEX](https://github.com/bsn-si/ocex-cli) ⚪, [Roloi](https://github.com/RoloiMoney/roloi-polkadot-w3f-grant) ⚪, [OpenPayroll](https://github.com/polkadrys/openPayroll) ⚪, [BlockchainFoodOrder](https://github.com/InkSmartContract/BlockchainFoodOrder) ⚪|                                    |"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#chains-and-pallets", "page_title": "Open Source Stack", "index": 6, "depth": 3, "title": "Chains and Pallets", "anchor": "chains-and-pallets", "start_char": 39322, "end_char": 62118, "estimated_token_count": 7494, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Chains and Pallets\n\n| Components                      | Existing projects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Potentially interesting projects                                                                                                                                                       |\n| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Scalable Transactions           | [Perun channels](https://github.com/perun-network/perun-polkadot-pallet) ⚪, [CLI demo of Perun](https://github.com/perun-network/perun-polkadot-demo) ⚪, [Astar](https://github.com/AstarNetwork/Astar) 🟢, [Celer](https://github.com/celer-network/cChannel-substrate) ⚪, [Gunclear](https://github.com/GunClear/Gunero) ⚪, [TPScore](https://github.com/BCS-Labs/tpscore-etl-system) :grey_question:, [proof-of-contract-stake](https://github.com/auguth/pocs) ⚪| roll-ups, DAG-based consensus mechanisms, side chains                                                                                                                                  |\n| Bridges and Interoperability                        | [interBTC](https://github.com/interlay/interbtc) ⚪, [DKG Substrate](https://github.com/webb-tools/dkg-substrate) ⚪, [Sygma](https://github.com/sygmaprotocol/sygma-substrate-pallets) ⚪, [EOS by Bifrost](https://github.com/bifrost-finance/bifrost-eos-relay) ⚪, [POA - Substrate](https://github.com/paritytech/parity-bridge) ⚪, [Substrate - Ethereum DAI Bridge](https://github.com/akropolisio/POC-polkadai-bridge) ⚪, [Substrate - Substrate Bridge](https://github.com/paritytech/substrate-bridge-relay) ⚪, [BTC by ChainX](https://github.com/chainx-org/ChainX) ⚪, [Cosmos-Substrate bridge](https://github.com/ChorusOne/wormhole-bridge) ⚪, [Substrate IBC Pallet](https://github.com/octopus-network/substrate-ibc) ⚪, [Polkadot Ethereum Bridge](https://github.com/Snowfork/polkadot-ethereum) 🟢, [Darwinia](https://github.com/darwinia-network/darwinia) ⚪, [Spacewalk: a Stellar bridge](https://github.com/pendulum-chain/spacewalk) 🟢, [Filecoindot](https://github.com/ChainSafe/filecoindot) ⚪, [Axelar-Substrate](https://github.com/centrifuge/axelar-cgp-substrate/tree/main) ⚪, [Hyperbridge](https://github.com/polytope-labs/hyperbridge) 🟢, [t3rn](https://github.com/t3rn/t3rn) ⚪| ZCash                                                                                                                                                                                  |\n| Privacy                         | [ZeroChain](https://github.com/LayerXcom/zero-chain) ⚪, [xx network](https://github.com/xx-labs/xxchain) ⚪, [pLibra (Phala Network)](https://github.com/Phala-Network/phala-blockchain) ⚪, [Automata Network](https://github.com/automata-network/automata) ⚪, [Zero Network](https://github.com/zero-network/zero) ⚪, [Silent Data](https://github.com/appliedblockchain/silentdata-polkadot) ⚪| [Multi-Asset Shielded Pool (MASP)](https://github.com/anoma/masp) , [Zkay](https://arxiv.org/pdf/2009.01020.pdf), [Zexe](https://eprint.iacr.org/2018/962.pdf) |\n| ZKP                             | [ZeroPool](https://github.com/zeropoolnetwork/zeropool-substrate-groth16-example) ⚪, [Megaclite](https://github.com/patractlabs/megaclite) ⚪, [zkMega](https://github.com/patractlabs/zkmega) ⚪, [PLONK for Substrate](https://github.com/AstarNetwork/plonk) ⚪, [Webb Anchor Protocol](https://github.com/webb-tools/protocol-substrate) ⚪, [zk-SNARKs tutorial](https://github.com/bright/zk-snarks-with-substrate/) ⚪, [substrate-zk](https://github.com/Zkvers/substrate-zk) ⚪, [hyperfridge-r0](https://github.com/w3f-grants-archive/hyperfridge-r0) ⚪, [Cyborg Network](https://github.com/Cyborg-Network/cyborg-parachain/tree/master) ⚪, [Manta](https://github.com/Manta-Network/Manta) ⚪|\n| TEE                             | [Acurast](https://github.com/Acurast/acurast-core) ⚪, [Integritee](https://github.com/integritee-network/worker) ⚪, [substraTEE](https://github.com/scs/substraTEE) ⚪, [WeTEE](https://github.com/wetee-dao/chain) 🟢| [Keysafe Protocol](https://github.com/keysafe-protocol/keysafe-app) ⚪|\n| DeFi                            | [PrivaDEX](https://github.com/kapilsinha/privadex) ⚪, [Fusotao](https://github.com/uinb/fusotao) ⚪, [Reef](https://github.com/reef-defi/reef-chain) ⚪, [Diora](https://github.com/Diora-Network/Diora) ⚪, [Pendulum Chain](https://github.com/pendulum-chain/pendulum) 🟢, [Compound Gateway](https://github.com/compound-finance/gateway) ⚪, [Parallel Finance](https://github.com/parallel-finance/parallel) ⚪, [PINT](https://github.com/ChainSafe/PINT) ⚪, [Laminar Chain](https://github.com/laminar-protocol/laminar-chain) ⚪, [Acala](https://github.com/AcalaNetwork/Acala) 🟡, [Centrifuge](https://github.com/centrifuge/centrifuge-chain) ⚪, [Stafi](https://github.com/stafiprotocol/stafi-node) 🟢, [Definex](https://github.com/y2labs-0sh/definex) ⚪, [OAX Foundation](https://github.com/OAXFoundation/parrot) ⚪, [Cybex](https://github.com/alexxuyang/substrate-dex) ⚪, [Zenlink](https://github.com/zenlinkpro/pallet-zenlink) ⚪, [Swaps Pallet](https://github.com/lsaether/pallet-swaps) ⚪, [Polkadex](https://github.com/Polkadex-Substrate/Polkadex/tree/master) ⚪, [SubDEX](https://github.com/subdarkdex/subdex-parachain) ⚪, [Hydration](https://github.com/galacticcouncil/hydration-node) 🟢, [Substrate Stablecoin](https://github.com/apopiak/stablecoin) ⚪, [Standard protocol](https://github.com/digitalnativeinc/standard-substrate) ⚪, [Polkaswap](https://github.com/sora-xor/sora2-network) 🟢, [Curve AMM](https://github.com/equilibrium-eosdt/equilibrium-curve-amm) ⚪, [Konomi Network](https://github.com/konomi-network/cumulus/) ⚪, [Stable Asset](https://github.com/nutsfinance/stable-asset) ⚪, [Libra Payment](https://github.com/atscaletech/libra) ⚪, [Mangata](https://github.com/mangata-finance/mangata-node) ⚪, [Tidechain](https://github.com/tidelabs/tidechain) ⚪, [Basilisk](https://github.com/galacticcouncil/Basilisk-node) 🟡, [Polymesh](https://github.com/PolymeshAssociation/Polymesh) 🟢, [Bifrost](https://github.com/bifrost-io/bifrost) 🟢, [Clover](https://github.com/clover-network/clover) ⚪, [Composable Finance ](https://github.com/ComposableFi/composable) ⚪, [OmniBTC](https://github.com/OmniBTC/PSC) ⚪, [Polimec](https://github.com/Polimec/polimec-node) ⚪, [Swush](https://github.com/swush-labs/swush-app) 🟡| DEX with privacy and confidentiality features such as those found in a [dark pool](https://en.wikipedia.org/wiki/Dark_pool)                                           |\n| Smart contract chains           | [moonbeam](https://github.com/PureStake/moonbeam) 🟢, [Magnet](https://github.com/Magport/Magnet) ⚪, [Aleph-node](https://github.com/Cardinal-Cryptography/aleph-node) ⚪, [Edgeware](https://github.com/hicommonwealth/edgeware-node) ⚪, [ParaState](https://github.com/ParaState/substrate-ssvm-node) ⚪, [gear](https://github.com/gear-tech/gear) 🟢, [CENNZnet](https://github.com/cennznet/cennznet) ⚪, [SkyeKiwi](https://github.com/skyekiwi/skyekiwi-network) ⚪, [OAK-blockchain](https://github.com/OAK-Foundation/OAK-blockchain) ⚪, [ICE Blockchain](https://github.com/web3labs/ice-substrate) ⚪, [Polkadot Smart Chain](https://github.com/OmniBTC/PSC) ⚪, [Madara - Cairo/Starknet](https://github.com/keep-starknet-strange/madara) ⚪| smart contract chains with novel security approaches, smart contract chains based on existing toolchains                                                                               |\n| Oracle                          | [Tellor](https://github.com/tellor-io/tellor-pallet) ⚪, [Laminar](https://github.com/laminar-protocol/open-runtime-module-library/tree/master/oracle) 🟢, [Chainlink-polkadot](https://github.com/smartcontractkit/chainlink-polkadot) ⚪, [Ares Protocol](https://github.com/aresprotocols/ares) ⚪, [Kylin Network](https://github.com/Kylin-Network/kylin-node) ⚪, [interbtc-clients oracle](https://github.com/interlay/interbtc-clients/tree/master/oracle) ⚪, [Anonima](https://github.com/webb-tools/anonima) ⚪, [SaaS3](https://github.com/SaaS3-Foundation/dRuntime-fat) ⚪, [Tellor](https://github.com/tellor-io/tellor-parachain-contracts) ⚪, [Bridgestate Oracle](https://github.com/diadata-org/bridgestate-ocw) ⚪\n| Identity/DID                    | [Parami](https://github.com/parami-foundation/parami-blockchain) ⚪, [Litentry](https://github.com/litentry/litentry-parachain) 🟢, [pallet-did](https://github.com/substrate-developer-hub/pallet-did) ⚪, [dot-id](https://github.com/prasad-kumkar/dot-id) ⚪|\n| IoT                             | [Nodle](https://github.com/NodleCode/chain) ⚪, [MXC/DataHighway](https://github.com/DataHighway-DHX/node) ⚪, [peaq-network-node](https://github.com/peaqnetwork/peaq-network-node) ⚪|\n| Verifiable Claims               | [KILT](https://github.com/KILTprotocol/kilt-node) ⚪, [Dock](https://github.com/docknetwork/dock-substrate) ⚪|\n| Supply chain                    | [DSCP Node](https://github.com/digicatapult/dscp-node) ⚪|                                                                                                                                                                                        |\n| Health care                     |  |                                                                                                                                                                                        |\n| Music Industry                       | [Allfeat Network](https://github.com/Allfeat/Allfeat) 🟢|\n| Data Availability    | [Avail](https://github.com/availproject/avail) 🟡, [Melodot](https://github.com/ZeroDAO/melodot) ⚪|                                                                                                                                                                                        |\n| Social Networking               | [Frequency](https://github.com/frequency-chain/frequency) 🟢, [Social Network](https://github.com/social-network/blockchain) ⚪, [SubSocial](https://github.com/dappforce/subsocial-parachain) ⚪, [ZeroDAO](https://github.com/ZeroDAO/ZeroDAO-node) ⚪, [Myriad Node](https://github.com/myriadsocial/myriad-node) ⚪, [Wika Network](https://github.com/randombishop/wika_etl) ⚪, [Listen](https://github.com/listenofficial/listen-parachain) ⚪, [Tribal Protocol](https://github.com/tribal-protocol/tribal_contract) ⚪, [Five Degrees on Substrate](https://github.com/rust-0x0/hex-space-protocol-substrate) ⚪, [Acuity Social](https://github.com/acuity-social/acuity-substrate) ⚪| Private instant messenger that uses on-chain identity                                                                                                                                  |\n| Governance/DAO                  | [Aisland Node](https://github.com/aisland-dao/aisland-node/tree/main) ⚪, [Hashed Network](https://github.com/hashed-io/hashed-substrate) ⚪, [Sunshine DAO](https://github.com/sunshine-protocol/sunshine-bounty) :grey_question:, [Governance OS](https://github.com/NucleiStudio/governance-os) ⚪, [Idavoll Network](https://github.com/idavollnetwork/idavoll) ⚪, [Substrate Moloch](https://github.com/DoraFactory/Substrate-Moloch-V2) ⚪, [QRUCIAL-DAO](https://github.com/Qrucial/QRUCIAL-DAO) ⚪, [Societal](https://github.com/sctllabs/societal-node) ⚪, [DAOs](https://github.com/daos-org/daos) ⚪, [Shivarthu](https://github.com/amiyatulu/shivarthu/) ⚪, [Faterium](https://github.com/faterium) 🟢, [Supersig](https://github.com/decentration/apps) ⚪, [GenesisDAO](https://github.com/deep-ink-ventures/genesis-dao-node) ⚪, [Liberland](https://github.com/liberland/liberland_substrate) ⚪| [Consul](https://github.com/consul/consul) - Open Government and E-Participation Web Software                                                                  |\n| Prediction Markets and Futarchy | [Zeitgeist](https://github.com/zeitgeistpm/zeitgeist) ⚪, [X Predict Market](https://github.com/XPredictMarket/NodePredict) ⚪|\n| Messaging                       | [HOPR](https://github.com/validitylabs/HOPR-PL-Substrate) ⚪, [Nolik](https://github.com/chainify/nolik) ⚪, [Uke](https://github.com/Uke-Messaging/uke-pallet) ⚪, [Diffy Chat](https://github.com/Belsoft-rs/diffychat-pallet) ⚪, [Fennel Protocol](https://github.com/fennelLabs/Fennel-Protocol) ⚪|\n| File Storage, Cloud             | [Subsocial-Offchain](https://github.com/dappforce/subsocial-offchain) ⚪, [DatDot](https://github.com/playproject-io/datdot) ⚪, [Crust Network](https://github.com/crustio/crust) ⚪, [offchain::ipfs](https://github.com/rs-ipfs/offchain-ipfs-manual) ⚪, [Canyon Network](https://github.com/canyon-network/canyon) ⚪, [CESS](https://github.com/Cumulus2021/cess) ⚪, [Iris](https://github.com/ideal-lab5/iris) ⚪, [fmd-cess](https://github.com/CESSProject/fmd-cess) ⚪, [IPFS Frame V3](https://github.com/DanHenton/pocket-substrate/tree/ipfs-ocw) ⚪, [Threefold Chain](https://github.com/threefoldtech/tfchain) 🟡, [Apron](https://github.com/Apron-Network/apron-node) ⚪, [IPFS Utilities](https://github.com/TDSoftware/substrate-ipfs) ⚪, [DINFRA](https://gitlab.com/dinfra/dinfra) 🟢, [CESS](https://github.com/CESSProject/cess) ⚪|\n| Name Service                    | [Substrate Names](https://github.com/xaya/substrate-names) ⚪, [ENS on Substrate](https://github.com/hskang9/substrate-name-service) ⚪, [PNS-Pallets](https://github.com/pnsproject/pns-pallets) ⚪, [Faceless](https://github.com/HeisenbergLin22/Faceless_milestone2_delivery) ⚪, [Anchor](https://github.com/ff13dfly/Anchor) ⚪|\n| Gaming                          | [Bit.country](https://github.com/bit-country/Bit-Country-Blockchain) ⚪, [SubGame](https://github.com/SubGame-Network/subgame-network) ⚪, [subzero](https://github.com/playzero/subzero) ⚪, [Web3Games](https://github.com/web3gamesofficial/web3games-blockchain) ⚪, [Ajuna Pallets](https://github.com/ajuna-network/ajuna-pallets) ⚪, [Gafi Network](https://github.com/cryptoviet/gafi) ⚪, [Asylum](https://gitlab.com/asylum-space/asylum-item-nft) 🟢, [3DPass](https://github.com/3Dpass/3DP) ⚪, [Polket](https://github.com/polketio/toearnfun_flutter_app) ⚪|\n| Computation/AI                  | [Deitos Network](https://github.com/Deitos-Network/deitos-ip) ⚪, [DeepBrain Chain](https://github.com/DeepBrainChain/DeepBrainChain-MainChain) ⚪, [AI Infrastructure on Blockchain](https://github.com/anudit/cerebrum) ⚪, [NeuroWeb](https://github.com/OriginTrail/neuroweb) ⚪, [Infimum](https://github.com/w3f/Grant-Milestone-Delivery/blob/master/evaluations/infimum_2_keeganquigley.md) 🟢|\n| Enable specific use-cases       | [pallet-hookpoints](https://github.com/deep-ink-ventures/pallet_hookpoints) ⚪, [Robonomics](https://github.com/airalab/substrate-node-robonomics) 🟢, [UniversalDOT](https://github.com/UniversalDot/pallets) ⚪, [Evercity Sustainable Finance Protocol](https://github.com/EvercityEcosystem/evercity-chain) ⚪, [logion](https://github.com/logion-network/logion-node) ⚪, [Me Protocol](https://github.com/Me-Protocol/rusty-protocol-v0.1/) ⚪, [QSTN](https://github.com/QSTN-US/Polkadot-QSTN-v1/) ⚪, [Subcoin](https://github.com/subcoin-project/subcoin) ⚪, [Aventus](https://github.com/AventusProtocolFoundation/avn-parachain) 🟢|\n| NFT                             | [ternoa](https://github.com/capsule-corp-ternoa/chain) ⚪, [FRAME Pallet: NFTs for Substrate](https://github.com/danforbes/pallet-nft) ⚪, [Unique NFT Parachain](https://github.com/UniqueNetwork/unique-chain) ⚪, [DNFT](https://github.com/DNFT-Team/dnft-substrate-node/tree/master/pallets) ⚪, [RMRK-Substrate](https://github.com/rmrk-team/rmrk-substrate) ⚪, [NT-NFTs](https://github.com/Popular-Coding/nt-nft) ⚪, [Green Lemon](https://github.com/GreenLemonProtocol/dksap-polkadot) ⚪, [Basilisk](https://github.com/galacticcouncil/Basilisk-node) 🟡, [LAOS](https://github.com/freeverseio/laos) 🟢, [NFTAA](https://github.com/decenzio/nftaa) ⚪|\n| Randomness                      | [DKG and Randomness Beacon](https://github.com/Cardinal-Cryptography/substrate/tree/randomness-beacon) ⚪, [drand-substrate-client](https://github.com/random-meat/drand-substrate-client) ⚪|\n| Banking Integration             | [FIAT on-off-ramp](https://github.com/element36-io/ebics-java-service) ⚪|\n| Crowdfunding                    | [Imbue Network](https://github.com/ImbueNetwork/imbue) ⚪, [Quadratic Funding pallet by Dora](https://github.com/zhangjiannan/QFgrant) ⚪, [Quadratic Funding pallet by OAK](https://github.com/OAK-Foundation/quadratic-funding-pallet/tree/master) ⚪| [Minimum Anti-Collusion Infrastructure (MACI)](https://ethresear.ch/t/minimal-anti-collusion-infrastructure/5413)                                                                      |\n| Collection of Pallets           | [Substrate Open Runtime Module Library](https://github.com/open-web3-stack/open-runtime-module-library) 🟢, [warehouse](https://github.com/galacticcouncil/warehouse) ⚪, [InvArch FRAME Pallet Library](https://github.com/InvArch/InvArch-Frames) ⚪|\n| Marketplaces                    | [Dot Marketplace](https://github.com/WowLabz/dot-marketplace-v2/tree/Phase3_Milestone3) ⚪, [Gated Marketplace](https://github.com/hashed-io/hashed-substrate/tree/main/pallets/gated-marketplace) ⚪, [Ventur](https://github.com/Popular-Coding/ventur) ⚪|\n| Carbon Credits                  | [BitGreen](https://github.com/bitgreen/bitg-node) ⚪, [Carbon Assets Pallet](https://github.com/EvercityEcosystem/carbon-assets) ⚪, [Sequester Pallets](https://github.com/SequesterChain/pallets) ⚪|\n| UTXO                            | [Tuxedo](https://github.com/Off-Narrative-Labs/Tuxedo) ⚪|\n| Other                           | [Moonkit](https://github.com/Moonsong-Labs/moonkit) 🟡, [Substrate Account Filter](https://github.com/gautamdhameja/substrate-account-filter) ⚪, [Subtensor](https://github.com/opentensor/subtensor) 🟢, [AdMeta](https://github.com/AdMetaNetwork/admeta) ⚪, [Chocolate Node](https://github.com/chocolatenetwork/chocolate-node) ⚪, [Virto Network](https://github.com/virto-network/virto-node) 🟡, [Substrate Validator Set](https://github.com/gautamdhameja/substrate-validator-set) ⚪, [DEIP](https://github.com/DEIPworld/deip-node) ⚪, [DeBio](https://github.com/debionetwork/debio-node) ⚪, [MathChain](https://github.com/mathwallet/MathChain) ⚪, [encointer](https://github.com/encointer/encointer-node) 🟡, [Grassland](https://github.com/grasslandnetwork/substrate_node) ⚪, [Substrate-Tutorials](https://github.com/rusty-crewmates/substrate-tutorials) ⚪, [Fair Squares](https://github.com/Fair-Squares/fair-squares) ⚪, [Totem Live Accounting](https://github.com/totem-tech/totem) ⚪, [Escrow Pallet](https://github.com/herou/EscrowPallet) ⚪, [TREX](https://github.com/NexTokenTech/TREX) ⚪, [Relation Graph](https://github.com/relationlabs/Relation-Graph) ⚪, [Decentralized Invoice](https://github.com/gertt/Invoice) ⚪, [Redstone Network](https://github.com/redstone-network/redstone-node) ⚪, [Access Control Pallet](https://github.com/WunderbarNetwork/access-control) ⚪, [Omniverse DLT](https://github.com/Omniverse-Web3-Labs/omniverse-swap/tree/web3-grant) ⚪, [ISMP](https://github.com/polytope-labs/substrate-ismp) ⚪, [XCMP](https://github.com/w3f/xcmp_prototype_playground) ⚪, [CORD Chain](https://github.com/dhiway/cord) ⚪, [Educhain](https://github.com/w3f/educhain) ⚪| Decentralized review/reputation system                                                                                                                                                 |"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#host", "page_title": "Open Source Stack", "index": 7, "depth": 3, "title": "Host", "anchor": "host", "start_char": 62118, "end_char": 63356, "estimated_token_count": 451, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Host\n\n| Components     | Existing projects                                                                                            | Potentially interesting projects |\n| -------------- | ------------------------------------------------------------------------------------------------------------ | -------------------------------- |\n| Rust           | [Substrate](https://github.com/paritytech/polkadot-sdk/tree/master/substrate) 🟢, [Cumulus](https://github.com/paritytech/polkadot-sdk/tree/master/cumulus) 🟢|\n| C++            | [Kagome](https://github.com/soramitsu/kagome) ⚪, [Mayon](https://github.com/Zondax/mayon) ⚪|\n| Go             | [Gossamer](https://github.com/ChainSafe/gossamer) ⚪|\n| Java             | [Fruzhin](https://github.com/LimeChain/Fruzhin) ⚪, [Java Host Research](https://github.com/LimeChain/java-host-research) ⚪|\n| AssemblyScript |\n| Light Client   | [smoldot](https://github.com/smol-dot/smoldot) 🟢, [Substrate Connect](https://github.com/paritytech/substrate-connect) ⚪, [C++ Polkadot Light Client](https://github.com/eqlabs/polkadot-light-client) ⚪|\n| Testing             | [Polkadot Conformance](https://github.com/LimeChain/polkadot-conformance) ⚪, [Polkafuzz](https://github.com/sigp/polkafuzz) ⚪|"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#network-maintenance-tools", "page_title": "Open Source Stack", "index": 8, "depth": 3, "title": "Network Maintenance Tools", "anchor": "network-maintenance-tools", "start_char": 63356, "end_char": 67201, "estimated_token_count": 1431, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Network Maintenance Tools\n\n| Components                  | Existing projects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | Potentially interesting projects |\n| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |\n| Secure validator setup      | [Polkadot Validation Node Ansible Setup](https://github.com/polkachu/polkadot-validator) ⚪, [W3F Polkadot Validator Setup](https://github.com/w3f/polkadot-validator-setup) ⚪, [polkadot-ansible](https://github.com/Nexus2k/polkadot-ansible) ⚪|\n| High availability setup     | [Archipel](https://github.com/luguslabs/archipel) ⚪, [Polkadot Failover Mechanism](https://github.com/protofire/polkadot-failover-mechanism) ⚪, [Datagen](https://github.com/Datagen-Project/Datagen-Substrate-Grant) ⚪, [High Availability Validator Setup](https://github.com/bright/substrate-raft) ⚪|\n| Load Balanced Endpoints     | [terragrunt-polkadot](https://github.com/insight-w3f/terragrunt-polkadot) ⚪, [Geometry Labs' Substrate Meta repo](https://github.com/sudoblockio/substrate-meta) ⚪|\n| Deployment Tools            | [Polkadot Package Manager](https://github.com/Blockdaemon/bpm-sdk) ⚪, [PolkaHub](https://github.com/akropolisio/polkahub-monorepo) ⚪, [Avado](https://github.com/AvadoDServer/AVADO-DNP-Polkadot-custom) ⚪, [Polkadot Deployer](https://github.com/w3f/polkadot-deployer) ⚪, [Unified Collator Deployment](https://github.com/for-parity-with-love/unified-collator-node-deployment) ⚪|\n| Validator monitoring        | [ONE-T](https://github.com/turboflakes/one-t) 🟢, [SubVT](https://github.com/helikon-labs/subvt-backend) 🟡, [P.A.N.I.C.](https://github.com/SimplyVC/panic) ⚪, [Polkalert](https://github.com/galacticcouncil/polkalert) ⚪, [B-Harvest](https://github.com/nodebreaker0-0/substrate/tree/prometheus_v0.3) ⚪, [nmonpolkadot](https://github.com/stakezone/nmonpolkadot) ⚪, [Polkadot-K8s-Monitor](https://github.com/ironoa/polkadot-k8s-monitor) ⚪, [Polkadot-Watcher](https://github.com/w3f/polkadot-watcher) ⚪, [1KV Telegram Bot](https://github.com/helikon-labs/polkadot-kusama-1kv-telegram-bot) ⚪|\n| Validator payout management | [Substrate validator auto payout](https://github.com/Colm3na/substrate-auto-payout) ⚪, [Polkadot Payouts](https://github.com/w3f/polkadot-payouts) ⚪, [staking-payouts CLI](https://github.com/emostov/staking-payouts) ⚪, [Payctl](https://github.com/stakelink/substrate-payctl) ⚪, [crunch](https://github.com/turboflakes/crunch) 🟢|\n| Staking Miner | [Staking Miner v2](https://github.com/paritytech/staking-miner-v2) 🟢|\n| Nominator Tools | [Validator Selection](https://github.com/miepsik/validators_selection) ⚪, [Polkanalyzer](https://github.com/filippoweb3/polkanalyzer) ⚪, [Polkanalyzer-app](https://github.com/filippoweb3/polkanalyzer-app) ⚪|"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#signatures", "page_title": "Open Source Stack", "index": 9, "depth": 3, "title": "Signatures", "anchor": "signatures", "start_char": 67201, "end_char": 69645, "estimated_token_count": 1015, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signatures\n\n| Components                       | Existing projects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Potentially interesting projects |\n| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |\n| SR25519                          | [rust](https://github.com/w3f/schnorrkel) 🟢(contains partial bindings for C, JavaScript, and Python), [.Net bindings](https://github.com/gautamdhameja/sr25519-dotnet) ⚪, [C](https://github.com/usetech-llc/sr25519) ⚪*(old)*, [C](https://github.com/TerenceGe/sr25519-donna) ⚪*(new)*, [C/C++](https://github.com/soramitsu/soramitsu-sr25519-crust) ⚪, [C#](https://github.com/usetech-llc/sr25519_dotnet) ⚪, [Go](https://github.com/ChainSafe/go-schnorrkel) ⚪, [java](https://github.com/debuggor/schnorrkel-java) ⚪, [PHP](https://github.com/gmajor-encrypt/sr25519-bindings) ⚪|\n| Signature Aggregation            | [apk-proofs](https://github.com/w3f/apk-proofs) ⚪|\n| Distributed key generation (DKG) or management | [keygen.rs](https://github.com/isislovecruft/frost-dalek) ⚪, [Secure Wallet Origin Distribution (SWORD)](https://github.com/w3f-grants-archive/sword) ⚪|\n| Validator HSMs                   | [Zondax Remote Signer](https://github.com/Zondax/buildroot-zondax) ⚪|\n| MPC                              | [Orochi Network](https://github.com/orochi-network/orochi-network.github.io) ⚪|"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#consensus", "page_title": "Open Source Stack", "index": 10, "depth": 3, "title": "Consensus", "anchor": "consensus", "start_char": 69645, "end_char": 71185, "estimated_token_count": 593, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Consensus\n\n| Components       | Existing projects                                                                                                                                                                                                                                                           | Potentially interesting projects |\n| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |\n| PoC              | [Spartan](https://github.com/subspace/substrate) ⚪|\n| PoW              | [PoW consensus for Substrate](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/client/consensus/pow) 🟢, [RandomX](https://github.com/kulupu/kulupu/tree/master/pow) ⚪, [Sha3 PoW](https://github.com/substrate-developer-hub/recipes/tree/master/consensus/sha3pow) ⚪|\n| Block production | [BABE](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/client/consensus/babe) 🟢, [Aura](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/client/consensus/aura) 🟢|\n| Finality         | [GRANDPA](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/grandpa) 🟢, [AlephBFT](https://github.com/Cardinal-Cryptography/AlephBFT) ⚪|\n| Other            | [Nimbus: Upgradeable consensus framework](https://github.com/PureStake/nimbus) ⚪|"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#networking", "page_title": "Open Source Stack", "index": 11, "depth": 3, "title": "Networking", "anchor": "networking", "start_char": 71185, "end_char": 73474, "estimated_token_count": 810, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Networking\n\n| Components          | Existing projects                                                                                                     | Potentially interesting projects |\n| ------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------- |\n| SCALE Codec                     | [Rust](https://github.com/paritytech/parity-scale-codec) 🟢, [TypeScript](https://github.com/paritytech/parity-scale-codec-ts) ⚪, [Python](https://github.com/polkascan/py-scale-codec) ⚪, [Golang Chainsafe](https://github.com/ChainSafe/gossamer/tree/development/pkg/scale/) ⚪, [Golang Itering](https://github.com/itering/scale.go) 🟡, [C](https://github.com/MatthewDarnell/cScale) ⚪, [C++](https://github.com/soramitsu/scale-codec-cpp) ⚪, [JavaScript](https://github.com/polkadot-js/api) 🟢, [AssemblyScript](https://github.com/LimeChain/as-scale-codec) ⚪, [Haskell](https://github.com/airalab/hs-web3/tree/master/packages/scale/src/Codec) 🟡, [Java](https://github.com/emeraldpay/polkaj) ⚪, [Ruby](https://github.com/itering/scale.rb) ⚪, [Dart](https://github.com/nbltrust/dart-scale-codec) ⚪, [Swift](https://github.com/tesseract-one/swift-scale-codec) ⚪, [scale-codec-swift](https://github.com/sublabdev/scale-codec-swift) ⚪, [scale-codec-kotlin](https://github.com/sublabdev/scale-codec-kotlin) ⚪, [PHP](https://github.com/gmajor-encrypt/php-scale-codec) 🟢, [JavaScript by Soramitsu](https://github.com/soramitsu/scale-codec-js-library) ⚪, [Scale Codec Comparator](https://github.com/gmajor-encrypt/scale-codec-comparator) ⚪, [ScaleCodec.sol by Darwinia](https://github.com/darwinia-network/darwinia-messages-sol/blob/master/contracts/utils/contracts/ScaleCodec.sol) ⚪, [Dotscale](https://github.com/arijitAD/dotscale) ⚪|\n| Networking Framework | [libp2p](https://github.com/libp2p/libp2p) 🟢[SwarmNL](https://github.com/algorealmInc/SwarmNL) ⚪|                                  |\n| DHT Crawler         | [Go](https://github.com/atredispartners/dht-crawler-polkadot) ⚪, [Kotlin](https://github.com/emeraldpay/polkabot) ⚪|                                  |\n| RPC Tor-like access | [WhiteNoise](https://github.com/Evanesco-Labs/WhiteNoise.rs) ⚪|                                  |"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#primitives", "page_title": "Open Source Stack", "index": 12, "depth": 3, "title": "Primitives", "anchor": "primitives", "start_char": 73474, "end_char": 74083, "estimated_token_count": 245, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Primitives\n\n| Components          | Existing projects                                                                                                     | Potentially interesting projects |\n| ------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------- |\n| Storage             | [Merkle Tree DB](https://github.com/frisitano/merkle-tree-db) ⚪|                                  |\n| Merkle Proofs       | [Solidity Trie Verifier](https://github.com/polytope-labs/solidity-merkle-trees) 🟢| |"}
{"source": "polkadot-docs", "page_id": "wiki-general-build-open-source", "url": "https://developer.polkadot.com/wiki/general/build-open-source/#contributing", "page_title": "Open Source Stack", "index": 13, "depth": 2, "title": "Contributing", "anchor": "contributing", "start_char": 74083, "end_char": 74566, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e87870410792a4a6c7d6f05d4287d6502460cbf7a285ab3aaf8c34283335b323", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Contributing\n\nPull requests, issues, or other contributions from the community are encouraged! You can not only\nadd specific projects, but also potentially interesting fields/areas which are currently missing in\nthe tech stack.\n\nAll technologies listed above need to be open-source. Ideally, the links\nlead directly to the code.\n\n_Note: You will need a GitHub account to suggest changes or open issues. If you do not have one, you\nmay [sign up for free](https://github.com/join)._"}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#general", "page_title": "Community", "index": 0, "depth": 2, "title": "General", "anchor": "general", "start_char": 259, "end_char": 1202, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## General\n\n=== \"Polkadot\"\n\n    - [Polkadot Forum](https://forum.polkadot.network/) - a place for thoughtful comments and discussions on the future of Polkadot, and the steps we can take to get there together.\n    - [Polkadot GitHub](https://github.com/paritytech/polkadot-sdk/tree/master/polkadot) - Parity maintained repository that houses the Rust implementation of the Polkadot Host.\n    - [Polkadot Support Contact](../../get-support.md).\n    - [Polkadot's Latest Research (news)](https://research.web3.foundation/news).\n    - [Polkadot Meetup Hub](https://www.notion.so/web3foundation/Polkadot-Meetup-Hub-4511c156770e4ba9936386d8be5fe5be) - Information on hosting meetups, applying for funding, and materials for running it.\n    - [Polkadot Discussion and Governance on Subsquare](https://polkadot.subsquare.io/discussions).\n\n=== \"Kusama\"\n\n    - [Kusama Discussion and Governance on Subsquare](https://kusama.subsquare.io/discussions)."}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#events", "page_title": "Community", "index": 1, "depth": 3, "title": "Events", "anchor": "events", "start_char": 1202, "end_char": 1743, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Events\n\n[Polkadot Meetup Platform](https://www.meetup.com/pro/polkadot) - Information on hosting meetups,\napplying for funding, and materials for running it.\n\n[Community Events](https://dotevents.xyz/) -\nInformation on events funded by the [Treasury](https://polkadot.subsquare.io/treasury/bounties/17) and\norganized by the Polkadot community (candidates or ambassadors) focused on promoting Polkadot,\nKusama, and related technologies. The events are educational and informative, and their goal is to\ncreate an impact in the community."}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#matrix-chats", "page_title": "Community", "index": 2, "depth": 2, "title": "Matrix Chats", "anchor": "matrix-chats", "start_char": 1743, "end_char": 4285, "estimated_token_count": 619, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Matrix Chats\n\nWe primarily use [Matrix](https://matrix.org) across the organization and to communicate with\ncommunity members. The application we use most often to interact with the Matrix protocol is the\n[Element](https://app.element.io) messenger client.\n\n=== \"Polkadot\"\n\n    - [Polkadot Space](https://matrix.to/#/#polkadot:web3.foundation) - Space containing all official rooms below. Note that this is a newer feature and may not be supported by your Matrix client. If you face any issues, join the rooms individually.\n    - [Polkadot Watercooler](https://matrix.to/#/#polkadot-watercooler:parity.io) - General room for talk about Polkadot.\n    - [Polkadot Validator Lounge](https://matrix.to/#/#polkadotvalidatorlounge:web3.foundation) - Room for validators learning about setting up a node.\n    - [Polkadot Direction](https://matrix.to/#/#Polkadot-Direction:parity.io) - Governance, and a place to discuss the future of Polkadot.\n    - [Polkadot Digest](https://matrix.to/#/#dailydigest:web3.foundation) - News about what is happening in the Polkadot ecosystem, published every weekday except holidays.\n    - [Polkadot Wiki](https://matrix.to/#/#polkadotwikipublic:web3.foundation) - The official matrix room about the Polkadot Wiki.\n\n=== \"Kusama\"\n\n    - [Kusama Space](https://matrix.to/#/#kusama:web3.foundation) - Space containing all official rooms below. Note that this is a newer feature and may not be supported by your Matrix client. If you face any issues, join the rooms individually.\n    - [Kusama Watercooler](https://matrix.to/#/#kusamawatercooler:web3.foundation) - General room for talk about Kusama.\n    - [Kusama Validator Lounge](https://matrix.to/#/#KusamaValidatorLounge:parity.io) - Room for validators learning about setting up a node.\n    - [Kusama Direction](https://matrix.to/#/#Kusama-Direction:parity.io) - Governance, and a place to discuss the future of Kusama.\n      \n=== \"Technical\"   \n\n    - [Substrate Developers Chat](https://matrix.to/#/#substratedevs:matrix.org) - A Matrix chat room for Substrate development.\n    - [Substrate Developers Telegram Chat](https://t.me/substratedevs) - A Telegram chat room for Substrate development, bridged to Matrix Substrate Developers Chat linked above.\n    - [Substrate and Polkadot StackExchange](https://substrate.stackexchange.com/) - More advanced room for technical questions on building with Substrate.\n    - [Smart Contracts & Parity Ink!](https://matrix.to/#/#ink:parity.io) - A room to discuss developing Substrate smart contracts using Parity Ink!"}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#socials", "page_title": "Community", "index": 3, "depth": 2, "title": "Socials", "anchor": "socials", "start_char": 4285, "end_char": 4297, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Socials"}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#chat", "page_title": "Community", "index": 4, "depth": 3, "title": "Chat", "anchor": "chat", "start_char": 4297, "end_char": 4558, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Chat\n\n- [Polkadot Discord](https://polkadot-discord.w3f.tools/) (RECOMMENDED)\n- [Kusama Discord](https://kusama-discord.w3f.tools/)\n- [Polkadot Announcements on Telegram](https://t.me/PolkadotAnnouncements) - official channel for\n  Polkadot announcements."}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#social-media", "page_title": "Community", "index": 5, "depth": 3, "title": "Social media", "anchor": "social-media", "start_char": 4558, "end_char": 5133, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Social media\n\n=== \"Web3 Foundation\"\n\n    - [Web3 Foundation X](https://x.com/web3foundation)\n    - [Web3 Foundation YouTube](https://www.youtube.com/channel/UClnw_bcNg4CAzF772qEtq4g)\n\n=== \"Polkadot\"\n\n    - [Polkadot X](https://x.com/Polkadot)\n    - [Polkadot Reddit](https://www.reddit.com/r/polkadot)\n    - [Polkadot YouTube](https://www.youtube.com/channel/UCB7PbjuZLEba_znc7mEGNgw)\n\n=== \"Kusama\"\n\n    - [Kusama X](https://x.com/kusamanetwork)\n    - [Kusama Reddit](https://www.reddit.com/r/Kusama)\n    - [Kusama YouTube Channel](https://youtube.com/c/kusamanetwork)"}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#blogs-and-tutorials", "page_title": "Community", "index": 6, "depth": 3, "title": "Blogs and tutorials", "anchor": "blogs-and-tutorials", "start_char": 5133, "end_char": 5376, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Blogs and tutorials\n\n- [Web3 Medium Blog](https://medium.com/@web3)\n- [Polkadot Blog](https://polkadot.network/blog/)\n- [Gavin Wood's Medium Blog](https://medium.com/@gavofyork)\n- [Dotleap.com Newsletter](https://newsletter.dotleap.com/)"}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#newsletters", "page_title": "Community", "index": 7, "depth": 3, "title": "Newsletters", "anchor": "newsletters", "start_char": 5376, "end_char": 5597, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Newsletters\n\n- [Subscribe to the Polkadot newsletter](https://share.hsforms.com/1LL1CBwiASxC5pJUYZAiDVw4752a) -\n  official, infrequent\n- [Dot Leap Newsletter](https://newsletter.dotleap.com/) - less official, weekly"}
{"source": "polkadot-docs", "page_id": "wiki-general-community", "url": "https://developer.polkadot.com/wiki/general/community/#ecosystem", "page_title": "Community", "index": 8, "depth": 2, "title": "Ecosystem", "anchor": "ecosystem", "start_char": 5597, "end_char": 7205, "estimated_token_count": 366, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b1b59e4d2c76fc422b38806dd9c1fdf943e426693163445d12d30740ef1a0cdb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Ecosystem\n\n- [Polkadot & Kusama Ecosystem Map](https://dotinsights.subwallet.app/) - Comprehensive list of\n  projects building in the ecosystem made by SubWallet with support from Parity Technologies.\n- [Polkadot Deep Dive Quarterly Report](https://dotinsights.subwallet.app/polkadot-report-q4-2022-en/) -\n  A quarterly report series that dives deep into the growth of the whole ecosystem. Made by\n  SubWallet with sections focused on Ecosystem Overview, DeFi, [NFT](../learn/learn-nft.md) &\n  [Web3](web3-and-polkadot.md).\n- [Polkadot Stack](../general/build-open-source.md) - if you're interested in seeing what's under\n  development and where there's room for your contributions.\n- [Teams Building on Polkadot](https://polkaproject.com/) - Community maintained list of teams\n  building on Polkadot and/or Substrate. (Note that this may contain inaccuracies, as it's\n  unofficial).\n- [Jobs in Polkadot Ecosystem](https://jobs.polkadot.com/jobs) - Join the Polkadot Talent Network.\n- [Polkadot Blockchain Academy](https://polkadot.network/development/blockchain-academy/) - a\n  classroom-based educational program covering the conceptual underpinnings and the hands-on\n  application of blockchain technology, using Polkadot and Substrate as its foundations.\n- [Polkadot Communities and Campaigns by AirLyft One](https://airlyft.one/communities?ecosystem=POLKADOT) -\n  Discover thriving communities and participate in engaging campaigns.\n- [Awesome Dot](https://github.com/haquefardeen/awesome-dot) - community curated resources,\n  projects, and learning material about the Polkadot and Kusama ecosystems."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributing", "url": "https://developer.polkadot.com/wiki/general/contributing/#how-to-contribute", "page_title": "Contributing to the Polkadot Wiki", "index": 0, "depth": 2, "title": "How to Contribute", "anchor": "how-to-contribute", "start_char": 897, "end_char": 2106, "estimated_token_count": 306, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbe90fc1ff276d5488d41f2f7037a1bf4ac47fe11cfc4cdec4b4604a622f330b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How to Contribute\n\nYou can contribute to the wiki on the\n[w3f/polkadot-wiki GitHub repository](https://github.com/w3f/polkadot-wiki). Every page is a [MarkDown](https://guides.github.com/features/mastering-markdown/) file, which is an easy-to-learn syntax extension to plain text that makes creating links, rendering images, and nice-looking\nformatting simple.\n\nEach page has an \"Edit this page\" link at the bottom of the content. By clicking it, you are taken\nto the GitHub sign-in page, where you can either log in or create an account.\n\nOnce logged in, you'll be taken to the GitHub built-in text editor, where you can make your edits\ndirectly. When you've completed your changes, you can add any specific details on what was changed\nand commit to a **new branch** to create a new Pull Request to the repository. From there, one of\nthe maintainers will review your changes and either merge them or request changes.\n\n![contributing](../assets/contributing.png)\n![creating-pull-request](../assets/creating-pull-request.png)\n\nRemember that after you click \"Propose Changes\", you must also click on \"Create Pull Request\" on the next page.\n\n![creating-pull-request-2](../assets/creating-pull-request-2.png)"}
{"source": "polkadot-docs", "page_id": "wiki-general-contributing", "url": "https://developer.polkadot.com/wiki/general/contributing/#ground-rules-for-contributing", "page_title": "Contributing to the Polkadot Wiki", "index": 1, "depth": 2, "title": "Ground Rules for Contributing", "anchor": "ground-rules-for-contributing", "start_char": 2106, "end_char": 3358, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbe90fc1ff276d5488d41f2f7037a1bf4ac47fe11cfc4cdec4b4604a622f330b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ground Rules for Contributing\n\nThere are a few basic ground rules for contributors:\n\n1. **No `--force` pushes** or modifying the Git history in any way.\n2. Pull requests are preferred to issues, especially for small changes such as typos. Issues should\n   be used for generic or broad-based changes or missing content. Suggestions and requests are\n   encouraged.\n3. Only use **non-master branches**.\n4. **Significant modifications**, even by contributors, ought to be subject to a **pull request** to\n   solicit feedback from other contributors.\n5. Pull requests to solicit feedback are _encouraged_ for any other non-trivial contribution but\n   left to the contributor’s discretion.\n6. Contributors should adhere to the prevailing `MarkDown` style, language, and layout.\n7. Correct grammar should be used at all times. Pull requests with typos will not be merged until\n   fixed.\n8. Care should be taken to remain as objective and informative as possible. There should be no\n   editorializing, and external bias should not be present.\n9. We use the Prettier plugin to standardize the style across documents. You can run this on your\n   local copy with `npx lint-staged`, but for simplicity, we also have a bot that runs this for us\n   in your PRs."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributing", "url": "https://developer.polkadot.com/wiki/general/contributing/#polkadot-wiki-style-guide", "page_title": "Contributing to the Polkadot Wiki", "index": 2, "depth": 2, "title": "Polkadot Wiki Style Guide", "anchor": "polkadot-wiki-style-guide", "start_char": 3358, "end_char": 4637, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbe90fc1ff276d5488d41f2f7037a1bf4ac47fe11cfc4cdec4b4604a622f330b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot Wiki Style Guide\n\n!!!info \"Wiki General Style Guides\"\n    See also [the Wiki README - Contributing to Documentation](https://github.com/w3f/polkadot-wiki?tab=readme-ov-file#contributing-to-documentation).\n\nThis style guide provides editorial guidelines for anyone writing documentation for the Polkadot Wiki. It is based and inspired in principle on the Google Developer Documentation Style Guide, adapted to fit the specific needs and terminology of the Polkadot ecosystem, with a focus on **creating static, long-lasting content.**\n\n\nThe Polkadot Wiki is powered by [MkDocs](https://www.mkdocs.org/) using [the MkDocs Material template](https://squidfunk.github.io/mkdocs-material/).\n\nThe Polkadot Wiki has multiple moving parts. To ensure your contribution does not introduce\ncompilation errors and that your page is properly rendered in production, we encourage you to build\nand render the Wiki on your local machine before submitting a pull request for review. Rendering the\nWiki locally also adds the benefit of checking for broken links.\n\n!!!info \"Run the Wiki Locally\"\n      For more information about how to run the Wiki locally on your machine, visit [the README file on GitHub](https://github.com/w3f/polkadot-wiki/blob/master/README.md#running-locally)."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributing", "url": "https://developer.polkadot.com/wiki/general/contributing/#general-guidelines", "page_title": "Contributing to the Polkadot Wiki", "index": 3, "depth": 3, "title": "General Guidelines", "anchor": "general-guidelines", "start_char": 4637, "end_char": 7132, "estimated_token_count": 499, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbe90fc1ff276d5488d41f2f7037a1bf4ac47fe11cfc4cdec4b4604a622f330b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### General Guidelines\n\nThe overarching theme is to ensure that the Polkadot Wiki's content is long-lasting, adheres to the guidelines, minimizes maintenance, and continues to have a high-quality standard.\n\n#### Avoid informal language\n\nAvoid using exclamation marks `!` and informal sentences, which are usually more appropriate for blog posts.\n\n#### Grammar and consistency\n\nRunning a grammar check before submitting your pull request for review can save reviewers time and speed up the review process.\n\nTo ensure consistency across pages, note the following general terms:\n- `relay chain` in text and `Relay chain` at the beginning of a sentence.\n- `parachain` in text and `Parachain` at the beginning of a sentence.\n\n#### Clarity\n\nPrioritize clear, concise, and direct language. Assume the reader has a basic understanding of blockchain concepts but may be new to Polkadot.  \n- **Example:** Instead of: \"The utilization of a multi-chain architecture enables the facilitation of diverse transactional modalities.\"  \n  \n- Write: \"Polkadot's heterogeneous, multi-chain design allows different types of transactions to be submitted on the network.\"  \n\n#### Longevity\n\nThe Polkadot Wiki should only contain features live in production, on the Polkadot relay chain. It should not allude to any feature on test networks or Kusama. **Document features and information *only* when they are live and available on the Polkadot mainnet.** Exclude information about features that are only available on Kusama, Westend, or other testnets. \n\n- **Example:** Do not include a section on a new XCM feature if it is only live on Kusama. Only document it once it is available on Polkadot Mainnet.  \n\nPrioritize information that is expected to remain relevant for an extended period. Avoid language that quickly becomes outdated.\n\n- **Example:** Instead of: \"The upcoming upgrade will introduce new governance features.\"  \n- Write: \"Polkadot governance allows token holders to participate in decision-making.\" (This describes the general function, not a specific, time-sensitive upgrade)  \n\n#### Accuracy\n\nEnsure all information is technically accurate and up-to-date. The Polkadot ecosystem evolves rapidly, so meticulous attention to detail is crucial.  \n\n#### Consistency\n\nMaintain a consistent style and terminology throughout all documentation. This creates a professional and cohesive experience for the reader.  \n- **Example:** Always use the term \"parachain\" and not \"parallel chain\" or \"para-chain.\""}
{"source": "polkadot-docs", "page_id": "wiki-general-contributing", "url": "https://developer.polkadot.com/wiki/general/contributing/#voice-and-tone", "page_title": "Contributing to the Polkadot Wiki", "index": 4, "depth": 3, "title": "Voice and tone", "anchor": "voice-and-tone", "start_char": 7132, "end_char": 9082, "estimated_token_count": 442, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dbe90fc1ff276d5488d41f2f7037a1bf4ac47fe11cfc4cdec4b4604a622f330b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Voice and tone\n\nPresent information in a neutral and objective tone, avoiding hype or marketing language.  \n\n- **Example:** Instead of: \"Polkadot is the most revolutionary blockchain technology...\"\n- Write: \"Polkadot is a network that enables interoperability between different blockchains.\"\n\n#### Voice\n\nUse a confident and authoritative voice, but avoid being overly formal or academic. An active voice should be used, versus a passive voice, to make the documentation more direct and engaging.  \n\n- **Example (formal):** \"It is imperative to note that the aforementioned process...\"  \n- **Write (concise):** \"Note that the process...\"  \n- **Example (passive):** \"The Relay Chain is secured by validators.\"  \n- **Write (active):** \"Validators secure the Relay Chain.\"\n\n#### Tone\n\nAim for a friendly, helpful, and approachable tone. Imagine you are a knowledgeable guide helping someone navigate the Polkadot ecosystem.  \n\n- **Example:** Instead of: \"The user must execute the following commands...\"  \n- Write: \"You can use the following commands...\"  \n\nPart of this can be accomplished via using the second-person tense when the user/reader is referred to. Use the second person (\"you\") to address the reader directly and make the documentation more engaging.  \n\n- **Example:** \"To create a parachain, you need to...\"  \n\n#### Tense\n\n- Use the present tense whenever possible to describe how Polkadot works on mainnet.  \n  - **Example:** \"Validators secure the Polkadot network.\"  \n- Use the past tense to describe specific events that have already occurred on mainnet.  \n  - **Example:** \"The first parachain auctions on Polkadot concluded in 2021.\"  \n- Avoid future tense and speculative language about features that are not yet live on Polkadot mainnet.  \n  - **Example:** Instead of: \"Parachains will connect to the Relay Chain in the future.\"  \n  - Write: \"Parachains connect to the Relay Chain.\" (Only if this is true on Polkadot Mainnet)"}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#current-contributors", "page_title": "Contributors", "index": 0, "depth": 2, "title": "Current Contributors", "anchor": "current-contributors", "start_char": 1, "end_char": 584, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Current Contributors\n\nThe following is a list of regular contributors to the Wiki. Each contributor's contact information\nis listed as a precaution - if one of these people ever contacts you directly, first check the\ncontact information to see that it matches the origin of the message, and then feel free to get in\ntouch with someone else on this list to verify the legitimacy of the original inquiry.\n\n!!!warning \"Employee impersonation is a common type of scam\"\n    For other ways of protecting yourself, please see the [How to Protect Yourself from Scams](./scams.md) guide."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#technical-education", "page_title": "Contributors", "index": 1, "depth": 2, "title": "Technical Education", "anchor": "technical-education", "start_char": 584, "end_char": 608, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Technical Education"}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#bill-laboon", "page_title": "Contributors", "index": 2, "depth": 3, "title": "Bill Laboon", "anchor": "bill-laboon", "start_char": 608, "end_char": 1514, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Bill Laboon\n\n- email: [bill@web3.foundation](mailto:bill@web3.foundation)\n- matrix: [@bill:web3.foundation](https://matrix.to/#/@bill:web3.foundation)\n- twitter: [@BillLaboon](https://twitter.com/BillLaboon)\n- telegram: [@BillLaboon](https://t.me/BillLaboon)\n\nBill Laboon is the Head of Education and Grants at Web3 Foundation. Prior to Web3 Foundation, he\nspent five years teaching Computer Science at the University of Pittsburgh. Bill also has several\nyears of experience in software engineering and management.\n\nHe is the author of two books:\n[A Friendly Introduction to Software Testing](https://www.amazon.com/Friendly-Introduction-Software-Testing/dp/1523477377),\nan undergraduate textbook; and\n[Strength in Numbers](https://www.amazon.com/Strength-Numbers-Cryptocurrency-Bill-Laboon/dp/1981526730/),\na near-future novel set in a world in which cryptocurrency has eliminated traditional money."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#radhakrishna-dasari", "page_title": "Contributors", "index": 3, "depth": 3, "title": "Radhakrishna Dasari", "anchor": "radhakrishna-dasari", "start_char": 1514, "end_char": 2154, "estimated_token_count": 156, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Radhakrishna Dasari\n\n- email: [radha@web3.foundation](mailto:radha@web3.foundation)\n- matrix: [@radha:web3.foundation](https://matrix.to/#/@radha:web3.foundation)\n- twitter: [@DrW3RK](https://twitter.com/DrW3RK)\n\nRadha leads Technical Education at Web3 Foundation. Radha has a PhD in Computer Science and has\nthree years of experience teaching Computer Science courses. He also taught a Massively Open Online\nCourse (MOOC) on [Coursera](https://www.coursera.org/learn/computer-vision-basics). Radha is excited\nto contribute to Web3 Foundation's vision by educating professionals and the general public about\nthe Web3 Technology Stack."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#filippo-franchini", "page_title": "Contributors", "index": 4, "depth": 3, "title": "Filippo Franchini", "anchor": "filippo-franchini", "start_char": 2154, "end_char": 3390, "estimated_token_count": 284, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Filippo Franchini\n\n- email: [filippo@web3.foundation](mailto:filippo@web3.foundation)\n- matrix: [@filippo:web3.foundation](https://matrix.to/#/@filippo:web3.foundation)\n- twitter: [@filippoweb3](https://twitter.com/filippoweb3)\n\nFilippo is a Technical Educator at the Web3 Foundation with a PhD in Statistics from\n[the University of St Andrews](https://www.st-andrews.ac.uk/). After completing his studies, he\nbriefly worked in the healthcare industry before pivoting to blockchain technology. Filippo is\ndeeply committed to the Web3 vision of a privacy-focused, secure, and decentralized internet that\nempowers users. He recognizes that the complexity of Web3 technology remains a major barrier to\nmainstream adoption and is passionate about bridging this gap through education.\n\nAt the Web3 Foundation, Filippo contributes to this mission by educating professionals and the\ngeneral public about blockchain and Web3. He actively engages with the Polkadot ecosystem, regularly\ncontributing to Wiki articles. He is a\n[certified blockchain analyst](https://www.credential.net/bad85935-7e6e-4b4a-9ed2-e96128bdb5e5) and\na [PBA-X](https://pbax.polkadot.academy/) and [PBA on-chain track](https://polkadot.academy/pba-campus/) graduate."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#bader-youssef", "page_title": "Contributors", "index": 5, "depth": 3, "title": "Bader Youssef", "anchor": "bader-youssef", "start_char": 3390, "end_char": 4341, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Bader Youssef\n\n- email: [bader@web3.foundation](mailto:bader@web3.foundation)\n- matrix: [@bader:web3.foundation](https://matrix.to/#/@bader:web3.foundation)\n- twitter: [@baderyo_o](https://twitter.com/baderyo_o)\n\nBader is a Technical Educator at the Web3 Foundation. He has been an avid blockchain and web3\nadvocate, full-stack software engineer, and technical writer for the past 4 years. He has used a\nmultitude of technologies to create disruptive and unique applications, mostly centering around\neliminating intermediary servers in applications and creating trust-free digital interactions for\nthe betterment of humanity. Real technology needs to solve real problems, and Bader is very strong\non creating practical solutions to those problems using Web3.\n\nBader has a strong passion for ensuring that this technology can be understood and utilized to its\nfullest potential and focuses on making it as simple and useful to digest as possible."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#technical-integrations", "page_title": "Contributors", "index": 6, "depth": 2, "title": "Technical Integrations", "anchor": "technical-integrations", "start_char": 4341, "end_char": 4368, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Technical Integrations"}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#joe-petrowski", "page_title": "Contributors", "index": 7, "depth": 3, "title": "Joe Petrowski", "anchor": "joe-petrowski", "start_char": 4368, "end_char": 5192, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Joe Petrowski\n\n- email: [joe@web3.foundation](mailto:joe@web3.foundation)\n- matrix: [@joe:web3.foundation](https://matrix.to/#/@joe:web3.foundation)\n- telegram: [@joepetrowski](https://t.me/joepetrowski)\n- twitter: [@joepetrowski](https://twitter.com/joepetrowski)\n\nJoe leads Technical Integrations at Web3 Foundation and was previously a Research Analyst at Parity\nTechnologies. He focuses on making Substrate chain integration as smooth as possible, from educating\nusers on Substrate and Polkadot fundamentals to building tools to create great user experiences and\noccasionally writing a bit of code.\n\nPrior to working at Parity, Joe worked in shock and vibration simulation for satellite launch,\nalgorithmic trading, and professional cycling. He has a Bachelor of Science in Aeronautical and\nMechanical Engineering."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#past-contributors", "page_title": "Contributors", "index": 8, "depth": 2, "title": "Past Contributors", "anchor": "past-contributors", "start_char": 5192, "end_char": 5295, "estimated_token_count": 16, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Past Contributors\n\nThe following contributors are no longer participating in an official capacity."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#keith-alfaro", "page_title": "Contributors", "index": 9, "depth": 3, "title": "Keith Alfaro", "anchor": "keith-alfaro", "start_char": 5295, "end_char": 5819, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Keith Alfaro\n\nKeith was a member of the TechEd team at the Web3 Foundation. He has worked professionally as a\nsoftware engineer since completing his graduate studies. Keith holds bachelor's and master's degrees\nin Architecture (buildings not computers). It was during this time that he discovered his passion\nfor computational design. He was previously employed in the CAD/3D graphics software development\ndomains. Keith is passionate about learning, developing and sharing decentralized and peer-to-peer\ntechnologies."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#emre-surmeli", "page_title": "Contributors", "index": 10, "depth": 3, "title": "Emre Surmeli", "anchor": "emre-surmeli", "start_char": 5819, "end_char": 6260, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Emre Surmeli\n\n- twitter: [@semres8](https://twitter.com/semres8)\n\nEmre was a Technical Educator at Web3 Foundation. His background is in full-stack software\ndevelopment, education, and blockchain technology consulting. He is passionate about learning and\nteaching and has always kept a foot in education by designing and delivering software development\nand blockchain classes at General Assembly, Code Fellows, and Columbia University."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#danny-salman", "page_title": "Contributors", "index": 11, "depth": 3, "title": "Danny Salman", "anchor": "danny-salman", "start_char": 6260, "end_char": 6564, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Danny Salman\n\nDanny was a Technical Educator at the Web3 Foundation, teaching and documenting Polkadot and Web3. \nHis interests center on blockchain and trust-minimized technologies. He has a background in computer \nengineering, full-stack development, philosophy, and public policy and governance."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#alex-chau", "page_title": "Contributors", "index": 12, "depth": 3, "title": "Alex Chau", "anchor": "alex-chau", "start_char": 6564, "end_char": 6999, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Alex Chau\n\n- matrix: [@a-jwc:​matrix.org](https://matrix.to/#/@a-jwc:​matrix.org)\n\nAlex was a Technical Education Intern at Web3 Foundation. He has developed a deep passion for\neducating others on decentralized systems and pushing forward the WEB3 vision. Alex has educational\nexperience in cryptography, data privacy, and enterprise security. He has a Bachelor of Science in\nComputer Science from San Francisco State University."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#jake-hemmerle", "page_title": "Contributors", "index": 13, "depth": 3, "title": "Jake Hemmerle", "anchor": "jake-hemmerle", "start_char": 6999, "end_char": 7634, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Jake Hemmerle\n\n- matrix: [@jake:hemmerle.dev](https://matrix.to/#/@jake:hemmerle.dev)\n- twitter: [@jakehemmerle](https://twitter.com/jakehemmerle)\n- telegram: [@jakehemmerle](https://t.me/jakehemmerle)\n\nJake was a Technical Education Intern at Web3 Foundation and studied Computer Science at the\nUniversity of Cincinnati. He has been learning about blockchain technology since 2018 and has\npersonal interests in peer-to-peer systems, network protocols, applied cryptography and\nprivacy-enhancing technologies.\n\nYou can now find Jake cracking the code at the multi-chain Polkadot dApp hub,\n[Astar Network](https://astar.network/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#bruno-skvorc", "page_title": "Contributors", "index": 14, "depth": 3, "title": "Bruno Skvorc", "anchor": "bruno-skvorc", "start_char": 7634, "end_char": 8855, "estimated_token_count": 289, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Bruno Skvorc\n\n- telegram: [@swader](https://t.me/swader)\n- matrix: [@bitfalls:matrix.org](https://matrix.to/#/@bitfalls:matrix.org)\n- twitter: [@bitfalls](https://twitter.com/bitfalls)\n\nBruno joined the crypto ecosystem full time in 2015 with the advent of Ethereum and created\neducational resources, tutorials, and newsletters for budding developers of the industry.\n\nFrom 2019, he was a Technical Educator at Web3 Foundation. He is passionate about decentralization,\ncensorship resistance, and transparency coupled with accountability, so he has found his passion in\nimmutable ledgers of the present and future.\n\nIn a previous life, he was a web developer and senior PHP editor at SitePoint, which culminated in a\n[book about web-dev-friendly virtual environments](https://www.amazon.com/Jump-Start-PHP-Environment-Language/dp/0994182643).\nIn his quest for developer health, he\nlikes to combine fitness and gaming and can be found in VR on Oculus and Steam as TheSwader. He also\nruns a weekly newsletter covering all things Web3 at [DotLeap](https://newsletter.dotleap.com/).\n\nYou can now find Bruno hacking the metaverse by leading the way at [RMRK](https://rmrk.app/) to\ncreate the next-generation NFT standard."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#anson-lau", "page_title": "Contributors", "index": 15, "depth": 3, "title": "Anson Lau", "anchor": "anson-lau", "start_char": 8855, "end_char": 9427, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Anson Lau\n\n- matrix: [@anson-lau:matrix.org](https://matrix.to/#/@anson-lau:matrix.org)\n- twitter: [@Anson_LauHK](https://twitter.com/anson_lauhk)\n\nAnson was a Technical Educator at Web3 Foundation. Before that, he worked as a Hyperledger\nBlockchain Developer to deliver B2B applications at IBM. He is passionate about staking, governance,\ncryptoeconomics, and privacy areas. Anson has been actively participating in the blockchain space\nsince 2017 and creating video content to help different people understand how decentralization could\ndeliver us a better future."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#kirsten-richard", "page_title": "Contributors", "index": 16, "depth": 3, "title": "Kirsten Richard", "anchor": "kirsten-richard", "start_char": 9427, "end_char": 9715, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Kirsten Richard\n\nKirsten was a Technical Educator Intern at Web3 Foundation from Canada. She focused on curating\neducational content around blockchain and Polkadot network concepts. Kirsten has a Bachelor's degree\nin Computer Science and is passionate about teaching and technology."}
{"source": "polkadot-docs", "page_id": "wiki-general-contributors", "url": "https://developer.polkadot.com/wiki/general/contributors/#logan-saether", "page_title": "Contributors", "index": 17, "depth": 3, "title": "Logan Saether", "anchor": "logan-saether", "start_char": 9715, "end_char": 10431, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:93322238e6fc244ea69fce6cdace3bd232fb970fab4ee318626a1db34ee37451", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Logan Saether\n\n- matrix: [@logansaether:matrix.org](https://matrix.to/#/@logansaether:matrix.org)\n- twitter: [@logansaether](https://twitter.com/logansaether)\n\nLogan was a Technical Educator at Web3 Foundation, where he worked on creating material for\nsupporting the development of the next generation of distributed technologies. At Web3 Technical\nEducation, Logan focused on creating the Polkadot Wiki as the central source of truth and knowledge\nfor the Polkadot protocol. He contributed in creating written content and example applications that\ndemonstrate how to use these new technologies.\n\nYou can now find Logan leading efforts to define the prediction market space at\n[Zeitgeist](https://zeitgeist.pm/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-parity-data-dashboards", "url": "https://developer.polkadot.com/wiki/general/dashboards/parity-data-dashboards/#accessing-polkadot-ecosystem-dashboards", "page_title": "Parity Data Dashboards", "index": 0, "depth": 2, "title": "Accessing Polkadot Ecosystem Dashboards", "anchor": "accessing-polkadot-ecosystem-dashboards", "start_char": 1, "end_char": 980, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:855e85c40d389295d1c23adbc42cb02da3e2b7d83185e803dcee622d129d4dd9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Accessing Polkadot Ecosystem Dashboards\n\nThe Parity Data Team has made publicly available a [website](https://dashboards.data.paritytech.io/)\nthat displays a number of dashboards relating to Polkadot Ecosystem On-Chain data. The graphs\nprovided are grouped into the following sections:\n\n- [Stablecoins](https://dashboards.data.paritytech.io/stablecoins.html) - metrics around stablecoins\n  in Polkadot AssetHub.\n- [Treasury](https://dashboards.data.paritytech.io/treasuries.html) - metrics around treasuries in\n  the ecosystem.\n- [Staking](https://dashboards.data.paritytech.io/staking.html) - metrics pertaining to staking,\n  nomination pools and more.\n- [Ecosystem](https://dashboards.data.paritytech.io/parachains.html) - high level activity metrics\n  for parachains.\n- [Monthly Report](https://dashboards.data.paritytech.io/eoyr.html) - an updated version of the\n  [Polkadot in Numbers: Annual Report 2023](https://dashboards.data.paritytech.io/reports/2023/index.html)."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-parity-data-dashboards", "url": "https://developer.polkadot.com/wiki/general/dashboards/parity-data-dashboards/#notes-on-how-to-use-the-interactive-charts", "page_title": "Parity Data Dashboards", "index": 1, "depth": 2, "title": "Notes on How to Use the Interactive Charts", "anchor": "notes-on-how-to-use-the-interactive-charts", "start_char": 980, "end_char": 2592, "estimated_token_count": 371, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:855e85c40d389295d1c23adbc42cb02da3e2b7d83185e803dcee622d129d4dd9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Notes on How to Use the Interactive Charts\n\nThe [Ecosystem Tab](https://dashboards.data.paritytech.io/parachains.html) shows a number of\nuniversally applicable metrics (Active Accounts, Unique Accounts, Transactions, Events) across both\nPolkadot & Kusama parachains. Users can select whether they want to view:\n\n- Polkadot or Kusama\n- Daily or monthly figures\n- Substrate Only, EVM Only or Substrate + EVM numbers.\n\nThe default view is set to Polkadot,Monthly, Substrate + EVM.\n\n![Default Selection](../../assets/parity-data-dashboards/ecosystem-chart-default-selection.png)\n\nHere is an example of selecting Polkadot, Daily, Substrate Only for Transactions.\n\n![Daily Substrate Transactions Selection](../../assets/parity-data-dashboards/ecosystem-polkadot-daily-substrate-transactions-selection.png)\n\nUsers can also specify which chains they would like to view metrics for. The default view is set to\nthe entire Relay & Parachain grouping. Below is an example of selecting data for only Polkadot\nRelay, Moonbeam and Nodle chains. Users can hit invert selection for convenience to de-select all\noptions before selecting their desired chains.\n\n![Chain Selection](../../assets/parity-data-dashboards/ecosystem-chain-selection-example.png)\n\nAlso, for all graphs on the website, in the top right users can toggle between chart types: choosing\nbar, line or stacked and a combination of those. See below for an example from the\n[Stablecoins](https://dashboards.data.paritytech.io/stablecoins.html) tab.\n\n![Stablecoin USDC Example](../../assets/parity-data-dashboards/stablecoins-usdc-toggle-chart-type-example.png)"}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-parity-data-dashboards", "url": "https://developer.polkadot.com/wiki/general/dashboards/parity-data-dashboards/#where-the-data-comes-from", "page_title": "Parity Data Dashboards", "index": 2, "depth": 2, "title": "Where the Data Comes From", "anchor": "where-the-data-comes-from", "start_char": 2592, "end_char": 4439, "estimated_token_count": 379, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:855e85c40d389295d1c23adbc42cb02da3e2b7d83185e803dcee622d129d4dd9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where the Data Comes From\n\nThe data displayed on the website comes from DotLake, which is a scalable and cost-efficient data\nplatform built on Google Cloud Platform (GCP) by the Data Team at\n[Parity Technologies](https://www.parity.io/). It's designed to store all blocks, events,\nextrinsics, and more for all the chains in the Polkadot ecosystem. The platform uses a range of\nexisting technologies, keeping the architecture simple with low operational overhead. This includes\ntools like Terraform, the Substrate Sidecar, Rust & Python programming languages, and various GCP\nservices like Cloud Storage, BigQuery, Cloud Run & Jobs, and Workflows & Functions.\n\nThe approach allows the processing of data from block number N to M, storing the raw results as JSON\nin Google Cloud Storage. This method not only provides a convenient abstraction, but also avoids the\npitfalls of custom block parsing strategies in the ever-evolving Substrate Framework. The key to the\nplatform's efficiency is the Block Compressor, which optimizes and reduces the data size\nsignificantly, making it more manageable for analytical purposes.\n\nDotLake has evolved from its origins as a data warehouse built to serve Parity's internal data\nneeds. Since then, the scope has been broadened to share data initiatives and learnings with the\nwider community. The plan is to progressively make datasets available to the public, alongside\ndashboards, metrics, code, and best practices employed to ingest and decode Substrate data.\n\nDotLake consists of Polkadot, Kusama, solo-chains and test-nets with their full\nhistory and is continuously expanding.\n\n**DotLake Batch Architecture**\n\n![DotLake Batch Architecture](../../assets/parity-data-dashboards/dotlake-batch.png)\n\n**Real-Time Architecture**\n\n![Real-Time Architecture](../../assets/parity-data-dashboards/dotlake-rt.png)"}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-parity-data-dashboards", "url": "https://developer.polkadot.com/wiki/general/dashboards/parity-data-dashboards/#support-data-requests-collaborations-parachain-onboarding-etc", "page_title": "Parity Data Dashboards", "index": 3, "depth": 2, "title": "Support: Data Requests, Collaborations, Parachain Onboarding etc.", "anchor": "support-data-requests-collaborations-parachain-onboarding-etc", "start_char": 4439, "end_char": 4793, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:855e85c40d389295d1c23adbc42cb02da3e2b7d83185e803dcee622d129d4dd9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Support: Data Requests, Collaborations, Parachain Onboarding etc.\n\nThe Parity Data Team is very eager to collaborate with the Ecosystem. If you have any questions,\ndata requests that you need help with, interest in partnerships or you are a Parachain team and want\nyour chain onboarded to the platform - please get in contact with data-team@parity.io."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#preliminary-notes", "page_title": "Polkadot Staking Dashboard", "index": 0, "depth": 2, "title": "Preliminary Notes", "anchor": "preliminary-notes", "start_char": 1, "end_char": 1434, "estimated_token_count": 415, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Preliminary Notes\n\nThe [Polkadot Staking Dashboard](https://staking.polkadot.cloud/#/overview) supports\n[**proxy accounts**](../../learn/learn-proxies.md) and you can import your\n[staking proxy](../../learn/learn-staking-advanced.md#staking-proxies) (for nominators) or\n[non-transfer proxy](../../learn/learn-proxies.md#proxy-types) (for nomination pool admins and members).\n\nThe dashboard also has **native [Ledger](../ledger.md) support**, meaning that you do not need an\nextension or a wallet to use it; you just need your Ledger device.\n[Metadata updates](../../learn/learn-guides-transfers.md#metadata-updates-with-the-polkadot-developer-signer)\nare thus not necessary, as you only need to keep your Ledger apps up-to-date.\n\nBefore using the dashboard, make sure you have a wallet or extension with a funded account. Note\nthat accounts on wallets or extensions can be imported from [Ledger](../ledger.md) or\n[Polkadot Vault](../polkadot-vault.md).\n\nOn top of the [existential deposit](../../learn/learn-accounts.md#existential-deposit-and-reaping), you\nneed some free balance to pay for\n[transaction fees](../../learn/learn-transactions.md#transaction-fees) and\n[the minimum amount to place your nominations or join a nomination pool](../chain-state-values.md).\nFor more information about staking visit the [staking page](../../learn/learn-staking.md) and the\n[advanced staking page](../../learn/learn-staking-advanced.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#using-the-polkadot-staking-dashboard", "page_title": "Polkadot Staking Dashboard", "index": 1, "depth": 2, "title": "Using the Polkadot Staking Dashboard", "anchor": "using-the-polkadot-staking-dashboard", "start_char": 1434, "end_char": 3762, "estimated_token_count": 573, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Using the Polkadot Staking Dashboard\n\nThe [Polkadot Staking Dashboard](https://staking.polkadot.cloud/#/overview) is a tool only dedicated\nto [staking](../../learn/learn-staking.md) on Polkadot, [Kusama](../../learn/learn-comparisons-kusama.md)\n(Polkadot's canary network) and [Westend](../../learn/learn-DOT.md#obtaining-testnet-tokens) (Polkadot's test network).\n\nThe dashboard is not a wallet, meaning that you cannot transfer funds between accounts. To fund\naccounts, you can use wallets and extension. You can participate in\nstaking by being a [nominator](../../learn/learn-nominator.md) or a member of a\n[nomination pool](../../learn/learn-nomination-pools.md). Once you have a funded account, you need to\nconnect it to the dashboard (connect button on the top-right corner), this will allow you to interact with native staking.\n\n!!!info \"The dashboard is a Web3 dApp\"\n    The dashboard is a decentralized application (dApp), and to login you do not need to sign up with an\n    email and password but just need an account created on the supported non-custodial wallets. Any\n    transaction to be submitted needs to be signed by you. Also, if you use light clients, which are\n    resistant to censorship, you interact trustlessly with the network without intermediaries. Welcome\n    to the world of [true Web3](../web3-and-polkadot.md)!\n\nNote the pictures on this page refer to Kusama, but the same applies to Polkadot and Westend.\n\nThe structure of this page follows the sidebar of the staking dashboard. Here you will learn about\nthe main features of the dashboard. If you need more information, see the\n[Walkthrough Tutorial](https://youtu.be/hvXLc4H7rA4).\n\n!!!info \"Walk-through Video Tutorials\"\n    - [**Nominating**](https://youtu.be/F59N3YKYCRs): Stake your tokens, choose your best validators,\n    and start your staking journey.\n    - [**Becoming a Pool Member**](https://youtu.be/dDIG7QAApig): Start becoming a part of the Polkadot\n    movement, keep the network secure by staking minimum 1 DOT and receiving staking rewards.\n    - [**Dashboard Walkthrough**](https://youtu.be/hvXLc4H7rA4): Become a Pro using the Staking\n    Dashboard.\n    - [**After Staking**](https://youtu.be/58pIe8tt2o4): Nominating is not a set-and-forget action,\n    learn what you can do with the dashboard after you started staking."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#overview", "page_title": "Polkadot Staking Dashboard", "index": 2, "depth": 2, "title": "Overview", "anchor": "overview", "start_char": 3762, "end_char": 6948, "estimated_token_count": 753, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Overview\n\n!!!info \"Staking Dashboard Walk-through video tutorial\"\n    [This video tutorial](https://youtu.be/hvXLc4H7rA4) shows you everything you can do with the Staking\n    Dashboard.\n\n![dashboard overview](../../assets/dashboard-overview.png)\n\nThis page of the dashboard has six main panels:\n\n- **Section A: The Sidebar** shows which page you are on (in this case, the Overview). It will also\n  show the role you have in staking (in this case, active in both [Pools](#pools) and\n  [Nominate](#nominate)). You can also change the [network](#network) (currently on Kusama).\n\n- **Section B: The Accounts Panel** allows you to connect one account to the dashboard. Once\n  connected, the account will appear next to the `Accounts` button. You can see it here if you are\n  active as a nominator and/or a pool member. In this case, the account KSM Stash is a nominator and\n  a member of the pool Insight Finance. Proxy accounts are also shown here if applicable. Note that\n  the dashboard will automatically fetch the stash and the proxy.\n\nNote that Sections A and B will always be visible while you use the dashboard.\n\n- **Section C: The Stats Panel** shows the general view of current staking metrics, including the historical reward rate (including after\n  [inflation](../../learn/learn-DOT.md#dot-inflation)), the supply staked and time remaining\n  in the current era.\n\n- **Section D: The Summary Panel** shows your current situation and gives you general tips about\n  staking. In this case, the KSM Stash account is a nominator and a pool member, and by clicking on\n  `Manage >` you can go directly to the [Nominate](#nominate) and [Pools](#pools) pages,\n  respectively. You can take actions such as changing staking preferences, bonding more funds, etc.\n\n- **Section E: The Balance Panel** shows the bonded amount distinguishing between \"Nominating\", \"In\n  a Pool\", and \"Not Staking\". The amount that is not staking is further divided into \"Free\" (a\n  balance that can be transferred) and \"Reserve\" (a balance that is needed the keep the account\n  on-chain, see [existential deposit](../../learn/learn-accounts.md#existential-deposit-and-reaping)).\n  In this case, 0.301 KSM are bonded for nominating, 0.3 KSM are bonded in a pool, and 0.145 KSM are\n  not used for staking. Of the non-staking balance, 0.144 KSM are free while\n  [a small portion is reserved for the existential deposit](../chain-state-values.md).\n\n- **Section F: The Recent Payouts Panel** shows a bar chart with the rewards paid out to you in the\n  past 15 days either as a nominator or a pool member (manually claimed). Note how the 4th of April\n  bar has the tip that is not filled with color. This is to show a pending payout (for nominators\n  only). Below the bar chart is a line chart showing the 10-day moving average.\n\nAdditional statistics can be found at the bottom of the overview page.\n\n!!!info \"Pool funds are in system accounts\"\n    Remember that funds bonded in a pool are transferred to the pool's system account, which can only be\n    accessed by the protocol, and not by any individual user. Some wallets might not display the balance\n    bonded in pools, but the dashboard will always show it."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#stake", "page_title": "Polkadot Staking Dashboard", "index": 3, "depth": 2, "title": "Stake", "anchor": "stake", "start_char": 6948, "end_char": 7182, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Stake\n\nIn this category, you can access all functionalities allowing you to stake your tokens as a\nnominator, member of a nomination pool, or both. The payout section will enable you to inspect the\nmost recently received rewards."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#pools", "page_title": "Polkadot Staking Dashboard", "index": 4, "depth": 3, "title": "Pools", "anchor": "pools", "start_char": 7182, "end_char": 12223, "estimated_token_count": 1191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Pools\n\n!!!info \"Joining a Nomination Pool - Walk-through video tutorial\"\n    [This video tutorial](https://youtu.be/dDIG7QAApig) shows you how to join a [nomination pool](../../learn/learn-nomination-pools.md) with the Staking Dashboard. You can also read the [dashboard documentation on joining a pool](https://docs.staking.polkadot.cloud/en/nomination-pools#joining-a-pool).\n\n![dashboard pools](../../assets/dashboard-pools.png)\n\nThis page of the dashboard has four main panels (Sidebar and Accounts Panels excluded):\n\n- **Section A: The Stats Panel** shows the number of active pools and the minimum number of tokens\n  needed to join a pool and/or create one.\n- **Section B: The Balance Panel** shows the number of tokens bonded in pools and those that are\n  free. In this case, we have 0.3 KSM bonded and 0.144 KSM free. In this panel, you can bond more\n  funds (`+` button) or unbond some funds (`-` button). Unbonding will withdraw unclaimed rewards\n  and funds will be locked for the [unbonding period](../chain-state-values.md).\n  Once the unbonding period has passed, you can unlock the locked funds (button with a lock icon)\n  that will be available as a free balance.\n\n- **Section C: The Pool Panel** shows the pool id where you have membership (in this case, Pool 82),\n  the pool name, and next to it, a `Manage` button that will allow to choose between different\n  options:\n\n    - Update Claim Permissions: you can allow other pool members to compound your rewards, withdraw your rewards as a free balance, or both. More details about nomination pools and updating claim permissions can be found on the [dedicated wiki page](../../learn/learn-nomination-pools.md#claim-permissions).\n\n    ![dashboard-permissionlessPoolClaims](../../assets/dashboard-permissionlessPoolClaims.png)\n\n    !!!info\n        For more information about how to update your claim permissions with the staking dashboard, see the [dashboard documentation](https://docs.staking.polkadot.cloud/en/nomination-pools#claim-permission).\n\n    - Leave the pool and unbond all the funds in the pool.\n\n    If you are a pool admin you will be able to see the additional options:\n\n    - Claim Commission: you can claim pool commissions to an account specified under Manage Commission\n    (below).\n    - Manage Commission: you can manage the pool commission rate, maximum commission, maximum change\n    rate, and minimum time delay between commission updates. More details about nomination pools and\n    managing pool commissions can be found on the\n    [dedicated wiki page](../../learn/learn-nomination-pools.md#pool-commissions).\n\n    ![dashboard-manage-commission](../../assets/dashboard-managePoolCommission.png)\n\n    !!!info\n        For more information about how to manage commission of your nomination pool with the staking dashboard, see the [dashboard documentation](https://docs.staking.polkadot.cloud/en/nomination-pools#commission-root-only).\n\n    - Rename Pool: you can change the pool's name.\n    - Lock Pool: you can lock the pool so that new members are not allowed.\n    - Destroy Pool: you can destroy the pool. See\n    [this wiki page](../../learn/learn-guides-staking-pools.md#pool-destruction-with-polkadot-js) and\n    the [dashboard documentation](https://docs.staking.polkadot.cloud/en/nomination-pools#change-pool-state-root-or-bouncer) for more information.\n\n    You can see any unclaimed rewards in the middle of the panel. You can claim and bond the rewards (`+ Compound` button) or withdraw them as a free balance (`Withdraw` button). In this case, there are approximately 0.0012 KSM that can be claimed. You can see the Pool Status at the bottom of the panel, currently set to \"Nominating and Earning Rewards\".\n\n    Note that if it is the first time you log in to the dashboard, you will see two buttons `Create` and `Join`, instead of `Manage`. For more information about how to create a nomination pool, see the [dashboard documentation](https://docs.staking.polkadot.cloud/en/nomination-pools#creating-a-pool-5-step-wizard).\n\n- **Section D: The Pool Nominations Panel** shows the nominations of the pool you are currently in,\n  highlighting the validator that is active and will pay rewards to the pool at the end of the era\n  (in this case `ParaNodes.io/11`).\n\nIf you scroll down the page, there are two additional panels:\n\n- **Roles** showing the accounts of the pool's Depositor, Root, Nominator, and Bouncer. The same\n  account can cover all the roles.\n- **Pool Stats** showing the Pool State (either Active, Closed, or Destroying), Pool Members (number\n  of members in the pool), and Total Bonded (total number of bonded tokens).\n\nThe Pools page is divided into four parts: the Overview is basically what we talked about until now,\nthe Members section will show all accounts of the pool members, the All Pools section will show all\npools (you can filter Active, Locked, and Destroying pools), and the Favorites section shows all\npools that you liked (you can like a pool in the All Pools section by clicking on the heart icons)."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#nominate", "page_title": "Polkadot Staking Dashboard", "index": 5, "depth": 3, "title": "Nominate", "anchor": "nominate", "start_char": 12223, "end_char": 14344, "estimated_token_count": 506, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Nominate\n\n!!!info \"Walk-through video tutorial of How to Nominate\"\n    [This video tutorial](https://youtu.be/F59N3YKYCRs) shows you how to become a nominator with the\n    Staking Dashboard.\n\n![dashboard nominate](../../assets/dashboard-nominate.png)\n\nThis page of the dashboard has four main panels (Sidebar and Accounts Panels excluded):\n\n- **Section A: The Stats Panel** shows the number of active nominators,\n  [the minimum number of tokens to nominate](../chain-state-values.md)\n  and [the minimum active bond](../chain-state-values.md). The system keeps 12500\n  nomination intents and puts them into the\n  [bags list](../../learn/learn-staking-advanced.md#bags-list). The fact that active nominators are not\n  12500 is because there are nominators that have no active validator.\n- **Section B: The Balance Panel** shows the number of tokens bonded in nominations and those that\n  are free. In this case, we have 0.301 KSM bonded and 0.144 KSM free. In this panel, you can bond\n  more funds (`+` button) or unbond some funds (`-` button). Unbonding will withdraw unclaimed\n  rewards and funds will be locked for the\n  [unbonding period](../chain-state-values.md). Once the unbonding period has\n  passed, you can unlock the locked funds (button with a lock icon) that will be available as a free\n  balance.\n\n- **Section C: The Nominator Panel** shows the current status of the nominator, currently set to\n  \"Nominating and Earning Rewards\", and next to it, the `Unstake` button allows you to unstake the\n  whole bonded amount and stop nominating. In the middle of the panel, the payout destination is\n  currently set to \"Compounding\" (i.e. rewards are added to the bonded funds). The `Update` button\n  will allow you to change the destination to \"To Your Account\" (to the stash account as a free\n  balance), \"To Another Account\" (an account that is not the stash), or \"None\" (no payout\n  destination).\n- **Section D: The Nominations panel** shows your nominations and allows you to stop all nomination\n  with the `Stop` button or to select specific validators (`Select` button) and stop nominating only\n  those."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#payouts", "page_title": "Polkadot Staking Dashboard", "index": 6, "depth": 3, "title": "Payouts", "anchor": "payouts", "start_char": 14344, "end_char": 14553, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Payouts\n\nThis page is an expanded version of Panel F on the [Overview](#overview) page. It also shows all\nvalidators and/or nomination pools that paid out rewards to your accounts in the past few months."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#after-staking", "page_title": "Polkadot Staking Dashboard", "index": 7, "depth": 3, "title": "After Staking", "anchor": "after-staking", "start_char": 14553, "end_char": 14773, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### After Staking\n\n!!!info \"Walk-through video tutorial - What to do after Staking\"\n    [This video tutorial](https://youtu.be/F59N3YKYCRs) shows you how to what you can do after staking\n    with the Staking Dashboard."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#validators", "page_title": "Polkadot Staking Dashboard", "index": 8, "depth": 2, "title": "Validators", "anchor": "validators", "start_char": 14773, "end_char": 16890, "estimated_token_count": 475, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Validators\n\n![dashboard nominate](../../assets/dashboard-validators.png)\n\nThis page of the dashboard has two main panels (Sidebar and Accounts Panels excluded):\n\n- **Panel A: The Stats Panel** shows the total number of active validators, all validators currently\n  registered (active and inactive), and average commission across all validators.\n- **Panel B: The Validators Panel** shows all validators. They can be ordered by either \"Performance\"\n  or \"Commission\" (low/high), or filtered by the following criteria:\n  - Include only active validators (excludes validators that are waiting, i.e. not in the current\n    [active set](../../learn/learn-validator.md)). A new set is selected every era, so an active\n    validator is not guaranteed to remain active in future eras.\n  - Exclude validators with 100% commission (nominating these yields no staking rewards).\n  - Exclude validators with blocked nominations (attempting to nominate them causes the transaction\n    to fail, even when nominating others alongside them).\n  - Exclude validators with a missing [on-chain identity](../../learn/learn-identity.md).\n\nFor each validator, the panel displays: the account icon and address (replaced by the on-chain\nidentity when set, which may or may not be verified by a [registrar](../../learn/learn-identity.md#registrars));\na small graph of the validator's 30-day performance; a copy icon for its public address; a heart icon\nto add or remove it from the Favorites tab; and a metrics icon that opens detailed statistics such as\nself stake, recent performance, and reward history. Also shown are the estimated Annual Percentage\nYield (APY), the \"Top x%\" ranking (displayed when the validator is among the top performers over the\nlast 30 days), the commission rate (from 0% to 100%), and the status in the current validator set\n(active or waiting, with the total stake shown for active validators).\n\nThe Validators page also includes a **Favorites** tab, which lists the validators marked with the\nheart icon. These can be quickly selected when [nominating](#nominate), and removed by toggling the\nheart icon again."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#support", "page_title": "Polkadot Staking Dashboard", "index": 9, "depth": 2, "title": "Support", "anchor": "support", "start_char": 16890, "end_char": 17019, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Support\n\nSupport for the Staking Dashboard is available at\n[the official Polkadot support website](../../../get-support.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-dashboards-staking-dashboard", "url": "https://developer.polkadot.com/wiki/general/dashboards/staking-dashboard/#network", "page_title": "Polkadot Staking Dashboard", "index": 10, "depth": 2, "title": "Network", "anchor": "network", "start_char": 17019, "end_char": 17282, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8c91072305aaad1d7f7c3f27aeb194c83415f9633c39c3e2ef2005f249e7100b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Network\n\nUnder Network, you can connect to either Polkadot, Kusama, or Westend through public RPC nodes or\nlight clients for a true Web3 experience. For more information about light clients, see [this page](../web3-and-polkadot.md#decentralized-access-points)."}
{"source": "polkadot-docs", "page_id": "wiki-general-ecosystem-funds", "url": "https://developer.polkadot.com/wiki/general/ecosystem-funds/#scytale-digital", "page_title": "Polkadot Ecosystem Development Funds", "index": 0, "depth": 2, "title": "Scytale Digital", "anchor": "scytale-digital", "start_char": 269, "end_char": 1075, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b97fa3568a87c6ee6e349c2fd7ef8157ebf38b3ed6148f694ceefc00a125b2fb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Scytale Digital\n\n[The Polkadot Ecosystem Fund](https://www.scytale.digital/blog-posts/scytale-polkadot-ecosystem-fund)\nby Scytale is going to be a venture initiative focused on strategically investing in and supporting\nprojects within the Polkadot and Kusama ecosystems. With over USD 75 million in assets under\nmanagement, Scytale has built a portfolio of over 20 projects spanning three continents. The fund\nwill provide early-stage ventures with mentorship, liquidity, and access to a network of strategic\npartners. Through its rigorous due diligence process, it selects only the most promising projects.\nThe fund’s value proposition includes offering technical advisory, KPI, and OKR oversight, and\nfostering active ecosystem participation, ensuring sustainable growth for its portfolio companies."}
{"source": "polkadot-docs", "page_id": "wiki-general-ecosystem-funds", "url": "https://developer.polkadot.com/wiki/general/ecosystem-funds/#harbour-industrial-capital", "page_title": "Polkadot Ecosystem Development Funds", "index": 1, "depth": 2, "title": "Harbour Industrial Capital", "anchor": "harbour-industrial-capital", "start_char": 1075, "end_char": 1563, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b97fa3568a87c6ee6e349c2fd7ef8157ebf38b3ed6148f694ceefc00a125b2fb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Harbour Industrial Capital\n\n[Harbour Industrial Capital (HIC)](https://www.harbourindustrial.com/) is a Polkadot-focused VC fund\nmanaged by [Max Rebol](https://www.linkedin.com/in/maxrebol/) and\n[Mario Altenburger](https://www.linkedin.com/in/marioaltenburger/). The fund launched in early 2022,\nheld its final closing at the end of 2023, and, as of 2024, reached an AUM of ~US$10m. LPs are\nprimarily family offices and institutional investors from Asia, Europe, and the Middle East."}
{"source": "polkadot-docs", "page_id": "wiki-general-ecosystem-funds", "url": "https://developer.polkadot.com/wiki/general/ecosystem-funds/#contact-for-projects", "page_title": "Polkadot Ecosystem Development Funds", "index": 2, "depth": 3, "title": "Contact for Projects", "anchor": "contact-for-projects", "start_char": 1563, "end_char": 1798, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b97fa3568a87c6ee6e349c2fd7ef8157ebf38b3ed6148f694ceefc00a125b2fb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Contact for Projects\n\nProjects building on Polkadot that want to raise investment from HIC can contact\ninfo@harbourindustrial.com. Please note that projects building in different ecosystems will be\noutside HIC’s investment scope."}
{"source": "polkadot-docs", "page_id": "wiki-general-ecosystem-funds", "url": "https://developer.polkadot.com/wiki/general/ecosystem-funds/#legal-disclaimer", "page_title": "Polkadot Ecosystem Development Funds", "index": 3, "depth": 2, "title": "Legal Disclaimer", "anchor": "legal-disclaimer", "start_char": 1798, "end_char": 2737, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b97fa3568a87c6ee6e349c2fd7ef8157ebf38b3ed6148f694ceefc00a125b2fb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Legal Disclaimer\n\nThe information provided herein is for informational purposes only and should not be construed as an\nendorsement, recommendation, or advice regarding any specific products, services, or investment\nfunds. Web 3.0 Technologies Foundation (“W3F”) does not make any representations or warranties,\neither express or implied, regarding the suitability, performance, or potential outcomes of any\nproducts referenced.\n\nNothing contained in this communication constitutes financial, legal, or investment advice, nor does\nit take into account your specific objectives, financial situation, or needs. Decisions based on the\ninformation provided are your responsibility, and W3F strongly advises that you seek professional\nadvice from licensed financial, legal, or other relevant experts before making any decisions. W3F\ndisclaims any liability for any loss or damage that may arise from your reliance on the information\nprovided."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#alliance", "page_title": "Extrinsics", "index": 0, "depth": 2, "title": "alliance", "anchor": "alliance", "start_char": 460, "end_char": 474, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## alliance"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#abdicatefellowstatus", "page_title": "Extrinsics", "index": 1, "depth": 3, "title": "abdicateFellowStatus()", "anchor": "abdicatefellowstatus", "start_char": 474, "end_char": 778, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### abdicateFellowStatus()\n- **interface**: `api.tx.alliance.abdicateFellowStatus`\n- **summary**:    Abdicate one's position as a voting member and just be an Ally. May be used by Fellows  who do not want to leave the Alliance but do not have the capacity to participate  operationally for some time."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#addunscrupulousitemsitems-vecpalletallianceunscrupulousitem", "page_title": "Extrinsics", "index": 2, "depth": 3, "title": "addUnscrupulousItems(items: `Vec<PalletAllianceUnscrupulousItem>`)", "anchor": "addunscrupulousitemsitems-vecpalletallianceunscrupulousitem", "start_char": 778, "end_char": 986, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### addUnscrupulousItems(items: `Vec<PalletAllianceUnscrupulousItem>`)\n- **interface**: `api.tx.alliance.addUnscrupulousItems`\n- **summary**:    Add accounts or websites to the list of unscrupulous items."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#announceannouncement-palletalliancecid", "page_title": "Extrinsics", "index": 3, "depth": 3, "title": "announce(announcement: `PalletAllianceCid`)", "anchor": "announceannouncement-palletalliancecid", "start_char": 986, "end_char": 1161, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### announce(announcement: `PalletAllianceCid`)\n- **interface**: `api.tx.alliance.announce`\n- **summary**:    Make an announcement of a new IPFS CID about alliance issues."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#closeproposal_hash-h256-index-compactu32-proposal_weight_bound-spweightsweightv2weight-length_bound-compactu32", "page_title": "Extrinsics", "index": 4, "depth": 3, "title": "close(proposal_hash: `H256`, index: `Compact<u32>`, proposal_weight_bound: `SpWeightsWeightV2Weight`, length_bound: `Compact<u32>`)", "anchor": "closeproposal_hash-h256-index-compactu32-proposal_weight_bound-spweightsweightv2weight-length_bound-compactu32", "start_char": 1161, "end_char": 1477, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### close(proposal_hash: `H256`, index: `Compact<u32>`, proposal_weight_bound: `SpWeightsWeightV2Weight`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.alliance.close`\n- **summary**:    Close a vote that is either approved, disapproved, or whose voting period has ended. \n\n   Must be called by a Fellow."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#disbandwitness-palletalliancedisbandwitness", "page_title": "Extrinsics", "index": 5, "depth": 3, "title": "disband(witness: `PalletAllianceDisbandWitness`)", "anchor": "disbandwitness-palletalliancedisbandwitness", "start_char": 1477, "end_char": 1697, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### disband(witness: `PalletAllianceDisbandWitness`)\n- **interface**: `api.tx.alliance.disband`\n- **summary**:    Disband the Alliance, remove all active members and unreserve deposits. \n\n   Witness data must be set."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#elevateallyally-multiaddress", "page_title": "Extrinsics", "index": 6, "depth": 3, "title": "elevateAlly(ally: `MultiAddress`)", "anchor": "elevateallyally-multiaddress", "start_char": 1697, "end_char": 1830, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### elevateAlly(ally: `MultiAddress`)\n- **interface**: `api.tx.alliance.elevateAlly`\n- **summary**:    Elevate an Ally to Fellow."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#giveretirementnotice", "page_title": "Extrinsics", "index": 7, "depth": 3, "title": "giveRetirementNotice()", "anchor": "giveretirementnotice", "start_char": 1830, "end_char": 2040, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### giveRetirementNotice()\n- **interface**: `api.tx.alliance.giveRetirementNotice`\n- **summary**:    As a member, give a retirement notice and start a retirement period required to pass in  order to retire."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#initmembersfellows-vecaccountid32-allies-vecaccountid32", "page_title": "Extrinsics", "index": 8, "depth": 3, "title": "initMembers(fellows: `Vec<AccountId32>`, allies: `Vec<AccountId32>`)", "anchor": "initmembersfellows-vecaccountid32-allies-vecaccountid32", "start_char": 2040, "end_char": 2356, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### initMembers(fellows: `Vec<AccountId32>`, allies: `Vec<AccountId32>`)\n- **interface**: `api.tx.alliance.initMembers`\n- **summary**:    Initialize the Alliance, onboard fellows and allies. \n\n   The Alliance must be empty, and the call must provide some founding members. \n\n   Must be called by the Root origin."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#joinalliance", "page_title": "Extrinsics", "index": 9, "depth": 3, "title": "joinAlliance()", "anchor": "joinalliance", "start_char": 2356, "end_char": 2503, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### joinAlliance()\n- **interface**: `api.tx.alliance.joinAlliance`\n- **summary**:    Submit oneself for candidacy. A fixed deposit is reserved."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#kickmemberwho-multiaddress", "page_title": "Extrinsics", "index": 10, "depth": 3, "title": "kickMember(who: `MultiAddress`)", "anchor": "kickmemberwho-multiaddress", "start_char": 2503, "end_char": 2661, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### kickMember(who: `MultiAddress`)\n- **interface**: `api.tx.alliance.kickMember`\n- **summary**:    Kick a member from the Alliance and slash its deposit."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#nominateallywho-multiaddress", "page_title": "Extrinsics", "index": 11, "depth": 3, "title": "nominateAlly(who: `MultiAddress`)", "anchor": "nominateallywho-multiaddress", "start_char": 2661, "end_char": 2892, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### nominateAlly(who: `MultiAddress`)\n- **interface**: `api.tx.alliance.nominateAlly`\n- **summary**:    A Fellow can nominate someone to join the alliance as an Ally. There is no deposit  required from the nominator or nominee."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#proposethreshold-compactu32-proposal-call-length_bound-compactu32", "page_title": "Extrinsics", "index": 12, "depth": 3, "title": "propose(threshold: `Compact<u32>`, proposal: `Call`, length_bound: `Compact<u32>`)", "anchor": "proposethreshold-compactu32-proposal-call-length_bound-compactu32", "start_char": 2892, "end_char": 3111, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### propose(threshold: `Compact<u32>`, proposal: `Call`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.alliance.propose`\n- **summary**:    Add a new proposal to be voted on. \n\n   Must be called by a Fellow."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeannouncementannouncement-palletalliancecid", "page_title": "Extrinsics", "index": 13, "depth": 3, "title": "removeAnnouncement(announcement: `PalletAllianceCid`)", "anchor": "removeannouncementannouncement-palletalliancecid", "start_char": 3111, "end_char": 3268, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeAnnouncement(announcement: `PalletAllianceCid`)\n- **interface**: `api.tx.alliance.removeAnnouncement`\n- **summary**:    Remove an announcement."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeunscrupulousitemsitems-vecpalletallianceunscrupulousitem", "page_title": "Extrinsics", "index": 14, "depth": 3, "title": "removeUnscrupulousItems(items: `Vec<PalletAllianceUnscrupulousItem>`)", "anchor": "removeunscrupulousitemsitems-vecpalletallianceunscrupulousitem", "start_char": 3268, "end_char": 3462, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeUnscrupulousItems(items: `Vec<PalletAllianceUnscrupulousItem>`)\n- **interface**: `api.tx.alliance.removeUnscrupulousItems`\n- **summary**:    Deem some items no longer unscrupulous."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#retire", "page_title": "Extrinsics", "index": 15, "depth": 3, "title": "retire()", "anchor": "retire", "start_char": 3462, "end_char": 3716, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### retire()\n- **interface**: `api.tx.alliance.retire`\n- **summary**:    As a member, retire from the Alliance and unreserve the deposit. \n\n   This can only be done once you have called `give_retirement_notice` and the  `RetirementPeriod` has passed."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setrulerule-palletalliancecid", "page_title": "Extrinsics", "index": 16, "depth": 3, "title": "setRule(rule: `PalletAllianceCid`)", "anchor": "setrulerule-palletalliancecid", "start_char": 3716, "end_char": 3860, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setRule(rule: `PalletAllianceCid`)\n- **interface**: `api.tx.alliance.setRule`\n- **summary**:    Set a new IPFS CID to the alliance rule."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#voteproposal-h256-index-compactu32-approve-bool", "page_title": "Extrinsics", "index": 17, "depth": 3, "title": "vote(proposal: `H256`, index: `Compact<u32>`, approve: `bool`)", "anchor": "voteproposal-h256-index-compactu32-approve-bool", "start_char": 3860, "end_char": 4087, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### vote(proposal: `H256`, index: `Compact<u32>`, approve: `bool`)\n- **interface**: `api.tx.alliance.vote`\n- **summary**:    Add an aye or nay vote for the sender to the given proposal. \n\n   Must be called by a Fellow. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#alliancemotion", "page_title": "Extrinsics", "index": 18, "depth": 2, "title": "allianceMotion", "anchor": "alliancemotion", "start_char": 4087, "end_char": 4107, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## allianceMotion"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#closeproposal_hash-h256-index-compactu32-proposal_weight_bound-spweightsweightv2weight-length_bound-compactu32_1", "page_title": "Extrinsics", "index": 19, "depth": 3, "title": "close(proposal_hash: `H256`, index: `Compact<u32>`, proposal_weight_bound: `SpWeightsWeightV2Weight`, length_bound: `Compact<u32>`)", "anchor": "closeproposal_hash-h256-index-compactu32-proposal_weight_bound-spweightsweightv2weight-length_bound-compactu32_1", "start_char": 4107, "end_char": 5507, "estimated_token_count": 320, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### close(proposal_hash: `H256`, index: `Compact<u32>`, proposal_weight_bound: `SpWeightsWeightV2Weight`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.allianceMotion.close`\n- **summary**:    Close a vote that is either approved, disapproved or whose voting period has ended. \n\n   May be called by any signed account in order to finish voting and close the proposal. \n\n   If called before the end of the voting period it will only close the vote if it is  has enough votes to be approved or disapproved. \n\n   If called after the end of the voting period abstentions are counted as rejections  unless there is a prime member set and the prime member cast an approval. \n\n   If the close operation completes successfully with disapproval, the transaction fee will  be waived. Otherwise execution of the approved operation will be charged to the caller. \n\n   + `proposal_weight_bound`: The maximum amount of weight consumed by executing the closed  proposal.  + `length_bound`: The upper bound for the length of the proposal in storage. Checked via  `storage::read` so it is `size_of::<u32>() == 4` larger than the pure length. \n\n   #### Complexity \n\n  - `O(B + M + P1 + P2)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` is members-count (code- and governance-bounded)\n\n  - `P1` is the complexity of `proposal` preimage.\n\n  - `P2` is proposal-count (code-bounded)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#disapproveproposalproposal_hash-h256", "page_title": "Extrinsics", "index": 20, "depth": 3, "title": "disapproveProposal(proposal_hash: `H256`)", "anchor": "disapproveproposalproposal_hash-h256", "start_char": 5507, "end_char": 5927, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### disapproveProposal(proposal_hash: `H256`)\n- **interface**: `api.tx.allianceMotion.disapproveProposal`\n- **summary**:    Disapprove a proposal, close, and remove it from the system, regardless of its current  state. \n\n   Must be called by the Root origin. \n\n   Parameters: \n\n  * `proposal_hash`: The hash of the proposal that should be disapproved.\n\n   #### Complexity  O(P) where P is the number of max proposals"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#executeproposal-call-length_bound-compactu32", "page_title": "Extrinsics", "index": 21, "depth": 3, "title": "execute(proposal: `Call`, length_bound: `Compact<u32>`)", "anchor": "executeproposal-call-length_bound-compactu32", "start_char": 5927, "end_char": 6357, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### execute(proposal: `Call`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.allianceMotion.execute`\n- **summary**:    Dispatch a proposal from a member using the `Member` origin. \n\n   Origin must be a member of the collective. \n\n   #### Complexity: \n\n  - `O(B + M + P)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` members-count (code-bounded)\n\n  - `P` complexity of dispatching `proposal`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#killproposal_hash-h256", "page_title": "Extrinsics", "index": 22, "depth": 3, "title": "kill(proposal_hash: `H256`)", "anchor": "killproposal_hash-h256", "start_char": 6357, "end_char": 6746, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### kill(proposal_hash: `H256`)\n- **interface**: `api.tx.allianceMotion.kill`\n- **summary**:    Disapprove the proposal and burn the cost held for storing this proposal. \n\n   Parameters: \n\n  - `origin`: must be the `KillOrigin`.\n\n  - `proposal_hash`: The hash of the proposal that should be killed.\n\n   Emits `Killed` and `ProposalCostBurned` if any cost was held for a given proposal."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#proposethreshold-compactu32-proposal-call-length_bound-compactu32_1", "page_title": "Extrinsics", "index": 23, "depth": 3, "title": "propose(threshold: `Compact<u32>`, proposal: `Call`, length_bound: `Compact<u32>`)", "anchor": "proposethreshold-compactu32-proposal-call-length_bound-compactu32_1", "start_char": 6746, "end_char": 7472, "estimated_token_count": 205, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### propose(threshold: `Compact<u32>`, proposal: `Call`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.allianceMotion.propose`\n- **summary**:    Add a new proposal to either be voted on or executed directly. \n\n   Requires the sender to be member. \n\n   `threshold` determines whether `proposal` is executed directly (`threshold < 2`)  or put up for voting. \n\n   #### Complexity \n\n  - `O(B + M + P1)` or `O(B + M + P2)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` is members-count (code- and governance-bounded)\n\n  - branching is influenced by `threshold` where:\n\n  - `P1` is proposal execution complexity (`threshold < 2`)\n\n  - `P2` is proposals-count (code-bounded) (`threshold >= 2`)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#releaseproposalcostproposal_hash-h256", "page_title": "Extrinsics", "index": 24, "depth": 3, "title": "releaseProposalCost(proposal_hash: `H256`)", "anchor": "releaseproposalcostproposal_hash-h256", "start_char": 7472, "end_char": 7956, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### releaseProposalCost(proposal_hash: `H256`)\n- **interface**: `api.tx.allianceMotion.releaseProposalCost`\n- **summary**:    Release the cost held for storing a proposal once the given proposal is completed. \n\n   If there is no associated cost for the given proposal, this call will have no effect. \n\n   Parameters: \n\n  - `origin`: must be `Signed` or `Root`.\n\n  - `proposal_hash`: The hash of the proposal.\n\n   Emits `ProposalCostReleased` if any cost held for a given proposal."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setmembersnew_members-vecaccountid32-prime-optionaccountid32-old_count-u32", "page_title": "Extrinsics", "index": 25, "depth": 3, "title": "setMembers(new_members: `Vec<AccountId32>`, prime: `Option<AccountId32>`, old_count: `u32`)", "anchor": "setmembersnew_members-vecaccountid32-prime-optionaccountid32-old_count-u32", "start_char": 7956, "end_char": 9123, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setMembers(new_members: `Vec<AccountId32>`, prime: `Option<AccountId32>`, old_count: `u32`)\n- **interface**: `api.tx.allianceMotion.setMembers`\n- **summary**:    Set the collective's membership. \n\n   - `new_members`: The new member list. Be nice to the chain and provide it sorted. \n\n  - `prime`: The prime member whose vote sets the default.\n\n  - `old_count`: The upper bound for the previous number of members in storage. Used for weight estimation. \n\n   The dispatch of this call must be `SetMembersOrigin`. \n\n   NOTE: Does not enforce the expected `MaxMembers` limit on the amount of members, but  the weight estimations rely on it to estimate dispatchable weight. \n\n   #### WARNING: \n\n   The `pallet-collective` can also be managed by logic outside of the pallet through the  implementation of the trait [`ChangeMembers`].  Any call to `set_members` must be careful that the member set doesn't get out of sync  with other logic managing the member set. \n\n   #### Complexity: \n\n  - `O(MP + N)` where:\n\n  - `M` old-members-count (code- and governance-bounded)\n\n  - `N` new-members-count (code- and governance-bounded)\n\n  - `P` proposals-count (code-bounded)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#voteproposal-h256-index-compactu32-approve-bool_1", "page_title": "Extrinsics", "index": 26, "depth": 3, "title": "vote(proposal: `H256`, index: `Compact<u32>`, approve: `bool`)", "anchor": "voteproposal-h256-index-compactu32-approve-bool_1", "start_char": 9123, "end_char": 9631, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### vote(proposal: `H256`, index: `Compact<u32>`, approve: `bool`)\n- **interface**: `api.tx.allianceMotion.vote`\n- **summary**:    Add an aye or nay vote for the sender to the given proposal. \n\n   Requires the sender to be a member. \n\n   Transaction fees will be waived if the member is voting on any particular proposal  for the first time and the call is successful. Subsequent vote changes will charge a  fee.  #### Complexity \n\n  - `O(M)` where `M` is members-count (code- and governance-bounded)\n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#assetconversion", "page_title": "Extrinsics", "index": 27, "depth": 2, "title": "assetConversion", "anchor": "assetconversion", "start_char": 9631, "end_char": 9652, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## assetConversion"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#addliquidityasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid-amount1_desired-u128-amount2_desired-u128-amount1_min-u128-amount2_min-u128-mint_to-accountid32", "page_title": "Extrinsics", "index": 28, "depth": 3, "title": "addLiquidity(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, amount1_desired: `u128`, amount2_desired: `u128`, amount1_min: `u128`, amount2_min: `u128`, mint_to: `AccountId32`)", "anchor": "addliquidityasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid-amount1_desired-u128-amount2_desired-u128-amount1_min-u128-amount2_min-u128-mint_to-accountid32", "start_char": 9652, "end_char": 10795, "estimated_token_count": 228, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### addLiquidity(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, amount1_desired: `u128`, amount2_desired: `u128`, amount1_min: `u128`, amount2_min: `u128`, mint_to: `AccountId32`)\n- **interface**: `api.tx.assetConversion.addLiquidity`\n- **summary**:    Provide liquidity into the pool of `asset1` and `asset2`.  NOTE: an optimal amount of asset1 and asset2 will be calculated and  might be different than the provided `amount1_desired`/`amount2_desired`  thus you should provide the min amount you're happy to provide.  Params `amount1_min`/`amount2_min` represent that.  `mint_to` will be sent the liquidity tokens that represent this share of the pool. \n\n   NOTE: when encountering an incorrect exchange rate and non-withdrawable pool liquidity,  batch an atomic call with [`Pallet::add_liquidity`] and  [`Pallet::swap_exact_tokens_for_tokens`] or [`Pallet::swap_tokens_for_exact_tokens`]  calls to render the liquidity withdrawable and rectify the exchange rate. \n\n   Once liquidity is added, someone may successfully call  [`Pallet::swap_exact_tokens_for_tokens`]."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#createpoolasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid", "page_title": "Extrinsics", "index": 29, "depth": 3, "title": "createPool(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)", "anchor": "createpoolasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid", "start_char": 10795, "end_char": 11213, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### createPool(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)\n- **interface**: `api.tx.assetConversion.createPool`\n- **summary**:    Creates an empty liquidity pool and an associated new `lp_token` asset  (the id of which is returned in the `Event::PoolCreated` event). \n\n   Once a pool is created, someone may [`Pallet::add_liquidity`] to it."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeliquidityasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid-lp_token_burn-u128-amount1_min_receive-u128-amount2_min_receive-u128-withdraw_to-accountid32", "page_title": "Extrinsics", "index": 30, "depth": 3, "title": "removeLiquidity(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, lp_token_burn: `u128`, amount1_min_receive: `u128`, amount2_min_receive: `u128`, withdraw_to: `AccountId32`)", "anchor": "removeliquidityasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid-lp_token_burn-u128-amount1_min_receive-u128-amount2_min_receive-u128-withdraw_to-accountid32", "start_char": 11213, "end_char": 11788, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeLiquidity(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, lp_token_burn: `u128`, amount1_min_receive: `u128`, amount2_min_receive: `u128`, withdraw_to: `AccountId32`)\n- **interface**: `api.tx.assetConversion.removeLiquidity`\n- **summary**:    Allows you to remove liquidity by providing the `lp_token_burn` tokens that will be  burned in the process. With the usage of `amount1_min_receive`/`amount2_min_receive`  it's possible to control the min amount of returned tokens you're happy with."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#swapexacttokensfortokenspath-vecframesupporttokensfungibleunionofnativeorwithid-amount_in-u128-amount_out_min-u128-send_to-accountid32-keep_alive-bool", "page_title": "Extrinsics", "index": 31, "depth": 3, "title": "swapExactTokensForTokens(path: `Vec<FrameSupportTokensFungibleUnionOfNativeOrWithId>`, amount_in: `u128`, amount_out_min: `u128`, send_to: `AccountId32`, keep_alive: `bool`)", "anchor": "swapexacttokensfortokenspath-vecframesupporttokensfungibleunionofnativeorwithid-amount_in-u128-amount_out_min-u128-send_to-accountid32-keep_alive-bool", "start_char": 11788, "end_char": 12312, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### swapExactTokensForTokens(path: `Vec<FrameSupportTokensFungibleUnionOfNativeOrWithId>`, amount_in: `u128`, amount_out_min: `u128`, send_to: `AccountId32`, keep_alive: `bool`)\n- **interface**: `api.tx.assetConversion.swapExactTokensForTokens`\n- **summary**:    Swap the exact amount of `asset1` into `asset2`.  `amount_out_min` param allows you to specify the min amount of the `asset2`  you're happy to receive. \n\n   [`AssetConversionApi::quote_price_exact_tokens_for_tokens`] runtime call can be called  for a quote."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#swaptokensforexacttokenspath-vecframesupporttokensfungibleunionofnativeorwithid-amount_out-u128-amount_in_max-u128-send_to-accountid32-keep_alive-bool", "page_title": "Extrinsics", "index": 32, "depth": 3, "title": "swapTokensForExactTokens(path: `Vec<FrameSupportTokensFungibleUnionOfNativeOrWithId>`, amount_out: `u128`, amount_in_max: `u128`, send_to: `AccountId32`, keep_alive: `bool`)", "anchor": "swaptokensforexacttokenspath-vecframesupporttokensfungibleunionofnativeorwithid-amount_out-u128-amount_in_max-u128-send_to-accountid32-keep_alive-bool", "start_char": 12312, "end_char": 12847, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### swapTokensForExactTokens(path: `Vec<FrameSupportTokensFungibleUnionOfNativeOrWithId>`, amount_out: `u128`, amount_in_max: `u128`, send_to: `AccountId32`, keep_alive: `bool`)\n- **interface**: `api.tx.assetConversion.swapTokensForExactTokens`\n- **summary**:    Swap any amount of `asset1` to get the exact amount of `asset2`.  `amount_in_max` param allows to specify the max amount of the `asset1`  you're happy to provide. \n\n   [`AssetConversionApi::quote_price_tokens_for_exact_tokens`] runtime call can be called  for a quote."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#touchasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid", "page_title": "Extrinsics", "index": 33, "depth": 3, "title": "touch(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)", "anchor": "touchasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid", "start_char": 12847, "end_char": 13625, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### touch(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)\n- **interface**: `api.tx.assetConversion.touch`\n- **summary**:    Touch an existing pool to fulfill prerequisites before providing liquidity, such as  ensuring that the pool's accounts are in place. It is typically useful when a pool  creator removes the pool's accounts and does not provide a liquidity. This action may  involve holding assets from the caller as a deposit for creating the pool's accounts. \n\n   The origin must be Signed. \n\n   - `asset1`: The asset ID of an existing pool with a pair (asset1, asset2). \n\n  - `asset2`: The asset ID of an existing pool with a pair (asset1, asset2).\n\n   Emits `Touched` event when successful. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#assetconversionmigration", "page_title": "Extrinsics", "index": 34, "depth": 2, "title": "assetConversionMigration", "anchor": "assetconversionmigration", "start_char": 13625, "end_char": 13655, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## assetConversionMigration"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#migratetonewaccountasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid", "page_title": "Extrinsics", "index": 35, "depth": 3, "title": "migrateToNewAccount(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)", "anchor": "migratetonewaccountasset1-framesupporttokensfungibleunionofnativeorwithid-asset2-framesupporttokensfungibleunionofnativeorwithid", "start_char": 13655, "end_char": 14081, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### migrateToNewAccount(asset1: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, asset2: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)\n- **interface**: `api.tx.assetConversionMigration.migrateToNewAccount`\n- **summary**:    Migrates an existing pool to a new account ID derivation method for a given asset pair.  If the migration is successful, transaction fees are refunded to the caller. \n\n   Must be signed. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#assetrate", "page_title": "Extrinsics", "index": 36, "depth": 2, "title": "assetRate", "anchor": "assetrate", "start_char": 14081, "end_char": 14096, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## assetRate"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#createasset_kind-framesupporttokensfungibleunionofnativeorwithid-rate-u128", "page_title": "Extrinsics", "index": 37, "depth": 3, "title": "create(asset_kind: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, rate: `u128`)", "anchor": "createasset_kind-framesupporttokensfungibleunionofnativeorwithid-rate-u128", "start_char": 14096, "end_char": 14347, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### create(asset_kind: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, rate: `u128`)\n- **interface**: `api.tx.assetRate.create`\n- **summary**:    Initialize a conversion rate to native balance for the given asset. \n\n   #### Complexity \n\n  - O(1)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeasset_kind-framesupporttokensfungibleunionofnativeorwithid", "page_title": "Extrinsics", "index": 38, "depth": 3, "title": "remove(asset_kind: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)", "anchor": "removeasset_kind-framesupporttokensfungibleunionofnativeorwithid", "start_char": 14347, "end_char": 14590, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### remove(asset_kind: `FrameSupportTokensFungibleUnionOfNativeOrWithId`)\n- **interface**: `api.tx.assetRate.remove`\n- **summary**:    Remove an existing conversion rate to native balance for the given asset. \n\n   #### Complexity \n\n  - O(1)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#updateasset_kind-framesupporttokensfungibleunionofnativeorwithid-rate-u128", "page_title": "Extrinsics", "index": 39, "depth": 3, "title": "update(asset_kind: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, rate: `u128`)", "anchor": "updateasset_kind-framesupporttokensfungibleunionofnativeorwithid-rate-u128", "start_char": 14590, "end_char": 14844, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### update(asset_kind: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, rate: `u128`)\n- **interface**: `api.tx.assetRate.update`\n- **summary**:    Update the conversion rate to native balance for the given asset. \n\n   #### Complexity \n\n  - O(1)\n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#assetrewards", "page_title": "Extrinsics", "index": 40, "depth": 2, "title": "assetRewards", "anchor": "assetrewards", "start_char": 14844, "end_char": 14862, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## assetRewards"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#cleanuppoolpool_id-u32", "page_title": "Extrinsics", "index": 41, "depth": 3, "title": "cleanupPool(pool_id: `u32`)", "anchor": "cleanuppoolpool_id-u32", "start_char": 14862, "end_char": 15130, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### cleanupPool(pool_id: `u32`)\n- **interface**: `api.tx.assetRewards.cleanupPool`\n- **summary**:    Cleanup a pool. \n\n   Origin must be the pool admin. \n\n   Cleanup storage, release any associated storage cost and return the remaining reward  tokens to the admin."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#createpoolstaked_asset_id-framesupporttokensfungibleunionofnativeorwithid-reward_asset_id-framesupporttokensfungibleunionofnativeorwithid-reward_rate_per_block-u128-expiry-framesupportscheduledispatchtime-admin-optionaccountid32", "page_title": "Extrinsics", "index": 42, "depth": 3, "title": "createPool(staked_asset_id: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, reward_asset_id: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, reward_rate_per_block: `u128`, expiry: `FrameSupportScheduleDispatchTime`, admin: `Option<AccountId32>`)", "anchor": "createpoolstaked_asset_id-framesupporttokensfungibleunionofnativeorwithid-reward_asset_id-framesupporttokensfungibleunionofnativeorwithid-reward_rate_per_block-u128-expiry-framesupportscheduledispatchtime-admin-optionaccountid32", "start_char": 15130, "end_char": 16118, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### createPool(staked_asset_id: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, reward_asset_id: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, reward_rate_per_block: `u128`, expiry: `FrameSupportScheduleDispatchTime`, admin: `Option<AccountId32>`)\n- **interface**: `api.tx.assetRewards.createPool`\n- **summary**:    Create a new reward pool. \n\n   Parameters: \n\n  - `origin`: must be `Config::CreatePoolOrigin`;\n\n  - `staked_asset_id`: the asset to be staked in the pool;\n\n  - `reward_asset_id`: the asset to be distributed as rewards;\n\n  - `reward_rate_per_block`: the amount of reward tokens distributed per block;\n\n  - `expiry`: the block number at which the pool will cease to accumulate rewards. The [`DispatchTime::After`] variant evaluated at the execution time. \n\n  - `admin`: the account allowed to extend the pool expiration, increase the rewards rate and receive the unutilized reward tokens back after the pool completion. If `None`,  the caller is set as an admin."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#depositrewardtokenspool_id-u32-amount-u128", "page_title": "Extrinsics", "index": 43, "depth": 3, "title": "depositRewardTokens(pool_id: `u32`, amount: `u128`)", "anchor": "depositrewardtokenspool_id-u32-amount-u128", "start_char": 16118, "end_char": 16508, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### depositRewardTokens(pool_id: `u32`, amount: `u128`)\n- **interface**: `api.tx.assetRewards.depositRewardTokens`\n- **summary**:    Convenience method to deposit reward tokens into a pool. \n\n   This method is not strictly necessary (tokens could be transferred directly to the  pool pot address), but is provided for convenience so manual derivation of the  account id is not required."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#harvestrewardspool_id-u32-staker-optionaccountid32", "page_title": "Extrinsics", "index": 44, "depth": 3, "title": "harvestRewards(pool_id: `u32`, staker: `Option<AccountId32>`)", "anchor": "harvestrewardspool_id-u32-staker-optionaccountid32", "start_char": 16508, "end_char": 16911, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### harvestRewards(pool_id: `u32`, staker: `Option<AccountId32>`)\n- **interface**: `api.tx.assetRewards.harvestRewards`\n- **summary**:    Harvest unclaimed pool rewards. \n\n   Parameters: \n\n  - origin: must be the `staker` if the pool is still active. Otherwise, any account.\n\n  - pool_id: the pool to harvest from.\n\n  - staker: the account for which to harvest rewards. If `None`, the caller is used."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setpooladminpool_id-u32-new_admin-accountid32", "page_title": "Extrinsics", "index": 45, "depth": 3, "title": "setPoolAdmin(pool_id: `u32`, new_admin: `AccountId32`)", "anchor": "setpooladminpool_id-u32-new_admin-accountid32", "start_char": 16911, "end_char": 17117, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setPoolAdmin(pool_id: `u32`, new_admin: `AccountId32`)\n- **interface**: `api.tx.assetRewards.setPoolAdmin`\n- **summary**:    Modify a pool admin. \n\n   Only the pool admin may perform this operation."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setpoolexpiryblockpool_id-u32-new_expiry-framesupportscheduledispatchtime", "page_title": "Extrinsics", "index": 46, "depth": 3, "title": "setPoolExpiryBlock(pool_id: `u32`, new_expiry: `FrameSupportScheduleDispatchTime`)", "anchor": "setpoolexpiryblockpool_id-u32-new_expiry-framesupportscheduledispatchtime", "start_char": 17117, "end_char": 17423, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setPoolExpiryBlock(pool_id: `u32`, new_expiry: `FrameSupportScheduleDispatchTime`)\n- **interface**: `api.tx.assetRewards.setPoolExpiryBlock`\n- **summary**:    Set when the pool should expire. \n\n   Currently the expiry block can only be extended. \n\n   Only the pool admin may perform this operation."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setpoolrewardrateperblockpool_id-u32-new_reward_rate_per_block-u128", "page_title": "Extrinsics", "index": 47, "depth": 3, "title": "setPoolRewardRatePerBlock(pool_id: `u32`, new_reward_rate_per_block: `u128`)", "anchor": "setpoolrewardrateperblockpool_id-u32-new_reward_rate_per_block-u128", "start_char": 17423, "end_char": 17724, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setPoolRewardRatePerBlock(pool_id: `u32`, new_reward_rate_per_block: `u128`)\n- **interface**: `api.tx.assetRewards.setPoolRewardRatePerBlock`\n- **summary**:    Modify a pool reward rate. \n\n   Currently the reward rate can only be increased. \n\n   Only the pool admin may perform this operation."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#stakepool_id-u32-amount-u128", "page_title": "Extrinsics", "index": 48, "depth": 3, "title": "stake(pool_id: `u32`, amount: `u128`)", "anchor": "stakepool_id-u32-amount-u128", "start_char": 17724, "end_char": 17913, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### stake(pool_id: `u32`, amount: `u128`)\n- **interface**: `api.tx.assetRewards.stake`\n- **summary**:    Stake additional tokens in a pool. \n\n   A freeze is placed on the staked tokens."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#unstakepool_id-u32-amount-u128-staker-optionaccountid32", "page_title": "Extrinsics", "index": 49, "depth": 3, "title": "unstake(pool_id: `u32`, amount: `u128`, staker: `Option<AccountId32>`)", "anchor": "unstakepool_id-u32-amount-u128-staker-optionaccountid32", "start_char": 17913, "end_char": 18398, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### unstake(pool_id: `u32`, amount: `u128`, staker: `Option<AccountId32>`)\n- **interface**: `api.tx.assetRewards.unstake`\n- **summary**:    Unstake tokens from a pool. \n\n   Removes the freeze on the staked tokens. \n\n   Parameters: \n\n  - origin: must be the `staker` if the pool is still active. Otherwise, any account.\n\n  - pool_id: the pool to unstake from.\n\n  - amount: the amount of tokens to unstake.\n\n  - staker: the account to unstake from. If `None`, the caller is used.\n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#assets", "page_title": "Extrinsics", "index": 50, "depth": 2, "title": "assets", "anchor": "assets", "start_char": 18398, "end_char": 18410, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## assets"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#approvetransferid-compactu32-delegate-multiaddress-amount-compactu128", "page_title": "Extrinsics", "index": 51, "depth": 3, "title": "approveTransfer(id: `Compact<u32>`, delegate: `MultiAddress`, amount: `Compact<u128>`)", "anchor": "approvetransferid-compactu32-delegate-multiaddress-amount-compactu128", "start_char": 18410, "end_char": 19383, "estimated_token_count": 222, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### approveTransfer(id: `Compact<u32>`, delegate: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.assets.approveTransfer`\n- **summary**:    Approve an amount of asset for transfer by a delegated third-party account. \n\n   Origin must be Signed. \n\n   Ensures that `ApprovalDeposit` worth of `Currency` is reserved from signing account  for the purpose of holding the approval. If some non-zero amount of assets is already  approved from signing account to `delegate`, then it is topped up or unreserved to  meet the right value. \n\n   NOTE: The signing account does not need to own `amount` of assets at the point of  making this call. \n\n   - `id`: The identifier of the asset. \n\n  - `delegate`: The account to delegate permission to transfer asset.\n\n  - `amount`: The amount of asset that may be transferred by `delegate`. If there is already an approval in place, then this acts additively. \n\n   Emits `ApprovedTransfer` on success. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#blockid-compactu32-who-multiaddress", "page_title": "Extrinsics", "index": 52, "depth": 3, "title": "block(id: `Compact<u32>`, who: `MultiAddress`)", "anchor": "blockid-compactu32-who-multiaddress", "start_char": 19383, "end_char": 19799, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### block(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.assets.block`\n- **summary**:    Disallow further unprivileged transfers of an asset `id` to and from an account `who`. \n\n   Origin must be Signed and the sender should be the Freezer of the asset `id`. \n\n   - `id`: The identifier of the account's asset. \n\n  - `who`: The account to be unblocked.\n\n   Emits `Blocked`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#burnid-compactu32-who-multiaddress-amount-compactu128", "page_title": "Extrinsics", "index": 53, "depth": 3, "title": "burn(id: `Compact<u32>`, who: `MultiAddress`, amount: `Compact<u128>`)", "anchor": "burnid-compactu32-who-multiaddress-amount-compactu128", "start_char": 19799, "end_char": 20605, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### burn(id: `Compact<u32>`, who: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.assets.burn`\n- **summary**:    Reduce the balance of `who` by as much as possible up to `amount` assets of `id`. \n\n   Origin must be Signed and the sender should be the Manager of the asset `id`. \n\n   Bails with `NoAccount` if the `who` is already dead. \n\n   - `id`: The identifier of the asset to have some amount burned. \n\n  - `who`: The account to be debited from.\n\n  - `amount`: The maximum amount by which `who`'s balance should be reduced.\n\n   Emits `Burned` with the actual amount burned. If this takes the balance to below the  minimum for the asset, then the amount burned is increased to take it to zero. \n\n   Weight: `O(1)`  Modes: Post-existence of `who`; Pre & post Zombie-status of `who`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#cancelapprovalid-compactu32-delegate-multiaddress", "page_title": "Extrinsics", "index": 54, "depth": 3, "title": "cancelApproval(id: `Compact<u32>`, delegate: `MultiAddress`)", "anchor": "cancelapprovalid-compactu32-delegate-multiaddress", "start_char": 20605, "end_char": 21182, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### cancelApproval(id: `Compact<u32>`, delegate: `MultiAddress`)\n- **interface**: `api.tx.assets.cancelApproval`\n- **summary**:    Cancel all of some asset approved for delegated transfer by a third-party account. \n\n   Origin must be Signed and there must be an approval in place between signer and  `delegate`. \n\n   Unreserves any deposit previously reserved by `approve_transfer` for the approval. \n\n   - `id`: The identifier of the asset. \n\n  - `delegate`: The account delegated permission to transfer asset.\n\n   Emits `ApprovalCancelled` on success. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#clearmetadataid-compactu32", "page_title": "Extrinsics", "index": 55, "depth": 3, "title": "clearMetadata(id: `Compact<u32>`)", "anchor": "clearmetadataid-compactu32", "start_char": 21182, "end_char": 21550, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### clearMetadata(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.clearMetadata`\n- **summary**:    Clear the metadata for an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   Any deposit is freed for the asset owner. \n\n   - `id`: The identifier of the asset to clear. \n\n   Emits `MetadataCleared`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#createid-compactu32-admin-multiaddress-min_balance-u128", "page_title": "Extrinsics", "index": 56, "depth": 3, "title": "create(id: `Compact<u32>`, admin: `MultiAddress`, min_balance: `u128`)", "anchor": "createid-compactu32-admin-multiaddress-min_balance-u128", "start_char": 21550, "end_char": 22519, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### create(id: `Compact<u32>`, admin: `MultiAddress`, min_balance: `u128`)\n- **interface**: `api.tx.assets.create`\n- **summary**:    Issue a new class of fungible assets from a public origin. \n\n   This new asset class has no assets initially and its owner is the origin. \n\n   The origin must conform to the configured `CreateOrigin` and have sufficient funds free. \n\n   Funds of sender are reserved by `AssetDeposit`. \n\n   Parameters: \n\n  - `id`: The identifier of the new asset. This must not be currently in use to identify an existing asset. If [`NextAssetId`] is set, then this must be equal to it. \n\n  - `admin`: The admin of this class of assets. The admin is the initial address of each member of the asset class's admin team. \n\n  - `min_balance`: The minimum balance of this new asset that any single account must have. If an account's balance is reduced below this, then it collapses to zero. \n\n   Emits `Created` event when successful. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#destroyaccountsid-compactu32", "page_title": "Extrinsics", "index": 57, "depth": 3, "title": "destroyAccounts(id: `Compact<u32>`)", "anchor": "destroyaccountsid-compactu32", "start_char": 22519, "end_char": 23136, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### destroyAccounts(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.destroyAccounts`\n- **summary**:    Destroy all accounts associated with a given asset. \n\n   `destroy_accounts` should only be called after `start_destroy` has been called, and the  asset is in a `Destroying` state. \n\n   Due to weight restrictions, this function may need to be called multiple times to fully  destroy all accounts. It will destroy `RemoveItemsLimit` accounts at a time. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   Each call emits the `Event::DestroyedAccounts` event."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#destroyapprovalsid-compactu32", "page_title": "Extrinsics", "index": 58, "depth": 3, "title": "destroyApprovals(id: `Compact<u32>`)", "anchor": "destroyapprovalsid-compactu32", "start_char": 23136, "end_char": 23796, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### destroyApprovals(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.destroyApprovals`\n- **summary**:    Destroy all approvals associated with a given asset up to the max (T::RemoveItemsLimit). \n\n   `destroy_approvals` should only be called after `start_destroy` has been called, and the  asset is in a `Destroying` state. \n\n   Due to weight restrictions, this function may need to be called multiple times to fully  destroy all approvals. It will destroy `RemoveItemsLimit` approvals at a time. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   Each call emits the `Event::DestroyedApprovals` event."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#finishdestroyid-compactu32", "page_title": "Extrinsics", "index": 59, "depth": 3, "title": "finishDestroy(id: `Compact<u32>`)", "anchor": "finishdestroyid-compactu32", "start_char": 23796, "end_char": 24297, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### finishDestroy(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.finishDestroy`\n- **summary**:    Complete destroying asset and unreserve currency. \n\n   `finish_destroy` should only be called after `start_destroy` has been called, and the  asset is in a `Destroying` state. All accounts or approvals should be destroyed before  hand. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   Each successful call emits the `Event::Destroyed` event."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forceassetstatusid-compactu32-owner-multiaddress-issuer-multiaddress-admin-multiaddress-freezer-multiaddress-min_balance-compactu128-is_sufficient-bool-is_frozen-bool", "page_title": "Extrinsics", "index": 60, "depth": 3, "title": "forceAssetStatus(id: `Compact<u32>`, owner: `MultiAddress`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`, min_balance: `Compact<u128>`, is_sufficient: `bool`, is_frozen: `bool`)", "anchor": "forceassetstatusid-compactu32-owner-multiaddress-issuer-multiaddress-admin-multiaddress-freezer-multiaddress-min_balance-compactu128-is_sufficient-bool-is_frozen-bool", "start_char": 24297, "end_char": 25575, "estimated_token_count": 304, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceAssetStatus(id: `Compact<u32>`, owner: `MultiAddress`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`, min_balance: `Compact<u128>`, is_sufficient: `bool`, is_frozen: `bool`)\n- **interface**: `api.tx.assets.forceAssetStatus`\n- **summary**:    Alter the attributes of a given asset. \n\n   Origin must be `ForceOrigin`. \n\n   - `id`: The identifier of the asset. \n\n  - `owner`: The new Owner of this asset.\n\n  - `issuer`: The new Issuer of this asset.\n\n  - `admin`: The new Admin of this asset.\n\n  - `freezer`: The new Freezer of this asset.\n\n  - `min_balance`: The minimum balance of this new asset that any single account must have. If an account's balance is reduced below this, then it collapses to zero. \n\n  - `is_sufficient`: Whether a non-zero balance of this asset is deposit of sufficient value to account for the state bloat associated with its balance storage. If set to  `true`, then non-zero balances may be stored without a `consumer` reference (and thus  an ED in the Balances pallet or whatever else is used to control user-account state  growth). \n\n  - `is_frozen`: Whether this asset class is frozen except for permissioned/admin instructions. \n\n   Emits `AssetStatusChanged` with the identity of the asset. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forcecancelapprovalid-compactu32-owner-multiaddress-delegate-multiaddress", "page_title": "Extrinsics", "index": 61, "depth": 3, "title": "forceCancelApproval(id: `Compact<u32>`, owner: `MultiAddress`, delegate: `MultiAddress`)", "anchor": "forcecancelapprovalid-compactu32-owner-multiaddress-delegate-multiaddress", "start_char": 25575, "end_char": 26203, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceCancelApproval(id: `Compact<u32>`, owner: `MultiAddress`, delegate: `MultiAddress`)\n- **interface**: `api.tx.assets.forceCancelApproval`\n- **summary**:    Cancel all of some asset approved for delegated transfer by a third-party account. \n\n   Origin must be either ForceOrigin or Signed origin with the signer being the Admin  account of the asset `id`. \n\n   Unreserves any deposit previously reserved by `approve_transfer` for the approval. \n\n   - `id`: The identifier of the asset. \n\n  - `delegate`: The account delegated permission to transfer asset.\n\n   Emits `ApprovalCancelled` on success. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forceclearmetadataid-compactu32", "page_title": "Extrinsics", "index": 62, "depth": 3, "title": "forceClearMetadata(id: `Compact<u32>`)", "anchor": "forceclearmetadataid-compactu32", "start_char": 26203, "end_char": 26516, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceClearMetadata(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.forceClearMetadata`\n- **summary**:    Clear the metadata for an asset. \n\n   Origin must be ForceOrigin. \n\n   Any deposit is returned. \n\n   - `id`: The identifier of the asset to clear. \n\n   Emits `MetadataCleared`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forcecreateid-compactu32-owner-multiaddress-is_sufficient-bool-min_balance-compactu128", "page_title": "Extrinsics", "index": 63, "depth": 3, "title": "forceCreate(id: `Compact<u32>`, owner: `MultiAddress`, is_sufficient: `bool`, min_balance: `Compact<u128>`)", "anchor": "forcecreateid-compactu32-owner-multiaddress-is_sufficient-bool-min_balance-compactu128", "start_char": 26516, "end_char": 27510, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceCreate(id: `Compact<u32>`, owner: `MultiAddress`, is_sufficient: `bool`, min_balance: `Compact<u128>`)\n- **interface**: `api.tx.assets.forceCreate`\n- **summary**:    Issue a new class of fungible assets from a privileged origin. \n\n   This new asset class has no assets initially. \n\n   The origin must conform to `ForceOrigin`. \n\n   Unlike `create`, no funds are reserved. \n\n   - `id`: The identifier of the new asset. This must not be currently in use to identify  an existing asset. If [`NextAssetId`] is set, then this must be equal to it. \n\n  - `owner`: The owner of this class of assets. The owner has full superuser permissions over this asset, but may later change and configure the permissions using  `transfer_ownership` and `set_team`. \n\n  - `min_balance`: The minimum balance of this new asset that any single account must have. If an account's balance is reduced below this, then it collapses to zero. \n\n   Emits `ForceCreated` event when successful. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forcesetmetadataid-compactu32-name-bytes-symbol-bytes-decimals-u8-is_frozen-bool", "page_title": "Extrinsics", "index": 64, "depth": 3, "title": "forceSetMetadata(id: `Compact<u32>`, name: `Bytes`, symbol: `Bytes`, decimals: `u8`, is_frozen: `bool`)", "anchor": "forcesetmetadataid-compactu32-name-bytes-symbol-bytes-decimals-u8-is_frozen-bool", "start_char": 27510, "end_char": 28222, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceSetMetadata(id: `Compact<u32>`, name: `Bytes`, symbol: `Bytes`, decimals: `u8`, is_frozen: `bool`)\n- **interface**: `api.tx.assets.forceSetMetadata`\n- **summary**:    Force the metadata for an asset to some value. \n\n   Origin must be ForceOrigin. \n\n   Any deposit is left alone. \n\n   - `id`: The identifier of the asset to update. \n\n  - `name`: The user friendly name of this asset. Limited in length by `StringLimit`.\n\n  - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`.\n\n  - `decimals`: The number of decimals this asset uses to represent one unit.\n\n   Emits `MetadataSet`. \n\n   Weight: `O(N + S)` where N and S are the length of the name and symbol respectively."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forcetransferid-compactu32-source-multiaddress-dest-multiaddress-amount-compactu128", "page_title": "Extrinsics", "index": 65, "depth": 3, "title": "forceTransfer(id: `Compact<u32>`, source: `MultiAddress`, dest: `MultiAddress`, amount: `Compact<u128>`)", "anchor": "forcetransferid-compactu32-source-multiaddress-dest-multiaddress-amount-compactu128", "start_char": 28222, "end_char": 29309, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceTransfer(id: `Compact<u32>`, source: `MultiAddress`, dest: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.assets.forceTransfer`\n- **summary**:    Move some assets from one account to another. \n\n   Origin must be Signed and the sender should be the Admin of the asset `id`. \n\n   - `id`: The identifier of the asset to have some amount transferred. \n\n  - `source`: The account to be debited.\n\n  - `dest`: The account to be credited.\n\n  - `amount`: The amount by which the `source`'s balance of assets should be reduced and `dest`'s balance increased. The amount actually transferred may be slightly greater in  the case that the transfer would otherwise take the `source` balance above zero but  below the minimum balance. Must be greater than zero. \n\n   Emits `Transferred` with the actual amount transferred. If this takes the source balance  to below the minimum for the asset, then the amount transferred is increased to take it  to zero. \n\n   Weight: `O(1)`  Modes: Pre-existence of `dest`; Post-existence of `source`; Account pre-existence of  `dest`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#freezeid-compactu32-who-multiaddress", "page_title": "Extrinsics", "index": 66, "depth": 3, "title": "freeze(id: `Compact<u32>`, who: `MultiAddress`)", "anchor": "freezeid-compactu32-who-multiaddress", "start_char": 29309, "end_char": 29873, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### freeze(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.assets.freeze`\n- **summary**:    Disallow further unprivileged transfers of an asset `id` from an account `who`. `who`  must already exist as an entry in `Account`s of the asset. If you want to freeze an  account that does not have an entry, use `touch_other` first. \n\n   Origin must be Signed and the sender should be the Freezer of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n  - `who`: The account to be frozen.\n\n   Emits `Frozen`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#freezeassetid-compactu32", "page_title": "Extrinsics", "index": 67, "depth": 3, "title": "freezeAsset(id: `Compact<u32>`)", "anchor": "freezeassetid-compactu32", "start_char": 29873, "end_char": 30215, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### freezeAsset(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.freezeAsset`\n- **summary**:    Disallow further unprivileged transfers for the asset class. \n\n   Origin must be Signed and the sender should be the Freezer of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n   Emits `Frozen`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#mintid-compactu32-beneficiary-multiaddress-amount-compactu128", "page_title": "Extrinsics", "index": 68, "depth": 3, "title": "mint(id: `Compact<u32>`, beneficiary: `MultiAddress`, amount: `Compact<u128>`)", "anchor": "mintid-compactu32-beneficiary-multiaddress-amount-compactu128", "start_char": 30215, "end_char": 30819, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### mint(id: `Compact<u32>`, beneficiary: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.assets.mint`\n- **summary**:    Mint assets of a particular class. \n\n   The origin must be Signed and the sender must be the Issuer of the asset `id`. \n\n   - `id`: The identifier of the asset to have some amount minted. \n\n  - `beneficiary`: The account to be credited with the minted assets.\n\n  - `amount`: The amount of the asset to be minted.\n\n   Emits `Issued` event when successful. \n\n   Weight: `O(1)`  Modes: Pre-existing balance of `beneficiary`; Account pre-existence of `beneficiary`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#refundid-compactu32-allow_burn-bool", "page_title": "Extrinsics", "index": 69, "depth": 3, "title": "refund(id: `Compact<u32>`, allow_burn: `bool`)", "anchor": "refundid-compactu32-allow_burn-bool", "start_char": 30819, "end_char": 31435, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### refund(id: `Compact<u32>`, allow_burn: `bool`)\n- **interface**: `api.tx.assets.refund`\n- **summary**:    Return the deposit (if any) of an asset account or a consumer reference (if any) of an  account. \n\n   The origin must be Signed. \n\n   - `id`: The identifier of the asset for which the caller would like the deposit  refunded. \n\n  - `allow_burn`: If `true` then assets may be destroyed in order to complete the refund.\n\n   It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if  the asset account contains holds or freezes in place. \n\n   Emits `Refunded` event when successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#refundotherid-compactu32-who-multiaddress", "page_title": "Extrinsics", "index": 70, "depth": 3, "title": "refundOther(id: `Compact<u32>`, who: `MultiAddress`)", "anchor": "refundotherid-compactu32-who-multiaddress", "start_char": 31435, "end_char": 32143, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### refundOther(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.assets.refundOther`\n- **summary**:    Return the deposit (if any) of a target asset account. Useful if you are the depositor. \n\n   The origin must be Signed and either the account owner, depositor, or asset `Admin`. In  order to burn a non-zero balance of the asset, the caller must be the account and should  use `refund`. \n\n   - `id`: The identifier of the asset for the account holding a deposit. \n\n  - `who`: The account to refund.\n\n   It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if  the asset account contains holds or freezes in place. \n\n   Emits `Refunded` event when successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setmetadataid-compactu32-name-bytes-symbol-bytes-decimals-u8", "page_title": "Extrinsics", "index": 71, "depth": 3, "title": "setMetadata(id: `Compact<u32>`, name: `Bytes`, symbol: `Bytes`, decimals: `u8`)", "anchor": "setmetadataid-compactu32-name-bytes-symbol-bytes-decimals-u8", "start_char": 32143, "end_char": 32939, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setMetadata(id: `Compact<u32>`, name: `Bytes`, symbol: `Bytes`, decimals: `u8`)\n- **interface**: `api.tx.assets.setMetadata`\n- **summary**:    Set the metadata for an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   Funds of sender are reserved according to the formula:  `MetadataDepositBase + MetadataDepositPerByte * (name.len + symbol.len)` taking into  account any already reserved funds. \n\n   - `id`: The identifier of the asset to update. \n\n  - `name`: The user friendly name of this asset. Limited in length by `StringLimit`.\n\n  - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`.\n\n  - `decimals`: The number of decimals this asset uses to represent one unit.\n\n   Emits `MetadataSet`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setminbalanceid-compactu32-min_balance-u128", "page_title": "Extrinsics", "index": 72, "depth": 3, "title": "setMinBalance(id: `Compact<u32>`, min_balance: `u128`)", "anchor": "setminbalanceid-compactu32-min_balance-u128", "start_char": 32939, "end_char": 33475, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setMinBalance(id: `Compact<u32>`, min_balance: `u128`)\n- **interface**: `api.tx.assets.setMinBalance`\n- **summary**:    Sets the minimum balance of an asset. \n\n   Only works if there aren't any accounts that are holding the asset or if  the new value of `min_balance` is less than the old one. \n\n   Origin must be Signed and the sender has to be the Owner of the  asset `id`. \n\n   - `id`: The identifier of the asset. \n\n  - `min_balance`: The new value of `min_balance`.\n\n   Emits `AssetMinBalanceChanged` event when successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setteamid-compactu32-issuer-multiaddress-admin-multiaddress-freezer-multiaddress", "page_title": "Extrinsics", "index": 73, "depth": 3, "title": "setTeam(id: `Compact<u32>`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`)", "anchor": "setteamid-compactu32-issuer-multiaddress-admin-multiaddress-freezer-multiaddress", "start_char": 33475, "end_char": 34008, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setTeam(id: `Compact<u32>`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`)\n- **interface**: `api.tx.assets.setTeam`\n- **summary**:    Change the Issuer, Admin and Freezer of an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n  - `issuer`: The new Issuer of this asset.\n\n  - `admin`: The new Admin of this asset.\n\n  - `freezer`: The new Freezer of this asset.\n\n   Emits `TeamChanged`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#startdestroyid-compactu32", "page_title": "Extrinsics", "index": 74, "depth": 3, "title": "startDestroy(id: `Compact<u32>`)", "anchor": "startdestroyid-compactu32", "start_char": 34008, "end_char": 34615, "estimated_token_count": 147, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### startDestroy(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.startDestroy`\n- **summary**:    Start the process of destroying a fungible asset class. \n\n   `start_destroy` is the first in a series of extrinsics that should be called, to allow  destruction of an asset class. \n\n   The origin must conform to `ForceOrigin` or must be `Signed` by the asset's `owner`. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if  an account contains holds or freezes in place."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#thawid-compactu32-who-multiaddress", "page_title": "Extrinsics", "index": 75, "depth": 3, "title": "thaw(id: `Compact<u32>`, who: `MultiAddress`)", "anchor": "thawid-compactu32-who-multiaddress", "start_char": 34615, "end_char": 35000, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### thaw(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.assets.thaw`\n- **summary**:    Allow unprivileged transfers to and from an account again. \n\n   Origin must be Signed and the sender should be the Admin of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n  - `who`: The account to be unfrozen.\n\n   Emits `Thawed`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#thawassetid-compactu32", "page_title": "Extrinsics", "index": 76, "depth": 3, "title": "thawAsset(id: `Compact<u32>`)", "anchor": "thawassetid-compactu32", "start_char": 35000, "end_char": 35325, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### thawAsset(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.thawAsset`\n- **summary**:    Allow unprivileged transfers for the asset again. \n\n   Origin must be Signed and the sender should be the Admin of the asset `id`. \n\n   - `id`: The identifier of the asset to be thawed. \n\n   Emits `Thawed`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#touchid-compactu32", "page_title": "Extrinsics", "index": 77, "depth": 3, "title": "touch(id: `Compact<u32>`)", "anchor": "touchid-compactu32", "start_char": 35325, "end_char": 35739, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### touch(id: `Compact<u32>`)\n- **interface**: `api.tx.assets.touch`\n- **summary**:    Create an asset account for non-provider assets. \n\n   A deposit will be taken from the signer account. \n\n   - `origin`: Must be Signed; the signer account must have sufficient funds for a deposit  to be taken. \n\n  - `id`: The identifier of the asset for the account to be created.\n\n   Emits `Touched` event when successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#touchotherid-compactu32-who-multiaddress", "page_title": "Extrinsics", "index": 78, "depth": 3, "title": "touchOther(id: `Compact<u32>`, who: `MultiAddress`)", "anchor": "touchotherid-compactu32-who-multiaddress", "start_char": 35739, "end_char": 36251, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### touchOther(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.assets.touchOther`\n- **summary**:    Create an asset account for `who`. \n\n   A deposit will be taken from the signer account. \n\n   - `origin`: Must be Signed by `Freezer` or `Admin` of the asset `id`; the signer account  must have sufficient funds for a deposit to be taken. \n\n  - `id`: The identifier of the asset for the account to be created.\n\n  - `who`: The account to be created.\n\n   Emits `Touched` event when successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferid-compactu32-target-multiaddress-amount-compactu128", "page_title": "Extrinsics", "index": 79, "depth": 3, "title": "transfer(id: `Compact<u32>`, target: `MultiAddress`, amount: `Compact<u128>`)", "anchor": "transferid-compactu32-target-multiaddress-amount-compactu128", "start_char": 36251, "end_char": 37220, "estimated_token_count": 225, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transfer(id: `Compact<u32>`, target: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.assets.transfer`\n- **summary**:    Move some assets from the sender account to another. \n\n   Origin must be Signed. \n\n   - `id`: The identifier of the asset to have some amount transferred. \n\n  - `target`: The account to be credited.\n\n  - `amount`: The amount by which the sender's balance of assets should be reduced and `target`'s balance increased. The amount actually transferred may be slightly greater in  the case that the transfer would otherwise take the sender balance above zero but below  the minimum balance. Must be greater than zero. \n\n   Emits `Transferred` with the actual amount transferred. If this takes the source balance  to below the minimum for the asset, then the amount transferred is increased to take it  to zero. \n\n   Weight: `O(1)`  Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of  `target`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferallid-compactu32-dest-multiaddress-keep_alive-bool", "page_title": "Extrinsics", "index": 80, "depth": 3, "title": "transferAll(id: `Compact<u32>`, dest: `MultiAddress`, keep_alive: `bool`)", "anchor": "transferallid-compactu32-dest-multiaddress-keep_alive-bool", "start_char": 37220, "end_char": 38285, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transferAll(id: `Compact<u32>`, dest: `MultiAddress`, keep_alive: `bool`)\n- **interface**: `api.tx.assets.transferAll`\n- **summary**:    Transfer the entire transferable balance from the caller asset account. \n\n   NOTE: This function only attempts to transfer _transferable_ balances. This means that  any held, frozen, or minimum balance (when `keep_alive` is `true`), will not be  transferred by this function. To ensure that this function results in a killed account,  you might need to prepare the account by removing any reference counters, storage  deposits, etc... \n\n   The dispatch origin of this call must be Signed. \n\n   - `id`: The identifier of the asset for the account holding a deposit. \n\n  - `dest`: The recipient of the transfer.\n\n  - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all of the funds the asset account has, causing the sender asset account to be killed  (false), or transfer everything except at least the minimum balance, which will  guarantee to keep the sender asset account alive (true)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferapprovedid-compactu32-owner-multiaddress-destination-multiaddress-amount-compactu128", "page_title": "Extrinsics", "index": 81, "depth": 3, "title": "transferApproved(id: `Compact<u32>`, owner: `MultiAddress`, destination: `MultiAddress`, amount: `Compact<u128>`)", "anchor": "transferapprovedid-compactu32-owner-multiaddress-destination-multiaddress-amount-compactu128", "start_char": 38285, "end_char": 39193, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transferApproved(id: `Compact<u32>`, owner: `MultiAddress`, destination: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.assets.transferApproved`\n- **summary**:    Transfer some asset balance from a previously delegated account to some third-party  account. \n\n   Origin must be Signed and there must be an approval in place by the `owner` to the  signer. \n\n   If the entire amount approved for transfer is transferred, then any deposit previously  reserved by `approve_transfer` is unreserved. \n\n   - `id`: The identifier of the asset. \n\n  - `owner`: The account which previously approved for a transfer of at least `amount` and from which the asset balance will be withdrawn. \n\n  - `destination`: The account to which the asset balance of `amount` will be transferred.\n\n  - `amount`: The amount of assets to transfer.\n\n   Emits `TransferredApproved` on success. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferkeepaliveid-compactu32-target-multiaddress-amount-compactu128", "page_title": "Extrinsics", "index": 82, "depth": 3, "title": "transferKeepAlive(id: `Compact<u32>`, target: `MultiAddress`, amount: `Compact<u128>`)", "anchor": "transferkeepaliveid-compactu32-target-multiaddress-amount-compactu128", "start_char": 39193, "end_char": 40214, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transferKeepAlive(id: `Compact<u32>`, target: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.assets.transferKeepAlive`\n- **summary**:    Move some assets from the sender account to another, keeping the sender account alive. \n\n   Origin must be Signed. \n\n   - `id`: The identifier of the asset to have some amount transferred. \n\n  - `target`: The account to be credited.\n\n  - `amount`: The amount by which the sender's balance of assets should be reduced and `target`'s balance increased. The amount actually transferred may be slightly greater in  the case that the transfer would otherwise take the sender balance above zero but below  the minimum balance. Must be greater than zero. \n\n   Emits `Transferred` with the actual amount transferred. If this takes the source balance  to below the minimum for the asset, then the amount transferred is increased to take it  to zero. \n\n   Weight: `O(1)`  Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of  `target`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferownershipid-compactu32-owner-multiaddress", "page_title": "Extrinsics", "index": 83, "depth": 3, "title": "transferOwnership(id: `Compact<u32>`, owner: `MultiAddress`)", "anchor": "transferownershipid-compactu32-owner-multiaddress", "start_char": 40214, "end_char": 40599, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transferOwnership(id: `Compact<u32>`, owner: `MultiAddress`)\n- **interface**: `api.tx.assets.transferOwnership`\n- **summary**:    Change the Owner of an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   - `id`: The identifier of the asset. \n\n  - `owner`: The new Owner of this asset.\n\n   Emits `OwnerChanged`. \n\n   Weight: `O(1)` \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#babe", "page_title": "Extrinsics", "index": 84, "depth": 2, "title": "babe", "anchor": "babe", "start_char": 40599, "end_char": 40609, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## babe"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#planconfigchangeconfig-spconsensusbabedigestsnextconfigdescriptor", "page_title": "Extrinsics", "index": 85, "depth": 3, "title": "planConfigChange(config: `SpConsensusBabeDigestsNextConfigDescriptor`)", "anchor": "planconfigchangeconfig-spconsensusbabedigestsnextconfigdescriptor", "start_char": 40609, "end_char": 41038, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### planConfigChange(config: `SpConsensusBabeDigestsNextConfigDescriptor`)\n- **interface**: `api.tx.babe.planConfigChange`\n- **summary**:    Plan an epoch config change. The epoch config change is recorded and will be enacted on  the next call to `enact_epoch_change`. The config will be activated one epoch after.  Multiple calls to this method will replace any existing planned config change that had  not been enacted yet."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportequivocationequivocation_proof-spconsensusslotsequivocationproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 86, "depth": 3, "title": "reportEquivocation(equivocation_proof: `SpConsensusSlotsEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportequivocationequivocation_proof-spconsensusslotsequivocationproof-key_owner_proof-spsessionmembershipproof", "start_char": 41038, "end_char": 41451, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportEquivocation(equivocation_proof: `SpConsensusSlotsEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.babe.reportEquivocation`\n- **summary**:    Report authority equivocation/misbehavior. This method will verify  the equivocation proof and validate the given key ownership proof  against the extracted offender. If both are valid, the offence will  be reported."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportequivocationunsignedequivocation_proof-spconsensusslotsequivocationproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 87, "depth": 3, "title": "reportEquivocationUnsigned(equivocation_proof: `SpConsensusSlotsEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportequivocationunsignedequivocation_proof-spconsensusslotsequivocationproof-key_owner_proof-spsessionmembershipproof", "start_char": 41451, "end_char": 42107, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportEquivocationUnsigned(equivocation_proof: `SpConsensusSlotsEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.babe.reportEquivocationUnsigned`\n- **summary**:    Report authority equivocation/misbehavior. This method will verify  the equivocation proof and validate the given key ownership proof  against the extracted offender. If both are valid, the offence will  be reported.  This extrinsic must be called unsigned and it is expected that only  block authors will call it (validated in `ValidateUnsigned`), as such  if the block author is defined it will be defined as the equivocation  reporter. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#balances", "page_title": "Extrinsics", "index": 88, "depth": 2, "title": "balances", "anchor": "balances", "start_char": 42107, "end_char": 42121, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## balances"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#burnvalue-compactu128-keep_alive-bool", "page_title": "Extrinsics", "index": 89, "depth": 3, "title": "burn(value: `Compact<u128>`, keep_alive: `bool`)", "anchor": "burnvalue-compactu128-keep_alive-bool", "start_char": 42121, "end_char": 42610, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### burn(value: `Compact<u128>`, keep_alive: `bool`)\n- **interface**: `api.tx.balances.burn`\n- **summary**:    Burn the specified liquid free balance from the origin account. \n\n   If the origin's account ends up below the existential deposit as a result  of the burn and `keep_alive` is false, the account will be reaped. \n\n   Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible,  this `burn` operation will reduce total issuance by the amount _burned_."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forceadjusttotalissuancedirection-palletbalancesadjustmentdirection-delta-compactu128", "page_title": "Extrinsics", "index": 90, "depth": 3, "title": "forceAdjustTotalIssuance(direction: `PalletBalancesAdjustmentDirection`, delta: `Compact<u128>`)", "anchor": "forceadjusttotalissuancedirection-palletbalancesadjustmentdirection-delta-compactu128", "start_char": 42610, "end_char": 42926, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceAdjustTotalIssuance(direction: `PalletBalancesAdjustmentDirection`, delta: `Compact<u128>`)\n- **interface**: `api.tx.balances.forceAdjustTotalIssuance`\n- **summary**:    Adjust the total issuance in a saturating way. \n\n   Can only be called by root and always needs a positive `delta`. \n\n   #### Example"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forcesetbalancewho-multiaddress-new_free-compactu128", "page_title": "Extrinsics", "index": 91, "depth": 3, "title": "forceSetBalance(who: `MultiAddress`, new_free: `Compact<u128>`)", "anchor": "forcesetbalancewho-multiaddress-new_free-compactu128", "start_char": 42926, "end_char": 43160, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceSetBalance(who: `MultiAddress`, new_free: `Compact<u128>`)\n- **interface**: `api.tx.balances.forceSetBalance`\n- **summary**:    Set the regular balance of a given account. \n\n   The dispatch origin for this call is `root`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forcetransfersource-multiaddress-dest-multiaddress-value-compactu128", "page_title": "Extrinsics", "index": 92, "depth": 3, "title": "forceTransfer(source: `MultiAddress`, dest: `MultiAddress`, value: `Compact<u128>`)", "anchor": "forcetransfersource-multiaddress-dest-multiaddress-value-compactu128", "start_char": 43160, "end_char": 43426, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceTransfer(source: `MultiAddress`, dest: `MultiAddress`, value: `Compact<u128>`)\n- **interface**: `api.tx.balances.forceTransfer`\n- **summary**:    Exactly as `transfer_allow_death`, except the origin must be root and the source account  may be specified."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forceunreservewho-multiaddress-amount-u128", "page_title": "Extrinsics", "index": 93, "depth": 3, "title": "forceUnreserve(who: `MultiAddress`, amount: `u128`)", "anchor": "forceunreservewho-multiaddress-amount-u128", "start_char": 43426, "end_char": 43631, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceUnreserve(who: `MultiAddress`, amount: `u128`)\n- **interface**: `api.tx.balances.forceUnreserve`\n- **summary**:    Unreserve some balance from a user by force. \n\n   Can only be called by ROOT."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferalldest-multiaddress-keep_alive-bool", "page_title": "Extrinsics", "index": 94, "depth": 3, "title": "transferAll(dest: `MultiAddress`, keep_alive: `bool`)", "anchor": "transferalldest-multiaddress-keep_alive-bool", "start_char": 43631, "end_char": 44593, "estimated_token_count": 202, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transferAll(dest: `MultiAddress`, keep_alive: `bool`)\n- **interface**: `api.tx.balances.transferAll`\n- **summary**:    Transfer the entire transferable balance from the caller account. \n\n   NOTE: This function only attempts to transfer _transferable_ balances. This means that  any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be  transferred by this function. To ensure that this function results in a killed account,  you might need to prepare the account by removing any reference counters, storage  deposits, etc... \n\n   The dispatch origin of this call must be Signed. \n\n   - `dest`: The recipient of the transfer. \n\n  - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all of the funds the account has, causing the sender account to be killed (false), or  transfer everything except at least the existential deposit, which will guarantee to  keep the sender account alive (true)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferallowdeathdest-multiaddress-value-compactu128", "page_title": "Extrinsics", "index": 95, "depth": 3, "title": "transferAllowDeath(dest: `MultiAddress`, value: `Compact<u128>`)", "anchor": "transferallowdeathdest-multiaddress-value-compactu128", "start_char": 44593, "end_char": 45065, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transferAllowDeath(dest: `MultiAddress`, value: `Compact<u128>`)\n- **interface**: `api.tx.balances.transferAllowDeath`\n- **summary**:    Transfer some liquid free balance to another account. \n\n   `transfer_allow_death` will set the `FreeBalance` of the sender and receiver.  If the sender's account is below the existential deposit as a result  of the transfer, the account will be reaped. \n\n   The dispatch origin for this call must be `Signed` by the transactor."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferkeepalivedest-multiaddress-value-compactu128", "page_title": "Extrinsics", "index": 96, "depth": 3, "title": "transferKeepAlive(dest: `MultiAddress`, value: `Compact<u128>`)", "anchor": "transferkeepalivedest-multiaddress-value-compactu128", "start_char": 45065, "end_char": 45450, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transferKeepAlive(dest: `MultiAddress`, value: `Compact<u128>`)\n- **interface**: `api.tx.balances.transferKeepAlive`\n- **summary**:    Same as the [`transfer_allow_death`] call, but with a check that the transfer will not  kill the origin account. \n\n   99% of the time you want [`transfer_allow_death`] instead. \n\n   [`transfer_allow_death`]: struct.Pallet.html#method.transfer"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#upgradeaccountswho-vecaccountid32", "page_title": "Extrinsics", "index": 97, "depth": 3, "title": "upgradeAccounts(who: `Vec<AccountId32>`)", "anchor": "upgradeaccountswho-vecaccountid32", "start_char": 45450, "end_char": 45873, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### upgradeAccounts(who: `Vec<AccountId32>`)\n- **interface**: `api.tx.balances.upgradeAccounts`\n- **summary**:    Upgrade a specified account. \n\n   - `origin`: Must be `Signed`. \n\n  - `who`: The account to be upgraded.\n\n   This will waive the transaction fee if at least all but 10% of the accounts needed to  be upgraded. (We let some not have to be upgraded just in order to allow for the  possibility of churn). \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#beefy", "page_title": "Extrinsics", "index": 98, "depth": 2, "title": "beefy", "anchor": "beefy", "start_char": 45873, "end_char": 45884, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## beefy"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportdoublevotingequivocation_proof-spconsensusbeefydoublevotingproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 99, "depth": 3, "title": "reportDoubleVoting(equivocation_proof: `SpConsensusBeefyDoubleVotingProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportdoublevotingequivocation_proof-spconsensusbeefydoublevotingproof-key_owner_proof-spsessionmembershipproof", "start_char": 45884, "end_char": 46294, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportDoubleVoting(equivocation_proof: `SpConsensusBeefyDoubleVotingProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.beefy.reportDoubleVoting`\n- **summary**:    Report voter equivocation/misbehavior. This method will verify the  equivocation proof and validate the given key ownership proof  against the extracted offender. If both are valid, the offence  will be reported."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportdoublevotingunsignedequivocation_proof-spconsensusbeefydoublevotingproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 100, "depth": 3, "title": "reportDoubleVotingUnsigned(equivocation_proof: `SpConsensusBeefyDoubleVotingProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportdoublevotingunsignedequivocation_proof-spconsensusbeefydoublevotingproof-key_owner_proof-spsessionmembershipproof", "start_char": 46294, "end_char": 46946, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportDoubleVotingUnsigned(equivocation_proof: `SpConsensusBeefyDoubleVotingProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.beefy.reportDoubleVotingUnsigned`\n- **summary**:    Report voter equivocation/misbehavior. This method will verify the  equivocation proof and validate the given key ownership proof  against the extracted offender. If both are valid, the offence  will be reported. \n\n   This extrinsic must be called unsigned and it is expected that only  block authors will call it (validated in `ValidateUnsigned`), as such  if the block author is defined it will be defined as the equivocation  reporter."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportforkvotingequivocation_proof-spconsensusbeefyforkvotingproofancestryproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 101, "depth": 3, "title": "reportForkVoting(equivocation_proof: `SpConsensusBeefyForkVotingProofAncestryProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportforkvotingequivocation_proof-spconsensusbeefyforkvotingproofancestryproof-key_owner_proof-spsessionmembershipproof", "start_char": 46946, "end_char": 47356, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportForkVoting(equivocation_proof: `SpConsensusBeefyForkVotingProofAncestryProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.beefy.reportForkVoting`\n- **summary**:    Report fork voting equivocation. This method will verify the equivocation proof  and validate the given key ownership proof against the extracted offender.  If both are valid, the offence will be reported."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportforkvotingunsignedequivocation_proof-spconsensusbeefyforkvotingproofancestryproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 102, "depth": 3, "title": "reportForkVotingUnsigned(equivocation_proof: `SpConsensusBeefyForkVotingProofAncestryProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportforkvotingunsignedequivocation_proof-spconsensusbeefyforkvotingproofancestryproof-key_owner_proof-spsessionmembershipproof", "start_char": 47356, "end_char": 48008, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportForkVotingUnsigned(equivocation_proof: `SpConsensusBeefyForkVotingProofAncestryProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.beefy.reportForkVotingUnsigned`\n- **summary**:    Report fork voting equivocation. This method will verify the equivocation proof  and validate the given key ownership proof against the extracted offender.  If both are valid, the offence will be reported. \n\n   This extrinsic must be called unsigned and it is expected that only  block authors will call it (validated in `ValidateUnsigned`), as such  if the block author is defined it will be defined as the equivocation  reporter."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportfutureblockvotingequivocation_proof-spconsensusbeefyfutureblockvotingproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 103, "depth": 3, "title": "reportFutureBlockVoting(equivocation_proof: `SpConsensusBeefyFutureBlockVotingProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportfutureblockvotingequivocation_proof-spconsensusbeefyfutureblockvotingproof-key_owner_proof-spsessionmembershipproof", "start_char": 48008, "end_char": 48434, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportFutureBlockVoting(equivocation_proof: `SpConsensusBeefyFutureBlockVotingProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.beefy.reportFutureBlockVoting`\n- **summary**:    Report future block voting equivocation. This method will verify the equivocation proof  and validate the given key ownership proof against the extracted offender.  If both are valid, the offence will be reported."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportfutureblockvotingunsignedequivocation_proof-spconsensusbeefyfutureblockvotingproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 104, "depth": 3, "title": "reportFutureBlockVotingUnsigned(equivocation_proof: `SpConsensusBeefyFutureBlockVotingProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportfutureblockvotingunsignedequivocation_proof-spconsensusbeefyfutureblockvotingproof-key_owner_proof-spsessionmembershipproof", "start_char": 48434, "end_char": 49102, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportFutureBlockVotingUnsigned(equivocation_proof: `SpConsensusBeefyFutureBlockVotingProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.beefy.reportFutureBlockVotingUnsigned`\n- **summary**:    Report future block voting equivocation. This method will verify the equivocation proof  and validate the given key ownership proof against the extracted offender.  If both are valid, the offence will be reported. \n\n   This extrinsic must be called unsigned and it is expected that only  block authors will call it (validated in `ValidateUnsigned`), as such  if the block author is defined it will be defined as the equivocation  reporter."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setnewgenesisdelay_in_blocks-u32", "page_title": "Extrinsics", "index": 105, "depth": 3, "title": "setNewGenesis(delay_in_blocks: `u32`)", "anchor": "setnewgenesisdelay_in_blocks-u32", "start_char": 49102, "end_char": 49364, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setNewGenesis(delay_in_blocks: `u32`)\n- **interface**: `api.tx.beefy.setNewGenesis`\n- **summary**:    Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the  future. \n\n   Note: `delay_in_blocks` has to be at least 1. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#bounties", "page_title": "Extrinsics", "index": 106, "depth": 2, "title": "bounties", "anchor": "bounties", "start_char": 49364, "end_char": 49378, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## bounties"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#acceptcuratorbounty_id-compactu32", "page_title": "Extrinsics", "index": 107, "depth": 3, "title": "acceptCurator(bounty_id: `Compact<u32>`)", "anchor": "acceptcuratorbounty_id-compactu32", "start_char": 49378, "end_char": 49681, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### acceptCurator(bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.bounties.acceptCurator`\n- **summary**:    Accept the curator role for a bounty.  A deposit will be reserved from curator and refund upon successful payout. \n\n   May only be called from the curator. \n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#approvebountybounty_id-compactu32", "page_title": "Extrinsics", "index": 108, "depth": 3, "title": "approveBounty(bounty_id: `Compact<u32>`)", "anchor": "approvebountybounty_id-compactu32", "start_char": 49681, "end_char": 50007, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### approveBounty(bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.bounties.approveBounty`\n- **summary**:    Approve a bounty proposal. At a later time, the bounty will be funded and become active  and the original deposit will be returned. \n\n   May only be called from `T::SpendOrigin`. \n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#approvebountywithcuratorbounty_id-compactu32-curator-multiaddress-fee-compactu128", "page_title": "Extrinsics", "index": 109, "depth": 3, "title": "approveBountyWithCurator(bounty_id: `Compact<u32>`, curator: `MultiAddress`, fee: `Compact<u128>`)", "anchor": "approvebountywithcuratorbounty_id-compactu32-curator-multiaddress-fee-compactu128", "start_char": 50007, "end_char": 50551, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### approveBountyWithCurator(bounty_id: `Compact<u32>`, curator: `MultiAddress`, fee: `Compact<u128>`)\n- **interface**: `api.tx.bounties.approveBountyWithCurator`\n- **summary**:    Approve the bounty and propose a curator simultaneously.  This call is a shortcut to calling `approve_bounty` and `propose_curator` separately. \n\n   May only be called from `T::SpendOrigin`. \n\n   - `bounty_id`: Bounty ID to approve. \n\n  - `curator`: The curator account whom will manage this bounty.\n\n  - `fee`: The curator fee.\n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#awardbountybounty_id-compactu32-beneficiary-multiaddress", "page_title": "Extrinsics", "index": 110, "depth": 3, "title": "awardBounty(bounty_id: `Compact<u32>`, beneficiary: `MultiAddress`)", "anchor": "awardbountybounty_id-compactu32-beneficiary-multiaddress", "start_char": 50551, "end_char": 51015, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### awardBounty(bounty_id: `Compact<u32>`, beneficiary: `MultiAddress`)\n- **interface**: `api.tx.bounties.awardBounty`\n- **summary**:    Award bounty to a beneficiary account. The beneficiary will be able to claim the funds  after a delay. \n\n   The dispatch origin for this call must be the curator of this bounty. \n\n   - `bounty_id`: Bounty ID to award. \n\n  - `beneficiary`: The beneficiary account whom will receive the payout.\n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#claimbountybounty_id-compactu32", "page_title": "Extrinsics", "index": 111, "depth": 3, "title": "claimBounty(bounty_id: `Compact<u32>`)", "anchor": "claimbountybounty_id-compactu32", "start_char": 51015, "end_char": 51337, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### claimBounty(bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.bounties.claimBounty`\n- **summary**:    Claim the payout from an awarded bounty after payout delay. \n\n   The dispatch origin for this call must be the beneficiary of this bounty. \n\n   - `bounty_id`: Bounty ID to claim. \n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#closebountybounty_id-compactu32", "page_title": "Extrinsics", "index": 112, "depth": 3, "title": "closeBounty(bounty_id: `Compact<u32>`)", "anchor": "closebountybounty_id-compactu32", "start_char": 51337, "end_char": 51709, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### closeBounty(bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.bounties.closeBounty`\n- **summary**:    Cancel a proposed or active bounty. All the funds will be sent to treasury and  the curator deposit will be unreserved if possible. \n\n   Only `T::RejectOrigin` is able to cancel a bounty. \n\n   - `bounty_id`: Bounty ID to cancel. \n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#extendbountyexpirybounty_id-compactu32-remark-bytes", "page_title": "Extrinsics", "index": 113, "depth": 3, "title": "extendBountyExpiry(bounty_id: `Compact<u32>`, remark: `Bytes`)", "anchor": "extendbountyexpirybounty_id-compactu32-remark-bytes", "start_char": 51709, "end_char": 52082, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### extendBountyExpiry(bounty_id: `Compact<u32>`, remark: `Bytes`)\n- **interface**: `api.tx.bounties.extendBountyExpiry`\n- **summary**:    Extend the expiry time of an active bounty. \n\n   The dispatch origin for this call must be the curator of this bounty. \n\n   - `bounty_id`: Bounty ID to extend. \n\n  - `remark`: additional information.\n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#proposebountyvalue-compactu128-description-bytes", "page_title": "Extrinsics", "index": 114, "depth": 3, "title": "proposeBounty(value: `Compact<u128>`, description: `Bytes`)", "anchor": "proposebountyvalue-compactu128-description-bytes", "start_char": 52082, "end_char": 52724, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### proposeBounty(value: `Compact<u128>`, description: `Bytes`)\n- **interface**: `api.tx.bounties.proposeBounty`\n- **summary**:    Propose a new bounty. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Payment: `TipReportDepositBase` will be reserved from the origin account, as well as  `DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval,  or slashed when rejected. \n\n   - `curator`: The curator account whom will manage this bounty. \n\n  - `fee`: The curator fee.\n\n  - `value`: The total payment amount of this bounty, curator fee included.\n\n  - `description`: The description of this bounty."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#proposecuratorbounty_id-compactu32-curator-multiaddress-fee-compactu128", "page_title": "Extrinsics", "index": 115, "depth": 3, "title": "proposeCurator(bounty_id: `Compact<u32>`, curator: `MultiAddress`, fee: `Compact<u128>`)", "anchor": "proposecuratorbounty_id-compactu32-curator-multiaddress-fee-compactu128", "start_char": 52724, "end_char": 53005, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### proposeCurator(bounty_id: `Compact<u32>`, curator: `MultiAddress`, fee: `Compact<u128>`)\n- **interface**: `api.tx.bounties.proposeCurator`\n- **summary**:    Propose a curator to a funded bounty. \n\n   May only be called from `T::SpendOrigin`. \n\n   #### Complexity \n\n  - O(1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#unassigncuratorbounty_id-compactu32", "page_title": "Extrinsics", "index": 116, "depth": 3, "title": "unassignCurator(bounty_id: `Compact<u32>`)", "anchor": "unassigncuratorbounty_id-compactu32", "start_char": 53005, "end_char": 53958, "estimated_token_count": 217, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### unassignCurator(bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.bounties.unassignCurator`\n- **summary**:    Unassign curator from a bounty. \n\n   This function can only be called by the `RejectOrigin` a signed origin. \n\n   If this function is called by the `RejectOrigin`, we assume that the curator is  malicious or inactive. As a result, we will slash the curator when possible. \n\n   If the origin is the curator, we take this as a sign they are unable to do their job and  they willingly give up. We could slash them, but for now we allow them to recover their  deposit and exit without issue. (We may want to change this if it is abused.) \n\n   Finally, the origin can be anyone if and only if the curator is \"inactive\". This allows  anyone in the community to call out that a curator is not doing their due diligence, and  we should pick a new curator. In this case the curator should also be slashed. \n\n   #### Complexity \n\n  - O(1).\n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#broker", "page_title": "Extrinsics", "index": 117, "depth": 2, "title": "broker", "anchor": "broker", "start_char": 53958, "end_char": 53970, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## broker"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#assignregion_id-palletbrokerregionid-task-u32-finality-palletbrokerfinality", "page_title": "Extrinsics", "index": 118, "depth": 3, "title": "assign(region_id: `PalletBrokerRegionId`, task: `u32`, finality: `PalletBrokerFinality`)", "anchor": "assignregion_id-palletbrokerregionid-task-u32-finality-palletbrokerfinality", "start_char": 53970, "end_char": 54558, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### assign(region_id: `PalletBrokerRegionId`, task: `u32`, finality: `PalletBrokerFinality`)\n- **interface**: `api.tx.broker.assign`\n- **summary**:    Assign a Bulk Coretime Region to a task. \n\n   - `origin`: Must be a Signed origin of the account which owns the Region `region_id`. \n\n  - `region_id`: The Region which should be assigned to the task.\n\n  - `task`: The task to assign.\n\n  - `finality`: Indication of whether this assignment is final (in which case it may be eligible for renewal) or provisional (in which case it may be manipulated and/or  reassigned at a later stage)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#claimrevenueregion_id-palletbrokerregionid-max_timeslices-u32", "page_title": "Extrinsics", "index": 119, "depth": 3, "title": "claimRevenue(region_id: `PalletBrokerRegionId`, max_timeslices: `u32`)", "anchor": "claimrevenueregion_id-palletbrokerregionid-max_timeslices-u32", "start_char": 54558, "end_char": 55217, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### claimRevenue(region_id: `PalletBrokerRegionId`, max_timeslices: `u32`)\n- **interface**: `api.tx.broker.claimRevenue`\n- **summary**:    Claim the revenue owed from inclusion in the Instantaneous Coretime Pool. \n\n   - `origin`: Must be a Signed origin. \n\n  - `region_id`: The Region which was assigned to the Pool.\n\n  - `max_timeslices`: The maximum number of timeslices which should be processed. This must be greater than 0. This may affect the weight of the call but should be ideally  made equivalent to the length of the Region `region_id`. If less, further dispatches  will be required with the same `region_id` to claim revenue for the remainder."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#configureconfig-palletbrokerconfigrecord", "page_title": "Extrinsics", "index": 120, "depth": 3, "title": "configure(config: `PalletBrokerConfigRecord`)", "anchor": "configureconfig-palletbrokerconfigrecord", "start_char": 55217, "end_char": 55456, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### configure(config: `PalletBrokerConfigRecord`)\n- **interface**: `api.tx.broker.configure`\n- **summary**:    Configure the pallet. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `config`: The configuration for this pallet."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#disableautorenewcore-u16-task-u32", "page_title": "Extrinsics", "index": 121, "depth": 3, "title": "disableAutoRenew(core: `u16`, task: `u32`)", "anchor": "disableautorenewcore-u16-task-u32", "start_char": 55456, "end_char": 55876, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### disableAutoRenew(core: `u16`, task: `u32`)\n- **interface**: `api.tx.broker.disableAutoRenew`\n- **summary**:    Extrinsic for disabling auto renewal. \n\n   Callable by the sovereign account of the task on the specified core. \n\n   - `origin`: Must be the sovereign account of the task. \n\n  - `core`: The core for which we want to disable auto renewal.\n\n  - `task`: The task for which we want to disable auto renewal."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#dropcontributionregion_id-palletbrokerregionid", "page_title": "Extrinsics", "index": 122, "depth": 3, "title": "dropContribution(region_id: `PalletBrokerRegionId`)", "anchor": "dropcontributionregion_id-palletbrokerregionid", "start_char": 55876, "end_char": 56200, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### dropContribution(region_id: `PalletBrokerRegionId`)\n- **interface**: `api.tx.broker.dropContribution`\n- **summary**:    Drop an expired Instantaneous Pool Contribution record from the chain. \n\n   - `origin`: Can be any kind of origin. \n\n  - `region_id`: The Region identifying the Pool Contribution which has expired."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#drophistorywhen-u32", "page_title": "Extrinsics", "index": 123, "depth": 3, "title": "dropHistory(when: `u32`)", "anchor": "drophistorywhen-u32", "start_char": 56200, "end_char": 56478, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### dropHistory(when: `u32`)\n- **interface**: `api.tx.broker.dropHistory`\n- **summary**:    Drop an expired Instantaneous Pool History record from the chain. \n\n   - `origin`: Can be any kind of origin. \n\n  - `region_id`: The time of the Pool History record which has expired."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#dropregionregion_id-palletbrokerregionid", "page_title": "Extrinsics", "index": 124, "depth": 3, "title": "dropRegion(region_id: `PalletBrokerRegionId`)", "anchor": "dropregionregion_id-palletbrokerregionid", "start_char": 56478, "end_char": 56724, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### dropRegion(region_id: `PalletBrokerRegionId`)\n- **interface**: `api.tx.broker.dropRegion`\n- **summary**:    Drop an expired Region from the chain. \n\n   - `origin`: Can be any kind of origin. \n\n  - `region_id`: The Region which has expired."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#droprenewalcore-u16-when-u32", "page_title": "Extrinsics", "index": 125, "depth": 3, "title": "dropRenewal(core: `u16`, when: `u32`)", "anchor": "droprenewalcore-u16-when-u32", "start_char": 56724, "end_char": 57077, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### dropRenewal(core: `u16`, when: `u32`)\n- **interface**: `api.tx.broker.dropRenewal`\n- **summary**:    Drop an expired Allowed Renewal record from the chain. \n\n   - `origin`: Can be any kind of origin. \n\n  - `core`: The core to which the expired renewal refers.\n\n  - `when`: The timeslice to which the expired renewal refers. This must have passed."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#enableautorenewcore-u16-task-u32-workload_end_hint-optionu32", "page_title": "Extrinsics", "index": 126, "depth": 3, "title": "enableAutoRenew(core: `u16`, task: `u32`, workload_end_hint: `Option<u32>`)", "anchor": "enableautorenewcore-u16-task-u32-workload_end_hint-optionu32", "start_char": 57077, "end_char": 57880, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### enableAutoRenew(core: `u16`, task: `u32`, workload_end_hint: `Option<u32>`)\n- **interface**: `api.tx.broker.enableAutoRenew`\n- **summary**:    Extrinsic for enabling auto renewal. \n\n   Callable by the sovereign account of the task on the specified core. This account  will be charged at the start of every bulk period for renewing core time. \n\n   - `origin`: Must be the sovereign account of the task \n\n  - `core`: The core to which the task to be renewed is currently assigned.\n\n  - `task`: The task for which we want to enable auto renewal.\n\n  - `workload_end_hint`: should be used when enabling auto-renewal for a core that is not expiring in the upcoming bulk period (e.g., due to holding a lease) since it would be  inefficient to look up when the core expires to schedule the next renewal."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#forcereserveworkload-vecpalletbrokerscheduleitem-core-u16", "page_title": "Extrinsics", "index": 127, "depth": 3, "title": "forceReserve(workload: `Vec<PalletBrokerScheduleItem>`, core: `u16`)", "anchor": "forcereserveworkload-vecpalletbrokerscheduleitem-core-u16", "start_char": 57880, "end_char": 58623, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### forceReserve(workload: `Vec<PalletBrokerScheduleItem>`, core: `u16`)\n- **interface**: `api.tx.broker.forceReserve`\n- **summary**:    Reserve a core for a workload immediately. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `workload`: The workload which should be permanently placed on a core starting immediately. \n\n  - `core`: The core to which the assignment should be made until the reservation takes effect. It is left to the caller to either add this new core or reassign any other  tasks to this existing core. \n\n   This reserves the workload and then injects the workload into the Workplan for the next  two sale periods. This overwrites any existing assignments for this core at the start of  the next sale period."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#interlaceregion_id-palletbrokerregionid-pivot-palletbrokercoremask", "page_title": "Extrinsics", "index": 128, "depth": 3, "title": "interlace(region_id: `PalletBrokerRegionId`, pivot: `PalletBrokerCoreMask`)", "anchor": "interlaceregion_id-palletbrokerregionid-pivot-palletbrokercoremask", "start_char": 58623, "end_char": 59222, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### interlace(region_id: `PalletBrokerRegionId`, pivot: `PalletBrokerCoreMask`)\n- **interface**: `api.tx.broker.interlace`\n- **summary**:    Split a Bulk Coretime Region into two wholly-overlapping Regions with complementary  interlace masks which together make up the original Region's interlace mask. \n\n   - `origin`: Must be a Signed origin of the account which owns the Region `region_id`. \n\n  - `region_id`: The Region which should become two interlaced Regions of incomplete regularity. \n\n  - `pivot`: The interlace mask of one of the two new regions (the other is its partial complement)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#notifycorecountcore_count-u16", "page_title": "Extrinsics", "index": 129, "depth": 3, "title": "notifyCoreCount(core_count: `u16`)", "anchor": "notifycorecountcore_count-u16", "start_char": 59222, "end_char": 59312, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### notifyCoreCount(core_count: `u16`)\n- **interface**: `api.tx.broker.notifyCoreCount`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#notifyrevenuerevenue-palletbrokerondemandrevenuerecord", "page_title": "Extrinsics", "index": 130, "depth": 3, "title": "notifyRevenue(revenue: `PalletBrokerOnDemandRevenueRecord`)", "anchor": "notifyrevenuerevenue-palletbrokerondemandrevenuerecord", "start_char": 59312, "end_char": 59425, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### notifyRevenue(revenue: `PalletBrokerOnDemandRevenueRecord`)\n- **interface**: `api.tx.broker.notifyRevenue`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#partitionregion_id-palletbrokerregionid-pivot-u32", "page_title": "Extrinsics", "index": 131, "depth": 3, "title": "partition(region_id: `PalletBrokerRegionId`, pivot: `u32`)", "anchor": "partitionregion_id-palletbrokerregionid-pivot-u32", "start_char": 59425, "end_char": 59912, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### partition(region_id: `PalletBrokerRegionId`, pivot: `u32`)\n- **interface**: `api.tx.broker.partition`\n- **summary**:    Split a Bulk Coretime Region into two non-overlapping Regions at a particular time into  the region. \n\n   - `origin`: Must be a Signed origin of the account which owns the Region `region_id`. \n\n  - `region_id`: The Region which should be partitioned into two non-overlapping Regions.\n\n  - `pivot`: The offset in time into the Region at which to make the split."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#poolregion_id-palletbrokerregionid-payee-accountid32-finality-palletbrokerfinality", "page_title": "Extrinsics", "index": 132, "depth": 3, "title": "pool(region_id: `PalletBrokerRegionId`, payee: `AccountId32`, finality: `PalletBrokerFinality`)", "anchor": "poolregion_id-palletbrokerregionid-payee-accountid32-finality-palletbrokerfinality", "start_char": 59912, "end_char": 60396, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### pool(region_id: `PalletBrokerRegionId`, payee: `AccountId32`, finality: `PalletBrokerFinality`)\n- **interface**: `api.tx.broker.pool`\n- **summary**:    Place a Bulk Coretime Region into the Instantaneous Coretime Pool. \n\n   - `origin`: Must be a Signed origin of the account which owns the Region `region_id`. \n\n  - `region_id`: The Region which should be assigned to the Pool.\n\n  - `payee`: The account which is able to collect any revenue due for the usage of this Coretime."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#purchaseprice_limit-u128", "page_title": "Extrinsics", "index": 133, "depth": 3, "title": "purchase(price_limit: `u128`)", "anchor": "purchaseprice_limit-u128", "start_char": 60396, "end_char": 60714, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### purchase(price_limit: `u128`)\n- **interface**: `api.tx.broker.purchase`\n- **summary**:    Purchase Bulk Coretime in the ongoing Sale. \n\n   - `origin`: Must be a Signed origin with at least enough funds to pay the current price  of Bulk Coretime. \n\n  - `price_limit`: An amount no more than which should be paid."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#purchasecreditamount-u128-beneficiary-accountid32", "page_title": "Extrinsics", "index": 134, "depth": 3, "title": "purchaseCredit(amount: `u128`, beneficiary: `AccountId32`)", "anchor": "purchasecreditamount-u128-beneficiary-accountid32", "start_char": 60714, "end_char": 61157, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### purchaseCredit(amount: `u128`, beneficiary: `AccountId32`)\n- **interface**: `api.tx.broker.purchaseCredit`\n- **summary**:    Purchase credit for use in the Instantaneous Coretime Pool. \n\n   - `origin`: Must be a Signed origin able to pay at least `amount`. \n\n  - `amount`: The amount of credit to purchase.\n\n  - `beneficiary`: The account on the Relay-chain which controls the credit (generally this will be the collator's hot wallet)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeassignmentregion_id-palletbrokerregionid", "page_title": "Extrinsics", "index": 135, "depth": 3, "title": "removeAssignment(region_id: `PalletBrokerRegionId`)", "anchor": "removeassignmentregion_id-palletbrokerregionid", "start_char": 61157, "end_char": 61439, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeAssignment(region_id: `PalletBrokerRegionId`)\n- **interface**: `api.tx.broker.removeAssignment`\n- **summary**:    Remove an assignment from the Workplan. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `region_id`: The Region to be removed from the workplan."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeleasetask-u32", "page_title": "Extrinsics", "index": 136, "depth": 3, "title": "removeLease(task: `u32`)", "anchor": "removeleasetask-u32", "start_char": 61439, "end_char": 61666, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeLease(task: `u32`)\n- **interface**: `api.tx.broker.removeLease`\n- **summary**:    Remove a lease. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `task`: The task id of the lease which should be removed."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#renewcore-u16", "page_title": "Extrinsics", "index": 137, "depth": 3, "title": "renew(core: `u16`)", "anchor": "renewcore-u16", "start_char": 61666, "end_char": 61974, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### renew(core: `u16`)\n- **interface**: `api.tx.broker.renew`\n- **summary**:    Renew Bulk Coretime in the ongoing Sale or its prior Interlude Period. \n\n   - `origin`: Must be a Signed origin with at least enough funds to pay the renewal price  of the core. \n\n  - `core`: The core which should be renewed."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#requestcorecountcore_count-u16", "page_title": "Extrinsics", "index": 138, "depth": 3, "title": "requestCoreCount(core_count: `u16`)", "anchor": "requestcorecountcore_count-u16", "start_char": 61974, "end_char": 62278, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### requestCoreCount(core_count: `u16`)\n- **interface**: `api.tx.broker.requestCoreCount`\n- **summary**:    Request a change to the number of cores available for scheduling work. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `core_count`: The desired number of cores to be made available."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reserveworkload-vecpalletbrokerscheduleitem", "page_title": "Extrinsics", "index": 139, "depth": 3, "title": "reserve(workload: `Vec<PalletBrokerScheduleItem>`)", "anchor": "reserveworkload-vecpalletbrokerscheduleitem", "start_char": 62278, "end_char": 62682, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reserve(workload: `Vec<PalletBrokerScheduleItem>`)\n- **interface**: `api.tx.broker.reserve`\n- **summary**:    Reserve a core for a workload. \n\n   The workload will be given a reservation, but two sale period boundaries must pass  before the core is actually assigned. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `workload`: The workload which should be permanently placed on a core."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setleasetask-u32-until-u32", "page_title": "Extrinsics", "index": 140, "depth": 3, "title": "setLease(task: `u32`, until: `u32`)", "anchor": "setleasetask-u32-until-u32", "start_char": 62682, "end_char": 63211, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setLease(task: `u32`, until: `u32`)\n- **interface**: `api.tx.broker.setLease`\n- **summary**:    Reserve a core for a single task workload for a limited period. \n\n   In the interlude and sale period where Bulk Coretime is sold for the period immediately  after `until`, then the same workload may be renewed. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `task`: The workload which should be placed on a core.\n\n  - `until`: The timeslice now earlier than which `task` should be placed as a workload on a core."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#startsalesend_price-u128-extra_cores-u16", "page_title": "Extrinsics", "index": 141, "depth": 3, "title": "startSales(end_price: `u128`, extra_cores: `u16`)", "anchor": "startsalesend_price-u128-extra_cores-u16", "start_char": 63211, "end_char": 63753, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### startSales(end_price: `u128`, extra_cores: `u16`)\n- **interface**: `api.tx.broker.startSales`\n- **summary**:    Begin the Bulk Coretime sales rotation. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `end_price`: The price after the leading period of Bulk Coretime in the first sale.\n\n  - `extra_cores`: Number of extra cores that should be requested on top of the cores required for `Reservations` and `Leases`. \n\n   This will call [`Self::request_core_count`] internally to set the correct core count on  the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#swapleasesid-u32-other-u32", "page_title": "Extrinsics", "index": 142, "depth": 3, "title": "swapLeases(id: `u32`, other: `u32`)", "anchor": "swapleasesid-u32-other-u32", "start_char": 63753, "end_char": 63839, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### swapLeases(id: `u32`, other: `u32`)\n- **interface**: `api.tx.broker.swapLeases`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#transferregion_id-palletbrokerregionid-new_owner-accountid32", "page_title": "Extrinsics", "index": 143, "depth": 3, "title": "transfer(region_id: `PalletBrokerRegionId`, new_owner: `AccountId32`)", "anchor": "transferregion_id-palletbrokerregionid-new_owner-accountid32", "start_char": 63839, "end_char": 64223, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### transfer(region_id: `PalletBrokerRegionId`, new_owner: `AccountId32`)\n- **interface**: `api.tx.broker.transfer`\n- **summary**:    Transfer a Bulk Coretime Region to a new owner. \n\n   - `origin`: Must be a Signed origin of the account which owns the Region `region_id`. \n\n  - `region_id`: The Region whose ownership should change.\n\n  - `new_owner`: The new owner for the Region."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#unreserveitem_index-u32", "page_title": "Extrinsics", "index": 144, "depth": 3, "title": "unreserve(item_index: `u32`)", "anchor": "unreserveitem_index-u32", "start_char": 64223, "end_char": 64760, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### unreserve(item_index: `u32`)\n- **interface**: `api.tx.broker.unreserve`\n- **summary**:    Cancel a reservation for a workload. \n\n   - `origin`: Must be Root or pass `AdminOrigin`. \n\n  - `item_index`: The index of the reservation. Usually this will also be the index of the core on which the reservation has been scheduled. However, it is possible that if  other cores are reserved or unreserved in the same sale rotation that they won't  correspond, so it's better to look up the core properly in the `Reservations` storage. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#childbounties", "page_title": "Extrinsics", "index": 145, "depth": 2, "title": "childBounties", "anchor": "childbounties", "start_char": 64760, "end_char": 64779, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## childBounties"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#acceptcuratorparent_bounty_id-compactu32-child_bounty_id-compactu32", "page_title": "Extrinsics", "index": 146, "depth": 3, "title": "acceptCurator(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)", "anchor": "acceptcuratorparent_bounty_id-compactu32-child_bounty_id-compactu32", "start_char": 64779, "end_char": 65574, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### acceptCurator(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.childBounties.acceptCurator`\n- **summary**:    Accept the curator role for the child-bounty. \n\n   The dispatch origin for this call must be the curator of this  child-bounty. \n\n   A deposit will be reserved from the curator and refund upon  successful payout or cancellation. \n\n   Fee for curator is deducted from curator fee of parent bounty. \n\n   Parent bounty must be in active state, for this child-bounty call to  work. \n\n   Child-bounty must be in \"CuratorProposed\" state, for processing the  call. And state of child-bounty is moved to \"Active\" on successful  call completion. \n\n   - `parent_bounty_id`: Index of parent bounty. \n\n  - `child_bounty_id`: Index of child bounty."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#addchildbountyparent_bounty_id-compactu32-value-compactu128-description-bytes", "page_title": "Extrinsics", "index": 147, "depth": 3, "title": "addChildBounty(parent_bounty_id: `Compact<u32>`, value: `Compact<u128>`, description: `Bytes`)", "anchor": "addchildbountyparent_bounty_id-compactu32-value-compactu128-description-bytes", "start_char": 65574, "end_char": 66500, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### addChildBounty(parent_bounty_id: `Compact<u32>`, value: `Compact<u128>`, description: `Bytes`)\n- **interface**: `api.tx.childBounties.addChildBounty`\n- **summary**:    Add a new child-bounty. \n\n   The dispatch origin for this call must be the curator of parent  bounty and the parent bounty must be in \"active\" state. \n\n   Child-bounty gets added successfully & fund gets transferred from  parent bounty to child-bounty account, if parent bounty has enough  funds, else the call fails. \n\n   Upper bound to maximum number of active  child bounties that can be  added are managed via runtime trait config  [`Config::MaxActiveChildBountyCount`]. \n\n   If the call is success, the status of child-bounty is updated to  \"Added\". \n\n   - `parent_bounty_id`: Index of parent bounty for which child-bounty is being added. \n\n  - `value`: Value for executing the proposal.\n\n  - `description`: Text description for the child-bounty."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#awardchildbountyparent_bounty_id-compactu32-child_bounty_id-compactu32-beneficiary-multiaddress", "page_title": "Extrinsics", "index": 148, "depth": 3, "title": "awardChildBounty(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`, beneficiary: `MultiAddress`)", "anchor": "awardchildbountyparent_bounty_id-compactu32-child_bounty_id-compactu32-beneficiary-multiaddress", "start_char": 66500, "end_char": 67275, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### awardChildBounty(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`, beneficiary: `MultiAddress`)\n- **interface**: `api.tx.childBounties.awardChildBounty`\n- **summary**:    Award child-bounty to a beneficiary. \n\n   The beneficiary will be able to claim the funds after a delay. \n\n   The dispatch origin for this call must be the parent curator or  curator of this child-bounty. \n\n   Parent bounty must be in active state, for this child-bounty call to  work. \n\n   Child-bounty must be in active state, for processing the call. And  state of child-bounty is moved to \"PendingPayout\" on successful call  completion. \n\n   - `parent_bounty_id`: Index of parent bounty. \n\n  - `child_bounty_id`: Index of child bounty.\n\n  - `beneficiary`: Beneficiary account."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#claimchildbountyparent_bounty_id-compactu32-child_bounty_id-compactu32", "page_title": "Extrinsics", "index": 149, "depth": 3, "title": "claimChildBounty(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)", "anchor": "claimchildbountyparent_bounty_id-compactu32-child_bounty_id-compactu32", "start_char": 67275, "end_char": 68050, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### claimChildBounty(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.childBounties.claimChildBounty`\n- **summary**:    Claim the payout from an awarded child-bounty after payout delay. \n\n   The dispatch origin for this call may be any signed origin. \n\n   Call works independent of parent bounty state, No need for parent  bounty to be in active state. \n\n   The Beneficiary is paid out with agreed bounty value. Curator fee is  paid & curator deposit is unreserved. \n\n   Child-bounty must be in \"PendingPayout\" state, for processing the  call. And instance of child-bounty is removed from the state on  successful call completion. \n\n   - `parent_bounty_id`: Index of parent bounty. \n\n  - `child_bounty_id`: Index of child bounty."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#closechildbountyparent_bounty_id-compactu32-child_bounty_id-compactu32", "page_title": "Extrinsics", "index": 150, "depth": 3, "title": "closeChildBounty(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)", "anchor": "closechildbountyparent_bounty_id-compactu32-child_bounty_id-compactu32", "start_char": 68050, "end_char": 69022, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### closeChildBounty(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.childBounties.closeChildBounty`\n- **summary**:    Cancel a proposed or active child-bounty. Child-bounty account funds  are transferred to parent bounty account. The child-bounty curator  deposit may be unreserved if possible. \n\n   The dispatch origin for this call must be either parent curator or  `T::RejectOrigin`. \n\n   If the state of child-bounty is `Active`, curator deposit is  unreserved. \n\n   If the state of child-bounty is `PendingPayout`, call fails &  returns `PendingPayout` error. \n\n   For the origin other than T::RejectOrigin, parent bounty must be in  active state, for this child-bounty call to work. For origin  T::RejectOrigin execution is forced. \n\n   Instance of child-bounty is removed from the state on successful  call completion. \n\n   - `parent_bounty_id`: Index of parent bounty. \n\n  - `child_bounty_id`: Index of child bounty."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#proposecuratorparent_bounty_id-compactu32-child_bounty_id-compactu32-curator-multiaddress-fee-compactu128", "page_title": "Extrinsics", "index": 151, "depth": 3, "title": "proposeCurator(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`, curator: `MultiAddress`, fee: `Compact<u128>`)", "anchor": "proposecuratorparent_bounty_id-compactu32-child_bounty_id-compactu32-curator-multiaddress-fee-compactu128", "start_char": 69022, "end_char": 69794, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### proposeCurator(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`, curator: `MultiAddress`, fee: `Compact<u128>`)\n- **interface**: `api.tx.childBounties.proposeCurator`\n- **summary**:    Propose curator for funded child-bounty. \n\n   The dispatch origin for this call must be curator of parent bounty. \n\n   Parent bounty must be in active state, for this child-bounty call to  work. \n\n   Child-bounty must be in \"Added\" state, for processing the call. And  state of child-bounty is moved to \"CuratorProposed\" on successful  call completion. \n\n   - `parent_bounty_id`: Index of parent bounty. \n\n  - `child_bounty_id`: Index of child bounty.\n\n  - `curator`: Address of child-bounty curator.\n\n  - `fee`: payment fee to child-bounty curator for execution."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#unassigncuratorparent_bounty_id-compactu32-child_bounty_id-compactu32", "page_title": "Extrinsics", "index": 152, "depth": 3, "title": "unassignCurator(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)", "anchor": "unassigncuratorparent_bounty_id-compactu32-child_bounty_id-compactu32", "start_char": 69794, "end_char": 71450, "estimated_token_count": 352, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### unassignCurator(parent_bounty_id: `Compact<u32>`, child_bounty_id: `Compact<u32>`)\n- **interface**: `api.tx.childBounties.unassignCurator`\n- **summary**:    Unassign curator from a child-bounty. \n\n   The dispatch origin for this call can be either `RejectOrigin`, or  the curator of the parent bounty, or any signed origin. \n\n   For the origin other than T::RejectOrigin and the child-bounty  curator, parent bounty must be in active state, for this call to  work. We allow child-bounty curator and T::RejectOrigin to execute  this call irrespective of the parent bounty state. \n\n   If this function is called by the `RejectOrigin` or the  parent bounty curator, we assume that the child-bounty curator is  malicious or inactive. As a result, child-bounty curator deposit is  slashed. \n\n   If the origin is the child-bounty curator, we take this as a sign  that they are unable to do their job, and are willingly giving up.  We could slash the deposit, but for now we allow them to unreserve  their deposit and exit without issue. (We may want to change this if  it is abused.) \n\n   Finally, the origin can be anyone iff the child-bounty curator is  \"inactive\". Expiry update due of parent bounty is used to estimate  inactive state of child-bounty curator. \n\n   This allows anyone in the community to call out that a child-bounty  curator is not doing their due diligence, and we should pick a new  one. In this case the child-bounty curator deposit is slashed. \n\n   State of child-bounty is moved to Added state on successful call  completion. \n\n   - `parent_bounty_id`: Index of parent bounty. \n\n  - `child_bounty_id`: Index of child bounty.\n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#contracts", "page_title": "Extrinsics", "index": 153, "depth": 2, "title": "contracts", "anchor": "contracts", "start_char": 71450, "end_char": 71465, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## contracts"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#calldest-multiaddress-value-compactu128-gas_limit-spweightsweightv2weight-storage_deposit_limit-optioncompactu128-data-bytes", "page_title": "Extrinsics", "index": 154, "depth": 3, "title": "call(dest: `MultiAddress`, value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Option<Compact<u128>>`, data: `Bytes`)", "anchor": "calldest-multiaddress-value-compactu128-gas_limit-spweightsweightv2weight-storage_deposit_limit-optioncompactu128-data-bytes", "start_char": 71465, "end_char": 72493, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### call(dest: `MultiAddress`, value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Option<Compact<u128>>`, data: `Bytes`)\n- **interface**: `api.tx.contracts.call`\n- **summary**:    Makes a call to an account, optionally transferring some balance. \n\n   #### Parameters \n\n   * `dest`: Address of the contract to call. \n\n  * `value`: The balance to transfer from the `origin` to `dest`.\n\n  * `gas_limit`: The gas limit enforced when executing the constructor.\n\n  * `storage_deposit_limit`: The maximum amount of balance that can be charged from the caller to pay for the storage consumed. \n\n  * `data`: The input data to pass to the contract.\n\n   * If the account is a smart-contract account, the associated code will be  executed and any value will be transferred. \n\n  * If the account is a regular account, any value will be transferred.\n\n  * If no account exists and the call value is not less than `existential_deposit`, a regular account will be created and any value will be transferred."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#calloldweightdest-multiaddress-value-compactu128-gas_limit-compactu64-storage_deposit_limit-optioncompactu128-data-bytes", "page_title": "Extrinsics", "index": 155, "depth": 3, "title": "callOldWeight(dest: `MultiAddress`, value: `Compact<u128>`, gas_limit: `Compact<u64>`, storage_deposit_limit: `Option<Compact<u128>>`, data: `Bytes`)", "anchor": "calloldweightdest-multiaddress-value-compactu128-gas_limit-compactu64-storage_deposit_limit-optioncompactu128-data-bytes", "start_char": 72493, "end_char": 72788, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### callOldWeight(dest: `MultiAddress`, value: `Compact<u128>`, gas_limit: `Compact<u64>`, storage_deposit_limit: `Option<Compact<u128>>`, data: `Bytes`)\n- **interface**: `api.tx.contracts.callOldWeight`\n- **summary**:    Deprecated version if [`Self::call`] for use in an in-storage `Call`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#instantiatevalue-compactu128-gas_limit-spweightsweightv2weight-storage_deposit_limit-optioncompactu128-code_hash-h256-data-bytes-salt-bytes", "page_title": "Extrinsics", "index": 156, "depth": 3, "title": "instantiate(value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Option<Compact<u128>>`, code_hash: `H256`, data: `Bytes`, salt: `Bytes`)", "anchor": "instantiatevalue-compactu128-gas_limit-spweightsweightv2weight-storage_deposit_limit-optioncompactu128-code_hash-h256-data-bytes-salt-bytes", "start_char": 72788, "end_char": 73282, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### instantiate(value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Option<Compact<u128>>`, code_hash: `H256`, data: `Bytes`, salt: `Bytes`)\n- **interface**: `api.tx.contracts.instantiate`\n- **summary**:    Instantiates a contract from a previously deployed wasm binary. \n\n   This function is identical to [`Self::instantiate_with_code`] but without the  code deployment step. Instead, the `code_hash` of an on-chain deployed wasm binary  must be supplied."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#instantiateoldweightvalue-compactu128-gas_limit-compactu64-storage_deposit_limit-optioncompactu128-code_hash-h256-data-bytes-salt-bytes", "page_title": "Extrinsics", "index": 157, "depth": 3, "title": "instantiateOldWeight(value: `Compact<u128>`, gas_limit: `Compact<u64>`, storage_deposit_limit: `Option<Compact<u128>>`, code_hash: `H256`, data: `Bytes`, salt: `Bytes`)", "anchor": "instantiateoldweightvalue-compactu128-gas_limit-compactu64-storage_deposit_limit-optioncompactu128-code_hash-h256-data-bytes-salt-bytes", "start_char": 73282, "end_char": 73610, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### instantiateOldWeight(value: `Compact<u128>`, gas_limit: `Compact<u64>`, storage_deposit_limit: `Option<Compact<u128>>`, code_hash: `H256`, data: `Bytes`, salt: `Bytes`)\n- **interface**: `api.tx.contracts.instantiateOldWeight`\n- **summary**:    Deprecated version if [`Self::instantiate`] for use in an in-storage `Call`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#instantiatewithcodevalue-compactu128-gas_limit-spweightsweightv2weight-storage_deposit_limit-optioncompactu128-code-bytes-data-bytes-salt-bytes", "page_title": "Extrinsics", "index": 158, "depth": 3, "title": "instantiateWithCode(value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Option<Compact<u128>>`, code: `Bytes`, data: `Bytes`, salt: `Bytes`)", "anchor": "instantiatewithcodevalue-compactu128-gas_limit-spweightsweightv2weight-storage_deposit_limit-optioncompactu128-code-bytes-data-bytes-salt-bytes", "start_char": 73610, "end_char": 75202, "estimated_token_count": 356, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### instantiateWithCode(value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Option<Compact<u128>>`, code: `Bytes`, data: `Bytes`, salt: `Bytes`)\n- **interface**: `api.tx.contracts.instantiateWithCode`\n- **summary**:    Instantiates a new contract from the supplied `code` optionally transferring  some balance. \n\n   This dispatchable has the same effect as calling [`Self::upload_code`] +  [`Self::instantiate`]. Bundling them together provides efficiency gains. Please  also check the documentation of [`Self::upload_code`]. \n\n   #### Parameters \n\n   * `value`: The balance to transfer from the `origin` to the newly created contract. \n\n  * `gas_limit`: The gas limit enforced when executing the constructor.\n\n  * `storage_deposit_limit`: The maximum amount of balance that can be charged/reserved from the caller to pay for the storage consumed. \n\n  * `code`: The contract code to deploy in raw bytes.\n\n  * `data`: The input data to pass to the contract constructor.\n\n  * `salt`: Used for the address derivation. See [`Pallet::contract_address`].\n\n   Instantiation is executed as follows: \n\n   - The supplied `code` is deployed, and a `code_hash` is created for that code. \n\n  - If the `code_hash` already exists on the chain the underlying `code` will be shared.\n\n  - The destination address is computed based on the sender, code_hash and the salt.\n\n  - The smart-contract account is created at the computed address.\n\n  - The `value` is transferred to the new account.\n\n  - The `deploy` function is executed in the context of the newly-created account."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#instantiatewithcodeoldweightvalue-compactu128-gas_limit-compactu64-storage_deposit_limit-optioncompactu128-code-bytes-data-bytes-salt-bytes", "page_title": "Extrinsics", "index": 159, "depth": 3, "title": "instantiateWithCodeOldWeight(value: `Compact<u128>`, gas_limit: `Compact<u64>`, storage_deposit_limit: `Option<Compact<u128>>`, code: `Bytes`, data: `Bytes`, salt: `Bytes`)", "anchor": "instantiatewithcodeoldweightvalue-compactu128-gas_limit-compactu64-storage_deposit_limit-optioncompactu128-code-bytes-data-bytes-salt-bytes", "start_char": 75202, "end_char": 75552, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### instantiateWithCodeOldWeight(value: `Compact<u128>`, gas_limit: `Compact<u64>`, storage_deposit_limit: `Option<Compact<u128>>`, code: `Bytes`, data: `Bytes`, salt: `Bytes`)\n- **interface**: `api.tx.contracts.instantiateWithCodeOldWeight`\n- **summary**:    Deprecated version if [`Self::instantiate_with_code`] for use in an in-storage `Call`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#migrateweight_limit-spweightsweightv2weight", "page_title": "Extrinsics", "index": 160, "depth": 3, "title": "migrate(weight_limit: `SpWeightsWeightV2Weight`)", "anchor": "migrateweight_limit-spweightsweightv2weight", "start_char": 75552, "end_char": 75984, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### migrate(weight_limit: `SpWeightsWeightV2Weight`)\n- **interface**: `api.tx.contracts.migrate`\n- **summary**:    When a migration is in progress, this dispatchable can be used to run migration steps.  Calls that contribute to advancing the migration have their fees waived, as it's helpful  for the chain. Note that while the migration is in progress, the pallet will also  leverage the `on_idle` hooks to run migration steps."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removecodecode_hash-h256", "page_title": "Extrinsics", "index": 161, "depth": 3, "title": "removeCode(code_hash: `H256`)", "anchor": "removecodecode_hash-h256", "start_char": 75984, "end_char": 76278, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeCode(code_hash: `H256`)\n- **interface**: `api.tx.contracts.removeCode`\n- **summary**:    Remove the code stored under `code_hash` and refund the deposit to its owner. \n\n   A code can only be removed by its original uploader (its owner) and only if it is  not used by any contract."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setcodedest-multiaddress-code_hash-h256", "page_title": "Extrinsics", "index": 162, "depth": 3, "title": "setCode(dest: `MultiAddress`, code_hash: `H256`)", "anchor": "setcodedest-multiaddress-code_hash-h256", "start_char": 76278, "end_char": 76808, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setCode(dest: `MultiAddress`, code_hash: `H256`)\n- **interface**: `api.tx.contracts.setCode`\n- **summary**:    Privileged function that changes the code of an existing contract. \n\n   This takes care of updating refcounts and all other necessary operations. Returns  an error if either the `code_hash` or `dest` do not exist. \n\n   #### Note \n\n   This does **not** change the address of the contract in question. This means  that the contract address is no longer derived from its code hash after calling  this dispatchable."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#uploadcodecode-bytes-storage_deposit_limit-optioncompactu128-determinism-palletcontractswasmdeterminism", "page_title": "Extrinsics", "index": 163, "depth": 3, "title": "uploadCode(code: `Bytes`, storage_deposit_limit: `Option<Compact<u128>>`, determinism: `PalletContractsWasmDeterminism`)", "anchor": "uploadcodecode-bytes-storage_deposit_limit-optioncompactu128-determinism-palletcontractswasmdeterminism", "start_char": 76808, "end_char": 78163, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### uploadCode(code: `Bytes`, storage_deposit_limit: `Option<Compact<u128>>`, determinism: `PalletContractsWasmDeterminism`)\n- **interface**: `api.tx.contracts.uploadCode`\n- **summary**:    Upload new `code` without instantiating a contract from it. \n\n   If the code does not already exist a deposit is reserved from the caller  and unreserved only when [`Self::remove_code`] is called. The size of the reserve  depends on the size of the supplied `code`. \n\n   If the code already exists in storage it will still return `Ok` and upgrades  the in storage version to the current `InstructionWeights::version`. \n\n   - `determinism`: If this is set to any other value but [`Determinism::Enforced`] then  the only way to use this code is to delegate call into it from an offchain execution.  Set to [`Determinism::Enforced`] if in doubt. \n\n   #### Note \n\n   Anyone can instantiate a contract from any uploaded code and thus prevent its removal.  To avoid this situation a constructor could employ access control so that it can  only be instantiated by permissioned entities. The same is true when uploading  through [`Self::instantiate_with_code`]. \n\n   Use [`Determinism::Relaxed`] exclusively for non-deterministic code. If the uploaded  code is deterministic, specifying [`Determinism::Relaxed`] will be disregarded and  result in higher gas costs. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#convictionvoting", "page_title": "Extrinsics", "index": 164, "depth": 2, "title": "convictionVoting", "anchor": "convictionvoting", "start_char": 78163, "end_char": 78185, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## convictionVoting"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#delegateclass-u16-to-multiaddress-conviction-palletconvictionvotingconviction-balance-u128", "page_title": "Extrinsics", "index": 165, "depth": 3, "title": "delegate(class: `u16`, to: `MultiAddress`, conviction: `PalletConvictionVotingConviction`, balance: `u128`)", "anchor": "delegateclass-u16-to-multiaddress-conviction-palletconvictionvotingconviction-balance-u128", "start_char": 78185, "end_char": 79551, "estimated_token_count": 299, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### delegate(class: `u16`, to: `MultiAddress`, conviction: `PalletConvictionVotingConviction`, balance: `u128`)\n- **interface**: `api.tx.convictionVoting.delegate`\n- **summary**:    Delegate the voting power (with some given conviction) of the sending account for a  particular class of polls. \n\n   The balance delegated is locked for as long as it's delegated, and thereafter for the  time appropriate for the conviction's lock period. \n\n   The dispatch origin of this call must be _Signed_, and the signing account must either: \n\n  - be delegating already; or\n\n  - have no voting activity (if there is, then it will need to be removed through `remove_vote`). \n\n   - `to`: The account whose voting the `target` account's voting power will follow. \n\n  - `class`: The class of polls to delegate. To delegate multiple classes, multiple calls to this function are required. \n\n  - `conviction`: The conviction that will be attached to the delegated votes. When the account is undelegated, the funds will be locked for the corresponding period. \n\n  - `balance`: The amount of the account's balance to be used in delegating. This must not be more than the account's current balance. \n\n   Emits `Delegated`. \n\n   Weight: `O(R)` where R is the number of polls the voter delegating to has  voted on. Weight is initially charged as if maximum votes, but is refunded later."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeothervotetarget-multiaddress-class-u16-index-u32", "page_title": "Extrinsics", "index": 166, "depth": 3, "title": "removeOtherVote(target: `MultiAddress`, class: `u16`, index: `u32`)", "anchor": "removeothervotetarget-multiaddress-class-u16-index-u32", "start_char": 79551, "end_char": 80407, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeOtherVote(target: `MultiAddress`, class: `u16`, index: `u32`)\n- **interface**: `api.tx.convictionVoting.removeOtherVote`\n- **summary**:    Remove a vote for a poll. \n\n   If the `target` is equal to the signer, then this function is exactly equivalent to  `remove_vote`. If not equal to the signer, then the vote must have expired,  either because the poll was cancelled, because the voter lost the poll or  because the conviction period is over. \n\n   The dispatch origin of this call must be _Signed_. \n\n   - `target`: The account of the vote to be removed; this account must have voted for poll  `index`. \n\n  - `index`: The index of poll of the vote to be removed.\n\n  - `class`: The class of the poll.\n\n   Weight: `O(R + log R)` where R is the number of polls that `target` has voted on.  Weight is calculated for the maximum number of vote."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removevoteclass-optionu16-index-u32", "page_title": "Extrinsics", "index": 167, "depth": 3, "title": "removeVote(class: `Option<u16>`, index: `u32`)", "anchor": "removevoteclass-optionu16-index-u32", "start_char": 80407, "end_char": 81852, "estimated_token_count": 337, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeVote(class: `Option<u16>`, index: `u32`)\n- **interface**: `api.tx.convictionVoting.removeVote`\n- **summary**:    Remove a vote for a poll. \n\n   If: \n\n  - the poll was cancelled, or\n\n  - the poll is ongoing, or\n\n  - the poll has ended such that\n\n  - the vote of the account was in opposition to the result; or\n\n  - there was no conviction to the account's vote; or\n\n  - the account made a split vote ...then the vote is removed cleanly and a following call to `unlock` may result in more  funds being available. \n\n   If, however, the poll has ended and: \n\n  - it finished corresponding to the vote of the account, and\n\n  - the account made a standard vote with conviction, and\n\n  - the lock period of the conviction is not over ...then the lock will be aggregated into the overall account's lock, which may involve \n\n  *overlocking* (where the two locks are combined into a single lock that is the maximum of both the amount locked and the time is it locked for). \n\n   The dispatch origin of this call must be _Signed_, and the signer must have a vote  registered for poll `index`. \n\n   - `index`: The index of poll of the vote to be removed. \n\n  - `class`: Optional parameter, if given it indicates the class of the poll. For polls which have finished or are cancelled, this must be `Some`. \n\n   Weight: `O(R + log R)` where R is the number of polls that `target` has voted on.  Weight is calculated for the maximum number of vote."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#undelegateclass-u16", "page_title": "Extrinsics", "index": 168, "depth": 3, "title": "undelegate(class: `u16`)", "anchor": "undelegateclass-u16", "start_char": 81852, "end_char": 82565, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### undelegate(class: `u16`)\n- **interface**: `api.tx.convictionVoting.undelegate`\n- **summary**:    Undelegate the voting power of the sending account for a particular class of polls. \n\n   Tokens may be unlocked following once an amount of time consistent with the lock period  of the conviction with which the delegation was issued has passed. \n\n   The dispatch origin of this call must be _Signed_ and the signing account must be  currently delegating. \n\n   - `class`: The class of polls to remove the delegation from. \n\n   Emits `Undelegated`. \n\n   Weight: `O(R)` where R is the number of polls the voter delegating to has  voted on. Weight is initially charged as if maximum votes, but is refunded later."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#unlockclass-u16-target-multiaddress", "page_title": "Extrinsics", "index": 169, "depth": 3, "title": "unlock(class: `u16`, target: `MultiAddress`)", "anchor": "unlockclass-u16-target-multiaddress", "start_char": 82565, "end_char": 82986, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### unlock(class: `u16`, target: `MultiAddress`)\n- **interface**: `api.tx.convictionVoting.unlock`\n- **summary**:    Remove the lock caused by prior voting/delegating which has expired within a particular  class. \n\n   The dispatch origin of this call must be _Signed_. \n\n   - `class`: The class of polls to unlock. \n\n  - `target`: The account to remove the lock on.\n\n   Weight: `O(R)` with R number of vote of target."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#votepoll_index-compactu32-vote-palletconvictionvotingvoteaccountvote", "page_title": "Extrinsics", "index": 170, "depth": 3, "title": "vote(poll_index: `Compact<u32>`, vote: `PalletConvictionVotingVoteAccountVote`)", "anchor": "votepoll_index-compactu32-vote-palletconvictionvotingvoteaccountvote", "start_char": 82986, "end_char": 83487, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### vote(poll_index: `Compact<u32>`, vote: `PalletConvictionVotingVoteAccountVote`)\n- **interface**: `api.tx.convictionVoting.vote`\n- **summary**:    Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal;  otherwise it is a vote to keep the status quo. \n\n   The dispatch origin of this call must be _Signed_. \n\n   - `poll_index`: The index of the poll to vote for. \n\n  - `vote`: The vote configuration.\n\n   Weight: `O(R)` where R is the number of polls the voter has voted on. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#corefellowship", "page_title": "Extrinsics", "index": 171, "depth": 2, "title": "coreFellowship", "anchor": "corefellowship", "start_char": 83487, "end_char": 83507, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## coreFellowship"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#approvewho-accountid32-at_rank-u16", "page_title": "Extrinsics", "index": 172, "depth": 3, "title": "approve(who: `AccountId32`, at_rank: `u16`)", "anchor": "approvewho-accountid32-at_rank-u16", "start_char": 83507, "end_char": 83990, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### approve(who: `AccountId32`, at_rank: `u16`)\n- **interface**: `api.tx.coreFellowship.approve`\n- **summary**:    Approve a member to continue at their rank. \n\n   This resets `last_proof` to the current block, thereby delaying any automatic demotion. \n\n   `who` must already be tracked by this pallet for this to have an effect. \n\n   - `origin`: An origin which satisfies `ApproveOrigin` or root. \n\n  - `who`: A member (i.e. of non-zero rank).\n\n  - `at_rank`: The rank of member."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#bumpwho-accountid32", "page_title": "Extrinsics", "index": 173, "depth": 3, "title": "bump(who: `AccountId32`)", "anchor": "bumpwho-accountid32", "start_char": 83990, "end_char": 84320, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### bump(who: `AccountId32`)\n- **interface**: `api.tx.coreFellowship.bump`\n- **summary**:    Bump the state of a member. \n\n   This will demote a member whose `last_proof` is now beyond their rank's  `demotion_period`. \n\n   - `origin`: A `Signed` origin of an account. \n\n  - `who`: A member account whose state is to be updated."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#import", "page_title": "Extrinsics", "index": 174, "depth": 3, "title": "import()", "anchor": "import", "start_char": 84320, "end_char": 84746, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### import()\n- **interface**: `api.tx.coreFellowship.import`\n- **summary**:    Introduce an already-ranked individual of the collective into this pallet. \n\n   The rank may still be zero. This resets `last_proof` to the current block and  `last_promotion` will be set to zero, thereby delaying any automatic demotion but  allowing immediate promotion. \n\n   - `origin`: A signed origin of a ranked, but not tracked, account."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#importmemberwho-accountid32", "page_title": "Extrinsics", "index": 175, "depth": 3, "title": "importMember(who: `AccountId32`)", "anchor": "importmemberwho-accountid32", "start_char": 84746, "end_char": 85348, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### importMember(who: `AccountId32`)\n- **interface**: `api.tx.coreFellowship.importMember`\n- **summary**:    Introduce an already-ranked individual of the collective into this pallet. \n\n   The rank may still be zero. Can be called by anyone on any collective member - including  the sender. \n\n   This resets `last_proof` to the current block and `last_promotion` will be set to zero,  thereby delaying any automatic demotion but allowing immediate promotion. \n\n   - `origin`: A signed origin of a ranked, but not tracked, account. \n\n  - `who`: The account ID of the collective member to be inducted."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#inductwho-accountid32", "page_title": "Extrinsics", "index": 176, "depth": 3, "title": "induct(who: `AccountId32`)", "anchor": "inductwho-accountid32", "start_char": 85348, "end_char": 85647, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### induct(who: `AccountId32`)\n- **interface**: `api.tx.coreFellowship.induct`\n- **summary**:    Introduce a new and unranked candidate (rank zero). \n\n   - `origin`: An origin which satisfies `InductOrigin` or root. \n\n  - `who`: The account ID of the candidate to be inducted and become a member."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#offboardwho-accountid32", "page_title": "Extrinsics", "index": 177, "depth": 3, "title": "offboard(who: `AccountId32`)", "anchor": "offboardwho-accountid32", "start_char": 85647, "end_char": 86003, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### offboard(who: `AccountId32`)\n- **interface**: `api.tx.coreFellowship.offboard`\n- **summary**:    Stop tracking a prior member who is now not a ranked member of the collective. \n\n   - `origin`: A `Signed` origin of an account. \n\n  - `who`: The ID of an account which was tracked in this pallet but which is now not a ranked member of the collective."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#promotewho-accountid32-to_rank-u16", "page_title": "Extrinsics", "index": 178, "depth": 3, "title": "promote(who: `AccountId32`, to_rank: `u16`)", "anchor": "promotewho-accountid32-to_rank-u16", "start_char": 86003, "end_char": 86414, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### promote(who: `AccountId32`, to_rank: `u16`)\n- **interface**: `api.tx.coreFellowship.promote`\n- **summary**:    Increment the rank of a ranked and tracked account. \n\n   - `origin`: An origin which satisfies `PromoteOrigin` with a `Success` result of  `to_rank` or more or root. \n\n  - `who`: The account ID of the member to be promoted to `to_rank`.\n\n  - `to_rank`: One more than the current rank of `who`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#promotefastwho-accountid32-to_rank-u16", "page_title": "Extrinsics", "index": 179, "depth": 3, "title": "promoteFast(who: `AccountId32`, to_rank: `u16`)", "anchor": "promotefastwho-accountid32-to_rank-u16", "start_char": 86414, "end_char": 86804, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### promoteFast(who: `AccountId32`, to_rank: `u16`)\n- **interface**: `api.tx.coreFellowship.promoteFast`\n- **summary**:    Fast promotions can skip ranks and ignore the `min_promotion_period`. \n\n   This is useful for out-of-band promotions, hence it has its own `FastPromoteOrigin` to  be (possibly) more restrictive than `PromoteOrigin`. Note that the member must already  be inducted."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setactiveis_active-bool", "page_title": "Extrinsics", "index": 180, "depth": 3, "title": "setActive(is_active: `bool`)", "anchor": "setactiveis_active-bool", "start_char": 86804, "end_char": 87057, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setActive(is_active: `bool`)\n- **interface**: `api.tx.coreFellowship.setActive`\n- **summary**:    Set whether a member is active or not. \n\n   - `origin`: A `Signed` origin of a member's account. \n\n  - `is_active`: `true` iff the member is active."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setparamsparams-palletcorefellowshipparamstypeu128", "page_title": "Extrinsics", "index": 181, "depth": 3, "title": "setParams(params: `PalletCoreFellowshipParamsTypeU128`)", "anchor": "setparamsparams-palletcorefellowshipparamstypeu128", "start_char": 87057, "end_char": 87325, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setParams(params: `PalletCoreFellowshipParamsTypeU128`)\n- **interface**: `api.tx.coreFellowship.setParams`\n- **summary**:    Set the parameters. \n\n   - `origin`: An origin complying with `ParamsOrigin` or root. \n\n  - `params`: The new parameters for the pallet."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setpartialparamspartial_params-palletcorefellowshipparamstypeoption", "page_title": "Extrinsics", "index": 182, "depth": 3, "title": "setPartialParams(partial_params: `PalletCoreFellowshipParamsTypeOption`)", "anchor": "setpartialparamspartial_params-palletcorefellowshipparamstypeoption", "start_char": 87325, "end_char": 87759, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setPartialParams(partial_params: `PalletCoreFellowshipParamsTypeOption`)\n- **interface**: `api.tx.coreFellowship.setPartialParams`\n- **summary**:    Set the parameters partially. \n\n   - `origin`: An origin complying with `ParamsOrigin` or root. \n\n  - `partial_params`: The new parameters for the pallet.\n\n   This update config with multiple arguments without duplicating  the fields that does not need to update (set to None)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#submitevidencewish-palletcorefellowshipwish-evidence-bytes", "page_title": "Extrinsics", "index": 183, "depth": 3, "title": "submitEvidence(wish: `PalletCoreFellowshipWish`, evidence: `Bytes`)", "anchor": "submitevidencewish-palletcorefellowshipwish-evidence-bytes", "start_char": 87759, "end_char": 88472, "estimated_token_count": 157, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### submitEvidence(wish: `PalletCoreFellowshipWish`, evidence: `Bytes`)\n- **interface**: `api.tx.coreFellowship.submitEvidence`\n- **summary**:    Provide evidence that a rank is deserved. \n\n   This is free as long as no evidence for the forthcoming judgement is already submitted.  Evidence is cleared after an outcome (either demotion, promotion of approval). \n\n   - `origin`: A `Signed` origin of an inducted and ranked account. \n\n  - `wish`: The stated desire of the member.\n\n  - `evidence`: A dump of evidence to be considered. This should generally be either a Markdown-encoded document or a series of 32-byte hashes which can be found on a  decentralised content-based-indexing system such as IPFS. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#council", "page_title": "Extrinsics", "index": 184, "depth": 2, "title": "council", "anchor": "council", "start_char": 88472, "end_char": 88485, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## council"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#closeproposal_hash-h256-index-compactu32-proposal_weight_bound-spweightsweightv2weight-length_bound-compactu32_2", "page_title": "Extrinsics", "index": 185, "depth": 3, "title": "close(proposal_hash: `H256`, index: `Compact<u32>`, proposal_weight_bound: `SpWeightsWeightV2Weight`, length_bound: `Compact<u32>`)", "anchor": "closeproposal_hash-h256-index-compactu32-proposal_weight_bound-spweightsweightv2weight-length_bound-compactu32_2", "start_char": 88485, "end_char": 89878, "estimated_token_count": 320, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### close(proposal_hash: `H256`, index: `Compact<u32>`, proposal_weight_bound: `SpWeightsWeightV2Weight`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.council.close`\n- **summary**:    Close a vote that is either approved, disapproved or whose voting period has ended. \n\n   May be called by any signed account in order to finish voting and close the proposal. \n\n   If called before the end of the voting period it will only close the vote if it is  has enough votes to be approved or disapproved. \n\n   If called after the end of the voting period abstentions are counted as rejections  unless there is a prime member set and the prime member cast an approval. \n\n   If the close operation completes successfully with disapproval, the transaction fee will  be waived. Otherwise execution of the approved operation will be charged to the caller. \n\n   + `proposal_weight_bound`: The maximum amount of weight consumed by executing the closed  proposal.  + `length_bound`: The upper bound for the length of the proposal in storage. Checked via  `storage::read` so it is `size_of::<u32>() == 4` larger than the pure length. \n\n   #### Complexity \n\n  - `O(B + M + P1 + P2)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` is members-count (code- and governance-bounded)\n\n  - `P1` is the complexity of `proposal` preimage.\n\n  - `P2` is proposal-count (code-bounded)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#disapproveproposalproposal_hash-h256_1", "page_title": "Extrinsics", "index": 186, "depth": 3, "title": "disapproveProposal(proposal_hash: `H256`)", "anchor": "disapproveproposalproposal_hash-h256_1", "start_char": 89878, "end_char": 90291, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### disapproveProposal(proposal_hash: `H256`)\n- **interface**: `api.tx.council.disapproveProposal`\n- **summary**:    Disapprove a proposal, close, and remove it from the system, regardless of its current  state. \n\n   Must be called by the Root origin. \n\n   Parameters: \n\n  * `proposal_hash`: The hash of the proposal that should be disapproved.\n\n   #### Complexity  O(P) where P is the number of max proposals"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#executeproposal-call-length_bound-compactu32_1", "page_title": "Extrinsics", "index": 187, "depth": 3, "title": "execute(proposal: `Call`, length_bound: `Compact<u32>`)", "anchor": "executeproposal-call-length_bound-compactu32_1", "start_char": 90291, "end_char": 90714, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### execute(proposal: `Call`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.council.execute`\n- **summary**:    Dispatch a proposal from a member using the `Member` origin. \n\n   Origin must be a member of the collective. \n\n   #### Complexity: \n\n  - `O(B + M + P)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` members-count (code-bounded)\n\n  - `P` complexity of dispatching `proposal`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#killproposal_hash-h256_1", "page_title": "Extrinsics", "index": 188, "depth": 3, "title": "kill(proposal_hash: `H256`)", "anchor": "killproposal_hash-h256_1", "start_char": 90714, "end_char": 91096, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### kill(proposal_hash: `H256`)\n- **interface**: `api.tx.council.kill`\n- **summary**:    Disapprove the proposal and burn the cost held for storing this proposal. \n\n   Parameters: \n\n  - `origin`: must be the `KillOrigin`.\n\n  - `proposal_hash`: The hash of the proposal that should be killed.\n\n   Emits `Killed` and `ProposalCostBurned` if any cost was held for a given proposal."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#proposethreshold-compactu32-proposal-call-length_bound-compactu32_2", "page_title": "Extrinsics", "index": 189, "depth": 3, "title": "propose(threshold: `Compact<u32>`, proposal: `Call`, length_bound: `Compact<u32>`)", "anchor": "proposethreshold-compactu32-proposal-call-length_bound-compactu32_2", "start_char": 91096, "end_char": 91815, "estimated_token_count": 205, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### propose(threshold: `Compact<u32>`, proposal: `Call`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.council.propose`\n- **summary**:    Add a new proposal to either be voted on or executed directly. \n\n   Requires the sender to be member. \n\n   `threshold` determines whether `proposal` is executed directly (`threshold < 2`)  or put up for voting. \n\n   #### Complexity \n\n  - `O(B + M + P1)` or `O(B + M + P2)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` is members-count (code- and governance-bounded)\n\n  - branching is influenced by `threshold` where:\n\n  - `P1` is proposal execution complexity (`threshold < 2`)\n\n  - `P2` is proposals-count (code-bounded) (`threshold >= 2`)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#releaseproposalcostproposal_hash-h256_1", "page_title": "Extrinsics", "index": 190, "depth": 3, "title": "releaseProposalCost(proposal_hash: `H256`)", "anchor": "releaseproposalcostproposal_hash-h256_1", "start_char": 91815, "end_char": 92292, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### releaseProposalCost(proposal_hash: `H256`)\n- **interface**: `api.tx.council.releaseProposalCost`\n- **summary**:    Release the cost held for storing a proposal once the given proposal is completed. \n\n   If there is no associated cost for the given proposal, this call will have no effect. \n\n   Parameters: \n\n  - `origin`: must be `Signed` or `Root`.\n\n  - `proposal_hash`: The hash of the proposal.\n\n   Emits `ProposalCostReleased` if any cost held for a given proposal."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setmembersnew_members-vecaccountid32-prime-optionaccountid32-old_count-u32_1", "page_title": "Extrinsics", "index": 191, "depth": 3, "title": "setMembers(new_members: `Vec<AccountId32>`, prime: `Option<AccountId32>`, old_count: `u32`)", "anchor": "setmembersnew_members-vecaccountid32-prime-optionaccountid32-old_count-u32_1", "start_char": 92292, "end_char": 93452, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setMembers(new_members: `Vec<AccountId32>`, prime: `Option<AccountId32>`, old_count: `u32`)\n- **interface**: `api.tx.council.setMembers`\n- **summary**:    Set the collective's membership. \n\n   - `new_members`: The new member list. Be nice to the chain and provide it sorted. \n\n  - `prime`: The prime member whose vote sets the default.\n\n  - `old_count`: The upper bound for the previous number of members in storage. Used for weight estimation. \n\n   The dispatch of this call must be `SetMembersOrigin`. \n\n   NOTE: Does not enforce the expected `MaxMembers` limit on the amount of members, but  the weight estimations rely on it to estimate dispatchable weight. \n\n   #### WARNING: \n\n   The `pallet-collective` can also be managed by logic outside of the pallet through the  implementation of the trait [`ChangeMembers`].  Any call to `set_members` must be careful that the member set doesn't get out of sync  with other logic managing the member set. \n\n   #### Complexity: \n\n  - `O(MP + N)` where:\n\n  - `M` old-members-count (code- and governance-bounded)\n\n  - `N` new-members-count (code- and governance-bounded)\n\n  - `P` proposals-count (code-bounded)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#voteproposal-h256-index-compactu32-approve-bool_2", "page_title": "Extrinsics", "index": 192, "depth": 3, "title": "vote(proposal: `H256`, index: `Compact<u32>`, approve: `bool`)", "anchor": "voteproposal-h256-index-compactu32-approve-bool_2", "start_char": 93452, "end_char": 93953, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### vote(proposal: `H256`, index: `Compact<u32>`, approve: `bool`)\n- **interface**: `api.tx.council.vote`\n- **summary**:    Add an aye or nay vote for the sender to the given proposal. \n\n   Requires the sender to be a member. \n\n   Transaction fees will be waived if the member is voting on any particular proposal  for the first time and the call is successful. Subsequent vote changes will charge a  fee.  #### Complexity \n\n  - `O(M)` where `M` is members-count (code- and governance-bounded)\n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#democracy", "page_title": "Extrinsics", "index": 193, "depth": 2, "title": "democracy", "anchor": "democracy", "start_char": 93953, "end_char": 93968, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## democracy"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#blacklistproposal_hash-h256-maybe_ref_index-optionu32", "page_title": "Extrinsics", "index": 194, "depth": 3, "title": "blacklist(proposal_hash: `H256`, maybe_ref_index: `Option<u32>`)", "anchor": "blacklistproposal_hash-h256-maybe_ref_index-optionu32", "start_char": 93968, "end_char": 94743, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### blacklist(proposal_hash: `H256`, maybe_ref_index: `Option<u32>`)\n- **interface**: `api.tx.democracy.blacklist`\n- **summary**:    Permanently place a proposal into the blacklist. This prevents it from ever being  proposed again. \n\n   If called on a queued public or external proposal, then this will result in it being  removed. If the `ref_index` supplied is an active referendum with the proposal hash,  then it will be cancelled. \n\n   The dispatch origin of this call must be `BlacklistOrigin`. \n\n   - `proposal_hash`: The proposal hash to blacklist permanently. \n\n  - `ref_index`: An ongoing referendum whose hash is `proposal_hash`, which will be cancelled. \n\n   Weight: `O(p)` (though as this is an high-privilege dispatch, we assume it has a  reasonable value)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#cancelproposalprop_index-compactu32", "page_title": "Extrinsics", "index": 195, "depth": 3, "title": "cancelProposal(prop_index: `Compact<u32>`)", "anchor": "cancelproposalprop_index-compactu32", "start_char": 94743, "end_char": 95072, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### cancelProposal(prop_index: `Compact<u32>`)\n- **interface**: `api.tx.democracy.cancelProposal`\n- **summary**:    Remove a proposal. \n\n   The dispatch origin of this call must be `CancelProposalOrigin`. \n\n   - `prop_index`: The index of the proposal to cancel. \n\n   Weight: `O(p)` where `p = PublicProps::<T>::decode_len()`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#cancelreferendumref_index-compactu32", "page_title": "Extrinsics", "index": 196, "depth": 3, "title": "cancelReferendum(ref_index: `Compact<u32>`)", "anchor": "cancelreferendumref_index-compactu32", "start_char": 95072, "end_char": 95349, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### cancelReferendum(ref_index: `Compact<u32>`)\n- **interface**: `api.tx.democracy.cancelReferendum`\n- **summary**:    Remove a referendum. \n\n   The dispatch origin of this call must be _Root_. \n\n   - `ref_index`: The index of the referendum to cancel. \n\n   Weight: `O(1)`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#clearpublicproposals", "page_title": "Extrinsics", "index": 197, "depth": 3, "title": "clearPublicProposals()", "anchor": "clearpublicproposals", "start_char": 95349, "end_char": 95558, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### clearPublicProposals()\n- **interface**: `api.tx.democracy.clearPublicProposals`\n- **summary**:    Clears all public proposals. \n\n   The dispatch origin of this call must be _Root_. \n\n   Weight: `O(1)`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#delegateto-multiaddress-conviction-palletdemocracyconviction-balance-u128", "page_title": "Extrinsics", "index": 198, "depth": 3, "title": "delegate(to: `MultiAddress`, conviction: `PalletDemocracyConviction`, balance: `u128`)", "anchor": "delegateto-multiaddress-conviction-palletdemocracyconviction-balance-u128", "start_char": 95558, "end_char": 96736, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### delegate(to: `MultiAddress`, conviction: `PalletDemocracyConviction`, balance: `u128`)\n- **interface**: `api.tx.democracy.delegate`\n- **summary**:    Delegate the voting power (with some given conviction) of the sending account. \n\n   The balance delegated is locked for as long as it's delegated, and thereafter for the  time appropriate for the conviction's lock period. \n\n   The dispatch origin of this call must be _Signed_, and the signing account must either: \n\n  - be delegating already; or\n\n  - have no voting activity (if there is, then it will need to be removed/consolidated through `reap_vote` or `unvote`). \n\n   - `to`: The account whose voting the `target` account's voting power will follow. \n\n  - `conviction`: The conviction that will be attached to the delegated votes. When the account is undelegated, the funds will be locked for the corresponding period. \n\n  - `balance`: The amount of the account's balance to be used in delegating. This must not be more than the account's current balance. \n\n   Emits `Delegated`. \n\n   Weight: `O(R)` where R is the number of referendums the voter delegating to has  voted on. Weight is charged as if maximum votes."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#emergencycancelref_index-u32", "page_title": "Extrinsics", "index": 199, "depth": 3, "title": "emergencyCancel(ref_index: `u32`)", "anchor": "emergencycancelref_index-u32", "start_char": 96736, "end_char": 97091, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### emergencyCancel(ref_index: `u32`)\n- **interface**: `api.tx.democracy.emergencyCancel`\n- **summary**:    Schedule an emergency cancellation of a referendum. Cannot happen twice to the same  referendum. \n\n   The dispatch origin of this call must be `CancellationOrigin`. \n\n   -`ref_index`: The index of the referendum to cancel. \n\n   Weight: `O(1)`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#externalproposeproposal-framesupportpreimagesbounded", "page_title": "Extrinsics", "index": 200, "depth": 3, "title": "externalPropose(proposal: `FrameSupportPreimagesBounded`)", "anchor": "externalproposeproposal-framesupportpreimagesbounded", "start_char": 97091, "end_char": 97438, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### externalPropose(proposal: `FrameSupportPreimagesBounded`)\n- **interface**: `api.tx.democracy.externalPropose`\n- **summary**:    Schedule a referendum to be tabled once it is legal to schedule an external  referendum. \n\n   The dispatch origin of this call must be `ExternalOrigin`. \n\n   - `proposal_hash`: The preimage hash of the proposal."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#externalproposedefaultproposal-framesupportpreimagesbounded", "page_title": "Extrinsics", "index": 201, "depth": 3, "title": "externalProposeDefault(proposal: `FrameSupportPreimagesBounded`)", "anchor": "externalproposedefaultproposal-framesupportpreimagesbounded", "start_char": 97438, "end_char": 97974, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### externalProposeDefault(proposal: `FrameSupportPreimagesBounded`)\n- **interface**: `api.tx.democracy.externalProposeDefault`\n- **summary**:    Schedule a negative-turnout-bias referendum to be tabled next once it is legal to  schedule an external referendum. \n\n   The dispatch of this call must be `ExternalDefaultOrigin`. \n\n   - `proposal_hash`: The preimage hash of the proposal. \n\n   Unlike `external_propose`, blacklisting has no effect on this and it may replace a  pre-scheduled `external_propose` call. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#externalproposemajorityproposal-framesupportpreimagesbounded", "page_title": "Extrinsics", "index": 202, "depth": 3, "title": "externalProposeMajority(proposal: `FrameSupportPreimagesBounded`)", "anchor": "externalproposemajorityproposal-framesupportpreimagesbounded", "start_char": 97974, "end_char": 98508, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### externalProposeMajority(proposal: `FrameSupportPreimagesBounded`)\n- **interface**: `api.tx.democracy.externalProposeMajority`\n- **summary**:    Schedule a majority-carries referendum to be tabled next once it is legal to schedule  an external referendum. \n\n   The dispatch of this call must be `ExternalMajorityOrigin`. \n\n   - `proposal_hash`: The preimage hash of the proposal. \n\n   Unlike `external_propose`, blacklisting has no effect on this and it may replace a  pre-scheduled `external_propose` call. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#fasttrackproposal_hash-h256-voting_period-u32-delay-u32", "page_title": "Extrinsics", "index": 203, "depth": 3, "title": "fastTrack(proposal_hash: `H256`, voting_period: `u32`, delay: `u32`)", "anchor": "fasttrackproposal_hash-h256-voting_period-u32-delay-u32", "start_char": 98508, "end_char": 99387, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### fastTrack(proposal_hash: `H256`, voting_period: `u32`, delay: `u32`)\n- **interface**: `api.tx.democracy.fastTrack`\n- **summary**:    Schedule the currently externally-proposed majority-carries referendum to be tabled  immediately. If there is no externally-proposed referendum currently, or if there is one  but it is not a majority-carries referendum then it fails. \n\n   The dispatch of this call must be `FastTrackOrigin`. \n\n   - `proposal_hash`: The hash of the current external proposal. \n\n  - `voting_period`: The period that is allowed for voting on this proposal. Increased to Must be always greater than zero.  For `FastTrackOrigin` must be equal or greater than `FastTrackVotingPeriod`. \n\n  - `delay`: The number of block after voting has ended in approval and this should be enacted. This doesn't have a minimum amount. \n\n   Emits `Started`. \n\n   Weight: `O(1)`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#proposeproposal-framesupportpreimagesbounded-value-compactu128", "page_title": "Extrinsics", "index": 204, "depth": 3, "title": "propose(proposal: `FrameSupportPreimagesBounded`, value: `Compact<u128>`)", "anchor": "proposeproposal-framesupportpreimagesbounded-value-compactu128", "start_char": 99387, "end_char": 99834, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### propose(proposal: `FrameSupportPreimagesBounded`, value: `Compact<u128>`)\n- **interface**: `api.tx.democracy.propose`\n- **summary**:    Propose a sensitive action to be taken. \n\n   The dispatch origin of this call must be _Signed_ and the sender must  have funds to cover the deposit. \n\n   - `proposal_hash`: The hash of the proposal preimage. \n\n  - `value`: The amount of deposit (must be at least `MinimumDeposit`).\n\n   Emits `Proposed`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeothervotetarget-multiaddress-index-u32", "page_title": "Extrinsics", "index": 205, "depth": 3, "title": "removeOtherVote(target: `MultiAddress`, index: `u32`)", "anchor": "removeothervotetarget-multiaddress-index-u32", "start_char": 99834, "end_char": 100666, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeOtherVote(target: `MultiAddress`, index: `u32`)\n- **interface**: `api.tx.democracy.removeOtherVote`\n- **summary**:    Remove a vote for a referendum. \n\n   If the `target` is equal to the signer, then this function is exactly equivalent to  `remove_vote`. If not equal to the signer, then the vote must have expired,  either because the referendum was cancelled, because the voter lost the referendum or  because the conviction period is over. \n\n   The dispatch origin of this call must be _Signed_. \n\n   - `target`: The account of the vote to be removed; this account must have voted for  referendum `index`. \n\n  - `index`: The index of referendum of the vote to be removed.\n\n   Weight: `O(R + log R)` where R is the number of referenda that `target` has voted on.  Weight is calculated for the maximum number of vote."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removevoteindex-u32", "page_title": "Extrinsics", "index": 206, "depth": 3, "title": "removeVote(index: `u32`)", "anchor": "removevoteindex-u32", "start_char": 100666, "end_char": 101979, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeVote(index: `u32`)\n- **interface**: `api.tx.democracy.removeVote`\n- **summary**:    Remove a vote for a referendum. \n\n   If: \n\n  - the referendum was cancelled, or\n\n  - the referendum is ongoing, or\n\n  - the referendum has ended such that\n\n  - the vote of the account was in opposition to the result; or\n\n  - there was no conviction to the account's vote; or\n\n  - the account made a split vote ...then the vote is removed cleanly and a following call to `unlock` may result in more  funds being available. \n\n   If, however, the referendum has ended and: \n\n  - it finished corresponding to the vote of the account, and\n\n  - the account made a standard vote with conviction, and\n\n  - the lock period of the conviction is not over ...then the lock will be aggregated into the overall account's lock, which may involve \n\n  *overlocking* (where the two locks are combined into a single lock that is the maximum of both the amount locked and the time is it locked for). \n\n   The dispatch origin of this call must be _Signed_, and the signer must have a vote  registered for referendum `index`. \n\n   - `index`: The index of referendum of the vote to be removed. \n\n   Weight: `O(R + log R)` where R is the number of referenda that `target` has voted on.  Weight is calculated for the maximum number of vote."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#secondproposal-compactu32", "page_title": "Extrinsics", "index": 207, "depth": 3, "title": "second(proposal: `Compact<u32>`)", "anchor": "secondproposal-compactu32", "start_char": 101979, "end_char": 102322, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### second(proposal: `Compact<u32>`)\n- **interface**: `api.tx.democracy.second`\n- **summary**:    Signals agreement with a particular proposal. \n\n   The dispatch origin of this call must be _Signed_ and the sender  must have funds to cover the deposit, equal to the original deposit. \n\n   - `proposal`: The index of the proposal to second."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setmetadataowner-palletdemocracymetadataowner-maybe_hash-optionh256", "page_title": "Extrinsics", "index": 208, "depth": 3, "title": "setMetadata(owner: `PalletDemocracyMetadataOwner`, maybe_hash: `Option<H256>`)", "anchor": "setmetadataowner-palletdemocracymetadataowner-maybe_hash-optionh256", "start_char": 102322, "end_char": 103188, "estimated_token_count": 188, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setMetadata(owner: `PalletDemocracyMetadataOwner`, maybe_hash: `Option<H256>`)\n- **interface**: `api.tx.democracy.setMetadata`\n- **summary**:    Set or clear a metadata of a proposal or a referendum. \n\n   Parameters: \n\n  - `origin`: Must correspond to the `MetadataOwner`.\n\n  - `ExternalOrigin` for an external proposal with the `SuperMajorityApprove` threshold. \n\n  - `ExternalDefaultOrigin` for an external proposal with the `SuperMajorityAgainst` threshold. \n\n  - `ExternalMajorityOrigin` for an external proposal with the `SimpleMajority` threshold. \n\n  - `Signed` by a creator for a public proposal.\n\n  - `Signed` to clear a metadata for a finished referendum.\n\n  - `Root` to set a metadata for an ongoing referendum.\n\n  - `owner`: an identifier of a metadata owner.\n\n  - `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#undelegate", "page_title": "Extrinsics", "index": 209, "depth": 3, "title": "undelegate()", "anchor": "undelegate", "start_char": 103188, "end_char": 103746, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### undelegate()\n- **interface**: `api.tx.democracy.undelegate`\n- **summary**:    Undelegate the voting power of the sending account. \n\n   Tokens may be unlocked following once an amount of time consistent with the lock period  of the conviction with which the delegation was issued. \n\n   The dispatch origin of this call must be _Signed_ and the signing account must be  currently delegating. \n\n   Emits `Undelegated`. \n\n   Weight: `O(R)` where R is the number of referendums the voter delegating to has  voted on. Weight is charged as if maximum votes."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#unlocktarget-multiaddress", "page_title": "Extrinsics", "index": 210, "depth": 3, "title": "unlock(target: `MultiAddress`)", "anchor": "unlocktarget-multiaddress", "start_char": 103746, "end_char": 104047, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### unlock(target: `MultiAddress`)\n- **interface**: `api.tx.democracy.unlock`\n- **summary**:    Unlock tokens that have an expired lock. \n\n   The dispatch origin of this call must be _Signed_. \n\n   - `target`: The account to remove the lock on. \n\n   Weight: `O(R)` with R number of vote of target."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#vetoexternalproposal_hash-h256", "page_title": "Extrinsics", "index": 211, "depth": 3, "title": "vetoExternal(proposal_hash: `H256`)", "anchor": "vetoexternalproposal_hash-h256", "start_char": 104047, "end_char": 104435, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### vetoExternal(proposal_hash: `H256`)\n- **interface**: `api.tx.democracy.vetoExternal`\n- **summary**:    Veto and blacklist the external proposal hash. \n\n   The dispatch origin of this call must be `VetoOrigin`. \n\n   - `proposal_hash`: The preimage hash of the proposal to veto and blacklist. \n\n   Emits `Vetoed`. \n\n   Weight: `O(V + log(V))` where V is number of `existing vetoers`"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#voteref_index-compactu32-vote-palletdemocracyvoteaccountvote", "page_title": "Extrinsics", "index": 212, "depth": 3, "title": "vote(ref_index: `Compact<u32>`, vote: `PalletDemocracyVoteAccountVote`)", "anchor": "voteref_index-compactu32-vote-palletdemocracyvoteaccountvote", "start_char": 104435, "end_char": 104857, "estimated_token_count": 110, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### vote(ref_index: `Compact<u32>`, vote: `PalletDemocracyVoteAccountVote`)\n- **interface**: `api.tx.democracy.vote`\n- **summary**:    Vote in a referendum. If `vote.is_aye()`, the vote is to enact the proposal;  otherwise it is a vote to keep the status quo. \n\n   The dispatch origin of this call must be _Signed_. \n\n   - `ref_index`: The index of the referendum to vote for. \n\n  - `vote`: The vote configuration.\n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#electionprovidermultiphase", "page_title": "Extrinsics", "index": 213, "depth": 2, "title": "electionProviderMultiPhase", "anchor": "electionprovidermultiphase", "start_char": 104857, "end_char": 104889, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## electionProviderMultiPhase"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#governancefallbackmaybe_max_voters-optionu32-maybe_max_targets-optionu32", "page_title": "Extrinsics", "index": 214, "depth": 3, "title": "governanceFallback(maybe_max_voters: `Option<u32>`, maybe_max_targets: `Option<u32>`)", "anchor": "governancefallbackmaybe_max_voters-optionu32-maybe_max_targets-optionu32", "start_char": 104889, "end_char": 105243, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### governanceFallback(maybe_max_voters: `Option<u32>`, maybe_max_targets: `Option<u32>`)\n- **interface**: `api.tx.electionProviderMultiPhase.governanceFallback`\n- **summary**:    Trigger the governance fallback. \n\n   This can only be called when [`Phase::Emergency`] is enabled, as an alternative to  calling [`Call::set_emergency_election_result`]."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setemergencyelectionresultsupports-vecaccountid32spnposelectionssupport", "page_title": "Extrinsics", "index": 215, "depth": 3, "title": "setEmergencyElectionResult(supports: `Vec<(AccountId32,SpNposElectionsSupport)>`)", "anchor": "setemergencyelectionresultsupports-vecaccountid32spnposelectionssupport", "start_char": 105243, "end_char": 105848, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setEmergencyElectionResult(supports: `Vec<(AccountId32,SpNposElectionsSupport)>`)\n- **interface**: `api.tx.electionProviderMultiPhase.setEmergencyElectionResult`\n- **summary**:    Set a solution in the queue, to be handed out to the client of this pallet in the next  call to `ElectionProvider::elect`. \n\n   This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. \n\n   The solution is not checked for any feasibility and is assumed to be trustworthy, as any  feasibility check itself can in principle cause the election process to fail (due to  memory/weight constrains)."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setminimumuntrustedscoremaybe_next_score-optionspnposelectionselectionscore", "page_title": "Extrinsics", "index": 216, "depth": 3, "title": "setMinimumUntrustedScore(maybe_next_score: `Option<SpNposElectionsElectionScore>`)", "anchor": "setminimumuntrustedscoremaybe_next_score-optionspnposelectionselectionscore", "start_char": 105848, "end_char": 106205, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setMinimumUntrustedScore(maybe_next_score: `Option<SpNposElectionsElectionScore>`)\n- **interface**: `api.tx.electionProviderMultiPhase.setMinimumUntrustedScore`\n- **summary**:    Set a new value for `MinimumUntrustedScore`. \n\n   Dispatch origin must be aligned with `T::ForceOrigin`. \n\n   This check can be turned off by setting the value to `None`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#submitraw_solution-palletelectionprovidermultiphaserawsolution", "page_title": "Extrinsics", "index": 217, "depth": 3, "title": "submit(raw_solution: `PalletElectionProviderMultiPhaseRawSolution`)", "anchor": "submitraw_solution-palletelectionprovidermultiphaserawsolution", "start_char": 106205, "end_char": 106735, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### submit(raw_solution: `PalletElectionProviderMultiPhaseRawSolution`)\n- **interface**: `api.tx.electionProviderMultiPhase.submit`\n- **summary**:    Submit a solution for the signed phase. \n\n   The dispatch origin fo this call must be __signed__. \n\n   The solution is potentially queued, based on the claimed score and processed at the end  of the signed phase. \n\n   A deposit is reserved and recorded for the solution. Based on the outcome, the solution  might be rewarded, slashed, or get all or a part of the deposit back."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#submitunsignedraw_solution-palletelectionprovidermultiphaserawsolution-witness-palletelectionprovidermultiphasesolutionorsnapshotsize", "page_title": "Extrinsics", "index": 218, "depth": 3, "title": "submitUnsigned(raw_solution: `PalletElectionProviderMultiPhaseRawSolution`, witness: `PalletElectionProviderMultiPhaseSolutionOrSnapshotSize`)", "anchor": "submitunsignedraw_solution-palletelectionprovidermultiphaserawsolution-witness-palletelectionprovidermultiphasesolutionorsnapshotsize", "start_char": 106735, "end_char": 107633, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### submitUnsigned(raw_solution: `PalletElectionProviderMultiPhaseRawSolution`, witness: `PalletElectionProviderMultiPhaseSolutionOrSnapshotSize`)\n- **interface**: `api.tx.electionProviderMultiPhase.submitUnsigned`\n- **summary**:    Submit a solution for the unsigned phase. \n\n   The dispatch origin fo this call must be __none__. \n\n   This submission is checked on the fly. Moreover, this unsigned solution is only  validated when submitted to the pool from the **local** node. Effectively, this means  that only active validators can submit this transaction when authoring a block (similar  to an inherent). \n\n   To prevent any incorrect solution (and thus wasted time/weight), this transaction will  panic if the solution submitted by the validator is invalid in any way, effectively  putting their authoring reward at risk. \n\n   No deposit or reward is associated with this submission. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#elections", "page_title": "Extrinsics", "index": 219, "depth": 2, "title": "elections", "anchor": "elections", "start_char": 107633, "end_char": 107648, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## elections"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#cleandefunctvotersnum_voters-u32-num_defunct-u32", "page_title": "Extrinsics", "index": 220, "depth": 3, "title": "cleanDefunctVoters(num_voters: `u32`, num_defunct: `u32`)", "anchor": "cleandefunctvotersnum_voters-u32-num_defunct-u32", "start_char": 107648, "end_char": 108095, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### cleanDefunctVoters(num_voters: `u32`, num_defunct: `u32`)\n- **interface**: `api.tx.elections.cleanDefunctVoters`\n- **summary**:    Clean all voters who are defunct (i.e. they do not serve any purpose at all). The  deposit of the removed voters are returned. \n\n   This is an root function to be used only for cleaning the state. \n\n   The dispatch origin of this call must be root. \n\n   #### Complexity \n\n  - Check is_defunct_voter() details."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removememberwho-multiaddress-slash_bond-bool-rerun_election-bool", "page_title": "Extrinsics", "index": 221, "depth": 3, "title": "removeMember(who: `MultiAddress`, slash_bond: `bool`, rerun_election: `bool`)", "anchor": "removememberwho-multiaddress-slash_bond-bool-rerun_election-bool", "start_char": 108095, "end_char": 108915, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeMember(who: `MultiAddress`, slash_bond: `bool`, rerun_election: `bool`)\n- **interface**: `api.tx.elections.removeMember`\n- **summary**:    Remove a particular member from the set. This is effective immediately and the bond of  the outgoing member is slashed. \n\n   If a runner-up is available, then the best runner-up will be removed and replaces the  outgoing member. Otherwise, if `rerun_election` is `true`, a new phragmen election is  started, else, nothing happens. \n\n   If `slash_bond` is set to true, the bond of the member being removed is slashed. Else,  it is returned. \n\n   The dispatch origin of this call must be root. \n\n   Note that this does not affect the designated block number of the next election. \n\n   #### Complexity \n\n  - Check details of remove_and_replace_member() and do_phragmen()."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removevoter", "page_title": "Extrinsics", "index": 222, "depth": 3, "title": "removeVoter()", "anchor": "removevoter", "start_char": 108915, "end_char": 109151, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeVoter()\n- **interface**: `api.tx.elections.removeVoter`\n- **summary**:    Remove `origin` as a voter. \n\n   This removes the lock and returns the deposit. \n\n   The dispatch origin of this call must be signed and be a voter."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#renouncecandidacyrenouncing-palletelectionsphragmenrenouncing", "page_title": "Extrinsics", "index": 223, "depth": 3, "title": "renounceCandidacy(renouncing: `PalletElectionsPhragmenRenouncing`)", "anchor": "renouncecandidacyrenouncing-palletelectionsphragmenrenouncing", "start_char": 109151, "end_char": 110319, "estimated_token_count": 265, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### renounceCandidacy(renouncing: `PalletElectionsPhragmenRenouncing`)\n- **interface**: `api.tx.elections.renounceCandidacy`\n- **summary**:    Renounce one's intention to be a candidate for the next election round. 3 potential  outcomes exist: \n\n   - `origin` is a candidate and not elected in any set. In this case, the deposit is  unreserved, returned and origin is removed as a candidate. \n\n  - `origin` is a current runner-up. In this case, the deposit is unreserved, returned and origin is removed as a runner-up. \n\n  - `origin` is a current member. In this case, the deposit is unreserved and origin is removed as a member, consequently not being a candidate for the next round anymore.  Similar to [`remove_member`](Self::remove_member), if replacement runners exists, they  are immediately used. If the prime is renouncing, then no prime will exist until the  next round. \n\n   The dispatch origin of this call must be signed, and have one of the above roles.  The type of renouncing must be provided as witness data. \n\n   #### Complexity \n\n  - Renouncing::Candidate(count): O(count + log(count))\n\n  - Renouncing::Member: O(1)\n\n  - Renouncing::RunnerUp: O(1)"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#submitcandidacycandidate_count-compactu32", "page_title": "Extrinsics", "index": 224, "depth": 3, "title": "submitCandidacy(candidate_count: `Compact<u32>`)", "anchor": "submitcandidacycandidate_count-compactu32", "start_char": 110319, "end_char": 111045, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### submitCandidacy(candidate_count: `Compact<u32>`)\n- **interface**: `api.tx.elections.submitCandidacy`\n- **summary**:    Submit oneself for candidacy. A fixed amount of deposit is recorded. \n\n   All candidates are wiped at the end of the term. They either become a member/runner-up,  or leave the system while their deposit is slashed. \n\n   The dispatch origin of this call must be signed. \n\n   #### Warning \n\n   Even if a candidate ends up being a member, they must call [`Call::renounce_candidacy`]  to get their deposit back. Losing the spot in an election will always lead to a slash. \n\n   The number of current candidates must be provided as witness data.  #### Complexity  O(C + log(C)) where C is candidate_count."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#votevotes-vecaccountid32-value-compactu128", "page_title": "Extrinsics", "index": 225, "depth": 3, "title": "vote(votes: `Vec<AccountId32>`, value: `Compact<u128>`)", "anchor": "votevotes-vecaccountid32-value-compactu128", "start_char": 111045, "end_char": 111987, "estimated_token_count": 222, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### vote(votes: `Vec<AccountId32>`, value: `Compact<u128>`)\n- **interface**: `api.tx.elections.vote`\n- **summary**:    Vote for a set of candidates for the upcoming round of election. This can be called to  set the initial votes, or update already existing votes. \n\n   Upon initial voting, `value` units of `who`'s balance is locked and a deposit amount is  reserved. The deposit is based on the number of votes and can be updated over time. \n\n   The `votes` should: \n\n  - not be empty.\n\n  - be less than the number of possible candidates. Note that all current members and runners-up are also automatically candidates for the next round. \n\n   If `value` is more than `who`'s free balance, then the maximum of the two is used. \n\n   The dispatch origin of this call must be signed. \n\n   #### Warning \n\n   It is the responsibility of the caller to **NOT** place all of their balance into the  lock and keep some for further operations. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#fastunstake", "page_title": "Extrinsics", "index": 226, "depth": 2, "title": "fastUnstake", "anchor": "fastunstake", "start_char": 111987, "end_char": 112004, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## fastUnstake"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#controleras_to_check-u32", "page_title": "Extrinsics", "index": 227, "depth": 3, "title": "control(eras_to_check: `u32`)", "anchor": "controleras_to_check-u32", "start_char": 112004, "end_char": 112410, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### control(eras_to_check: `u32`)\n- **interface**: `api.tx.fastUnstake.control`\n- **summary**:    Control the operation of this pallet. \n\n   #### Dispatch Origin \n\n   The dispatch origin of this call must be [`Config::ControlOrigin`]. \n\n   #### Details \n\n   Can set the number of eras to check per block, and potentially other admin work. \n\n   #### Events \n\n   No events are emitted from this dispatch."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#deregister", "page_title": "Extrinsics", "index": 228, "depth": 3, "title": "deregister()", "anchor": "deregister", "start_char": 112410, "end_char": 113141, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### deregister()\n- **interface**: `api.tx.fastUnstake.deregister`\n- **summary**:    Deregister oneself from the fast-unstake. \n\n   #### Dispatch Origin \n\n   The dispatch origin of this call must be *signed* by whoever is permitted to call  unbond funds by the staking system. See [`Config::Staking`]. \n\n   #### Details \n\n   This is useful if one is registered, they are still waiting, and they change their mind. \n\n   Note that the associated stash is still fully unbonded and chilled as a consequence of  calling [`Pallet::register_fast_unstake`]. Therefore, this should probably be followed  by a call to `rebond` in the staking system. \n\n   #### Events \n\n   Some events from the staking and currency system might be emitted."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#registerfastunstake", "page_title": "Extrinsics", "index": 229, "depth": 3, "title": "registerFastUnstake()", "anchor": "registerfastunstake", "start_char": 113141, "end_char": 114251, "estimated_token_count": 234, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### registerFastUnstake()\n- **interface**: `api.tx.fastUnstake.registerFastUnstake`\n- **summary**:    Register oneself for fast-unstake. \n\n   #### Dispatch Origin \n\n   The dispatch origin of this call must be *signed* by whoever is permitted to call  unbond funds by the staking system. See [`Config::Staking`]. \n\n   #### Details \n\n   The stash associated with the origin must have no ongoing unlocking chunks. If  successful, this will fully unbond and chill the stash. Then, it will enqueue the stash  to be checked in further blocks. \n\n   If by the time this is called, the stash is actually eligible for fast-unstake, then  they are guaranteed to remain eligible, because the call will chill them as well. \n\n   If the check works, the entire staking data is removed, i.e. the stash is fully  unstaked. \n\n   If the check fails, the stash remains chilled and waiting for being unbonded as in with  the normal staking system, but they lose part of their unbonding chunks due to consuming  the chain's resources. \n\n   #### Events \n\n   Some events from the staking and currency system might be emitted. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#glutton", "page_title": "Extrinsics", "index": 230, "depth": 2, "title": "glutton", "anchor": "glutton", "start_char": 114251, "end_char": 114264, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## glutton"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#bloatgarbage-vecu81024", "page_title": "Extrinsics", "index": 231, "depth": 3, "title": "bloat(garbage: `Vec<[u8;1024]>`)", "anchor": "bloatgarbage-vecu81024", "start_char": 114264, "end_char": 114428, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### bloat(garbage: `Vec<[u8;1024]>`)\n- **interface**: `api.tx.glutton.bloat`\n- **summary**:    Increase the block size by including the specified garbage bytes."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#initializepalletnew_count-u32-witness_count-optionu32", "page_title": "Extrinsics", "index": 232, "depth": 3, "title": "initializePallet(new_count: `u32`, witness_count: `Option<u32>`)", "anchor": "initializepalletnew_count-u32-witness_count-optionu32", "start_char": 114428, "end_char": 114873, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### initializePallet(new_count: `u32`, witness_count: `Option<u32>`)\n- **interface**: `api.tx.glutton.initializePallet`\n- **summary**:    Initialize the pallet. Should be called once, if no genesis state was provided. \n\n   `current_count` is the current number of elements in `TrashData`. This can be set to  `None` when the pallet is first initialized. \n\n   Only callable by Root or `AdminOrigin`. A good default for `new_count` is `5_000`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setblocklengthblock_length-u64", "page_title": "Extrinsics", "index": 233, "depth": 3, "title": "setBlockLength(block_length: `u64`)", "anchor": "setblocklengthblock_length-u64", "start_char": 114873, "end_char": 115219, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setBlockLength(block_length: `u64`)\n- **interface**: `api.tx.glutton.setBlockLength`\n- **summary**:    Set how much of the block length should be filled with trash data on each block. \n\n   `1.0` means that all block should be filled. If set to `1.0`, storage proof size will  be close to zero. \n\n   Only callable by Root or `AdminOrigin`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setcomputecompute-u64", "page_title": "Extrinsics", "index": 234, "depth": 3, "title": "setCompute(compute: `u64`)", "anchor": "setcomputecompute-u64", "start_char": 115219, "end_char": 115442, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setCompute(compute: `u64`)\n- **interface**: `api.tx.glutton.setCompute`\n- **summary**:    Set how much of the remaining `ref_time` weight should be consumed by `on_idle`. \n\n   Only callable by Root or `AdminOrigin`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#setstoragestorage-u64", "page_title": "Extrinsics", "index": 235, "depth": 3, "title": "setStorage(storage: `u64`)", "anchor": "setstoragestorage-u64", "start_char": 115442, "end_char": 115909, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### setStorage(storage: `u64`)\n- **interface**: `api.tx.glutton.setStorage`\n- **summary**:    Set how much of the remaining `proof_size` weight should be consumed by `on_idle`. \n\n   `1.0` means that all remaining `proof_size` will be consumed. The PoV benchmarking  results that are used here are likely an over-estimation. 100% intended consumption will  therefore translate to less than 100% actual consumption. \n\n   Only callable by Root or `AdminOrigin`. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#grandpa", "page_title": "Extrinsics", "index": 236, "depth": 2, "title": "grandpa", "anchor": "grandpa", "start_char": 115909, "end_char": 115922, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## grandpa"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#notestalleddelay-u32-best_finalized_block_number-u32", "page_title": "Extrinsics", "index": 237, "depth": 3, "title": "noteStalled(delay: `u32`, best_finalized_block_number: `u32`)", "anchor": "notestalleddelay-u32-best_finalized_block_number-u32", "start_char": 115922, "end_char": 116829, "estimated_token_count": 186, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### noteStalled(delay: `u32`, best_finalized_block_number: `u32`)\n- **interface**: `api.tx.grandpa.noteStalled`\n- **summary**:    Note that the current authority set of the GRANDPA finality gadget has stalled. \n\n   This will trigger a forced authority set change at the beginning of the next session, to  be enacted `delay` blocks after that. The `delay` should be high enough to safely assume  that the block signalling the forced change will not be re-orged e.g. 1000 blocks.  The block production rate (which may be slowed down because of finality lagging) should  be taken into account when choosing the `delay`. The GRANDPA voters based on the new  authority will start voting on top of `best_finalized_block_number` for new finalized  blocks. `best_finalized_block_number` should be the highest of the latest finalized  block of all validators of the new authority set. \n\n   Only callable by root."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportequivocationequivocation_proof-spconsensusgrandpaequivocationproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 238, "depth": 3, "title": "reportEquivocation(equivocation_proof: `SpConsensusGrandpaEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportequivocationequivocation_proof-spconsensusgrandpaequivocationproof-key_owner_proof-spsessionmembershipproof", "start_char": 116829, "end_char": 117243, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportEquivocation(equivocation_proof: `SpConsensusGrandpaEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.grandpa.reportEquivocation`\n- **summary**:    Report voter equivocation/misbehavior. This method will verify the  equivocation proof and validate the given key ownership proof  against the extracted offender. If both are valid, the offence  will be reported."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#reportequivocationunsignedequivocation_proof-spconsensusgrandpaequivocationproof-key_owner_proof-spsessionmembershipproof", "page_title": "Extrinsics", "index": 239, "depth": 3, "title": "reportEquivocationUnsigned(equivocation_proof: `SpConsensusGrandpaEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)", "anchor": "reportequivocationunsignedequivocation_proof-spconsensusgrandpaequivocationproof-key_owner_proof-spsessionmembershipproof", "start_char": 117243, "end_char": 117904, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### reportEquivocationUnsigned(equivocation_proof: `SpConsensusGrandpaEquivocationProof`, key_owner_proof: `SpSessionMembershipProof`)\n- **interface**: `api.tx.grandpa.reportEquivocationUnsigned`\n- **summary**:    Report voter equivocation/misbehavior. This method will verify the  equivocation proof and validate the given key ownership proof  against the extracted offender. If both are valid, the offence  will be reported. \n\n   This extrinsic must be called unsigned and it is expected that only  block authors will call it (validated in `ValidateUnsigned`), as such  if the block author is defined it will be defined as the equivocation  reporter. \n\n___"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#identity", "page_title": "Extrinsics", "index": 240, "depth": 2, "title": "identity", "anchor": "identity", "start_char": 117904, "end_char": 117918, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## identity"}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#acceptusernameusername-bytes", "page_title": "Extrinsics", "index": 241, "depth": 3, "title": "acceptUsername(username: `Bytes`)", "anchor": "acceptusernameusername-bytes", "start_char": 117918, "end_char": 118147, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### acceptUsername(username: `Bytes`)\n- **interface**: `api.tx.identity.acceptUsername`\n- **summary**:    Accept a given username that an `authority` granted. The call must include the full  username, as in `username.suffix`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#addregistraraccount-multiaddress", "page_title": "Extrinsics", "index": 242, "depth": 3, "title": "addRegistrar(account: `MultiAddress`)", "anchor": "addregistraraccount-multiaddress", "start_char": 118147, "end_char": 118449, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### addRegistrar(account: `MultiAddress`)\n- **interface**: `api.tx.identity.addRegistrar`\n- **summary**:    Add a registrar to the system. \n\n   The dispatch origin for this call must be `T::RegistrarOrigin`. \n\n   - `account`: the account of the registrar. \n\n   Emits `RegistrarAdded` if successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#addsubsub-multiaddress-data-data", "page_title": "Extrinsics", "index": 243, "depth": 3, "title": "addSub(sub: `MultiAddress`, data: `Data`)", "anchor": "addsubsub-multiaddress-data-data", "start_char": 118449, "end_char": 118829, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### addSub(sub: `MultiAddress`, data: `Data`)\n- **interface**: `api.tx.identity.addSub`\n- **summary**:    Add the given account to the sender's subs. \n\n   Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated  to the sender. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a registered  sub identity of `sub`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#addusernameauthorityauthority-multiaddress-suffix-bytes-allocation-u32", "page_title": "Extrinsics", "index": 244, "depth": 3, "title": "addUsernameAuthority(authority: `MultiAddress`, suffix: `Bytes`, allocation: `u32`)", "anchor": "addusernameauthorityauthority-multiaddress-suffix-bytes-allocation-u32", "start_char": 118829, "end_char": 119304, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### addUsernameAuthority(authority: `MultiAddress`, suffix: `Bytes`, allocation: `u32`)\n- **interface**: `api.tx.identity.addUsernameAuthority`\n- **summary**:    Add an `AccountId` with permission to grant usernames with a given `suffix` appended. \n\n   The authority can grant up to `allocation` usernames. To top up the allocation or  change the account used to grant usernames, this call can be used with the updated  parameters to overwrite the existing configuration."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#cancelrequestreg_index-u32", "page_title": "Extrinsics", "index": 245, "depth": 3, "title": "cancelRequest(reg_index: `u32`)", "anchor": "cancelrequestreg_index-u32", "start_char": 119304, "end_char": 119746, "estimated_token_count": 92, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### cancelRequest(reg_index: `u32`)\n- **interface**: `api.tx.identity.cancelRequest`\n- **summary**:    Cancel a previous request. \n\n   Payment: A previously reserved deposit is returned on success. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a  registered identity. \n\n   - `reg_index`: The index of the registrar whose judgement is no longer requested. \n\n   Emits `JudgementUnrequested` if successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#clearidentity", "page_title": "Extrinsics", "index": 246, "depth": 3, "title": "clearIdentity()", "anchor": "clearidentity", "start_char": 119746, "end_char": 120129, "estimated_token_count": 82, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### clearIdentity()\n- **interface**: `api.tx.identity.clearIdentity`\n- **summary**:    Clear an account's identity info and all sub-accounts and return all deposits. \n\n   Payment: All reserved balances on the account are returned. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a registered  identity. \n\n   Emits `IdentityCleared` if successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#killidentitytarget-multiaddress", "page_title": "Extrinsics", "index": 247, "depth": 3, "title": "killIdentity(target: `MultiAddress`)", "anchor": "killidentitytarget-multiaddress", "start_char": 120129, "end_char": 120762, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### killIdentity(target: `MultiAddress`)\n- **interface**: `api.tx.identity.killIdentity`\n- **summary**:    Remove an account's identity and sub-account information and slash the deposits. \n\n   Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by  `Slash`. Verification request deposits are not returned; they should be cancelled  manually using `cancel_request`. \n\n   The dispatch origin for this call must match `T::ForceOrigin`. \n\n   - `target`: the account whose identity the judgement is upon. This must be an account  with a registered identity. \n\n   Emits `IdentityKilled` if successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#killusernameusername-bytes", "page_title": "Extrinsics", "index": 248, "depth": 3, "title": "killUsername(username: `Bytes`)", "anchor": "killusernameusername-bytes", "start_char": 120762, "end_char": 121000, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### killUsername(username: `Bytes`)\n- **interface**: `api.tx.identity.killUsername`\n- **summary**:    Call with [ForceOrigin](crate::Config::ForceOrigin) privileges which deletes a username  and slashes any deposit associated with it."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#providejudgementreg_index-compactu32-target-multiaddress-judgement-palletidentityjudgement-identity-h256", "page_title": "Extrinsics", "index": 249, "depth": 3, "title": "provideJudgement(reg_index: `Compact<u32>`, target: `MultiAddress`, judgement: `PalletIdentityJudgement`, identity: `H256`)", "anchor": "providejudgementreg_index-compactu32-target-multiaddress-judgement-palletidentityjudgement-identity-h256", "start_char": 121000, "end_char": 121862, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### provideJudgement(reg_index: `Compact<u32>`, target: `MultiAddress`, judgement: `PalletIdentityJudgement`, identity: `H256`)\n- **interface**: `api.tx.identity.provideJudgement`\n- **summary**:    Provide a judgement for an account's identity. \n\n   The dispatch origin for this call must be _Signed_ and the sender must be the account  of the registrar whose index is `reg_index`. \n\n   - `reg_index`: the index of the registrar whose judgement is being made. \n\n  - `target`: the account whose identity the judgement is upon. This must be an account with a registered identity. \n\n  - `judgement`: the judgement of the registrar of index `reg_index` about `target`.\n\n  - `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is provided. \n\n   Note: Judgements do not apply to a username. \n\n   Emits `JudgementGiven` if successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#quitsub", "page_title": "Extrinsics", "index": 250, "depth": 3, "title": "quitSub()", "anchor": "quitsub", "start_char": 121862, "end_char": 122384, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### quitSub()\n- **interface**: `api.tx.identity.quitSub`\n- **summary**:    Remove the sender as a sub-account. \n\n   Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated  to the sender (*not* the original depositor). \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a registered  super-identity. \n\n   NOTE: This should not normally be used, but is provided in the case that the non-  controller of an account is maliciously registered as a sub-account."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeexpiredapprovalusername-bytes", "page_title": "Extrinsics", "index": 251, "depth": 3, "title": "removeExpiredApproval(username: `Bytes`)", "anchor": "removeexpiredapprovalusername-bytes", "start_char": 122384, "end_char": 122724, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeExpiredApproval(username: `Bytes`)\n- **interface**: `api.tx.identity.removeExpiredApproval`\n- **summary**:    Remove an expired username approval. The username was approved by an authority but never  accepted by the user and must now be beyond its expiration. The call must include the  full username, as in `username.suffix`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removesubsub-multiaddress", "page_title": "Extrinsics", "index": 252, "depth": 3, "title": "removeSub(sub: `MultiAddress`)", "anchor": "removesubsub-multiaddress", "start_char": 122724, "end_char": 123101, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeSub(sub: `MultiAddress`)\n- **interface**: `api.tx.identity.removeSub`\n- **summary**:    Remove the given account from the sender's subs. \n\n   Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated  to the sender. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a registered  sub identity of `sub`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeusernameusername-bytes", "page_title": "Extrinsics", "index": 253, "depth": 3, "title": "removeUsername(username: `Bytes`)", "anchor": "removeusernameusername-bytes", "start_char": 123101, "end_char": 123383, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeUsername(username: `Bytes`)\n- **interface**: `api.tx.identity.removeUsername`\n- **summary**:    Permanently delete a username which has been unbinding for longer than the grace period.  Caller is refunded the fee if the username expired and the removal was successful."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#removeusernameauthoritysuffix-bytes-authority-multiaddress", "page_title": "Extrinsics", "index": 254, "depth": 3, "title": "removeUsernameAuthority(suffix: `Bytes`, authority: `MultiAddress`)", "anchor": "removeusernameauthoritysuffix-bytes-authority-multiaddress", "start_char": 123383, "end_char": 123585, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### removeUsernameAuthority(suffix: `Bytes`, authority: `MultiAddress`)\n- **interface**: `api.tx.identity.removeUsernameAuthority`\n- **summary**:    Remove `authority` from the username authorities."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#renamesubsub-multiaddress-data-data", "page_title": "Extrinsics", "index": 255, "depth": 3, "title": "renameSub(sub: `MultiAddress`, data: `Data`)", "anchor": "renamesubsub-multiaddress-data-data", "start_char": 123585, "end_char": 123870, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### renameSub(sub: `MultiAddress`, data: `Data`)\n- **interface**: `api.tx.identity.renameSub`\n- **summary**:    Alter the associated name of the given sub-account. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a registered  sub identity of `sub`."}
{"source": "polkadot-docs", "page_id": "wiki-general-extrinsics", "url": "https://developer.polkadot.com/wiki/general/extrinsics/#requestjudgementreg_index-compactu32-max_fee-compactu128", "page_title": "Extrinsics", "index": 256, "depth": 3, "title": "requestJudgement(reg_index: `Compact<u32>`, max_fee: `Compact<u128>`)", "anchor": "requestjudgementreg_index-compactu32-max_fee-compactu128", "start_char": 123870, "end_char": 331658, "estimated_token_count": 49289, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:43b3cbaa93796bb953c67a4e240fee24a3cabd6b3be54356759b90f30e62c7f9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### requestJudgement(reg_index: `Compact<u32>`, max_fee: `Compact<u128>`)\n- **interface**: `api.tx.identity.requestJudgement`\n- **summary**:    Request a judgement from a registrar. \n\n   Payment: At most `max_fee` will be reserved for payment to the registrar if judgement  given. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a  registered identity. \n\n   - `reg_index`: The index of the registrar whose judgement is requested. \n\n  - `max_fee`: The maximum fee that may be paid. This should just be auto-populated as:\n\n   ```nocompile  Registrars::<T>::get().get(reg_index).unwrap().fee  ``` \n\n   Emits `JudgementRequested` if successful. \n \n### setAccountId(index: `Compact<u32>`, new: `MultiAddress`)\n- **interface**: `api.tx.identity.setAccountId`\n- **summary**:    Change the account associated with a registrar. \n\n   The dispatch origin for this call must be _Signed_ and the sender must be the account  of the registrar whose index is `index`. \n\n   - `index`: the index of the registrar whose fee is to be set. \n\n  - `new`: the new account ID.\n \n### setFee(index: `Compact<u32>`, fee: `Compact<u128>`)\n- **interface**: `api.tx.identity.setFee`\n- **summary**:    Set the fee required for a judgement to be requested from a registrar. \n\n   The dispatch origin for this call must be _Signed_ and the sender must be the account  of the registrar whose index is `index`. \n\n   - `index`: the index of the registrar whose fee is to be set. \n\n  - `fee`: the new fee.\n \n### setFields(index: `Compact<u32>`, fields: `u64`)\n- **interface**: `api.tx.identity.setFields`\n- **summary**:    Set the field information for a registrar. \n\n   The dispatch origin for this call must be _Signed_ and the sender must be the account  of the registrar whose index is `index`. \n\n   - `index`: the index of the registrar whose fee is to be set. \n\n  - `fields`: the fields that the registrar concerns themselves with.\n \n### setIdentity(info: `PalletIdentityLegacyIdentityInfo`)\n- **interface**: `api.tx.identity.setIdentity`\n- **summary**:    Set an account's identity information and reserve the appropriate deposit. \n\n   If the account already has identity information, the deposit is taken as part payment  for the new deposit. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `info`: The identity information. \n\n   Emits `IdentitySet` if successful. \n \n### setPrimaryUsername(username: `Bytes`)\n- **interface**: `api.tx.identity.setPrimaryUsername`\n- **summary**:    Set a given username as the primary. The username should include the suffix. \n \n### setSubs(subs: `Vec<(AccountId32,Data)>`)\n- **interface**: `api.tx.identity.setSubs`\n- **summary**:    Set the sub-accounts of the sender. \n\n   Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned  and an amount `SubAccountDeposit` will be reserved for each item in `subs`. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have a registered  identity. \n\n   - `subs`: The identity's (new) sub-accounts. \n \n### setUsernameFor(who: `MultiAddress`, username: `Bytes`, signature: `Option<SpRuntimeMultiSignature>`, use_allocation: `bool`)\n- **interface**: `api.tx.identity.setUsernameFor`\n- **summary**:    Set the username for `who`. Must be called by a username authority. \n\n   If `use_allocation` is set, the authority must have a username allocation available to  spend. Otherwise, the authority will need to put up a deposit for registering the  username. \n\n   Users can either pre-sign their usernames or  accept them later. \n\n   Usernames must: \n\n  - Only contain lowercase ASCII characters or digits.\n\n  - When combined with the suffix of the issuing authority be _less than_ the `MaxUsernameLength`. \n \n### unbindUsername(username: `Bytes`)\n- **interface**: `api.tx.identity.unbindUsername`\n- **summary**:    Start the process of removing a username by placing it in the unbinding usernames map.  Once the grace period has passed, the username can be deleted by calling  [remove_username](crate::Call::remove_username). \n\n___\n\n\n## imOnline\n \n### heartbeat(heartbeat: `PalletImOnlineHeartbeat`, signature: `PalletImOnlineSr25519AppSr25519Signature`)\n- **interface**: `api.tx.imOnline.heartbeat`\n- **summary**:    #### Complexity: \n\n  - `O(K)` where K is length of `Keys` (heartbeat.validators_len)\n\n  - `O(K)`: decoding of length `K`\n\n___\n\n\n## indices\n \n### claim(index: `u32`)\n- **interface**: `api.tx.indices.claim`\n- **summary**:    Assign an previously unassigned index. \n\n   Payment: `Deposit` is reserved from the sender account. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `index`: the index to be claimed. This must not be in use. \n\n   Emits `IndexAssigned` if successful. \n\n   #### Complexity \n\n  - `O(1)`.\n \n### forceTransfer(new: `MultiAddress`, index: `u32`, freeze: `bool`)\n- **interface**: `api.tx.indices.forceTransfer`\n- **summary**:    Force an index to an account. This doesn't require a deposit. If the index is already  held, then any deposit is reimbursed to its current owner. \n\n   The dispatch origin for this call must be _Root_. \n\n   - `index`: the index to be (re-)assigned. \n\n  - `new`: the new owner of the index. This function is a no-op if it is equal to sender.\n\n  - `freeze`: if set to `true`, will freeze the index so it cannot be transferred.\n\n   Emits `IndexAssigned` if successful. \n\n   #### Complexity \n\n  - `O(1)`.\n \n### free(index: `u32`)\n- **interface**: `api.tx.indices.free`\n- **summary**:    Free up an index owned by the sender. \n\n   Payment: Any previous deposit placed for the index is unreserved in the sender account. \n\n   The dispatch origin for this call must be _Signed_ and the sender must own the index. \n\n   - `index`: the index to be freed. This must be owned by the sender. \n\n   Emits `IndexFreed` if successful. \n\n   #### Complexity \n\n  - `O(1)`.\n \n### freeze(index: `u32`)\n- **interface**: `api.tx.indices.freeze`\n- **summary**:    Freeze an index so it will always point to the sender account. This consumes the  deposit. \n\n   The dispatch origin for this call must be _Signed_ and the signing account must have a  non-frozen account `index`. \n\n   - `index`: the index to be frozen in place. \n\n   Emits `IndexFrozen` if successful. \n\n   #### Complexity \n\n  - `O(1)`.\n \n### pokeDeposit(index: `u32`)\n- **interface**: `api.tx.indices.pokeDeposit`\n- **summary**:    Poke the deposit reserved for an index. \n\n   The dispatch origin for this call must be _Signed_ and the signing account must have a  non-frozen account `index`. \n\n   The transaction fees is waived if the deposit is changed after poking/reconsideration. \n\n   - `index`: the index whose deposit is to be poked/reconsidered. \n\n   Emits `DepositPoked` if successful. \n \n### transfer(new: `MultiAddress`, index: `u32`)\n- **interface**: `api.tx.indices.transfer`\n- **summary**:    Assign an index already owned by the sender to another account. The balance reservation  is effectively transferred to the new account. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `index`: the index to be re-assigned. This must be owned by the sender. \n\n  - `new`: the new owner of the index. This function is a no-op if it is equal to sender.\n\n   Emits `IndexAssigned` if successful. \n\n   #### Complexity \n\n  - `O(1)`.\n\n___\n\n\n## lottery\n \n### buyTicket(call: `Call`)\n- **interface**: `api.tx.lottery.buyTicket`\n- **summary**:    Buy a ticket to enter the lottery. \n\n   This extrinsic acts as a passthrough function for `call`. In all  situations where `call` alone would succeed, this extrinsic should  succeed. \n\n   If `call` is successful, then we will attempt to purchase a ticket,  which may fail silently. To detect success of a ticket purchase, you  should listen for the `TicketBought` event. \n\n   This extrinsic must be called by a signed origin. \n \n### setCalls(calls: `Vec<Call>`)\n- **interface**: `api.tx.lottery.setCalls`\n- **summary**:    Set calls in storage which can be used to purchase a lottery ticket. \n\n   This function only matters if you use the `ValidateCall` implementation  provided by this pallet, which uses storage to determine the valid calls. \n\n   This extrinsic must be called by the Manager origin. \n \n### startLottery(price: `u128`, length: `u32`, delay: `u32`, repeat: `bool`)\n- **interface**: `api.tx.lottery.startLottery`\n- **summary**:    Start a lottery using the provided configuration. \n\n   This extrinsic must be called by the `ManagerOrigin`. \n\n   Parameters: \n\n   * `price`: The cost of a single ticket. \n\n  * `length`: How long the lottery should run for starting at the current block.\n\n  * `delay`: How long after the lottery end we should wait before picking a winner.\n\n  * `repeat`: If the lottery should repeat when completed.\n \n### stopRepeat()\n- **interface**: `api.tx.lottery.stopRepeat`\n- **summary**:    If a lottery is repeating, you can use this to stop the repeat.  The lottery will continue to run to completion. \n\n   This extrinsic must be called by the `ManagerOrigin`. \n\n___\n\n\n## messageQueue\n \n### executeOverweight(message_origin: `u32`, page: `u32`, index: `u32`, weight_limit: `SpWeightsWeightV2Weight`)\n- **interface**: `api.tx.messageQueue.executeOverweight`\n- **summary**:    Execute an overweight message. \n\n   Temporary processing errors will be propagated whereas permanent errors are treated  as success condition. \n\n   - `origin`: Must be `Signed`. \n\n  - `message_origin`: The origin from which the message to be executed arrived.\n\n  - `page`: The page in the queue in which the message to be executed is sitting.\n\n  - `index`: The index into the queue of the message to be executed.\n\n  - `weight_limit`: The maximum amount of weight allowed to be consumed in the execution of the message. \n\n   Benchmark complexity considerations: O(index + weight_limit). \n \n### reapPage(message_origin: `u32`, page_index: `u32`)\n- **interface**: `api.tx.messageQueue.reapPage`\n- **summary**:    Remove a page which has no more messages remaining to be processed or is stale. \n\n___\n\n\n## metaTx\n \n### dispatch(meta_tx: `PalletMetaTxMetaTx`)\n- **interface**: `api.tx.metaTx.dispatch`\n- **summary**:    Dispatch a given meta transaction. \n\n   - `_origin`: Can be any kind of origin. \n\n  - `meta_tx`: Meta Transaction with a target call to be dispatched.\n\n___\n\n\n## mixnet\n \n### register(registration: `PalletMixnetRegistration`, signature: `SpMixnetAppSignature`)\n- **interface**: `api.tx.mixnet.register`\n- **summary**:    Register a mixnode for the following session. \n\n___\n\n\n## multiBlockMigrations\n \n### clearHistoric(selector: `PalletMigrationsHistoricCleanupSelector`)\n- **interface**: `api.tx.multiBlockMigrations.clearHistoric`\n- **summary**:    Clears the `Historic` set. \n\n   `map_cursor` must be set to the last value that was returned by the  `HistoricCleared` event. The first time `None` can be used. `limit` must be chosen in a  way that will result in a sensible weight. \n \n### forceOnboardMbms()\n- **interface**: `api.tx.multiBlockMigrations.forceOnboardMbms`\n- **summary**:    Forces the onboarding of the migrations. \n\n   This process happens automatically on a runtime upgrade. It is in place as an emergency  measurement. The cursor needs to be `None` for this to succeed. \n \n### forceSetActiveCursor(index: `u32`, inner_cursor: `Option<Bytes>`, started_at: `Option<u32>`)\n- **interface**: `api.tx.multiBlockMigrations.forceSetActiveCursor`\n- **summary**:    Allows root to set an active cursor to forcefully start/forward the migration process. \n\n   This is an edge-case version of [`Self::force_set_cursor`] that allows to set the  `started_at` value to the next block number. Otherwise this would not be possible, since  `force_set_cursor` takes an absolute block number. Setting `started_at` to `None`  indicates that the current block number plus one should be used. \n \n### forceSetCursor(cursor: `Option<PalletMigrationsMigrationCursor>`)\n- **interface**: `api.tx.multiBlockMigrations.forceSetCursor`\n- **summary**:    Allows root to set a cursor to forcefully start, stop or forward the migration process. \n\n   Should normally not be needed and is only in place as emergency measure. Note that  restarting the migration process in this manner will not call the  [`MigrationStatusHandler::started`] hook or emit an `UpgradeStarted` event. \n\n___\n\n\n## multisig\n \n### approveAsMulti(threshold: `u16`, other_signatories: `Vec<AccountId32>`, maybe_timepoint: `Option<PalletMultisigTimepoint>`, call_hash: `[u8;32]`, max_weight: `SpWeightsWeightV2Weight`)\n- **interface**: `api.tx.multisig.approveAsMulti`\n- **summary**:    Register approval for a dispatch to be made from a deterministic composite account if  approved by a total of `threshold - 1` of `other_signatories`. \n\n   Payment: `DepositBase` will be reserved if this is the first approval, plus  `threshold` times `DepositFactor`. It is returned once this dispatch happens or  is cancelled. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `threshold`: The total number of approvals for this dispatch before it is executed. \n\n  - `other_signatories`: The accounts (other than the sender) who can approve this dispatch. May not be empty. \n\n  - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is not the first approval, then it must be `Some`, with the timepoint (block number and  transaction index) of the first approval transaction. \n\n  - `call_hash`: The hash of the call to be executed.\n\n   NOTE: If this is the final approval, you will want to use `as_multi` instead. \n\n   #### Complexity \n\n  - `O(S)`.\n\n  - Up to one balance-reserve or unreserve operation.\n\n  - One passthrough operation, one insert, both `O(S)` where `S` is the number of signatories. `S` is capped by `MaxSignatories`, with weight being proportional. \n\n  - One encode & hash, both of complexity `O(S)`.\n\n  - Up to one binary search and insert (`O(logS + S)`).\n\n  - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove.\n\n  - One event.\n\n  - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit taken for its lifetime of `DepositBase + threshold * DepositFactor`. \n \n### asMulti(threshold: `u16`, other_signatories: `Vec<AccountId32>`, maybe_timepoint: `Option<PalletMultisigTimepoint>`, call: `Call`, max_weight: `SpWeightsWeightV2Weight`)\n- **interface**: `api.tx.multisig.asMulti`\n- **summary**:    Register approval for a dispatch to be made from a deterministic composite account if  approved by a total of `threshold - 1` of `other_signatories`. \n\n   If there are enough, then dispatch the call. \n\n   Payment: `DepositBase` will be reserved if this is the first approval, plus  `threshold` times `DepositFactor`. It is returned once this dispatch happens or  is cancelled. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `threshold`: The total number of approvals for this dispatch before it is executed. \n\n  - `other_signatories`: The accounts (other than the sender) who can approve this dispatch. May not be empty. \n\n  - `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is not the first approval, then it must be `Some`, with the timepoint (block number and  transaction index) of the first approval transaction. \n\n  - `call`: The call to be executed.\n\n   NOTE: Unless this is the final approval, you will generally want to use  `approve_as_multi` instead, since it only requires a hash of the call. \n\n   Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise  on success, result is `Ok` and the result from the interior call, if it was executed,  may be found in the deposited `MultisigExecuted` event. \n\n   #### Complexity \n\n  - `O(S + Z + Call)`.\n\n  - Up to one balance-reserve or unreserve operation.\n\n  - One passthrough operation, one insert, both `O(S)` where `S` is the number of signatories. `S` is capped by `MaxSignatories`, with weight being proportional. \n\n  - One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len.\n\n  - One encode & hash, both of complexity `O(S)`.\n\n  - Up to one binary search and insert (`O(logS + S)`).\n\n  - I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove.\n\n  - One event.\n\n  - The weight of the `call`.\n\n  - Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit taken for its lifetime of `DepositBase + threshold * DepositFactor`. \n \n### asMultiThreshold1(other_signatories: `Vec<AccountId32>`, call: `Call`)\n- **interface**: `api.tx.multisig.asMultiThreshold1`\n- **summary**:    Immediately dispatch a multi-signature call using a single approval from the caller. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `other_signatories`: The accounts (other than the sender) who are part of the  multi-signature, but do not participate in the approval process. \n\n  - `call`: The call to be executed.\n\n   Result is equivalent to the dispatched result. \n\n   #### Complexity  O(Z + C) where Z is the length of the call and C its execution weight. \n \n### cancelAsMulti(threshold: `u16`, other_signatories: `Vec<AccountId32>`, timepoint: `PalletMultisigTimepoint`, call_hash: `[u8;32]`)\n- **interface**: `api.tx.multisig.cancelAsMulti`\n- **summary**:    Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously  for this operation will be unreserved on success. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `threshold`: The total number of approvals for this dispatch before it is executed. \n\n  - `other_signatories`: The accounts (other than the sender) who can approve this dispatch. May not be empty. \n\n  - `timepoint`: The timepoint (block number and transaction index) of the first approval transaction for this dispatch. \n\n  - `call_hash`: The hash of the call to be executed.\n\n   #### Complexity \n\n  - `O(S)`.\n\n  - Up to one balance-reserve or unreserve operation.\n\n  - One passthrough operation, one insert, both `O(S)` where `S` is the number of signatories. `S` is capped by `MaxSignatories`, with weight being proportional. \n\n  - One encode & hash, both of complexity `O(S)`.\n\n  - One event.\n\n  - I/O: 1 read `O(S)`, one remove.\n\n  - Storage: removes one item.\n \n### pokeDeposit(threshold: `u16`, other_signatories: `Vec<AccountId32>`, call_hash: `[u8;32]`)\n- **interface**: `api.tx.multisig.pokeDeposit`\n- **summary**:    Poke the deposit reserved for an existing multisig operation. \n\n   The dispatch origin for this call must be _Signed_ and must be the original depositor of  the multisig operation. \n\n   The transaction fee is waived if the deposit amount has changed. \n\n   - `threshold`: The total number of approvals needed for this multisig. \n\n  - `other_signatories`: The accounts (other than the sender) who are part of the multisig. \n\n  - `call_hash`: The hash of the call this deposit is reserved for.\n\n   Emits `DepositPoked` if successful. \n\n___\n\n\n## nftFractionalization\n \n### fractionalize(nft_collection_id: `u32`, nft_id: `u32`, asset_id: `u32`, beneficiary: `MultiAddress`, fractions: `u128`)\n- **interface**: `api.tx.nftFractionalization.fractionalize`\n- **summary**:    Lock the NFT and mint a new fungible asset. \n\n   The dispatch origin for this call must be Signed.  The origin must be the owner of the NFT they are trying to lock. \n\n   `Deposit` funds of sender are reserved. \n\n   - `nft_collection_id`: The ID used to identify the collection of the NFT.  Is used within the context of `pallet_nfts`. \n\n  - `nft_id`: The ID used to identify the NFT within the given collection. Is used within the context of `pallet_nfts`. \n\n  - `asset_id`: The ID of the new asset. It must not exist. Is used within the context of `pallet_assets`. \n\n  - `beneficiary`: The account that will receive the newly created asset.\n\n  - `fractions`: The total issuance of the newly created asset class.\n\n   Emits `NftFractionalized` event when successful. \n \n### unify(nft_collection_id: `u32`, nft_id: `u32`, asset_id: `u32`, beneficiary: `MultiAddress`)\n- **interface**: `api.tx.nftFractionalization.unify`\n- **summary**:    Burn the total issuance of the fungible asset and return (unlock) the locked NFT. \n\n   The dispatch origin for this call must be Signed. \n\n   `Deposit` funds will be returned to `asset_creator`. \n\n   - `nft_collection_id`: The ID used to identify the collection of the NFT.  Is used within the context of `pallet_nfts`. \n\n  - `nft_id`: The ID used to identify the NFT within the given collection. Is used within the context of `pallet_nfts`. \n\n  - `asset_id`: The ID of the asset being returned and destroyed. Must match the original ID of the created asset, corresponding to the NFT.  Is used within the context of `pallet_assets`. \n\n  - `beneficiary`: The account that will receive the unified NFT.\n\n   Emits `NftUnified` event when successful. \n\n___\n\n\n## nfts\n \n### approveItemAttributes(collection: `u32`, item: `u32`, delegate: `MultiAddress`)\n- **interface**: `api.tx.nfts.approveItemAttributes`\n- **summary**:    Approve item's attributes to be changed by a delegated third-party account. \n\n   Origin must be Signed and must be an owner of the `item`. \n\n   - `collection`: A collection of the item. \n\n  - `item`: The item that holds attributes.\n\n  - `delegate`: The account to delegate permission to change attributes of the item.\n\n   Emits `ItemAttributesApprovalAdded` on success. \n \n### approveTransfer(collection: `u32`, item: `u32`, delegate: `MultiAddress`, maybe_deadline: `Option<u32>`)\n- **interface**: `api.tx.nfts.approveTransfer`\n- **summary**:    Approve an item to be transferred by a delegated third-party account. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Owner of the  `item`. \n\n   - `collection`: The collection of the item to be approved for delegated transfer. \n\n  - `item`: The item to be approved for delegated transfer.\n\n  - `delegate`: The account to delegate permission to transfer the item.\n\n  - `maybe_deadline`: Optional deadline for the approval. Specified by providing the number of blocks after which the approval will expire \n\n   Emits `TransferApproved` on success. \n\n   Weight: `O(1)` \n \n### burn(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.nfts.burn`\n- **summary**:    Destroy a single item. \n\n   The origin must conform to `ForceOrigin` or must be Signed and the signing account must  be the owner of the `item`. \n\n   - `collection`: The collection of the item to be burned. \n\n  - `item`: The item to be burned.\n\n   Emits `Burned`. \n\n   Weight: `O(1)` \n \n### buyItem(collection: `u32`, item: `u32`, bid_price: `u128`)\n- **interface**: `api.tx.nfts.buyItem`\n- **summary**:    Allows to buy an item if it's up for sale. \n\n   Origin must be Signed and must not be the owner of the `item`. \n\n   - `collection`: The collection of the item. \n\n  - `item`: The item the sender wants to buy.\n\n  - `bid_price`: The price the sender is willing to pay.\n\n   Emits `ItemBought` on success. \n \n### cancelApproval(collection: `u32`, item: `u32`, delegate: `MultiAddress`)\n- **interface**: `api.tx.nfts.cancelApproval`\n- **summary**:    Cancel one of the transfer approvals for a specific item. \n\n   Origin must be either: \n\n  - the `Force` origin;\n\n  - `Signed` with the signer being the Owner of the `item`;\n\n   Arguments: \n\n  - `collection`: The collection of the item of whose approval will be cancelled.\n\n  - `item`: The item of the collection of whose approval will be cancelled.\n\n  - `delegate`: The account that is going to loose their approval.\n\n   Emits `ApprovalCancelled` on success. \n\n   Weight: `O(1)` \n \n### cancelItemAttributesApproval(collection: `u32`, item: `u32`, delegate: `MultiAddress`, witness: `PalletNftsCancelAttributesApprovalWitness`)\n- **interface**: `api.tx.nfts.cancelItemAttributesApproval`\n- **summary**:    Cancel the previously provided approval to change item's attributes.  All the previously set attributes by the `delegate` will be removed. \n\n   Origin must be Signed and must be an owner of the `item`. \n\n   - `collection`: Collection that the item is contained within. \n\n  - `item`: The item that holds attributes.\n\n  - `delegate`: The previously approved account to remove.\n\n   Emits `ItemAttributesApprovalRemoved` on success. \n \n### cancelSwap(offered_collection: `u32`, offered_item: `u32`)\n- **interface**: `api.tx.nfts.cancelSwap`\n- **summary**:    Cancel an atomic swap. \n\n   Origin must be Signed.  Origin must be an owner of the `item` if the deadline hasn't expired. \n\n   - `collection`: The collection of the item. \n\n  - `item`: The item an owner wants to give.\n\n   Emits `SwapCancelled` on success. \n \n### claimSwap(send_collection: `u32`, send_item: `u32`, receive_collection: `u32`, receive_item: `u32`, witness_price: `Option<PalletNftsPriceWithDirection>`)\n- **interface**: `api.tx.nfts.claimSwap`\n- **summary**:    Claim an atomic swap.  This method executes a pending swap, that was created by a counterpart before. \n\n   Origin must be Signed and must be an owner of the `item`. \n\n   - `send_collection`: The collection of the item to be sent. \n\n  - `send_item`: The item to be sent.\n\n  - `receive_collection`: The collection of the item to be received.\n\n  - `receive_item`: The item to be received.\n\n  - `witness_price`: A price that was previously agreed on.\n\n   Emits `SwapClaimed` on success. \n \n### clearAllTransferApprovals(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.nfts.clearAllTransferApprovals`\n- **summary**:    Cancel all the approvals of a specific item. \n\n   Origin must be either: \n\n  - the `Force` origin;\n\n  - `Signed` with the signer being the Owner of the `item`;\n\n   Arguments: \n\n  - `collection`: The collection of the item of whose approvals will be cleared.\n\n  - `item`: The item of the collection of whose approvals will be cleared.\n\n   Emits `AllApprovalsCancelled` on success. \n\n   Weight: `O(1)` \n \n### clearAttribute(collection: `u32`, maybe_item: `Option<u32>`, namespace: `PalletNftsAttributeNamespace`, key: `Bytes`)\n- **interface**: `api.tx.nfts.clearAttribute`\n- **summary**:    Clear an attribute for a collection or item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Owner of the  attribute. \n\n   Any deposit is freed for the collection's owner. \n\n   - `collection`: The identifier of the collection whose item's metadata to clear. \n\n  - `maybe_item`: The identifier of the item whose metadata to clear.\n\n  - `namespace`: Attribute's namespace.\n\n  - `key`: The key of the attribute.\n\n   Emits `AttributeCleared`. \n\n   Weight: `O(1)` \n \n### clearCollectionMetadata(collection: `u32`)\n- **interface**: `api.tx.nfts.clearCollectionMetadata`\n- **summary**:    Clear the metadata for a collection. \n\n   Origin must be either `ForceOrigin` or `Signed` and the sender should be the Admin of  the `collection`. \n\n   Any deposit is freed for the collection's owner. \n\n   - `collection`: The identifier of the collection whose metadata to clear. \n\n   Emits `CollectionMetadataCleared`. \n\n   Weight: `O(1)` \n \n### clearMetadata(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.nfts.clearMetadata`\n- **summary**:    Clear the metadata for an item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Admin of the  `collection`. \n\n   Any deposit is freed for the collection's owner. \n\n   - `collection`: The identifier of the collection whose item's metadata to clear. \n\n  - `item`: The identifier of the item whose metadata to clear.\n\n   Emits `ItemMetadataCleared`. \n\n   Weight: `O(1)` \n \n### create(admin: `MultiAddress`, config: `PalletNftsCollectionConfig`)\n- **interface**: `api.tx.nfts.create`\n- **summary**:    Issue a new collection of non-fungible items from a public origin. \n\n   This new collection has no items initially and its owner is the origin. \n\n   The origin must be Signed and the sender must have sufficient funds free. \n\n   `CollectionDeposit` funds of sender are reserved. \n\n   Parameters: \n\n  - `admin`: The admin of this collection. The admin is the initial address of each member of the collection's admin team. \n\n   Emits `Created` event when successful. \n\n   Weight: `O(1)` \n \n### createSwap(offered_collection: `u32`, offered_item: `u32`, desired_collection: `u32`, maybe_desired_item: `Option<u32>`, maybe_price: `Option<PalletNftsPriceWithDirection>`, duration: `u32`)\n- **interface**: `api.tx.nfts.createSwap`\n- **summary**:    Register a new atomic swap, declaring an intention to send an `item` in exchange for  `desired_item` from origin to target on the current blockchain.  The target can execute the swap during the specified `duration` of blocks (if set).  Additionally, the price could be set for the desired `item`. \n\n   Origin must be Signed and must be an owner of the `item`. \n\n   - `collection`: The collection of the item. \n\n  - `item`: The item an owner wants to give.\n\n  - `desired_collection`: The collection of the desired item.\n\n  - `desired_item`: The desired item an owner wants to receive.\n\n  - `maybe_price`: The price an owner is willing to pay or receive for the desired `item`.\n\n  - `duration`: A deadline for the swap. Specified by providing the number of blocks after which the swap will expire. \n\n   Emits `SwapCreated` on success. \n \n### destroy(collection: `u32`, witness: `PalletNftsDestroyWitness`)\n- **interface**: `api.tx.nfts.destroy`\n- **summary**:    Destroy a collection of fungible items. \n\n   The origin must conform to `ForceOrigin` or must be `Signed` and the sender must be the  owner of the `collection`. \n\n   NOTE: The collection must have 0 items to be destroyed. \n\n   - `collection`: The identifier of the collection to be destroyed. \n\n  - `witness`: Information on the items minted in the collection. This must be correct. \n\n   Emits `Destroyed` event when successful. \n\n   Weight: `O(m + c + a)` where: \n\n  - `m = witness.item_metadatas`\n\n  - `c = witness.item_configs`\n\n  - `a = witness.attributes`\n \n### forceCollectionConfig(collection: `u32`, config: `PalletNftsCollectionConfig`)\n- **interface**: `api.tx.nfts.forceCollectionConfig`\n- **summary**:    Change the config of a collection. \n\n   Origin must be `ForceOrigin`. \n\n   - `collection`: The identifier of the collection. \n\n  - `config`: The new config of this collection.\n\n   Emits `CollectionConfigChanged`. \n\n   Weight: `O(1)` \n \n### forceCollectionOwner(collection: `u32`, owner: `MultiAddress`)\n- **interface**: `api.tx.nfts.forceCollectionOwner`\n- **summary**:    Change the Owner of a collection. \n\n   Origin must be `ForceOrigin`. \n\n   - `collection`: The identifier of the collection. \n\n  - `owner`: The new Owner of this collection.\n\n   Emits `OwnerChanged`. \n\n   Weight: `O(1)` \n \n### forceCreate(owner: `MultiAddress`, config: `PalletNftsCollectionConfig`)\n- **interface**: `api.tx.nfts.forceCreate`\n- **summary**:    Issue a new collection of non-fungible items from a privileged origin. \n\n   This new collection has no items initially. \n\n   The origin must conform to `ForceOrigin`. \n\n   Unlike `create`, no funds are reserved. \n\n   - `owner`: The owner of this collection of items. The owner has full superuser  permissions over this item, but may later change and configure the permissions using  `transfer_ownership` and `set_team`. \n\n   Emits `ForceCreated` event when successful. \n\n   Weight: `O(1)` \n \n### forceMint(collection: `u32`, item: `u32`, mint_to: `MultiAddress`, item_config: `PalletNftsItemConfig`)\n- **interface**: `api.tx.nfts.forceMint`\n- **summary**:    Mint an item of a particular collection from a privileged origin. \n\n   The origin must conform to `ForceOrigin` or must be `Signed` and the sender must be the  Issuer of the `collection`. \n\n   - `collection`: The collection of the item to be minted. \n\n  - `item`: An identifier of the new item.\n\n  - `mint_to`: Account into which the item will be minted.\n\n  - `item_config`: A config of the new item.\n\n   Emits `Issued` event when successful. \n\n   Weight: `O(1)` \n \n### forceSetAttribute(set_as: `Option<AccountId32>`, collection: `u32`, maybe_item: `Option<u32>`, namespace: `PalletNftsAttributeNamespace`, key: `Bytes`, value: `Bytes`)\n- **interface**: `api.tx.nfts.forceSetAttribute`\n- **summary**:    Force-set an attribute for a collection or item. \n\n   Origin must be `ForceOrigin`. \n\n   If the attribute already exists and it was set by another account, the deposit  will be returned to the previous owner. \n\n   - `set_as`: An optional owner of the attribute. \n\n  - `collection`: The identifier of the collection whose item's metadata to set.\n\n  - `maybe_item`: The identifier of the item whose metadata to set.\n\n  - `namespace`: Attribute's namespace.\n\n  - `key`: The key of the attribute.\n\n  - `value`: The value to which to set the attribute.\n\n   Emits `AttributeSet`. \n\n   Weight: `O(1)` \n \n### lockCollection(collection: `u32`, lock_settings: `u64`)\n- **interface**: `api.tx.nfts.lockCollection`\n- **summary**:    Disallows specified settings for the whole collection. \n\n   Origin must be Signed and the sender should be the Owner of the `collection`. \n\n   - `collection`: The collection to be locked. \n\n  - `lock_settings`: The settings to be locked.\n\n   Note: it's possible to only lock(set) the setting, but not to unset it. \n\n   Emits `CollectionLocked`. \n\n   Weight: `O(1)` \n \n### lockItemProperties(collection: `u32`, item: `u32`, lock_metadata: `bool`, lock_attributes: `bool`)\n- **interface**: `api.tx.nfts.lockItemProperties`\n- **summary**:    Disallows changing the metadata or attributes of the item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Admin  of the `collection`. \n\n   - `collection`: The collection if the `item`. \n\n  - `item`: An item to be locked.\n\n  - `lock_metadata`: Specifies whether the metadata should be locked.\n\n  - `lock_attributes`: Specifies whether the attributes in the `CollectionOwner` namespace should be locked. \n\n   Note: `lock_attributes` affects the attributes in the `CollectionOwner` namespace only.  When the metadata or attributes are locked, it won't be possible the unlock them. \n\n   Emits `ItemPropertiesLocked`. \n\n   Weight: `O(1)` \n \n### lockItemTransfer(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.nfts.lockItemTransfer`\n- **summary**:    Disallow further unprivileged transfer of an item. \n\n   Origin must be Signed and the sender should be the Freezer of the `collection`. \n\n   - `collection`: The collection of the item to be changed. \n\n  - `item`: The item to become non-transferable.\n\n   Emits `ItemTransferLocked`. \n\n   Weight: `O(1)` \n \n### mint(collection: `u32`, item: `u32`, mint_to: `MultiAddress`, witness_data: `Option<PalletNftsMintWitness>`)\n- **interface**: `api.tx.nfts.mint`\n- **summary**:    Mint an item of a particular collection. \n\n   The origin must be Signed and the sender must comply with the `mint_settings` rules. \n\n   - `collection`: The collection of the item to be minted. \n\n  - `item`: An identifier of the new item.\n\n  - `mint_to`: Account into which the item will be minted.\n\n  - `witness_data`: When the mint type is `HolderOf(collection_id)`, then the owned item_id from that collection needs to be provided within the witness data object. If  the mint price is set, then it should be additionally confirmed in the `witness_data`. \n\n   Note: the deposit will be taken from the `origin` and not the `owner` of the `item`. \n\n   Emits `Issued` event when successful. \n\n   Weight: `O(1)` \n \n### mintPreSigned(mint_data: `PalletNftsPreSignedMint`, signature: `SpRuntimeMultiSignature`, signer: `AccountId32`)\n- **interface**: `api.tx.nfts.mintPreSigned`\n- **summary**:    Mint an item by providing the pre-signed approval. \n\n   Origin must be Signed. \n\n   - `mint_data`: The pre-signed approval that consists of the information about the item,  its metadata, attributes, who can mint it (`None` for anyone) and until what block  number. \n\n  - `signature`: The signature of the `data` object.\n\n  - `signer`: The `data` object's signer. Should be an Issuer of the collection.\n\n   Emits `Issued` on success.  Emits `AttributeSet` if the attributes were provided.  Emits `ItemMetadataSet` if the metadata was not empty. \n \n### payTips(tips: `Vec<PalletNftsItemTip>`)\n- **interface**: `api.tx.nfts.payTips`\n- **summary**:    Allows to pay the tips. \n\n   Origin must be Signed. \n\n   - `tips`: Tips array. \n\n   Emits `TipSent` on every tip transfer. \n \n### redeposit(collection: `u32`, items: `Vec<u32>`)\n- **interface**: `api.tx.nfts.redeposit`\n- **summary**:    Re-evaluate the deposits on some items. \n\n   Origin must be Signed and the sender should be the Owner of the `collection`. \n\n   - `collection`: The collection of the items to be reevaluated. \n\n  - `items`: The items of the collection whose deposits will be reevaluated.\n\n   NOTE: This exists as a best-effort function. Any items which are unknown or  in the case that the owner account does not have reservable funds to pay for a  deposit increase are ignored. Generally the owner isn't going to call this on items  whose existing deposit is less than the refreshed deposit as it would only cost them,  so it's of little consequence. \n\n   It will still return an error in the case that the collection is unknown or the signer  is not permitted to call it. \n\n   Weight: `O(items.len())` \n \n### setAcceptOwnership(maybe_collection: `Option<u32>`)\n- **interface**: `api.tx.nfts.setAcceptOwnership`\n- **summary**:    Set (or reset) the acceptance of ownership for a particular account. \n\n   Origin must be `Signed` and if `maybe_collection` is `Some`, then the signer must have a  provider reference. \n\n   - `maybe_collection`: The identifier of the collection whose ownership the signer is  willing to accept, or if `None`, an indication that the signer is willing to accept no  ownership transferal. \n\n   Emits `OwnershipAcceptanceChanged`. \n \n### setAttribute(collection: `u32`, maybe_item: `Option<u32>`, namespace: `PalletNftsAttributeNamespace`, key: `Bytes`, value: `Bytes`)\n- **interface**: `api.tx.nfts.setAttribute`\n- **summary**:    Set an attribute for a collection or item. \n\n   Origin must be Signed and must conform to the namespace ruleset: \n\n  - `CollectionOwner` namespace could be modified by the `collection` Admin only;\n\n  - `ItemOwner` namespace could be modified by the `maybe_item` owner only. `maybe_item` should be set in that case; \n\n  - `Account(AccountId)` namespace could be modified only when the `origin` was given a permission to do so; \n\n   The funds of `origin` are reserved according to the formula:  `AttributeDepositBase + DepositPerByte * (key.len + value.len)` taking into  account any already reserved funds. \n\n   - `collection`: The identifier of the collection whose item's metadata to set. \n\n  - `maybe_item`: The identifier of the item whose metadata to set.\n\n  - `namespace`: Attribute's namespace.\n\n  - `key`: The key of the attribute.\n\n  - `value`: The value to which to set the attribute.\n\n   Emits `AttributeSet`. \n\n   Weight: `O(1)` \n \n### setAttributesPreSigned(data: `PalletNftsPreSignedAttributes`, signature: `SpRuntimeMultiSignature`, signer: `AccountId32`)\n- **interface**: `api.tx.nfts.setAttributesPreSigned`\n- **summary**:    Set attributes for an item by providing the pre-signed approval. \n\n   Origin must be Signed and must be an owner of the `data.item`. \n\n   - `data`: The pre-signed approval that consists of the information about the item,  attributes to update and until what block number. \n\n  - `signature`: The signature of the `data` object.\n\n  - `signer`: The `data` object's signer. Should be an Admin of the collection for the `CollectionOwner` namespace. \n\n   Emits `AttributeSet` for each provided attribute.  Emits `ItemAttributesApprovalAdded` if the approval wasn't set before.  Emits `PreSignedAttributesSet` on success. \n \n### setCollectionMaxSupply(collection: `u32`, max_supply: `u32`)\n- **interface**: `api.tx.nfts.setCollectionMaxSupply`\n- **summary**:    Set the maximum number of items a collection could have. \n\n   Origin must be either `ForceOrigin` or `Signed` and the sender should be the Owner of  the `collection`. \n\n   - `collection`: The identifier of the collection to change. \n\n  - `max_supply`: The maximum number of items a collection could have.\n\n   Emits `CollectionMaxSupplySet` event when successful. \n \n### setCollectionMetadata(collection: `u32`, data: `Bytes`)\n- **interface**: `api.tx.nfts.setCollectionMetadata`\n- **summary**:    Set the metadata for a collection. \n\n   Origin must be either `ForceOrigin` or `Signed` and the sender should be the Admin of  the `collection`. \n\n   If the origin is `Signed`, then funds of signer are reserved according to the formula:  `MetadataDepositBase + DepositPerByte * data.len` taking into  account any already reserved funds. \n\n   - `collection`: The identifier of the item whose metadata to update. \n\n  - `data`: The general information of this item. Limited in length by `StringLimit`.\n\n   Emits `CollectionMetadataSet`. \n\n   Weight: `O(1)` \n \n### setMetadata(collection: `u32`, item: `u32`, data: `Bytes`)\n- **interface**: `api.tx.nfts.setMetadata`\n- **summary**:    Set the metadata for an item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Admin of the  `collection`. \n\n   If the origin is Signed, then funds of signer are reserved according to the formula:  `MetadataDepositBase + DepositPerByte * data.len` taking into  account any already reserved funds. \n\n   - `collection`: The identifier of the collection whose item's metadata to set. \n\n  - `item`: The identifier of the item whose metadata to set.\n\n  - `data`: The general information of this item. Limited in length by `StringLimit`.\n\n   Emits `ItemMetadataSet`. \n\n   Weight: `O(1)` \n \n### setPrice(collection: `u32`, item: `u32`, price: `Option<u128>`, whitelisted_buyer: `Option<MultiAddress>`)\n- **interface**: `api.tx.nfts.setPrice`\n- **summary**:    Set (or reset) the price for an item. \n\n   Origin must be Signed and must be the owner of the `item`. \n\n   - `collection`: The collection of the item. \n\n  - `item`: The item to set the price for.\n\n  - `price`: The price for the item. Pass `None`, to reset the price.\n\n  - `buyer`: Restricts the buy operation to a specific account.\n\n   Emits `ItemPriceSet` on success if the price is not `None`.  Emits `ItemPriceRemoved` on success if the price is `None`. \n \n### setTeam(collection: `u32`, issuer: `Option<MultiAddress>`, admin: `Option<MultiAddress>`, freezer: `Option<MultiAddress>`)\n- **interface**: `api.tx.nfts.setTeam`\n- **summary**:    Change the Issuer, Admin and Freezer of a collection. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Owner of the  `collection`. \n\n   Note: by setting the role to `None` only the `ForceOrigin` will be able to change it  after to `Some(account)`. \n\n   - `collection`: The collection whose team should be changed. \n\n  - `issuer`: The new Issuer of this collection.\n\n  - `admin`: The new Admin of this collection.\n\n  - `freezer`: The new Freezer of this collection.\n\n   Emits `TeamChanged`. \n\n   Weight: `O(1)` \n \n### transfer(collection: `u32`, item: `u32`, dest: `MultiAddress`)\n- **interface**: `api.tx.nfts.transfer`\n- **summary**:    Move an item from the sender account to another. \n\n   Origin must be Signed and the signing account must be either: \n\n  - the Owner of the `item`;\n\n  - the approved delegate for the `item` (in this case, the approval is reset).\n\n   Arguments: \n\n  - `collection`: The collection of the item to be transferred.\n\n  - `item`: The item to be transferred.\n\n  - `dest`: The account to receive ownership of the item.\n\n   Emits `Transferred`. \n\n   Weight: `O(1)` \n \n### transferOwnership(collection: `u32`, new_owner: `MultiAddress`)\n- **interface**: `api.tx.nfts.transferOwnership`\n- **summary**:    Change the Owner of a collection. \n\n   Origin must be Signed and the sender should be the Owner of the `collection`. \n\n   - `collection`: The collection whose owner should be changed. \n\n  - `owner`: The new Owner of this collection. They must have called `set_accept_ownership` with `collection` in order for this operation to succeed. \n\n   Emits `OwnerChanged`. \n\n   Weight: `O(1)` \n \n### unlockItemTransfer(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.nfts.unlockItemTransfer`\n- **summary**:    Re-allow unprivileged transfer of an item. \n\n   Origin must be Signed and the sender should be the Freezer of the `collection`. \n\n   - `collection`: The collection of the item to be changed. \n\n  - `item`: The item to become transferable.\n\n   Emits `ItemTransferUnlocked`. \n\n   Weight: `O(1)` \n \n### updateMintSettings(collection: `u32`, mint_settings: `PalletNftsMintSettings`)\n- **interface**: `api.tx.nfts.updateMintSettings`\n- **summary**:    Update mint settings. \n\n   Origin must be either `ForceOrigin` or `Signed` and the sender should be the Issuer  of the `collection`. \n\n   - `collection`: The identifier of the collection to change. \n\n  - `mint_settings`: The new mint settings.\n\n   Emits `CollectionMintSettingsUpdated` event when successful. \n\n___\n\n\n## nis\n \n### communify(index: `Compact<u32>`)\n- **interface**: `api.tx.nis.communify`\n- **summary**:    Make a private receipt communal and create fungible counterparts for its owner. \n \n### fundDeficit()\n- **interface**: `api.tx.nis.fundDeficit`\n- **summary**:    Ensure we have sufficient funding for all potential payouts. \n\n   - `origin`: Must be accepted by `FundOrigin`. \n \n### placeBid(amount: `Compact<u128>`, duration: `u32`)\n- **interface**: `api.tx.nis.placeBid`\n- **summary**:    Place a bid. \n\n   Origin must be Signed, and account must have at least `amount` in free balance. \n\n   - `amount`: The amount of the bid; these funds will be reserved, and if/when  consolidated, removed. Must be at least `MinBid`. \n\n  - `duration`: The number of periods before which the newly consolidated bid may be thawed. Must be greater than 1 and no more than `QueueCount`. \n\n   Complexities: \n\n  - `Queues[duration].len()` (just take max).\n \n### privatize(index: `Compact<u32>`)\n- **interface**: `api.tx.nis.privatize`\n- **summary**:    Make a communal receipt private and burn fungible counterparts from its owner. \n \n### retractBid(amount: `Compact<u128>`, duration: `u32`)\n- **interface**: `api.tx.nis.retractBid`\n- **summary**:    Retract a previously placed bid. \n\n   Origin must be Signed, and the account should have previously issued a still-active bid  of `amount` for `duration`. \n\n   - `amount`: The amount of the previous bid. \n\n  - `duration`: The duration of the previous bid.\n \n### thawCommunal(index: `Compact<u32>`)\n- **interface**: `api.tx.nis.thawCommunal`\n- **summary**:    Reduce or remove an outstanding receipt, placing the according proportion of funds into  the account of the owner. \n\n   - `origin`: Must be Signed and the account must be the owner of the fungible counterpart  for receipt `index`. \n\n  - `index`: The index of the receipt.\n \n### thawPrivate(index: `Compact<u32>`, maybe_proportion: `Option<Perquintill>`)\n- **interface**: `api.tx.nis.thawPrivate`\n- **summary**:    Reduce or remove an outstanding receipt, placing the according proportion of funds into  the account of the owner. \n\n   - `origin`: Must be Signed and the account must be the owner of the receipt `index` as  well as any fungible counterpart. \n\n  - `index`: The index of the receipt.\n\n  - `portion`: If `Some`, then only the given portion of the receipt should be thawed. If `None`, then all of it should be. \n\n___\n\n\n## nominationPools\n \n### adjustPoolDeposit(pool_id: `u32`)\n- **interface**: `api.tx.nominationPools.adjustPoolDeposit`\n- **summary**:    Top up the deficit or withdraw the excess ED from the pool. \n\n   When a pool is created, the pool depositor transfers ED to the reward account of the  pool. ED is subject to change and over time, the deposit in the reward account may be  insufficient to cover the ED deficit of the pool or vice-versa where there is excess  deposit to the pool. This call allows anyone to adjust the ED deposit of the  pool by either topping up the deficit or claiming the excess. \n \n### applySlash(member_account: `MultiAddress`)\n- **interface**: `api.tx.nominationPools.applySlash`\n- **summary**:    Apply a pending slash on a member. \n\n   Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type:  [`adapter::StakeStrategyType::Delegate`]. \n\n   The pending slash amount of the member must be equal or more than `ExistentialDeposit`.  This call can be dispatched permissionlessly (i.e. by any account). If the execution  is successful, fee is refunded and caller may be rewarded with a part of the slash  based on the [`crate::pallet::Config::StakeAdapter`] configuration. \n \n### bondExtra(extra: `PalletNominationPoolsBondExtra`)\n- **interface**: `api.tx.nominationPools.bondExtra`\n- **summary**:    Bond `extra` more funds from `origin` into the pool to which they already belong. \n\n   Additional funds can come from either the free balance of the account, of from the  accumulated rewards, see [`BondExtra`]. \n\n   Bonding extra funds implies an automatic payout of all pending rewards as well.  See `bond_extra_other` to bond pending rewards of `other` members. \n \n### bondExtraOther(member: `MultiAddress`, extra: `PalletNominationPoolsBondExtra`)\n- **interface**: `api.tx.nominationPools.bondExtraOther`\n- **summary**:    `origin` bonds funds from `extra` for some pool member `member` into their respective  pools. \n\n   `origin` can bond extra funds from free balance or pending rewards when `origin ==  other`. \n\n   In the case of `origin != other`, `origin` can only bond extra pending rewards of  `other` members assuming set_claim_permission for the given member is  `PermissionlessCompound` or `PermissionlessAll`. \n \n### chill(pool_id: `u32`)\n- **interface**: `api.tx.nominationPools.chill`\n- **summary**:    Chill on behalf of the pool. \n\n   The dispatch origin of this call can be signed by the pool nominator or the pool  root role, same as [`Pallet::nominate`]. \n\n   This directly forwards the call to an implementation of `StakingInterface` (e.g.,  `pallet-staking`) through [`Config::StakeAdapter`], on behalf of the bonded pool. \n\n   Under certain conditions, this call can be dispatched permissionlessly (i.e. by any  account). \n\n   #### Conditions for a permissionless dispatch: \n\n  * When pool depositor has less than `MinNominatorBond` staked, otherwise pool members are unable to unbond. \n\n   #### Conditions for permissioned dispatch: \n\n  * The caller is the pool's nominator or root.\n \n### claimCommission(pool_id: `u32`)\n- **interface**: `api.tx.nominationPools.claimCommission`\n- **summary**:    Claim pending commission. \n\n   The `root` role of the pool is _always_ allowed to claim the pool's commission. \n\n   If the pool has set `CommissionClaimPermission::Permissionless`, then any account can  trigger the process of claiming the pool's commission. \n\n   If the pool has set its `CommissionClaimPermission` to `Account(acc)`, then only  accounts \n\n  * `acc`, and\n\n  * the pool's root account\n\n   may call this extrinsic on behalf of the pool. \n\n   Pending commissions are paid out and added to the total claimed commission.  The total pending commission is reset to zero. \n \n### claimPayout()\n- **interface**: `api.tx.nominationPools.claimPayout`\n- **summary**:    A bonded member can use this to claim their payout based on the rewards that the pool  has accumulated since their last claimed payout (OR since joining if this is their first  time claiming rewards). The payout will be transferred to the member's account. \n\n   The member will earn rewards pro rata based on the members stake vs the sum of the  members in the pools stake. Rewards do not \"expire\". \n\n   See `claim_payout_other` to claim rewards on behalf of some `other` pool member. \n \n### claimPayoutOther(other: `AccountId32`)\n- **interface**: `api.tx.nominationPools.claimPayoutOther`\n- **summary**:    `origin` can claim payouts on some pool member `other`'s behalf. \n\n   Pool member `other` must have a `PermissionlessWithdraw` or `PermissionlessAll` claim  permission for this call to be successful. \n \n### create(amount: `Compact<u128>`, root: `MultiAddress`, nominator: `MultiAddress`, bouncer: `MultiAddress`)\n- **interface**: `api.tx.nominationPools.create`\n- **summary**:    Create a new delegation pool. \n\n   #### Arguments \n\n   * `amount` - The amount of funds to delegate to the pool. This also acts of a sort of  deposit since the pools creator cannot fully unbond funds until the pool is being  destroyed. \n\n  * `index` - A disambiguation index for creating the account. Likely only useful when creating multiple pools in the same extrinsic. \n\n  * `root` - The account to set as [`PoolRoles::root`].\n\n  * `nominator` - The account to set as the [`PoolRoles::nominator`].\n\n  * `bouncer` - The account to set as the [`PoolRoles::bouncer`].\n\n   #### Note \n\n   In addition to `amount`, the caller will transfer the existential deposit; so the caller  needs at have at least `amount + existential_deposit` transferable. \n \n### createWithPoolId(amount: `Compact<u128>`, root: `MultiAddress`, nominator: `MultiAddress`, bouncer: `MultiAddress`, pool_id: `u32`)\n- **interface**: `api.tx.nominationPools.createWithPoolId`\n- **summary**:    Create a new delegation pool with a previously used pool id \n\n   #### Arguments \n\n   same as `create` with the inclusion of \n\n  * `pool_id` - `A valid PoolId.\n \n### join(amount: `Compact<u128>`, pool_id: `u32`)\n- **interface**: `api.tx.nominationPools.join`\n- **summary**:    Stake funds with a pool. The amount to bond is delegated (or transferred based on  [`adapter::StakeStrategyType`]) from the member to the pool account and immediately  increases the pool's bond. \n\n   The method of transferring the amount to the pool account is determined by  [`adapter::StakeStrategyType`]. If the pool is configured to use  [`adapter::StakeStrategyType::Delegate`], the funds remain in the account of  the `origin`, while the pool gains the right to use these funds for staking. \n\n   #### Note \n\n   * An account can only be a member of a single pool. \n\n  * An account cannot join the same pool multiple times.\n\n  * This call will *not* dust the member account, so the member must have at least `existential deposit + amount` in their account. \n\n  * Only a pool with [`PoolState::Open`] can be joined\n \n### migrateDelegation(member_account: `MultiAddress`)\n- **interface**: `api.tx.nominationPools.migrateDelegation`\n- **summary**:    Migrates delegated funds from the pool account to the `member_account`. \n\n   Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type:  [`adapter::StakeStrategyType::Delegate`]. \n\n   This is a permission-less call and refunds any fee if claim is successful. \n\n   If the pool has migrated to delegation based staking, the staked tokens of pool members  can be moved and held in their own account. See [`adapter::DelegateStake`] \n \n### migratePoolToDelegateStake(pool_id: `u32`)\n- **interface**: `api.tx.nominationPools.migratePoolToDelegateStake`\n- **summary**:    Migrate pool from [`adapter::StakeStrategyType::Transfer`] to  [`adapter::StakeStrategyType::Delegate`]. \n\n   Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type:  [`adapter::StakeStrategyType::Delegate`]. \n\n   This call can be dispatched permissionlessly, and refunds any fee if successful. \n\n   If the pool has already migrated to delegation based staking, this call will fail. \n \n### nominate(pool_id: `u32`, validators: `Vec<AccountId32>`)\n- **interface**: `api.tx.nominationPools.nominate`\n- **summary**:    Nominate on behalf of the pool. \n\n   The dispatch origin of this call must be signed by the pool nominator or the pool  root role. \n\n   This directly forwards the call to an implementation of `StakingInterface` (e.g.,  `pallet-staking`) through [`Config::StakeAdapter`], on behalf of the bonded pool. \n\n   #### Note \n\n   In addition to a `root` or `nominator` role of `origin`, the pool's depositor needs to  have at least `depositor_min_bond` in the pool to start nominating. \n \n### poolWithdrawUnbonded(pool_id: `u32`, num_slashing_spans: `u32`)\n- **interface**: `api.tx.nominationPools.poolWithdrawUnbonded`\n- **summary**:    Call `withdraw_unbonded` for the pools account. This call can be made by any account. \n\n   This is useful if there are too many unlocking chunks to call `unbond`, and some  can be cleared by withdrawing. In the case there are too many unlocking chunks, the user  would probably see an error like `NoMoreChunks` emitted from the staking system when  they attempt to unbond. \n \n### setClaimPermission(permission: `PalletNominationPoolsClaimPermission`)\n- **interface**: `api.tx.nominationPools.setClaimPermission`\n- **summary**:    Allows a pool member to set a claim permission to allow or disallow permissionless  bonding and withdrawing. \n\n   #### Arguments \n\n   * `origin` - Member of a pool. \n\n  * `permission` - The permission to be applied.\n \n### setCommission(pool_id: `u32`, new_commission: `Option<(Perbill,AccountId32)>`)\n- **interface**: `api.tx.nominationPools.setCommission`\n- **summary**:    Set the commission of a pool.  Both a commission percentage and a commission payee must be provided in the `current`  tuple. Where a `current` of `None` is provided, any current commission will be removed. \n\n   - If a `None` is supplied to `new_commission`, existing commission will be removed. \n \n### setCommissionChangeRate(pool_id: `u32`, change_rate: `PalletNominationPoolsCommissionChangeRate`)\n- **interface**: `api.tx.nominationPools.setCommissionChangeRate`\n- **summary**:    Set the commission change rate for a pool. \n\n   Initial change rate is not bounded, whereas subsequent updates can only be more  restrictive than the current. \n \n### setCommissionClaimPermission(pool_id: `u32`, permission: `Option<PalletNominationPoolsCommissionClaimPermission>`)\n- **interface**: `api.tx.nominationPools.setCommissionClaimPermission`\n- **summary**:    Set or remove a pool's commission claim permission. \n\n   Determines who can claim the pool's pending commission. Only the `Root` role of the pool  is able to configure commission claim permissions. \n \n### setCommissionMax(pool_id: `u32`, max_commission: `Perbill`)\n- **interface**: `api.tx.nominationPools.setCommissionMax`\n- **summary**:    Set the maximum commission of a pool. \n\n   - Initial max can be set to any `Perbill`, and only smaller values thereafter. \n\n  - Current commission will be lowered in the event it is higher than a new max commission. \n \n### setConfigs(min_join_bond: `PalletNominationPoolsConfigOpU128`, min_create_bond: `PalletNominationPoolsConfigOpU128`, max_pools: `PalletNominationPoolsConfigOpU32`, max_members: `PalletNominationPoolsConfigOpU32`, max_members_per_pool: `PalletNominationPoolsConfigOpU32`, global_max_commission: `PalletNominationPoolsConfigOpPerbill`)\n- **interface**: `api.tx.nominationPools.setConfigs`\n- **summary**:    Update configurations for the nomination pools. The origin for this call must be  [`Config::AdminOrigin`]. \n\n   #### Arguments \n\n   * `min_join_bond` - Set [`MinJoinBond`]. \n\n  * `min_create_bond` - Set [`MinCreateBond`].\n\n  * `max_pools` - Set [`MaxPools`].\n\n  * `max_members` - Set [`MaxPoolMembers`].\n\n  * `max_members_per_pool` - Set [`MaxPoolMembersPerPool`].\n\n  * `global_max_commission` - Set [`GlobalMaxCommission`].\n \n### setMetadata(pool_id: `u32`, metadata: `Bytes`)\n- **interface**: `api.tx.nominationPools.setMetadata`\n- **summary**:    Set a new metadata for the pool. \n\n   The dispatch origin of this call must be signed by the bouncer, or the root role of the  pool. \n \n### setState(pool_id: `u32`, state: `PalletNominationPoolsPoolState`)\n- **interface**: `api.tx.nominationPools.setState`\n- **summary**:    Set a new state for the pool. \n\n   If a pool is already in the `Destroying` state, then under no condition can its state  change again. \n\n   The dispatch origin of this call must be either: \n\n   1. signed by the bouncer, or the root role of the pool,  2. if the pool conditions to be open are NOT met (as described by `ok_to_be_open`), and  then the state of the pool can be permissionlessly changed to `Destroying`. \n \n### unbond(member_account: `MultiAddress`, unbonding_points: `Compact<u128>`)\n- **interface**: `api.tx.nominationPools.unbond`\n- **summary**:    Unbond up to `unbonding_points` of the `member_account`'s funds from the pool. It  implicitly collects the rewards one last time, since not doing so would mean some  rewards would be forfeited. \n\n   Under certain conditions, this call can be dispatched permissionlessly (i.e. by any  account). \n\n   #### Conditions for a permissionless dispatch. \n\n   * The pool is blocked and the caller is either the root or bouncer. This is refereed to  as a kick. \n\n  * The pool is destroying and the member is not the depositor.\n\n  * The pool is destroying, the member is the depositor and no other members are in the pool. \n\n   #### Conditions for permissioned dispatch (i.e. the caller is also the  `member_account`): \n\n   * The caller is not the depositor. \n\n  * The caller is the depositor, the pool is destroying and no other members are in the pool. \n\n   #### Note \n\n   If there are too many unlocking chunks to unbond with the pool account,  [`Call::pool_withdraw_unbonded`] can be called to try and minimize unlocking chunks.  The [`StakingInterface::unbond`] will implicitly call [`Call::pool_withdraw_unbonded`]  to try to free chunks if necessary (ie. if unbound was called and no unlocking chunks  are available). However, it may not be possible to release the current unlocking chunks,  in which case, the result of this call will likely be the `NoMoreChunks` error from the  staking system. \n \n### updateRoles(pool_id: `u32`, new_root: `PalletNominationPoolsConfigOpAccountId32`, new_nominator: `PalletNominationPoolsConfigOpAccountId32`, new_bouncer: `PalletNominationPoolsConfigOpAccountId32`)\n- **interface**: `api.tx.nominationPools.updateRoles`\n- **summary**:    Update the roles of the pool. \n\n   The root is the only entity that can change any of the roles, including itself,  excluding the depositor, who can never change. \n\n   It emits an event, notifying UIs of the role change. This event is quite relevant to  most pool members and they should be informed of changes to pool roles. \n \n### withdrawUnbonded(member_account: `MultiAddress`, num_slashing_spans: `u32`)\n- **interface**: `api.tx.nominationPools.withdrawUnbonded`\n- **summary**:    Withdraw unbonded funds from `member_account`. If no bonded funds can be unbonded, an  error is returned. \n\n   Under certain conditions, this call can be dispatched permissionlessly (i.e. by any  account). \n\n   #### Conditions for a permissionless dispatch \n\n   * The pool is in destroy mode and the target is not the depositor. \n\n  * The target is the depositor and they are the only member in the sub pools.\n\n  * The pool is blocked and the caller is either the root or bouncer.\n\n   #### Conditions for permissioned dispatch \n\n   * The caller is the target and they are not the depositor. \n\n   #### Note \n\n   - If the target is the depositor, the pool will be destroyed. \n\n  - If the pool has any pending slash, we also try to slash the member before letting them withdraw. This calculation adds some weight overhead and is only defensive. In reality,  pool slashes must have been already applied via permissionless [`Call::apply_slash`]. \n\n___\n\n\n## parameters\n \n### setParameter(key_value: `KitchensinkRuntimeRuntimeParameters`)\n- **interface**: `api.tx.parameters.setParameter`\n- **summary**:    Set the value of a parameter. \n\n   The dispatch origin of this call must be `AdminOrigin` for the given `key`. Values be  deleted by setting them to `None`. \n\n___\n\n\n## poolAssets\n \n### approveTransfer(id: `Compact<u32>`, delegate: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.approveTransfer`\n- **summary**:    Approve an amount of asset for transfer by a delegated third-party account. \n\n   Origin must be Signed. \n\n   Ensures that `ApprovalDeposit` worth of `Currency` is reserved from signing account  for the purpose of holding the approval. If some non-zero amount of assets is already  approved from signing account to `delegate`, then it is topped up or unreserved to  meet the right value. \n\n   NOTE: The signing account does not need to own `amount` of assets at the point of  making this call. \n\n   - `id`: The identifier of the asset. \n\n  - `delegate`: The account to delegate permission to transfer asset.\n\n  - `amount`: The amount of asset that may be transferred by `delegate`. If there is already an approval in place, then this acts additively. \n\n   Emits `ApprovedTransfer` on success. \n\n   Weight: `O(1)` \n \n### block(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.block`\n- **summary**:    Disallow further unprivileged transfers of an asset `id` to and from an account `who`. \n\n   Origin must be Signed and the sender should be the Freezer of the asset `id`. \n\n   - `id`: The identifier of the account's asset. \n\n  - `who`: The account to be unblocked.\n\n   Emits `Blocked`. \n\n   Weight: `O(1)` \n \n### burn(id: `Compact<u32>`, who: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.burn`\n- **summary**:    Reduce the balance of `who` by as much as possible up to `amount` assets of `id`. \n\n   Origin must be Signed and the sender should be the Manager of the asset `id`. \n\n   Bails with `NoAccount` if the `who` is already dead. \n\n   - `id`: The identifier of the asset to have some amount burned. \n\n  - `who`: The account to be debited from.\n\n  - `amount`: The maximum amount by which `who`'s balance should be reduced.\n\n   Emits `Burned` with the actual amount burned. If this takes the balance to below the  minimum for the asset, then the amount burned is increased to take it to zero. \n\n   Weight: `O(1)`  Modes: Post-existence of `who`; Pre & post Zombie-status of `who`. \n \n### cancelApproval(id: `Compact<u32>`, delegate: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.cancelApproval`\n- **summary**:    Cancel all of some asset approved for delegated transfer by a third-party account. \n\n   Origin must be Signed and there must be an approval in place between signer and  `delegate`. \n\n   Unreserves any deposit previously reserved by `approve_transfer` for the approval. \n\n   - `id`: The identifier of the asset. \n\n  - `delegate`: The account delegated permission to transfer asset.\n\n   Emits `ApprovalCancelled` on success. \n\n   Weight: `O(1)` \n \n### clearMetadata(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.clearMetadata`\n- **summary**:    Clear the metadata for an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   Any deposit is freed for the asset owner. \n\n   - `id`: The identifier of the asset to clear. \n\n   Emits `MetadataCleared`. \n\n   Weight: `O(1)` \n \n### create(id: `Compact<u32>`, admin: `MultiAddress`, min_balance: `u128`)\n- **interface**: `api.tx.poolAssets.create`\n- **summary**:    Issue a new class of fungible assets from a public origin. \n\n   This new asset class has no assets initially and its owner is the origin. \n\n   The origin must conform to the configured `CreateOrigin` and have sufficient funds free. \n\n   Funds of sender are reserved by `AssetDeposit`. \n\n   Parameters: \n\n  - `id`: The identifier of the new asset. This must not be currently in use to identify an existing asset. If [`NextAssetId`] is set, then this must be equal to it. \n\n  - `admin`: The admin of this class of assets. The admin is the initial address of each member of the asset class's admin team. \n\n  - `min_balance`: The minimum balance of this new asset that any single account must have. If an account's balance is reduced below this, then it collapses to zero. \n\n   Emits `Created` event when successful. \n\n   Weight: `O(1)` \n \n### destroyAccounts(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.destroyAccounts`\n- **summary**:    Destroy all accounts associated with a given asset. \n\n   `destroy_accounts` should only be called after `start_destroy` has been called, and the  asset is in a `Destroying` state. \n\n   Due to weight restrictions, this function may need to be called multiple times to fully  destroy all accounts. It will destroy `RemoveItemsLimit` accounts at a time. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   Each call emits the `Event::DestroyedAccounts` event. \n \n### destroyApprovals(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.destroyApprovals`\n- **summary**:    Destroy all approvals associated with a given asset up to the max (T::RemoveItemsLimit). \n\n   `destroy_approvals` should only be called after `start_destroy` has been called, and the  asset is in a `Destroying` state. \n\n   Due to weight restrictions, this function may need to be called multiple times to fully  destroy all approvals. It will destroy `RemoveItemsLimit` approvals at a time. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   Each call emits the `Event::DestroyedApprovals` event. \n \n### finishDestroy(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.finishDestroy`\n- **summary**:    Complete destroying asset and unreserve currency. \n\n   `finish_destroy` should only be called after `start_destroy` has been called, and the  asset is in a `Destroying` state. All accounts or approvals should be destroyed before  hand. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   Each successful call emits the `Event::Destroyed` event. \n \n### forceAssetStatus(id: `Compact<u32>`, owner: `MultiAddress`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`, min_balance: `Compact<u128>`, is_sufficient: `bool`, is_frozen: `bool`)\n- **interface**: `api.tx.poolAssets.forceAssetStatus`\n- **summary**:    Alter the attributes of a given asset. \n\n   Origin must be `ForceOrigin`. \n\n   - `id`: The identifier of the asset. \n\n  - `owner`: The new Owner of this asset.\n\n  - `issuer`: The new Issuer of this asset.\n\n  - `admin`: The new Admin of this asset.\n\n  - `freezer`: The new Freezer of this asset.\n\n  - `min_balance`: The minimum balance of this new asset that any single account must have. If an account's balance is reduced below this, then it collapses to zero. \n\n  - `is_sufficient`: Whether a non-zero balance of this asset is deposit of sufficient value to account for the state bloat associated with its balance storage. If set to  `true`, then non-zero balances may be stored without a `consumer` reference (and thus  an ED in the Balances pallet or whatever else is used to control user-account state  growth). \n\n  - `is_frozen`: Whether this asset class is frozen except for permissioned/admin instructions. \n\n   Emits `AssetStatusChanged` with the identity of the asset. \n\n   Weight: `O(1)` \n \n### forceCancelApproval(id: `Compact<u32>`, owner: `MultiAddress`, delegate: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.forceCancelApproval`\n- **summary**:    Cancel all of some asset approved for delegated transfer by a third-party account. \n\n   Origin must be either ForceOrigin or Signed origin with the signer being the Admin  account of the asset `id`. \n\n   Unreserves any deposit previously reserved by `approve_transfer` for the approval. \n\n   - `id`: The identifier of the asset. \n\n  - `delegate`: The account delegated permission to transfer asset.\n\n   Emits `ApprovalCancelled` on success. \n\n   Weight: `O(1)` \n \n### forceClearMetadata(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.forceClearMetadata`\n- **summary**:    Clear the metadata for an asset. \n\n   Origin must be ForceOrigin. \n\n   Any deposit is returned. \n\n   - `id`: The identifier of the asset to clear. \n\n   Emits `MetadataCleared`. \n\n   Weight: `O(1)` \n \n### forceCreate(id: `Compact<u32>`, owner: `MultiAddress`, is_sufficient: `bool`, min_balance: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.forceCreate`\n- **summary**:    Issue a new class of fungible assets from a privileged origin. \n\n   This new asset class has no assets initially. \n\n   The origin must conform to `ForceOrigin`. \n\n   Unlike `create`, no funds are reserved. \n\n   - `id`: The identifier of the new asset. This must not be currently in use to identify  an existing asset. If [`NextAssetId`] is set, then this must be equal to it. \n\n  - `owner`: The owner of this class of assets. The owner has full superuser permissions over this asset, but may later change and configure the permissions using  `transfer_ownership` and `set_team`. \n\n  - `min_balance`: The minimum balance of this new asset that any single account must have. If an account's balance is reduced below this, then it collapses to zero. \n\n   Emits `ForceCreated` event when successful. \n\n   Weight: `O(1)` \n \n### forceSetMetadata(id: `Compact<u32>`, name: `Bytes`, symbol: `Bytes`, decimals: `u8`, is_frozen: `bool`)\n- **interface**: `api.tx.poolAssets.forceSetMetadata`\n- **summary**:    Force the metadata for an asset to some value. \n\n   Origin must be ForceOrigin. \n\n   Any deposit is left alone. \n\n   - `id`: The identifier of the asset to update. \n\n  - `name`: The user friendly name of this asset. Limited in length by `StringLimit`.\n\n  - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`.\n\n  - `decimals`: The number of decimals this asset uses to represent one unit.\n\n   Emits `MetadataSet`. \n\n   Weight: `O(N + S)` where N and S are the length of the name and symbol respectively. \n \n### forceTransfer(id: `Compact<u32>`, source: `MultiAddress`, dest: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.forceTransfer`\n- **summary**:    Move some assets from one account to another. \n\n   Origin must be Signed and the sender should be the Admin of the asset `id`. \n\n   - `id`: The identifier of the asset to have some amount transferred. \n\n  - `source`: The account to be debited.\n\n  - `dest`: The account to be credited.\n\n  - `amount`: The amount by which the `source`'s balance of assets should be reduced and `dest`'s balance increased. The amount actually transferred may be slightly greater in  the case that the transfer would otherwise take the `source` balance above zero but  below the minimum balance. Must be greater than zero. \n\n   Emits `Transferred` with the actual amount transferred. If this takes the source balance  to below the minimum for the asset, then the amount transferred is increased to take it  to zero. \n\n   Weight: `O(1)`  Modes: Pre-existence of `dest`; Post-existence of `source`; Account pre-existence of  `dest`. \n \n### freeze(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.freeze`\n- **summary**:    Disallow further unprivileged transfers of an asset `id` from an account `who`. `who`  must already exist as an entry in `Account`s of the asset. If you want to freeze an  account that does not have an entry, use `touch_other` first. \n\n   Origin must be Signed and the sender should be the Freezer of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n  - `who`: The account to be frozen.\n\n   Emits `Frozen`. \n\n   Weight: `O(1)` \n \n### freezeAsset(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.freezeAsset`\n- **summary**:    Disallow further unprivileged transfers for the asset class. \n\n   Origin must be Signed and the sender should be the Freezer of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n   Emits `Frozen`. \n\n   Weight: `O(1)` \n \n### mint(id: `Compact<u32>`, beneficiary: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.mint`\n- **summary**:    Mint assets of a particular class. \n\n   The origin must be Signed and the sender must be the Issuer of the asset `id`. \n\n   - `id`: The identifier of the asset to have some amount minted. \n\n  - `beneficiary`: The account to be credited with the minted assets.\n\n  - `amount`: The amount of the asset to be minted.\n\n   Emits `Issued` event when successful. \n\n   Weight: `O(1)`  Modes: Pre-existing balance of `beneficiary`; Account pre-existence of `beneficiary`. \n \n### refund(id: `Compact<u32>`, allow_burn: `bool`)\n- **interface**: `api.tx.poolAssets.refund`\n- **summary**:    Return the deposit (if any) of an asset account or a consumer reference (if any) of an  account. \n\n   The origin must be Signed. \n\n   - `id`: The identifier of the asset for which the caller would like the deposit  refunded. \n\n  - `allow_burn`: If `true` then assets may be destroyed in order to complete the refund.\n\n   It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if  the asset account contains holds or freezes in place. \n\n   Emits `Refunded` event when successful. \n \n### refundOther(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.refundOther`\n- **summary**:    Return the deposit (if any) of a target asset account. Useful if you are the depositor. \n\n   The origin must be Signed and either the account owner, depositor, or asset `Admin`. In  order to burn a non-zero balance of the asset, the caller must be the account and should  use `refund`. \n\n   - `id`: The identifier of the asset for the account holding a deposit. \n\n  - `who`: The account to refund.\n\n   It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if  the asset account contains holds or freezes in place. \n\n   Emits `Refunded` event when successful. \n \n### setMetadata(id: `Compact<u32>`, name: `Bytes`, symbol: `Bytes`, decimals: `u8`)\n- **interface**: `api.tx.poolAssets.setMetadata`\n- **summary**:    Set the metadata for an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   Funds of sender are reserved according to the formula:  `MetadataDepositBase + MetadataDepositPerByte * (name.len + symbol.len)` taking into  account any already reserved funds. \n\n   - `id`: The identifier of the asset to update. \n\n  - `name`: The user friendly name of this asset. Limited in length by `StringLimit`.\n\n  - `symbol`: The exchange symbol for this asset. Limited in length by `StringLimit`.\n\n  - `decimals`: The number of decimals this asset uses to represent one unit.\n\n   Emits `MetadataSet`. \n\n   Weight: `O(1)` \n \n### setMinBalance(id: `Compact<u32>`, min_balance: `u128`)\n- **interface**: `api.tx.poolAssets.setMinBalance`\n- **summary**:    Sets the minimum balance of an asset. \n\n   Only works if there aren't any accounts that are holding the asset or if  the new value of `min_balance` is less than the old one. \n\n   Origin must be Signed and the sender has to be the Owner of the  asset `id`. \n\n   - `id`: The identifier of the asset. \n\n  - `min_balance`: The new value of `min_balance`.\n\n   Emits `AssetMinBalanceChanged` event when successful. \n \n### setTeam(id: `Compact<u32>`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.setTeam`\n- **summary**:    Change the Issuer, Admin and Freezer of an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n  - `issuer`: The new Issuer of this asset.\n\n  - `admin`: The new Admin of this asset.\n\n  - `freezer`: The new Freezer of this asset.\n\n   Emits `TeamChanged`. \n\n   Weight: `O(1)` \n \n### startDestroy(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.startDestroy`\n- **summary**:    Start the process of destroying a fungible asset class. \n\n   `start_destroy` is the first in a series of extrinsics that should be called, to allow  destruction of an asset class. \n\n   The origin must conform to `ForceOrigin` or must be `Signed` by the asset's `owner`. \n\n   - `id`: The identifier of the asset to be destroyed. This must identify an existing  asset. \n\n   It will fail with either [`Error::ContainsHolds`] or [`Error::ContainsFreezes`] if  an account contains holds or freezes in place. \n \n### thaw(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.thaw`\n- **summary**:    Allow unprivileged transfers to and from an account again. \n\n   Origin must be Signed and the sender should be the Admin of the asset `id`. \n\n   - `id`: The identifier of the asset to be frozen. \n\n  - `who`: The account to be unfrozen.\n\n   Emits `Thawed`. \n\n   Weight: `O(1)` \n \n### thawAsset(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.thawAsset`\n- **summary**:    Allow unprivileged transfers for the asset again. \n\n   Origin must be Signed and the sender should be the Admin of the asset `id`. \n\n   - `id`: The identifier of the asset to be thawed. \n\n   Emits `Thawed`. \n\n   Weight: `O(1)` \n \n### touch(id: `Compact<u32>`)\n- **interface**: `api.tx.poolAssets.touch`\n- **summary**:    Create an asset account for non-provider assets. \n\n   A deposit will be taken from the signer account. \n\n   - `origin`: Must be Signed; the signer account must have sufficient funds for a deposit  to be taken. \n\n  - `id`: The identifier of the asset for the account to be created.\n\n   Emits `Touched` event when successful. \n \n### touchOther(id: `Compact<u32>`, who: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.touchOther`\n- **summary**:    Create an asset account for `who`. \n\n   A deposit will be taken from the signer account. \n\n   - `origin`: Must be Signed by `Freezer` or `Admin` of the asset `id`; the signer account  must have sufficient funds for a deposit to be taken. \n\n  - `id`: The identifier of the asset for the account to be created.\n\n  - `who`: The account to be created.\n\n   Emits `Touched` event when successful. \n \n### transfer(id: `Compact<u32>`, target: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.transfer`\n- **summary**:    Move some assets from the sender account to another. \n\n   Origin must be Signed. \n\n   - `id`: The identifier of the asset to have some amount transferred. \n\n  - `target`: The account to be credited.\n\n  - `amount`: The amount by which the sender's balance of assets should be reduced and `target`'s balance increased. The amount actually transferred may be slightly greater in  the case that the transfer would otherwise take the sender balance above zero but below  the minimum balance. Must be greater than zero. \n\n   Emits `Transferred` with the actual amount transferred. If this takes the source balance  to below the minimum for the asset, then the amount transferred is increased to take it  to zero. \n\n   Weight: `O(1)`  Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of  `target`. \n \n### transferAll(id: `Compact<u32>`, dest: `MultiAddress`, keep_alive: `bool`)\n- **interface**: `api.tx.poolAssets.transferAll`\n- **summary**:    Transfer the entire transferable balance from the caller asset account. \n\n   NOTE: This function only attempts to transfer _transferable_ balances. This means that  any held, frozen, or minimum balance (when `keep_alive` is `true`), will not be  transferred by this function. To ensure that this function results in a killed account,  you might need to prepare the account by removing any reference counters, storage  deposits, etc... \n\n   The dispatch origin of this call must be Signed. \n\n   - `id`: The identifier of the asset for the account holding a deposit. \n\n  - `dest`: The recipient of the transfer.\n\n  - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all of the funds the asset account has, causing the sender asset account to be killed  (false), or transfer everything except at least the minimum balance, which will  guarantee to keep the sender asset account alive (true). \n \n### transferApproved(id: `Compact<u32>`, owner: `MultiAddress`, destination: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.transferApproved`\n- **summary**:    Transfer some asset balance from a previously delegated account to some third-party  account. \n\n   Origin must be Signed and there must be an approval in place by the `owner` to the  signer. \n\n   If the entire amount approved for transfer is transferred, then any deposit previously  reserved by `approve_transfer` is unreserved. \n\n   - `id`: The identifier of the asset. \n\n  - `owner`: The account which previously approved for a transfer of at least `amount` and from which the asset balance will be withdrawn. \n\n  - `destination`: The account to which the asset balance of `amount` will be transferred.\n\n  - `amount`: The amount of assets to transfer.\n\n   Emits `TransferredApproved` on success. \n\n   Weight: `O(1)` \n \n### transferKeepAlive(id: `Compact<u32>`, target: `MultiAddress`, amount: `Compact<u128>`)\n- **interface**: `api.tx.poolAssets.transferKeepAlive`\n- **summary**:    Move some assets from the sender account to another, keeping the sender account alive. \n\n   Origin must be Signed. \n\n   - `id`: The identifier of the asset to have some amount transferred. \n\n  - `target`: The account to be credited.\n\n  - `amount`: The amount by which the sender's balance of assets should be reduced and `target`'s balance increased. The amount actually transferred may be slightly greater in  the case that the transfer would otherwise take the sender balance above zero but below  the minimum balance. Must be greater than zero. \n\n   Emits `Transferred` with the actual amount transferred. If this takes the source balance  to below the minimum for the asset, then the amount transferred is increased to take it  to zero. \n\n   Weight: `O(1)`  Modes: Pre-existence of `target`; Post-existence of sender; Account pre-existence of  `target`. \n \n### transferOwnership(id: `Compact<u32>`, owner: `MultiAddress`)\n- **interface**: `api.tx.poolAssets.transferOwnership`\n- **summary**:    Change the Owner of an asset. \n\n   Origin must be Signed and the sender should be the Owner of the asset `id`. \n\n   - `id`: The identifier of the asset. \n\n  - `owner`: The new Owner of this asset.\n\n   Emits `OwnerChanged`. \n\n   Weight: `O(1)` \n\n___\n\n\n## pov\n \n### emitEvent()\n- **interface**: `api.tx.pov.emitEvent`\n \n### noop()\n- **interface**: `api.tx.pov.noop`\n\n___\n\n\n## preimage\n \n### ensureUpdated(hashes: `Vec<H256>`)\n- **interface**: `api.tx.preimage.ensureUpdated`\n- **summary**:    Ensure that the bulk of pre-images is upgraded. \n\n   The caller pays no fee if at least 90% of pre-images were successfully updated. \n \n### notePreimage(bytes: `Bytes`)\n- **interface**: `api.tx.preimage.notePreimage`\n- **summary**:    Register a preimage on-chain. \n\n   If the preimage was previously requested, no fees or deposits are taken for providing  the preimage. Otherwise, a deposit is taken proportional to the size of the preimage. \n \n### requestPreimage(hash: `H256`)\n- **interface**: `api.tx.preimage.requestPreimage`\n- **summary**:    Request a preimage be uploaded to the chain without paying any fees or deposits. \n\n   If the preimage requests has already been provided on-chain, we unreserve any deposit  a user may have paid, and take the control of the preimage out of their hands. \n \n### unnotePreimage(hash: `H256`)\n- **interface**: `api.tx.preimage.unnotePreimage`\n- **summary**:    Clear an unrequested preimage from the runtime storage. \n\n   If `len` is provided, then it will be a much cheaper operation. \n\n   - `hash`: The hash of the preimage to be removed from the store. \n\n  - `len`: The length of the preimage of `hash`.\n \n### unrequestPreimage(hash: `H256`)\n- **interface**: `api.tx.preimage.unrequestPreimage`\n- **summary**:    Clear a previously made request for a preimage. \n\n   NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`. \n\n___\n\n\n## proxy\n \n### addProxy(delegate: `MultiAddress`, proxy_type: `KitchensinkRuntimeProxyType`, delay: `u32`)\n- **interface**: `api.tx.proxy.addProxy`\n- **summary**:    Register a proxy account for the sender that is able to make calls on its behalf. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `proxy`: The account that the `caller` would like to make a proxy.\n\n  - `proxy_type`: The permissions allowed for this proxy account.\n\n  - `delay`: The announcement period required of the initial proxy. Will generally be zero. \n \n### announce(real: `MultiAddress`, call_hash: `H256`)\n- **interface**: `api.tx.proxy.announce`\n- **summary**:    Publish the hash of a proxy-call that will be made in the future. \n\n   This must be called some number of blocks before the corresponding `proxy` is attempted  if the delay associated with the proxy relationship is greater than zero. \n\n   No more than `MaxPending` announcements may be made at any one time. \n\n   This will take a deposit of `AnnouncementDepositFactor` as well as  `AnnouncementDepositBase` if there are no other pending announcements. \n\n   The dispatch origin for this call must be _Signed_ and a proxy of `real`. \n\n   Parameters: \n\n  - `real`: The account that the proxy will make a call on behalf of.\n\n  - `call_hash`: The hash of the call to be made by the `real` account.\n \n### createPure(proxy_type: `KitchensinkRuntimeProxyType`, delay: `u32`, index: `u16`)\n- **interface**: `api.tx.proxy.createPure`\n- **summary**:    Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and  initialize it with a proxy of `proxy_type` for `origin` sender. \n\n   Requires a `Signed` origin. \n\n   - `proxy_type`: The type of the proxy that the sender will be registered as over the  new account. This will almost always be the most permissive `ProxyType` possible to  allow for maximum flexibility. \n\n  - `index`: A disambiguation index, in case this is called multiple times in the same transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just  want to use `0`. \n\n  - `delay`: The announcement period required of the initial proxy. Will generally be zero. \n\n   Fails with `Duplicate` if this has already been called in this transaction, from the  same sender, with the same parameters. \n\n   Fails if there are insufficient funds to pay for deposit. \n \n### killPure(spawner: `MultiAddress`, proxy_type: `KitchensinkRuntimeProxyType`, index: `u16`, height: `Compact<u32>`, ext_index: `Compact<u32>`)\n- **interface**: `api.tx.proxy.killPure`\n- **summary**:    Removes a previously spawned pure proxy. \n\n   WARNING: **All access to this account will be lost.** Any funds held in it will be  inaccessible. \n\n   Requires a `Signed` origin, and the sender account must have been created by a call to  `pure` with corresponding parameters. \n\n   - `spawner`: The account that originally called `pure` to create this account. \n\n  - `index`: The disambiguation index originally passed to `pure`. Probably `0`.\n\n  - `proxy_type`: The proxy type originally passed to `pure`.\n\n  - `height`: The height of the chain when the call to `pure` was processed.\n\n  - `ext_index`: The extrinsic index in which the call to `pure` was processed.\n\n   Fails with `NoPermission` in case the caller is not a previously created pure  account whose `pure` call has corresponding parameters. \n \n### pokeDeposit()\n- **interface**: `api.tx.proxy.pokeDeposit`\n- **summary**:    Poke / Adjust deposits made for proxies and announcements based on current values.  This can be used by accounts to possibly lower their locked amount. \n\n   The dispatch origin for this call must be _Signed_. \n\n   The transaction fee is waived if the deposit amount has changed. \n\n   Emits `DepositPoked` if successful. \n \n### proxy(real: `MultiAddress`, force_proxy_type: `Option<KitchensinkRuntimeProxyType>`, call: `Call`)\n- **interface**: `api.tx.proxy.proxy`\n- **summary**:    Dispatch the given `call` from an account that the sender is authorised for through  `add_proxy`. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `real`: The account that the proxy will make a call on behalf of.\n\n  - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call.\n\n  - `call`: The call to be made by the `real` account.\n \n### proxyAnnounced(delegate: `MultiAddress`, real: `MultiAddress`, force_proxy_type: `Option<KitchensinkRuntimeProxyType>`, call: `Call`)\n- **interface**: `api.tx.proxy.proxyAnnounced`\n- **summary**:    Dispatch the given `call` from an account that the sender is authorized for through  `add_proxy`. \n\n   Removes any corresponding announcement(s). \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `real`: The account that the proxy will make a call on behalf of.\n\n  - `force_proxy_type`: Specify the exact proxy type to be used and checked for this call.\n\n  - `call`: The call to be made by the `real` account.\n \n### rejectAnnouncement(delegate: `MultiAddress`, call_hash: `H256`)\n- **interface**: `api.tx.proxy.rejectAnnouncement`\n- **summary**:    Remove the given announcement of a delegate. \n\n   May be called by a target (proxied) account to remove a call that one of their delegates  (`delegate`) has announced they want to execute. The deposit is returned. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `delegate`: The account that previously announced the call.\n\n  - `call_hash`: The hash of the call to be made.\n \n### removeAnnouncement(real: `MultiAddress`, call_hash: `H256`)\n- **interface**: `api.tx.proxy.removeAnnouncement`\n- **summary**:    Remove a given announcement. \n\n   May be called by a proxy account to remove a call they previously announced and return  the deposit. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `real`: The account that the proxy will make a call on behalf of.\n\n  - `call_hash`: The hash of the call to be made by the `real` account.\n \n### removeProxies()\n- **interface**: `api.tx.proxy.removeProxies`\n- **summary**:    Unregister all proxy accounts for the sender. \n\n   The dispatch origin for this call must be _Signed_. \n\n   WARNING: This may be called on accounts created by `pure`, however if done, then  the unreserved fees will be inaccessible. **All access to this account will be lost.** \n \n### removeProxy(delegate: `MultiAddress`, proxy_type: `KitchensinkRuntimeProxyType`, delay: `u32`)\n- **interface**: `api.tx.proxy.removeProxy`\n- **summary**:    Unregister a proxy account for the sender. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `proxy`: The account that the `caller` would like to remove as a proxy.\n\n  - `proxy_type`: The permissions currently enabled for the removed proxy account.\n\n___\n\n\n## rankedCollective\n \n### addMember(who: `MultiAddress`)\n- **interface**: `api.tx.rankedCollective.addMember`\n- **summary**:    Introduce a new member. \n\n   - `origin`: Must be the `AddOrigin`. \n\n  - `who`: Account of non-member which will become a member.\n\n   Weight: `O(1)` \n \n### cleanupPoll(poll_index: `u32`, max: `u32`)\n- **interface**: `api.tx.rankedCollective.cleanupPoll`\n- **summary**:    Remove votes from the given poll. It must have ended. \n\n   - `origin`: Must be `Signed` by any account. \n\n  - `poll_index`: Index of a poll which is completed and for which votes continue to exist. \n\n  - `max`: Maximum number of vote items from remove in this call.\n\n   Transaction fees are waived if the operation is successful. \n\n   Weight `O(max)` (less if there are fewer items to remove than `max`). \n \n### demoteMember(who: `MultiAddress`)\n- **interface**: `api.tx.rankedCollective.demoteMember`\n- **summary**:    Decrement the rank of an existing member by one. If the member is already at rank zero,  then they are removed entirely. \n\n   - `origin`: Must be the `DemoteOrigin`. \n\n  - `who`: Account of existing member of rank greater than zero.\n\n   Weight: `O(1)`, less if the member's index is highest in its rank. \n \n### exchangeMember(who: `MultiAddress`, new_who: `MultiAddress`)\n- **interface**: `api.tx.rankedCollective.exchangeMember`\n- **summary**:    Exchanges a member with a new account and the same existing rank. \n\n   - `origin`: Must be the `ExchangeOrigin`. \n\n  - `who`: Account of existing member of rank greater than zero to be exchanged.\n\n  - `new_who`: New Account of existing member of rank greater than zero to exchanged to.\n \n### promoteMember(who: `MultiAddress`)\n- **interface**: `api.tx.rankedCollective.promoteMember`\n- **summary**:    Increment the rank of an existing member by one. \n\n   - `origin`: Must be the `PromoteOrigin`. \n\n  - `who`: Account of existing member.\n\n   Weight: `O(1)` \n \n### removeMember(who: `MultiAddress`, min_rank: `u16`)\n- **interface**: `api.tx.rankedCollective.removeMember`\n- **summary**:    Remove the member entirely. \n\n   - `origin`: Must be the `RemoveOrigin`. \n\n  - `who`: Account of existing member of rank greater than zero.\n\n  - `min_rank`: The rank of the member or greater.\n\n   Weight: `O(min_rank)`. \n \n### vote(poll: `u32`, aye: `bool`)\n- **interface**: `api.tx.rankedCollective.vote`\n- **summary**:    Add an aye or nay vote for the sender to the given proposal. \n\n   - `origin`: Must be `Signed` by a member account. \n\n  - `poll`: Index of a poll which is ongoing.\n\n  - `aye`: `true` if the vote is to approve the proposal, `false` otherwise.\n\n   Transaction fees are be waived if the member is voting on any particular proposal  for the first time and the call is successful. Subsequent vote changes will charge a  fee. \n\n   Weight: `O(1)`, less if there was no previous vote on the poll by the member. \n\n___\n\n\n## rankedPolls\n \n### cancel(index: `u32`)\n- **interface**: `api.tx.rankedPolls.cancel`\n- **summary**:    Cancel an ongoing referendum. \n\n   - `origin`: must be the `CancelOrigin`. \n\n  - `index`: The index of the referendum to be cancelled.\n\n   Emits `Cancelled`. \n \n### kill(index: `u32`)\n- **interface**: `api.tx.rankedPolls.kill`\n- **summary**:    Cancel an ongoing referendum and slash the deposits. \n\n   - `origin`: must be the `KillOrigin`. \n\n  - `index`: The index of the referendum to be cancelled.\n\n   Emits `Killed` and `DepositSlashed`. \n \n### nudgeReferendum(index: `u32`)\n- **interface**: `api.tx.rankedPolls.nudgeReferendum`\n- **summary**:    Advance a referendum onto its next logical state. Only used internally. \n\n   - `origin`: must be `Root`. \n\n  - `index`: the referendum to be advanced.\n \n### oneFewerDeciding(track: `u16`)\n- **interface**: `api.tx.rankedPolls.oneFewerDeciding`\n- **summary**:    Advance a track onto its next logical state. Only used internally. \n\n   - `origin`: must be `Root`. \n\n  - `track`: the track to be advanced.\n\n   Action item for when there is now one fewer referendum in the deciding phase and the  `DecidingCount` is not yet updated. This means that we should either: \n\n  - begin deciding another referendum (and leave `DecidingCount` alone); or\n\n  - decrement `DecidingCount`.\n \n### placeDecisionDeposit(index: `u32`)\n- **interface**: `api.tx.rankedPolls.placeDecisionDeposit`\n- **summary**:    Post the Decision Deposit for a referendum. \n\n   - `origin`: must be `Signed` and the account must have funds available for the  referendum's track's Decision Deposit. \n\n  - `index`: The index of the submitted referendum whose Decision Deposit is yet to be posted. \n\n   Emits `DecisionDepositPlaced`. \n \n### refundDecisionDeposit(index: `u32`)\n- **interface**: `api.tx.rankedPolls.refundDecisionDeposit`\n- **summary**:    Refund the Decision Deposit for a closed referendum back to the depositor. \n\n   - `origin`: must be `Signed` or `Root`. \n\n  - `index`: The index of a closed referendum whose Decision Deposit has not yet been refunded. \n\n   Emits `DecisionDepositRefunded`. \n \n### refundSubmissionDeposit(index: `u32`)\n- **interface**: `api.tx.rankedPolls.refundSubmissionDeposit`\n- **summary**:    Refund the Submission Deposit for a closed referendum back to the depositor. \n\n   - `origin`: must be `Signed` or `Root`. \n\n  - `index`: The index of a closed referendum whose Submission Deposit has not yet been refunded. \n\n   Emits `SubmissionDepositRefunded`. \n \n### setMetadata(index: `u32`, maybe_hash: `Option<H256>`)\n- **interface**: `api.tx.rankedPolls.setMetadata`\n- **summary**:    Set or clear metadata of a referendum. \n\n   Parameters: \n\n  - `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a metadata of a finished referendum. \n\n  - `index`:  The index of a referendum to set or clear metadata for.\n\n  - `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata.\n \n### submit(proposal_origin: `KitchensinkRuntimeOriginCaller`, proposal: `FrameSupportPreimagesBounded`, enactment_moment: `FrameSupportScheduleDispatchTime`)\n- **interface**: `api.tx.rankedPolls.submit`\n- **summary**:    Propose a referendum on a privileged action. \n\n   - `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds  available. \n\n  - `proposal_origin`: The origin from which the proposal should be executed.\n\n  - `proposal`: The proposal.\n\n  - `enactment_moment`: The moment that the proposal should be enacted.\n\n   Emits `Submitted`. \n\n___\n\n\n## recovery\n \n### asRecovered(account: `MultiAddress`, call: `Call`)\n- **interface**: `api.tx.recovery.asRecovered`\n- **summary**:    Send a call through a recovered account. \n\n   The dispatch origin for this call must be _Signed_ and registered to  be able to make calls on behalf of the recovered account. \n\n   Parameters: \n\n  - `account`: The recovered account you want to make a call on-behalf-of.\n\n  - `call`: The call you want to make with the recovered account.\n \n### cancelRecovered(account: `MultiAddress`)\n- **interface**: `api.tx.recovery.cancelRecovered`\n- **summary**:    Cancel the ability to use `as_recovered` for `account`. \n\n   The dispatch origin for this call must be _Signed_ and registered to  be able to make calls on behalf of the recovered account. \n\n   Parameters: \n\n  - `account`: The recovered account you are able to call on-behalf-of.\n \n### claimRecovery(account: `MultiAddress`)\n- **interface**: `api.tx.recovery.claimRecovery`\n- **summary**:    Allow a successful rescuer to claim their recovered account. \n\n   The dispatch origin for this call must be _Signed_ and must be a \"rescuer\"  who has successfully completed the account recovery process: collected  `threshold` or more vouches, waited `delay_period` blocks since initiation. \n\n   Parameters: \n\n  - `account`: The lost account that you want to claim has been successfully recovered by you. \n \n### closeRecovery(rescuer: `MultiAddress`)\n- **interface**: `api.tx.recovery.closeRecovery`\n- **summary**:    As the controller of a recoverable account, close an active recovery  process for your account. \n\n   Payment: By calling this function, the recoverable account will receive  the recovery deposit `RecoveryDeposit` placed by the rescuer. \n\n   The dispatch origin for this call must be _Signed_ and must be a  recoverable account with an active recovery process for it. \n\n   Parameters: \n\n  - `rescuer`: The account trying to rescue this recoverable account.\n \n### createRecovery(friends: `Vec<AccountId32>`, threshold: `u16`, delay_period: `u32`)\n- **interface**: `api.tx.recovery.createRecovery`\n- **summary**:    Create a recovery configuration for your account. This makes your account recoverable. \n\n   Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance  will be reserved for storing the recovery configuration. This deposit is returned  in full when the user calls `remove_recovery`. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `friends`: A list of friends you trust to vouch for recovery attempts. Should be ordered and contain no duplicate values. \n\n  - `threshold`: The number of friends that must vouch for a recovery attempt before the account can be recovered. Should be less than or equal to the length of the list of  friends. \n\n  - `delay_period`: The number of blocks after a recovery attempt is initialized that needs to pass before the account can be recovered. \n \n### initiateRecovery(account: `MultiAddress`)\n- **interface**: `api.tx.recovery.initiateRecovery`\n- **summary**:    Initiate the process for recovering a recoverable account. \n\n   Payment: `RecoveryDeposit` balance will be reserved for initiating the  recovery process. This deposit will always be repatriated to the account  trying to be recovered. See `close_recovery`. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `account`: The lost account that you want to recover. This account needs to be recoverable (i.e. have a recovery configuration). \n \n### removeRecovery()\n- **interface**: `api.tx.recovery.removeRecovery`\n- **summary**:    Remove the recovery process for your account. Recovered accounts are still accessible. \n\n   NOTE: The user must make sure to call `close_recovery` on all active  recovery attempts before calling this function else it will fail. \n\n   Payment: By calling this function the recoverable account will unreserve  their recovery configuration deposit.  (`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends) \n\n   The dispatch origin for this call must be _Signed_ and must be a  recoverable account (i.e. has a recovery configuration). \n \n### setRecovered(lost: `MultiAddress`, rescuer: `MultiAddress`)\n- **interface**: `api.tx.recovery.setRecovered`\n- **summary**:    Allow ROOT to bypass the recovery process and set a rescuer account  for a lost account directly. \n\n   The dispatch origin for this call must be _ROOT_. \n\n   Parameters: \n\n  - `lost`: The \"lost account\" to be recovered.\n\n  - `rescuer`: The \"rescuer account\" which can call as the lost account.\n \n### vouchRecovery(lost: `MultiAddress`, rescuer: `MultiAddress`)\n- **interface**: `api.tx.recovery.vouchRecovery`\n- **summary**:    Allow a \"friend\" of a recoverable account to vouch for an active recovery  process for that account. \n\n   The dispatch origin for this call must be _Signed_ and must be a \"friend\"  for the recoverable account. \n\n   Parameters: \n\n  - `lost`: The lost account that you want to recover.\n\n  - `rescuer`: The account trying to rescue the lost account that you want to vouch for.\n\n   The combination of these two parameters must point to an active recovery  process. \n\n___\n\n\n## referenda\n \n### cancel(index: `u32`)\n- **interface**: `api.tx.referenda.cancel`\n- **summary**:    Cancel an ongoing referendum. \n\n   - `origin`: must be the `CancelOrigin`. \n\n  - `index`: The index of the referendum to be cancelled.\n\n   Emits `Cancelled`. \n \n### kill(index: `u32`)\n- **interface**: `api.tx.referenda.kill`\n- **summary**:    Cancel an ongoing referendum and slash the deposits. \n\n   - `origin`: must be the `KillOrigin`. \n\n  - `index`: The index of the referendum to be cancelled.\n\n   Emits `Killed` and `DepositSlashed`. \n \n### nudgeReferendum(index: `u32`)\n- **interface**: `api.tx.referenda.nudgeReferendum`\n- **summary**:    Advance a referendum onto its next logical state. Only used internally. \n\n   - `origin`: must be `Root`. \n\n  - `index`: the referendum to be advanced.\n \n### oneFewerDeciding(track: `u16`)\n- **interface**: `api.tx.referenda.oneFewerDeciding`\n- **summary**:    Advance a track onto its next logical state. Only used internally. \n\n   - `origin`: must be `Root`. \n\n  - `track`: the track to be advanced.\n\n   Action item for when there is now one fewer referendum in the deciding phase and the  `DecidingCount` is not yet updated. This means that we should either: \n\n  - begin deciding another referendum (and leave `DecidingCount` alone); or\n\n  - decrement `DecidingCount`.\n \n### placeDecisionDeposit(index: `u32`)\n- **interface**: `api.tx.referenda.placeDecisionDeposit`\n- **summary**:    Post the Decision Deposit for a referendum. \n\n   - `origin`: must be `Signed` and the account must have funds available for the  referendum's track's Decision Deposit. \n\n  - `index`: The index of the submitted referendum whose Decision Deposit is yet to be posted. \n\n   Emits `DecisionDepositPlaced`. \n \n### refundDecisionDeposit(index: `u32`)\n- **interface**: `api.tx.referenda.refundDecisionDeposit`\n- **summary**:    Refund the Decision Deposit for a closed referendum back to the depositor. \n\n   - `origin`: must be `Signed` or `Root`. \n\n  - `index`: The index of a closed referendum whose Decision Deposit has not yet been refunded. \n\n   Emits `DecisionDepositRefunded`. \n \n### refundSubmissionDeposit(index: `u32`)\n- **interface**: `api.tx.referenda.refundSubmissionDeposit`\n- **summary**:    Refund the Submission Deposit for a closed referendum back to the depositor. \n\n   - `origin`: must be `Signed` or `Root`. \n\n  - `index`: The index of a closed referendum whose Submission Deposit has not yet been refunded. \n\n   Emits `SubmissionDepositRefunded`. \n \n### setMetadata(index: `u32`, maybe_hash: `Option<H256>`)\n- **interface**: `api.tx.referenda.setMetadata`\n- **summary**:    Set or clear metadata of a referendum. \n\n   Parameters: \n\n  - `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a metadata of a finished referendum. \n\n  - `index`:  The index of a referendum to set or clear metadata for.\n\n  - `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata.\n \n### submit(proposal_origin: `KitchensinkRuntimeOriginCaller`, proposal: `FrameSupportPreimagesBounded`, enactment_moment: `FrameSupportScheduleDispatchTime`)\n- **interface**: `api.tx.referenda.submit`\n- **summary**:    Propose a referendum on a privileged action. \n\n   - `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds  available. \n\n  - `proposal_origin`: The origin from which the proposal should be executed.\n\n  - `proposal`: The proposal.\n\n  - `enactment_moment`: The moment that the proposal should be enacted.\n\n   Emits `Submitted`. \n\n___\n\n\n## remark\n \n### store(remark: `Bytes`)\n- **interface**: `api.tx.remark.store`\n- **summary**:    Index and store data off chain. \n\n___\n\n\n## revive\n \n### call(dest: `H160`, value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Compact<u128>`, data: `Bytes`)\n- **interface**: `api.tx.revive.call`\n- **summary**:    Makes a call to an account, optionally transferring some balance. \n\n   #### Parameters \n\n   * `dest`: Address of the contract to call. \n\n  * `value`: The balance to transfer from the `origin` to `dest`.\n\n  * `gas_limit`: The gas limit enforced when executing the constructor.\n\n  * `storage_deposit_limit`: The maximum amount of balance that can be charged from the caller to pay for the storage consumed. \n\n  * `data`: The input data to pass to the contract.\n\n   * If the account is a smart-contract account, the associated code will be  executed and any value will be transferred. \n\n  * If the account is a regular account, any value will be transferred.\n\n  * If no account exists and the call value is not less than `existential_deposit`, a regular account will be created and any value will be transferred. \n \n### dispatchAsFallbackAccount(call: `Call`)\n- **interface**: `api.tx.revive.dispatchAsFallbackAccount`\n- **summary**:    Dispatch an `call` with the origin set to the callers fallback address. \n\n   Every `AccountId32` can control its corresponding fallback account. The fallback account  is the `AccountId20` with the last 12 bytes set to `0xEE`. This is essentially a  recovery function in case an `AccountId20` was used without creating a mapping first. \n \n### ethTransact(payload: `Bytes`)\n- **interface**: `api.tx.revive.ethTransact`\n- **summary**:    A raw EVM transaction, typically dispatched by an Ethereum JSON-RPC server. \n\n   #### Parameters \n\n   * `payload`: The encoded [`crate::evm::TransactionSigned`]. \n\n  * `gas_limit`: The gas limit enforced during contract execution.\n\n  * `storage_deposit_limit`: The maximum balance that can be charged to the caller for storage usage. \n\n   #### Note \n\n   This call cannot be dispatched directly; attempting to do so will result in a failed  transaction. It serves as a wrapper for an Ethereum transaction. When submitted, the  runtime converts it into a [`sp_runtime::generic::CheckedExtrinsic`] by recovering the  signer and validating the transaction. \n \n### instantiate(value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Compact<u128>`, code_hash: `H256`, data: `Bytes`, salt: `Option<[u8;32]>`)\n- **interface**: `api.tx.revive.instantiate`\n- **summary**:    Instantiates a contract from a previously deployed wasm binary. \n\n   This function is identical to [`Self::instantiate_with_code`] but without the  code deployment step. Instead, the `code_hash` of an on-chain deployed wasm binary  must be supplied. \n \n### instantiateWithCode(value: `Compact<u128>`, gas_limit: `SpWeightsWeightV2Weight`, storage_deposit_limit: `Compact<u128>`, code: `Bytes`, data: `Bytes`, salt: `Option<[u8;32]>`)\n- **interface**: `api.tx.revive.instantiateWithCode`\n- **summary**:    Instantiates a new contract from the supplied `code` optionally transferring  some balance. \n\n   This dispatchable has the same effect as calling [`Self::upload_code`] +  [`Self::instantiate`]. Bundling them together provides efficiency gains. Please  also check the documentation of [`Self::upload_code`]. \n\n   #### Parameters \n\n   * `value`: The balance to transfer from the `origin` to the newly created contract. \n\n  * `gas_limit`: The gas limit enforced when executing the constructor.\n\n  * `storage_deposit_limit`: The maximum amount of balance that can be charged/reserved from the caller to pay for the storage consumed. \n\n  * `code`: The contract code to deploy in raw bytes.\n\n  * `data`: The input data to pass to the contract constructor.\n\n  * `salt`: Used for the address derivation. If `Some` is supplied then `CREATE2` semantics are used. If `None` then `CRATE1` is used. \n\n  \n\n   Instantiation is executed as follows: \n\n   - The supplied `code` is deployed, and a `code_hash` is created for that code. \n\n  - If the `code_hash` already exists on the chain the underlying `code` will be shared.\n\n  - The destination address is computed based on the sender, code_hash and the salt.\n\n  - The smart-contract account is created at the computed address.\n\n  - The `value` is transferred to the new account.\n\n  - The `deploy` function is executed in the context of the newly-created account.\n \n### mapAccount()\n- **interface**: `api.tx.revive.mapAccount`\n- **summary**:    Register the callers account id so that it can be used in contract interactions. \n\n   This will error if the origin is already mapped or is a eth native `Address20`. It will  take a deposit that can be released by calling [`Self::unmap_account`]. \n \n### removeCode(code_hash: `H256`)\n- **interface**: `api.tx.revive.removeCode`\n- **summary**:    Remove the code stored under `code_hash` and refund the deposit to its owner. \n\n   A code can only be removed by its original uploader (its owner) and only if it is  not used by any contract. \n \n### setCode(dest: `H160`, code_hash: `H256`)\n- **interface**: `api.tx.revive.setCode`\n- **summary**:    Privileged function that changes the code of an existing contract. \n\n   This takes care of updating refcounts and all other necessary operations. Returns  an error if either the `code_hash` or `dest` do not exist. \n\n   #### Note \n\n   This does **not** change the address of the contract in question. This means  that the contract address is no longer derived from its code hash after calling  this dispatchable. \n \n### unmapAccount()\n- **interface**: `api.tx.revive.unmapAccount`\n- **summary**:    Unregister the callers account id in order to free the deposit. \n\n   There is no reason to ever call this function other than freeing up the deposit.  This is only useful when the account should no longer be used. \n \n### uploadCode(code: `Bytes`, storage_deposit_limit: `Compact<u128>`)\n- **interface**: `api.tx.revive.uploadCode`\n- **summary**:    Upload new `code` without instantiating a contract from it. \n\n   If the code does not already exist a deposit is reserved from the caller  and unreserved only when [`Self::remove_code`] is called. The size of the reserve  depends on the size of the supplied `code`. \n\n   #### Note \n\n   Anyone can instantiate a contract from any uploaded code and thus prevent its removal.  To avoid this situation a constructor could employ access control so that it can  only be instantiated by permissioned entities. The same is true when uploading  through [`Self::instantiate_with_code`]. \n\n___\n\n\n## rootTesting\n \n### fillBlock(ratio: `Perbill`)\n- **interface**: `api.tx.rootTesting.fillBlock`\n- **summary**:    A dispatch that will fill the block weight up to the given ratio. \n \n### triggerDefensive()\n- **interface**: `api.tx.rootTesting.triggerDefensive`\n\n___\n\n\n## safeMode\n \n### enter()\n- **interface**: `api.tx.safeMode.enter`\n- **summary**:    Enter safe-mode permissionlessly for [`Config::EnterDuration`] blocks. \n\n   Reserves [`Config::EnterDepositAmount`] from the caller's account.  Emits an [`Event::Entered`] event on success.  Errors with [`Error::Entered`] if the safe-mode is already entered.  Errors with [`Error::NotConfigured`] if the deposit amount is `None`. \n \n### extend()\n- **interface**: `api.tx.safeMode.extend`\n- **summary**:    Extend the safe-mode permissionlessly for [`Config::ExtendDuration`] blocks. \n\n   This accumulates on top of the current remaining duration.  Reserves [`Config::ExtendDepositAmount`] from the caller's account.  Emits an [`Event::Extended`] event on success.  Errors with [`Error::Exited`] if the safe-mode is entered.  Errors with [`Error::NotConfigured`] if the deposit amount is `None`. \n\n   This may be called by any signed origin with [`Config::ExtendDepositAmount`] free  currency to reserve. This call can be disabled for all origins by configuring  [`Config::ExtendDepositAmount`] to `None`. \n \n### forceEnter()\n- **interface**: `api.tx.safeMode.forceEnter`\n- **summary**:    Enter safe-mode by force for a per-origin configured number of blocks. \n\n   Emits an [`Event::Entered`] event on success.  Errors with [`Error::Entered`] if the safe-mode is already entered. \n\n   Can only be called by the [`Config::ForceEnterOrigin`] origin. \n \n### forceExit()\n- **interface**: `api.tx.safeMode.forceExit`\n- **summary**:    Exit safe-mode by force. \n\n   Emits an [`Event::Exited`] with [`ExitReason::Force`] event on success.  Errors with [`Error::Exited`] if the safe-mode is inactive. \n\n   Note: `safe-mode` will be automatically deactivated by [`Pallet::on_initialize`] hook  after the block height is greater than the [`EnteredUntil`] storage item.  Emits an [`Event::Exited`] with [`ExitReason::Timeout`] event when deactivated in the  hook. \n \n### forceExtend()\n- **interface**: `api.tx.safeMode.forceExtend`\n- **summary**:    Extend the safe-mode by force for a per-origin configured number of blocks. \n\n   Emits an [`Event::Extended`] event on success.  Errors with [`Error::Exited`] if the safe-mode is inactive. \n\n   Can only be called by the [`Config::ForceExtendOrigin`] origin. \n \n### forceReleaseDeposit(account: `AccountId32`, block: `u32`)\n- **interface**: `api.tx.safeMode.forceReleaseDeposit`\n- **summary**:    Force to release a deposit for an account that entered safe-mode at a given  historical block. \n\n   This can be called while safe-mode is still entered. \n\n   Emits a [`Event::DepositReleased`] event on success.  Errors with [`Error::Entered`] if safe-mode is entered.  Errors with [`Error::NoDeposit`] if the payee has no reserved currency at the  specified block. \n\n   Can only be called by the [`Config::ForceDepositOrigin`] origin. \n \n### forceSlashDeposit(account: `AccountId32`, block: `u32`)\n- **interface**: `api.tx.safeMode.forceSlashDeposit`\n- **summary**:    Slash a deposit for an account that entered or extended safe-mode at a given  historical block. \n\n   This can only be called while safe-mode is entered. \n\n   Emits a [`Event::DepositSlashed`] event on success.  Errors with [`Error::Entered`] if safe-mode is entered. \n\n   Can only be called by the [`Config::ForceDepositOrigin`] origin. \n \n### releaseDeposit(account: `AccountId32`, block: `u32`)\n- **interface**: `api.tx.safeMode.releaseDeposit`\n- **summary**:    Permissionlessly release a deposit for an account that entered safe-mode at a  given historical block. \n\n   The call can be completely disabled by setting [`Config::ReleaseDelay`] to `None`.  This cannot be called while safe-mode is entered and not until  [`Config::ReleaseDelay`] blocks have passed since safe-mode was entered. \n\n   Emits a [`Event::DepositReleased`] event on success.  Errors with [`Error::Entered`] if the safe-mode is entered.  Errors with [`Error::CannotReleaseYet`] if [`Config::ReleaseDelay`] block have not  passed since safe-mode was entered. Errors with [`Error::NoDeposit`] if the payee has no  reserved currency at the block specified. \n\n___\n\n\n## salary\n \n### bump()\n- **interface**: `api.tx.salary.bump`\n- **summary**:    Move to next payout cycle, assuming that the present block is now within that cycle. \n\n   - `origin`: A `Signed` origin of an account. \n \n### checkPayment()\n- **interface**: `api.tx.salary.checkPayment`\n- **summary**:    Update a payment's status; if it failed, alter the state so the payment can be retried. \n\n   This must be called within the same cycle as the failed payment. It will fail with  `Event::NotCurrent` otherwise. \n\n   - `origin`: A `Signed` origin of an account which is a member of `Members` who has  received a payment this cycle. \n \n### induct()\n- **interface**: `api.tx.salary.induct`\n- **summary**:    Induct oneself into the payout system. \n \n### init()\n- **interface**: `api.tx.salary.init`\n- **summary**:    Start the first payout cycle. \n\n   - `origin`: A `Signed` origin of an account. \n \n### payout()\n- **interface**: `api.tx.salary.payout`\n- **summary**:    Request a payout. \n\n   Will only work if we are after the first `RegistrationPeriod` blocks since the cycle  started but by no more than `PayoutPeriod` blocks. \n\n   - `origin`: A `Signed` origin of an account which is a member of `Members`. \n \n### payoutOther(beneficiary: `AccountId32`)\n- **interface**: `api.tx.salary.payoutOther`\n- **summary**:    Request a payout to a secondary account. \n\n   Will only work if we are after the first `RegistrationPeriod` blocks since the cycle  started but by no more than `PayoutPeriod` blocks. \n\n   - `origin`: A `Signed` origin of an account which is a member of `Members`. \n\n  - `beneficiary`: The account to receive payment.\n \n### register()\n- **interface**: `api.tx.salary.register`\n- **summary**:    Register for a payout. \n\n   Will only work if we are in the first `RegistrationPeriod` blocks since the cycle  started. \n\n   - `origin`: A `Signed` origin of an account which is a member of `Members`. \n\n___\n\n\n## scheduler\n \n### cancel(when: `u32`, index: `u32`)\n- **interface**: `api.tx.scheduler.cancel`\n- **summary**:    Cancel an anonymously scheduled task. \n \n### cancelNamed(id: `[u8;32]`)\n- **interface**: `api.tx.scheduler.cancelNamed`\n- **summary**:    Cancel a named scheduled task. \n \n### cancelRetry(task: `(u32,u32)`)\n- **interface**: `api.tx.scheduler.cancelRetry`\n- **summary**:    Removes the retry configuration of a task. \n \n### cancelRetryNamed(id: `[u8;32]`)\n- **interface**: `api.tx.scheduler.cancelRetryNamed`\n- **summary**:    Cancel the retry configuration of a named task. \n \n### schedule(when: `u32`, maybe_periodic: `Option<(u32,u32)>`, priority: `u8`, call: `Call`)\n- **interface**: `api.tx.scheduler.schedule`\n- **summary**:    Anonymously schedule a task. \n \n### scheduleAfter(after: `u32`, maybe_periodic: `Option<(u32,u32)>`, priority: `u8`, call: `Call`)\n- **interface**: `api.tx.scheduler.scheduleAfter`\n- **summary**:    Anonymously schedule a task after a delay. \n \n### scheduleNamed(id: `[u8;32]`, when: `u32`, maybe_periodic: `Option<(u32,u32)>`, priority: `u8`, call: `Call`)\n- **interface**: `api.tx.scheduler.scheduleNamed`\n- **summary**:    Schedule a named task. \n \n### scheduleNamedAfter(id: `[u8;32]`, after: `u32`, maybe_periodic: `Option<(u32,u32)>`, priority: `u8`, call: `Call`)\n- **interface**: `api.tx.scheduler.scheduleNamedAfter`\n- **summary**:    Schedule a named task after a delay. \n \n### setRetry(task: `(u32,u32)`, retries: `u8`, period: `u32`)\n- **interface**: `api.tx.scheduler.setRetry`\n- **summary**:    Set a retry configuration for a task so that, in case its scheduled run fails, it will  be retried after `period` blocks, for a total amount of `retries` retries or until it  succeeds. \n\n   Tasks which need to be scheduled for a retry are still subject to weight metering and  agenda space, same as a regular task. If a periodic task fails, it will be scheduled  normally while the task is retrying. \n\n   Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic  clones of the original task. Their retry configuration will be derived from the  original task's configuration, but will have a lower value for `remaining` than the  original `total_retries`. \n \n### setRetryNamed(id: `[u8;32]`, retries: `u8`, period: `u32`)\n- **interface**: `api.tx.scheduler.setRetryNamed`\n- **summary**:    Set a retry configuration for a named task so that, in case its scheduled run fails, it  will be retried after `period` blocks, for a total amount of `retries` retries or until  it succeeds. \n\n   Tasks which need to be scheduled for a retry are still subject to weight metering and  agenda space, same as a regular task. If a periodic task fails, it will be scheduled  normally while the task is retrying. \n\n   Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic  clones of the original task. Their retry configuration will be derived from the  original task's configuration, but will have a lower value for `remaining` than the  original `total_retries`. \n\n___\n\n\n## session\n \n### purgeKeys()\n- **interface**: `api.tx.session.purgeKeys`\n- **summary**:    Removes any session key(s) of the function caller. \n\n   This doesn't take effect until the next session. \n\n   The dispatch origin of this function must be Signed and the account must be either be  convertible to a validator ID using the chain's typical addressing system (this usually  means being a controller account) or directly convertible into a validator ID (which  usually means being a stash account). \n\n   #### Complexity \n\n  - `O(1)` in number of key types. Actual cost depends on the number of length of `T::Keys::key_ids()` which is fixed. \n \n### setKeys(keys: `KitchensinkRuntimeSessionKeys`, proof: `Bytes`)\n- **interface**: `api.tx.session.setKeys`\n- **summary**:    Sets the session key(s) of the function caller to `keys`.  Allows an account to set its session key prior to becoming a validator.  This doesn't take effect until the next session. \n\n   The dispatch origin of this function must be signed. \n\n   #### Complexity \n\n  - `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is fixed. \n\n___\n\n\n## society\n \n### bestowMembership(candidate: `AccountId32`)\n- **interface**: `api.tx.society.bestowMembership`\n- **summary**:    Transform an approved candidate into a member. Callable only by the Signed origin of the  Founder, only after the period for voting has ended and only when the candidate is not  clearly rejected. \n \n### bid(value: `u128`)\n- **interface**: `api.tx.society.bid`\n- **summary**:    A user outside of the society can make a bid for entry. \n\n   Payment: The group's Candidate Deposit will be reserved for making a bid. It is returned  when the bid becomes a member, or if the bid calls `unbid`. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Parameters: \n\n  - `value`: A one time payment the bid would like to receive when joining the society.\n \n### claimMembership()\n- **interface**: `api.tx.society.claimMembership`\n- **summary**:    Transform an approved candidate into a member. Callable only by the  the candidate, and only after the period for voting has ended. \n \n### cleanupCandidacy(candidate: `AccountId32`, max: `u32`)\n- **interface**: `api.tx.society.cleanupCandidacy`\n- **summary**:    Remove up to `max` stale votes for the given `candidate`. \n\n   May be called by any Signed origin, but only after the candidate's candidacy is ended. \n \n### cleanupChallenge(challenge_round: `u32`, max: `u32`)\n- **interface**: `api.tx.society.cleanupChallenge`\n- **summary**:    Remove up to `max` stale votes for the defender in the given `challenge_round`. \n\n   May be called by any Signed origin, but only after the challenge round is ended. \n \n### defenderVote(approve: `bool`)\n- **interface**: `api.tx.society.defenderVote`\n- **summary**:    As a member, vote on the defender. \n\n   The dispatch origin for this call must be _Signed_ and a member. \n\n   Parameters: \n\n  - `approve`: A boolean which says if the candidate should be approved (`true`) or rejected (`false`). \n \n### dissolve()\n- **interface**: `api.tx.society.dissolve`\n- **summary**:    Dissolve the society and remove all members. \n\n   The dispatch origin for this call must be Signed, and the signing account must be both  the `Founder` and the `Head`. This implies that it may only be done when there is one  member. \n \n### dropCandidate(candidate: `AccountId32`)\n- **interface**: `api.tx.society.dropCandidate`\n- **summary**:    Remove a `candidate`'s failed application from the society. Callable by any  signed origin but only at the end of the subsequent round and only for  a candidate with more rejections than approvals. \n\n   The bid deposit is lost and the voucher is banned. \n \n### foundSociety(founder: `MultiAddress`, max_members: `u32`, max_intake: `u32`, max_strikes: `u32`, candidate_deposit: `u128`, rules: `Bytes`)\n- **interface**: `api.tx.society.foundSociety`\n- **summary**:    Found the society. \n\n   This is done as a discrete action in order to allow for the  pallet to be included into a running chain and can only be done once. \n\n   The dispatch origin for this call must be from the _FounderSetOrigin_. \n\n   Parameters: \n\n  - `founder` - The first member and head of the newly founded society.\n\n  - `max_members` - The initial max number of members for the society.\n\n  - `max_intake` - The maximum number of candidates per intake period.\n\n  - `max_strikes`: The maximum number of strikes a member may get before they become suspended and may only be reinstated by the founder. \n\n  - `candidate_deposit`: The deposit required to make a bid for membership of the group.\n\n  - `rules` - The rules of this society concerning membership.\n\n   Complexity: O(1) \n \n### judgeSuspendedMember(who: `MultiAddress`, forgive: `bool`)\n- **interface**: `api.tx.society.judgeSuspendedMember`\n- **summary**:    Allow suspension judgement origin to make judgement on a suspended member. \n\n   If a suspended member is forgiven, we simply add them back as a member, not affecting  any of the existing storage items for that member. \n\n   If a suspended member is rejected, remove all associated storage items, including  their payouts, and remove any vouched bids they currently have. \n\n   The dispatch origin for this call must be Signed from the Founder. \n\n   Parameters: \n\n  - `who` - The suspended member to be judged.\n\n  - `forgive` - A boolean representing whether the suspension judgement origin forgives (`true`) or rejects (`false`) a suspended member. \n \n### kickCandidate(candidate: `AccountId32`)\n- **interface**: `api.tx.society.kickCandidate`\n- **summary**:    Remove the candidate's application from the society. Callable only by the Signed origin  of the Founder, only after the period for voting has ended, and only when they do not  have a clear approval. \n\n   Any bid deposit is lost and voucher is banned. \n \n### payout()\n- **interface**: `api.tx.society.payout`\n- **summary**:    Transfer the first matured payout for the sender and remove it from the records. \n\n   NOTE: This extrinsic needs to be called multiple times to claim multiple matured  payouts. \n\n   Payment: The member will receive a payment equal to their first matured  payout to their free balance. \n\n   The dispatch origin for this call must be _Signed_ and a member with  payouts remaining. \n \n### punishSkeptic()\n- **interface**: `api.tx.society.punishSkeptic`\n- **summary**:    Punish the skeptic with a strike if they did not vote on a candidate. Callable by the  candidate. \n \n### resignCandidacy()\n- **interface**: `api.tx.society.resignCandidacy`\n- **summary**:    Remove the candidate's application from the society. Callable only by the candidate. \n\n   Any bid deposit is lost and voucher is banned. \n \n### setParameters(max_members: `u32`, max_intake: `u32`, max_strikes: `u32`, candidate_deposit: `u128`)\n- **interface**: `api.tx.society.setParameters`\n- **summary**:    Change the maximum number of members in society and the maximum number of new candidates  in a single intake period. \n\n   The dispatch origin for this call must be Signed by the Founder. \n\n   Parameters: \n\n  - `max_members` - The maximum number of members for the society. This must be no less than the current number of members. \n\n  - `max_intake` - The maximum number of candidates per intake period.\n\n  - `max_strikes`: The maximum number of strikes a member may get before they become suspended and may only be reinstated by the founder. \n\n  - `candidate_deposit`: The deposit required to make a bid for membership of the group.\n \n### unbid()\n- **interface**: `api.tx.society.unbid`\n- **summary**:    A bidder can remove their bid for entry into society.  By doing so, they will have their candidate deposit returned or  they will unvouch their voucher. \n\n   Payment: The bid deposit is unreserved if the user made a bid. \n\n   The dispatch origin for this call must be _Signed_ and a bidder. \n \n### unvouch()\n- **interface**: `api.tx.society.unvouch`\n- **summary**:    As a vouching member, unvouch a bid. This only works while vouched user is  only a bidder (and not a candidate). \n\n   The dispatch origin for this call must be _Signed_ and a vouching member. \n\n   Parameters: \n\n  - `pos`: Position in the `Bids` vector of the bid who should be unvouched.\n \n### vote(candidate: `MultiAddress`, approve: `bool`)\n- **interface**: `api.tx.society.vote`\n- **summary**:    As a member, vote on a candidate. \n\n   The dispatch origin for this call must be _Signed_ and a member. \n\n   Parameters: \n\n  - `candidate`: The candidate that the member would like to bid on.\n\n  - `approve`: A boolean which says if the candidate should be approved (`true`) or rejected (`false`). \n \n### vouch(who: `MultiAddress`, value: `u128`, tip: `u128`)\n- **interface**: `api.tx.society.vouch`\n- **summary**:    As a member, vouch for someone to join society by placing a bid on their behalf. \n\n   There is no deposit required to vouch for a new bid, but a member can only vouch for  one bid at a time. If the bid becomes a suspended candidate and ultimately rejected by  the suspension judgement origin, the member will be banned from vouching again. \n\n   As a vouching member, you can claim a tip if the candidate is accepted. This tip will  be paid as a portion of the reward the member will receive for joining the society. \n\n   The dispatch origin for this call must be _Signed_ and a member. \n\n   Parameters: \n\n  - `who`: The user who you would like to vouch for.\n\n  - `value`: The total reward to be paid between you and the candidate if they become a member in the society. \n\n  - `tip`: Your cut of the total `value` payout when the candidate is inducted into the society. Tips larger than `value` will be saturated upon payout. \n \n### waiveRepay(amount: `u128`)\n- **interface**: `api.tx.society.waiveRepay`\n- **summary**:    Repay the payment previously given to the member with the signed origin, remove any  pending payments, and elevate them from rank 0 to rank 1. \n\n___\n\n\n## staking\n \n### bond(value: `Compact<u128>`, payee: `PalletStakingRewardDestination`)\n- **interface**: `api.tx.staking.bond`\n- **summary**:    Take the origin account as a stash and lock up `value` of its balance. `controller` will  be the account that controls it. \n\n   `value` must be more than the `minimum_balance` specified by `T::Currency`. \n\n   The dispatch origin for this call must be _Signed_ by the stash account. \n\n   Emits `Bonded`.  #### Complexity \n\n  - Independent of the arguments. Moderate complexity.\n\n  - O(1).\n\n  - Three extra DB entries.\n\n   NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned  unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed  as dust. \n \n### bondExtra(max_additional: `Compact<u128>`)\n- **interface**: `api.tx.staking.bondExtra`\n- **summary**:    Add some extra amount that have appeared in the stash `free_balance` into the balance up  for staking. \n\n   The dispatch origin for this call must be _Signed_ by the stash, not the controller. \n\n   Use this if there are additional funds in your stash account that you wish to bond.  Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose  any limitation on the amount that can be added. \n\n   Emits `Bonded`. \n\n   #### Complexity \n\n  - Independent of the arguments. Insignificant complexity.\n\n  - O(1).\n \n### cancelDeferredSlash(era: `u32`, slash_indices: `Vec<u32>`)\n- **interface**: `api.tx.staking.cancelDeferredSlash`\n- **summary**:    Cancel enactment of a deferred slash. \n\n   Can be called by the `T::AdminOrigin`. \n\n   Parameters: era and indices of the slashes for that era to kill. \n \n### chill()\n- **interface**: `api.tx.staking.chill`\n- **summary**:    Declare no desire to either validate or nominate. \n\n   Effects will be felt at the beginning of the next era. \n\n   The dispatch origin for this call must be _Signed_ by the controller, not the stash. \n\n   #### Complexity \n\n  - Independent of the arguments. Insignificant complexity.\n\n  - Contains one read.\n\n  - Writes are limited to the `origin` account key.\n \n### chillOther(stash: `AccountId32`)\n- **interface**: `api.tx.staking.chillOther`\n- **summary**:    Declare a `controller` to stop participating as either a validator or nominator. \n\n   Effects will be felt at the beginning of the next era. \n\n   The dispatch origin for this call must be _Signed_, but can be called by anyone. \n\n   If the caller is the same as the controller being targeted, then no further checks are  enforced, and this function behaves just like `chill`. \n\n   If the caller is different than the controller being targeted, the following conditions  must be met: \n\n   * `controller` must belong to a nominator who has become non-decodable, \n\n   Or: \n\n   * A `ChillThreshold` must be set and checked which defines how close to the max  nominators or validators we must reach before users can start chilling one-another. \n\n  * A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine how close we are to the threshold. \n\n  * A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines if this is a person that should be chilled because they have not met the threshold  bond required. \n\n   This can be helpful if bond requirements are updated, and we need to remove old users  who do not satisfy these requirements. \n \n### deprecateControllerBatch(controllers: `Vec<AccountId32>`)\n- **interface**: `api.tx.staking.deprecateControllerBatch`\n- **summary**:    Updates a batch of controller accounts to their corresponding stash account if they are  not the same. Ignores any controller accounts that do not exist, and does not operate if  the stash and controller are already the same. \n\n   Effects will be felt instantly (as soon as this function is completed successfully). \n\n   The dispatch origin must be `T::AdminOrigin`. \n \n### forceApplyMinCommission(validator_stash: `AccountId32`)\n- **interface**: `api.tx.staking.forceApplyMinCommission`\n- **summary**:    Force a validator to have at least the minimum commission. This will not affect a  validator who already has a commission greater than or equal to the minimum. Any account  can call this. \n \n### forceNewEra()\n- **interface**: `api.tx.staking.forceNewEra`\n- **summary**:    Force there to be a new era at the end of the next session. After this, it will be  reset to normal (non-forced) behaviour. \n\n   The dispatch origin must be Root. \n\n   #### Warning \n\n   The election process starts multiple blocks before the end of the era.  If this is called just before a new era is triggered, the election process may not  have enough blocks to get a result. \n\n   #### Complexity \n\n  - No arguments.\n\n  - Weight: O(1)\n \n### forceNewEraAlways()\n- **interface**: `api.tx.staking.forceNewEraAlways`\n- **summary**:    Force there to be a new era at the end of sessions indefinitely. \n\n   The dispatch origin must be Root. \n\n   #### Warning \n\n   The election process starts multiple blocks before the end of the era.  If this is called just before a new era is triggered, the election process may not  have enough blocks to get a result. \n \n### forceNoEras()\n- **interface**: `api.tx.staking.forceNoEras`\n- **summary**:    Force there to be no new eras indefinitely. \n\n   The dispatch origin must be Root. \n\n   #### Warning \n\n   The election process starts multiple blocks before the end of the era.  Thus the election process may be ongoing when this is called. In this case the  election will continue until the next era is triggered. \n\n   #### Complexity \n\n  - No arguments.\n\n  - Weight: O(1)\n \n### forceUnstake(stash: `AccountId32`, num_slashing_spans: `u32`)\n- **interface**: `api.tx.staking.forceUnstake`\n- **summary**:    Force a current staker to become completely unstaked, immediately. \n\n   The dispatch origin must be Root. \n\n   #### Parameters \n\n   - `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more  details. \n \n### increaseValidatorCount(additional: `Compact<u32>`)\n- **interface**: `api.tx.staking.increaseValidatorCount`\n- **summary**:    Increments the ideal number of validators up to maximum of  `ElectionProviderBase::MaxWinners`. \n\n   The dispatch origin must be Root. \n\n   #### Complexity  Same as [`Self::set_validator_count`]. \n \n### kick(who: `Vec<MultiAddress>`)\n- **interface**: `api.tx.staking.kick`\n- **summary**:    Remove the given nominations from the calling validator. \n\n   Effects will be felt at the beginning of the next era. \n\n   The dispatch origin for this call must be _Signed_ by the controller, not the stash. \n\n   - `who`: A list of nominator stash accounts who are nominating this validator which  should no longer be nominating this validator. \n\n   Note: Making this call only makes sense if you first set the validator preferences to  block any further nominations. \n \n### manualSlash(validator_stash: `AccountId32`, era: `u32`, slash_fraction: `Perbill`)\n- **interface**: `api.tx.staking.manualSlash`\n- **summary**:    This function allows governance to manually slash a validator and is a \n\n  **fallback mechanism**.\n\n   The dispatch origin must be `T::AdminOrigin`. \n\n   #### Parameters \n\n  - `validator_stash` - The stash account of the validator to slash.\n\n  - `era` - The era in which the validator was in the active set.\n\n  - `slash_fraction` - The percentage of the stake to slash, expressed as a Perbill.\n\n   #### Behavior \n\n   The slash will be applied using the standard slashing mechanics, respecting the  configured `SlashDeferDuration`. \n\n   This means: \n\n  - If the validator was already slashed by a higher percentage for the same era, this slash will have no additional effect. \n\n  - If the validator was previously slashed by a lower percentage, only the difference will be applied. \n\n  - The slash will be deferred by `SlashDeferDuration` eras before being enacted.\n \n### migrateCurrency(stash: `AccountId32`)\n- **interface**: `api.tx.staking.migrateCurrency`\n- **summary**:    Removes the legacy Staking locks if they exist. \n\n   This removes the legacy lock on the stake with [`Config::OldCurrency`] and creates a  hold on it if needed. If all stake cannot be held, the best effort is made to hold as  much as possible. The remaining stake is forced withdrawn from the ledger. \n\n   The fee is waived if the migration is successful. \n \n### nominate(targets: `Vec<MultiAddress>`)\n- **interface**: `api.tx.staking.nominate`\n- **summary**:    Declare the desire to nominate `targets` for the origin controller. \n\n   Effects will be felt at the beginning of the next era. \n\n   The dispatch origin for this call must be _Signed_ by the controller, not the stash. \n\n   #### Complexity \n\n  - The transaction's complexity is proportional to the size of `targets` (N) which is capped at CompactAssignments::LIMIT (T::MaxNominations). \n\n  - Both the reads and writes follow a similar pattern.\n \n### payoutStakers(validator_stash: `AccountId32`, era: `u32`)\n- **interface**: `api.tx.staking.payoutStakers`\n- **summary**:    Pay out next page of the stakers behind a validator for the given era. \n\n   - `validator_stash` is the stash account of the validator. \n\n  - `era` may be any era between `[current_era - history_depth; current_era]`.\n\n   The origin of this call must be _Signed_. Any account can call this function, even if  it is not one of the stakers. \n\n   The reward payout could be paged in case there are too many nominators backing the  `validator_stash`. This call will payout unpaid pages in an ascending order. To claim a  specific page, use `payout_stakers_by_page`.` \n\n   If all pages are claimed, it returns an error `InvalidPage`. \n \n### payoutStakersByPage(validator_stash: `AccountId32`, era: `u32`, page: `u32`)\n- **interface**: `api.tx.staking.payoutStakersByPage`\n- **summary**:    Pay out a page of the stakers behind a validator for the given era and page. \n\n   - `validator_stash` is the stash account of the validator. \n\n  - `era` may be any era between `[current_era - history_depth; current_era]`.\n\n  - `page` is the page index of nominators to pay out with value between 0 and `num_nominators / T::MaxExposurePageSize`. \n\n   The origin of this call must be _Signed_. Any account can call this function, even if  it is not one of the stakers. \n\n   If a validator has more than [`Config::MaxExposurePageSize`] nominators backing  them, then the list of nominators is paged, with each page being capped at  [`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators,  the call needs to be made for each page separately in order for all the nominators  backing a validator to receive the reward. The nominators are not sorted across pages  and so it should not be assumed the highest staker would be on the topmost page and vice  versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. \n \n### reapStash(stash: `AccountId32`, num_slashing_spans: `u32`)\n- **interface**: `api.tx.staking.reapStash`\n- **summary**:    Remove all data structures concerning a staker/stash once it is at a state where it can  be considered `dust` in the staking system. The requirements are: \n\n   1. the `total_balance` of the stash is below existential deposit.  2. or, the `ledger.total` of the stash is below existential deposit.  3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. \n\n   The former can happen in cases like a slash; the latter when a fully unbonded account  is still receiving staking rewards in `RewardDestination::Staked`. \n\n   It can be called by anyone, as long as `stash` meets the above requirements. \n\n   Refunds the transaction fees upon successful execution. \n\n   #### Parameters \n\n   - `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more  details. \n \n### rebond(value: `Compact<u128>`)\n- **interface**: `api.tx.staking.rebond`\n- **summary**:    Rebond a portion of the stash scheduled to be unlocked. \n\n   The dispatch origin must be signed by the controller. \n\n   #### Complexity \n\n  - Time complexity: O(L), where L is unlocking chunks\n\n  - Bounded by `MaxUnlockingChunks`.\n \n### restoreLedger(stash: `AccountId32`, maybe_controller: `Option<AccountId32>`, maybe_total: `Option<u128>`, maybe_unlocking: `Option<Vec<PalletStakingUnlockChunk>>`)\n- **interface**: `api.tx.staking.restoreLedger`\n- **summary**:    Restores the state of a ledger which is in an inconsistent state. \n\n   The requirements to restore a ledger are the following: \n\n  * The stash is bonded; or\n\n  * The stash is not bonded but it has a staking lock left behind; or\n\n  * If the stash has an associated ledger and its state is inconsistent; or\n\n  * If the ledger is not corrupted *but* its staking lock is out of sync.\n\n   The `maybe_*` input parameters will overwrite the corresponding data and metadata of the  ledger associated with the stash. If the input parameters are not set, the ledger will  be reset values from on-chain state. \n \n### scaleValidatorCount(factor: `Percent`)\n- **interface**: `api.tx.staking.scaleValidatorCount`\n- **summary**:    Scale up the ideal number of validators by a factor up to maximum of  `ElectionProviderBase::MaxWinners`. \n\n   The dispatch origin must be Root. \n\n   #### Complexity  Same as [`Self::set_validator_count`]. \n \n### setController()\n- **interface**: `api.tx.staking.setController`\n- **summary**:    (Re-)sets the controller of a stash to the stash itself. This function previously  accepted a `controller` argument to set the controller to an account other than the  stash itself. This functionality has now been removed, now only setting the controller  to the stash, if it is not already. \n\n   Effects will be felt instantly (as soon as this function is completed successfully). \n\n   The dispatch origin for this call must be _Signed_ by the stash, not the controller. \n\n   #### Complexity  O(1) \n\n  - Independent of the arguments. Insignificant complexity.\n\n  - Contains a limited number of reads.\n\n  - Writes are limited to the `origin` account key.\n \n### setInvulnerables(invulnerables: `Vec<AccountId32>`)\n- **interface**: `api.tx.staking.setInvulnerables`\n- **summary**:    Set the validators who cannot be slashed (if any). \n\n   The dispatch origin must be Root. \n \n### setMinCommission(new: `Perbill`)\n- **interface**: `api.tx.staking.setMinCommission`\n- **summary**:    Sets the minimum amount of commission that each validators must maintain. \n\n   This call has lower privilege requirements than `set_staking_config` and can be called  by the `T::AdminOrigin`. Root can always call this. \n \n### setPayee(payee: `PalletStakingRewardDestination`)\n- **interface**: `api.tx.staking.setPayee`\n- **summary**:    (Re-)set the payment target for a controller. \n\n   Effects will be felt instantly (as soon as this function is completed successfully). \n\n   The dispatch origin for this call must be _Signed_ by the controller, not the stash. \n\n   #### Complexity \n\n  - O(1)\n\n  - Independent of the arguments. Insignificant complexity.\n\n  - Contains a limited number of reads.\n\n  - Writes are limited to the `origin` account key.\n\n  ---------\n \n### setStakingConfigs(min_nominator_bond: `PalletStakingPalletConfigOpU128`, min_validator_bond: `PalletStakingPalletConfigOpU128`, max_nominator_count: `PalletStakingPalletConfigOpU32`, max_validator_count: `PalletStakingPalletConfigOpU32`, chill_threshold: `PalletStakingPalletConfigOpPercent`, min_commission: `PalletStakingPalletConfigOpPerbill`, max_staked_rewards: `PalletStakingPalletConfigOpPercent`)\n- **interface**: `api.tx.staking.setStakingConfigs`\n- **summary**:    Update the various staking configurations . \n\n   * `min_nominator_bond`: The minimum active bond needed to be a nominator. \n\n  * `min_validator_bond`: The minimum active bond needed to be a validator.\n\n  * `max_nominator_count`: The max number of users who can be a nominator at once. When set to `None`, no limit is enforced. \n\n  * `max_validator_count`: The max number of users who can be a validator at once. When set to `None`, no limit is enforced. \n\n  * `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which should be filled in order for the `chill_other` transaction to work. \n\n  * `min_commission`: The minimum amount of commission that each validators must maintain. This is checked only upon calling `validate`. Existing validators are not affected. \n\n   RuntimeOrigin must be Root to call this function. \n\n   NOTE: Existing nominators and validators will not be affected by this update.  to kick people under the new limits, `chill_other` should be called. \n \n### setValidatorCount(new: `Compact<u32>`)\n- **interface**: `api.tx.staking.setValidatorCount`\n- **summary**:    Sets the ideal number of validators. \n\n   The dispatch origin must be Root. \n\n   #### Complexity  O(1) \n \n### unbond(value: `Compact<u128>`)\n- **interface**: `api.tx.staking.unbond`\n- **summary**:    Schedule a portion of the stash to be unlocked ready for transfer out after the bond  period ends. If this leaves an amount actively bonded less than  [`asset::existential_deposit`], then it is increased to the full amount. \n\n   The dispatch origin for this call must be _Signed_ by the controller, not the stash. \n\n   Once the unlock period is done, you can call `withdraw_unbonded` to actually move  the funds out of management ready for transfer. \n\n   No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`)  can co-exists at the same time. If there are no unlocking chunks slots available  [`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). \n\n   If a user encounters the `InsufficientBond` error when calling this extrinsic,  they should call `chill` first in order to free up their bonded funds. \n\n   Emits `Unbonded`. \n\n   See also [`Call::withdraw_unbonded`]. \n \n### updatePayee(controller: `AccountId32`)\n- **interface**: `api.tx.staking.updatePayee`\n- **summary**:    Migrates an account's `RewardDestination::Controller` to  `RewardDestination::Account(controller)`. \n\n   Effects will be felt instantly (as soon as this function is completed successfully). \n\n   This will waive the transaction fee if the `payee` is successfully migrated. \n \n### validate(prefs: `PalletStakingValidatorPrefs`)\n- **interface**: `api.tx.staking.validate`\n- **summary**:    Declare the desire to validate for the origin controller. \n\n   Effects will be felt at the beginning of the next era. \n\n   The dispatch origin for this call must be _Signed_ by the controller, not the stash. \n \n### withdrawUnbonded(num_slashing_spans: `u32`)\n- **interface**: `api.tx.staking.withdrawUnbonded`\n- **summary**:    Remove any unlocked chunks from the `unlocking` queue from our management. \n\n   This essentially frees up that balance to be used by the stash account to do whatever  it wants. \n\n   The dispatch origin for this call must be _Signed_ by the controller. \n\n   Emits `Withdrawn`. \n\n   See also [`Call::unbond`]. \n\n   #### Parameters \n\n   - `num_slashing_spans` indicates the number of metadata slashing spans to clear when  this call results in a complete removal of all the data related to the stash account.  In this case, the `num_slashing_spans` must be larger or equal to the number of  slashing spans associated with the stash account in the [`SlashingSpans`] storage type,  otherwise the call will fail. The call weight is directly proportional to  `num_slashing_spans`. \n\n   #### Complexity  O(S) where S is the number of slashing spans to remove  NOTE: Weight annotation is the kill scenario, we refund otherwise. \n\n___\n\n\n## stateTrieMigration\n \n### continueMigrate(limits: `PalletStateTrieMigrationMigrationLimits`, real_size_upper: `u32`, witness_task: `PalletStateTrieMigrationMigrationTask`)\n- **interface**: `api.tx.stateTrieMigration.continueMigrate`\n- **summary**:    Continue the migration for the given `limits`. \n\n   The dispatch origin of this call can be any signed account. \n\n   This transaction has NO MONETARY INCENTIVES. calling it will not reward anyone. Albeit,  Upon successful execution, the transaction fee is returned. \n\n   The (potentially over-estimated) of the byte length of all the data read must be  provided for up-front fee-payment and weighing. In essence, the caller is guaranteeing  that executing the current `MigrationTask` with the given `limits` will not exceed  `real_size_upper` bytes of read data. \n\n   The `witness_task` is merely a helper to prevent the caller from being slashed or  generally trigger a migration that they do not intend. This parameter is just a message  from caller, saying that they believed `witness_task` was the last state of the  migration, and they only wish for their transaction to do anything, if this assumption  holds. In case `witness_task` does not match, the transaction fails. \n\n   Based on the documentation of [`MigrationTask::migrate_until_exhaustion`], the  recommended way of doing this is to pass a `limit` that only bounds `count`, as the  `size` limit can always be overwritten. \n \n### controlAutoMigration(maybe_config: `Option<PalletStateTrieMigrationMigrationLimits>`)\n- **interface**: `api.tx.stateTrieMigration.controlAutoMigration`\n- **summary**:    Control the automatic migration. \n\n   The dispatch origin of this call must be [`Config::ControlOrigin`]. \n \n### forceSetProgress(progress_top: `PalletStateTrieMigrationProgress`, progress_child: `PalletStateTrieMigrationProgress`)\n- **interface**: `api.tx.stateTrieMigration.forceSetProgress`\n- **summary**:    Forcefully set the progress the running migration. \n\n   This is only useful in one case: the next key to migrate is too big to be migrated with  a signed account, in a parachain context, and we simply want to skip it. A reasonable  example of this would be `:code:`, which is both very expensive to migrate, and commonly  used, so probably it is already migrated. \n\n   In case you mess things up, you can also, in principle, use this to reset the migration  process. \n \n### migrateCustomChild(root: `Bytes`, child_keys: `Vec<Bytes>`, total_size: `u32`)\n- **interface**: `api.tx.stateTrieMigration.migrateCustomChild`\n- **summary**:    Migrate the list of child keys by iterating each of them one by one. \n\n   All of the given child keys must be present under one `child_root`. \n\n   This does not affect the global migration process tracker ([`MigrationProcess`]), and  should only be used in case any keys are leftover due to a bug. \n \n### migrateCustomTop(keys: `Vec<Bytes>`, witness_size: `u32`)\n- **interface**: `api.tx.stateTrieMigration.migrateCustomTop`\n- **summary**:    Migrate the list of top keys by iterating each of them one by one. \n\n   This does not affect the global migration process tracker ([`MigrationProcess`]), and  should only be used in case any keys are leftover due to a bug. \n \n### setSignedMaxLimits(limits: `PalletStateTrieMigrationMigrationLimits`)\n- **interface**: `api.tx.stateTrieMigration.setSignedMaxLimits`\n- **summary**:    Set the maximum limit of the signed migration. \n\n___\n\n\n## sudo\n \n### removeKey()\n- **interface**: `api.tx.sudo.removeKey`\n- **summary**:    Permanently removes the sudo key. \n\n   **This cannot be un-done.** \n \n### setKey(new: `MultiAddress`)\n- **interface**: `api.tx.sudo.setKey`\n- **summary**:    Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo  key. \n \n### sudo(call: `Call`)\n- **interface**: `api.tx.sudo.sudo`\n- **summary**:    Authenticates the sudo key and dispatches a function call with `Root` origin. \n \n### sudoAs(who: `MultiAddress`, call: `Call`)\n- **interface**: `api.tx.sudo.sudoAs`\n- **summary**:    Authenticates the sudo key and dispatches a function call with `Signed` origin from  a given account. \n\n   The dispatch origin for this call must be _Signed_. \n \n### sudoUncheckedWeight(call: `Call`, weight: `SpWeightsWeightV2Weight`)\n- **interface**: `api.tx.sudo.sudoUncheckedWeight`\n- **summary**:    Authenticates the sudo key and dispatches a function call with `Root` origin.  This function does not check the weight of the call, and instead allows the  Sudo user to specify the weight of the call. \n\n   The dispatch origin for this call must be _Signed_. \n\n___\n\n\n## system\n \n### applyAuthorizedUpgrade(code: `Bytes`)\n- **interface**: `api.tx.system.applyAuthorizedUpgrade`\n- **summary**:    Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. \n\n   If the authorization required a version check, this call will ensure the spec name  remains unchanged and that the spec version has increased. \n\n   Depending on the runtime's `OnSetCode` configuration, this function may directly apply  the new `code` in the same block or attempt to schedule the upgrade. \n\n   All origins are allowed. \n \n### authorizeUpgrade(code_hash: `H256`)\n- **interface**: `api.tx.system.authorizeUpgrade`\n- **summary**:    Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied  later. \n\n   This call requires Root origin. \n \n### authorizeUpgradeWithoutChecks(code_hash: `H256`)\n- **interface**: `api.tx.system.authorizeUpgradeWithoutChecks`\n- **summary**:    Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied  later. \n\n   WARNING: This authorizes an upgrade that will take place without any safety checks, for  example that the spec name remains the same and that the version number increases. Not  recommended for normal use. Use `authorize_upgrade` instead. \n\n   This call requires Root origin. \n \n### killPrefix(prefix: `Bytes`, subkeys: `u32`)\n- **interface**: `api.tx.system.killPrefix`\n- **summary**:    Kill all storage items with a key that starts with the given prefix. \n\n   **NOTE:** We rely on the Root origin to provide us the number of subkeys under  the prefix we are removing to accurately calculate the weight of this function. \n \n### killStorage(keys: `Vec<Bytes>`)\n- **interface**: `api.tx.system.killStorage`\n- **summary**:    Kill some items from storage. \n \n### remark(remark: `Bytes`)\n- **interface**: `api.tx.system.remark`\n- **summary**:    Make some on-chain remark. \n\n   Can be executed by every `origin`. \n \n### remarkWithEvent(remark: `Bytes`)\n- **interface**: `api.tx.system.remarkWithEvent`\n- **summary**:    Make some on-chain remark and emit event. \n \n### setCode(code: `Bytes`)\n- **interface**: `api.tx.system.setCode`\n- **summary**:    Set the new runtime code. \n \n### setCodeWithoutChecks(code: `Bytes`)\n- **interface**: `api.tx.system.setCodeWithoutChecks`\n- **summary**:    Set the new runtime code without doing any checks of the given `code`. \n\n   Note that runtime upgrades will not run if this is called with a not-increasing spec  version! \n \n### setHeapPages(pages: `u64`)\n- **interface**: `api.tx.system.setHeapPages`\n- **summary**:    Set the number of pages in the WebAssembly environment's heap. \n \n### setStorage(items: `Vec<(Bytes,Bytes)>`)\n- **interface**: `api.tx.system.setStorage`\n- **summary**:    Set some items of storage. \n\n___\n\n\n## technicalCommittee\n \n### close(proposal_hash: `H256`, index: `Compact<u32>`, proposal_weight_bound: `SpWeightsWeightV2Weight`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.technicalCommittee.close`\n- **summary**:    Close a vote that is either approved, disapproved or whose voting period has ended. \n\n   May be called by any signed account in order to finish voting and close the proposal. \n\n   If called before the end of the voting period it will only close the vote if it is  has enough votes to be approved or disapproved. \n\n   If called after the end of the voting period abstentions are counted as rejections  unless there is a prime member set and the prime member cast an approval. \n\n   If the close operation completes successfully with disapproval, the transaction fee will  be waived. Otherwise execution of the approved operation will be charged to the caller. \n\n   + `proposal_weight_bound`: The maximum amount of weight consumed by executing the closed  proposal.  + `length_bound`: The upper bound for the length of the proposal in storage. Checked via  `storage::read` so it is `size_of::<u32>() == 4` larger than the pure length. \n\n   #### Complexity \n\n  - `O(B + M + P1 + P2)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` is members-count (code- and governance-bounded)\n\n  - `P1` is the complexity of `proposal` preimage.\n\n  - `P2` is proposal-count (code-bounded)\n \n### disapproveProposal(proposal_hash: `H256`)\n- **interface**: `api.tx.technicalCommittee.disapproveProposal`\n- **summary**:    Disapprove a proposal, close, and remove it from the system, regardless of its current  state. \n\n   Must be called by the Root origin. \n\n   Parameters: \n\n  * `proposal_hash`: The hash of the proposal that should be disapproved.\n\n   #### Complexity  O(P) where P is the number of max proposals \n \n### execute(proposal: `Call`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.technicalCommittee.execute`\n- **summary**:    Dispatch a proposal from a member using the `Member` origin. \n\n   Origin must be a member of the collective. \n\n   #### Complexity: \n\n  - `O(B + M + P)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` members-count (code-bounded)\n\n  - `P` complexity of dispatching `proposal`\n \n### kill(proposal_hash: `H256`)\n- **interface**: `api.tx.technicalCommittee.kill`\n- **summary**:    Disapprove the proposal and burn the cost held for storing this proposal. \n\n   Parameters: \n\n  - `origin`: must be the `KillOrigin`.\n\n  - `proposal_hash`: The hash of the proposal that should be killed.\n\n   Emits `Killed` and `ProposalCostBurned` if any cost was held for a given proposal. \n \n### propose(threshold: `Compact<u32>`, proposal: `Call`, length_bound: `Compact<u32>`)\n- **interface**: `api.tx.technicalCommittee.propose`\n- **summary**:    Add a new proposal to either be voted on or executed directly. \n\n   Requires the sender to be member. \n\n   `threshold` determines whether `proposal` is executed directly (`threshold < 2`)  or put up for voting. \n\n   #### Complexity \n\n  - `O(B + M + P1)` or `O(B + M + P2)` where:\n\n  - `B` is `proposal` size in bytes (length-fee-bounded)\n\n  - `M` is members-count (code- and governance-bounded)\n\n  - branching is influenced by `threshold` where:\n\n  - `P1` is proposal execution complexity (`threshold < 2`)\n\n  - `P2` is proposals-count (code-bounded) (`threshold >= 2`)\n \n### releaseProposalCost(proposal_hash: `H256`)\n- **interface**: `api.tx.technicalCommittee.releaseProposalCost`\n- **summary**:    Release the cost held for storing a proposal once the given proposal is completed. \n\n   If there is no associated cost for the given proposal, this call will have no effect. \n\n   Parameters: \n\n  - `origin`: must be `Signed` or `Root`.\n\n  - `proposal_hash`: The hash of the proposal.\n\n   Emits `ProposalCostReleased` if any cost held for a given proposal. \n \n### setMembers(new_members: `Vec<AccountId32>`, prime: `Option<AccountId32>`, old_count: `u32`)\n- **interface**: `api.tx.technicalCommittee.setMembers`\n- **summary**:    Set the collective's membership. \n\n   - `new_members`: The new member list. Be nice to the chain and provide it sorted. \n\n  - `prime`: The prime member whose vote sets the default.\n\n  - `old_count`: The upper bound for the previous number of members in storage. Used for weight estimation. \n\n   The dispatch of this call must be `SetMembersOrigin`. \n\n   NOTE: Does not enforce the expected `MaxMembers` limit on the amount of members, but  the weight estimations rely on it to estimate dispatchable weight. \n\n   #### WARNING: \n\n   The `pallet-collective` can also be managed by logic outside of the pallet through the  implementation of the trait [`ChangeMembers`].  Any call to `set_members` must be careful that the member set doesn't get out of sync  with other logic managing the member set. \n\n   #### Complexity: \n\n  - `O(MP + N)` where:\n\n  - `M` old-members-count (code- and governance-bounded)\n\n  - `N` new-members-count (code- and governance-bounded)\n\n  - `P` proposals-count (code-bounded)\n \n### vote(proposal: `H256`, index: `Compact<u32>`, approve: `bool`)\n- **interface**: `api.tx.technicalCommittee.vote`\n- **summary**:    Add an aye or nay vote for the sender to the given proposal. \n\n   Requires the sender to be a member. \n\n   Transaction fees will be waived if the member is voting on any particular proposal  for the first time and the call is successful. Subsequent vote changes will charge a  fee.  #### Complexity \n\n  - `O(M)` where `M` is members-count (code- and governance-bounded)\n\n___\n\n\n## technicalMembership\n \n### addMember(who: `MultiAddress`)\n- **interface**: `api.tx.technicalMembership.addMember`\n- **summary**:    Add a member `who` to the set. \n\n   May only be called from `T::AddOrigin`. \n \n### changeKey(new: `MultiAddress`)\n- **interface**: `api.tx.technicalMembership.changeKey`\n- **summary**:    Swap out the sending member for some other key `new`. \n\n   May only be called from `Signed` origin of a current member. \n\n   Prime membership is passed from the origin account to `new`, if extant. \n \n### clearPrime()\n- **interface**: `api.tx.technicalMembership.clearPrime`\n- **summary**:    Remove the prime member if it exists. \n\n   May only be called from `T::PrimeOrigin`. \n \n### removeMember(who: `MultiAddress`)\n- **interface**: `api.tx.technicalMembership.removeMember`\n- **summary**:    Remove a member `who` from the set. \n\n   May only be called from `T::RemoveOrigin`. \n \n### resetMembers(members: `Vec<AccountId32>`)\n- **interface**: `api.tx.technicalMembership.resetMembers`\n- **summary**:    Change the membership to a new set, disregarding the existing membership. Be nice and  pass `members` pre-sorted. \n\n   May only be called from `T::ResetOrigin`. \n \n### setPrime(who: `MultiAddress`)\n- **interface**: `api.tx.technicalMembership.setPrime`\n- **summary**:    Set the prime member. Must be a current member. \n\n   May only be called from `T::PrimeOrigin`. \n \n### swapMember(remove: `MultiAddress`, add: `MultiAddress`)\n- **interface**: `api.tx.technicalMembership.swapMember`\n- **summary**:    Swap out one member `remove` for another `add`. \n\n   May only be called from `T::SwapOrigin`. \n\n   Prime membership is *not* passed from `remove` to `add`, if extant. \n\n___\n\n\n## timestamp\n \n### set(now: `Compact<u64>`)\n- **interface**: `api.tx.timestamp.set`\n- **summary**:    Set the current time. \n\n   This call should be invoked exactly once per block. It will panic at the finalization  phase, if this call hasn't been invoked by that time. \n\n   The timestamp should be greater than the previous one by the amount specified by  [`Config::MinimumPeriod`]. \n\n   The dispatch origin for this call must be _None_. \n\n   This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware  that changing the complexity of this call could result exhausting the resources in a  block to execute any other calls. \n\n   #### Complexity \n\n  - `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`)\n\n  - 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in `on_finalize`) \n\n  - 1 event handler `on_timestamp_set`. Must be `O(1)`.\n\n___\n\n\n## tips\n \n### closeTip(hash: `H256`)\n- **interface**: `api.tx.tips.closeTip`\n- **summary**:    Close and payout a tip. \n\n   The dispatch origin for this call must be _Signed_. \n\n   The tip identified by `hash` must have finished its countdown period. \n\n   - `hash`: The identity of the open tip for which a tip value is declared. This is formed  as the hash of the tuple of the original tip `reason` and the beneficiary account ID. \n\n   #### Complexity \n\n  - : `O(T)` where `T` is the number of tippers. decoding `Tipper` vec of length `T`. `T` is charged as upper bound given by `ContainsLengthBound`. The actual cost depends on  the implementation of `T::Tippers`. \n \n### reportAwesome(reason: `Bytes`, who: `MultiAddress`)\n- **interface**: `api.tx.tips.reportAwesome`\n- **summary**:    Report something `reason` that deserves a tip and claim any eventual the finder's fee. \n\n   The dispatch origin for this call must be _Signed_. \n\n   Payment: `TipReportDepositBase` will be reserved from the origin account, as well as  `DataDepositPerByte` for each byte in `reason`. \n\n   - `reason`: The reason for, or the thing that deserves, the tip; generally this will be  a UTF-8-encoded URL. \n\n  - `who`: The account which should be credited for the tip.\n\n   Emits `NewTip` if successful. \n\n   #### Complexity \n\n  - `O(R)` where `R` length of `reason`.\n\n  - encoding and hashing of 'reason'\n \n### retractTip(hash: `H256`)\n- **interface**: `api.tx.tips.retractTip`\n- **summary**:    Retract a prior tip-report from `report_awesome`, and cancel the process of tipping. \n\n   If successful, the original deposit will be unreserved. \n\n   The dispatch origin for this call must be _Signed_ and the tip identified by `hash`  must have been reported by the signing account through `report_awesome` (and not  through `tip_new`). \n\n   - `hash`: The identity of the open tip for which a tip value is declared. This is formed  as the hash of the tuple of the original tip `reason` and the beneficiary account ID. \n\n   Emits `TipRetracted` if successful. \n\n   #### Complexity \n\n  - `O(1)`\n\n  - Depends on the length of `T::Hash` which is fixed.\n \n### slashTip(hash: `H256`)\n- **interface**: `api.tx.tips.slashTip`\n- **summary**:    Remove and slash an already-open tip. \n\n   May only be called from `T::RejectOrigin`. \n\n   As a result, the finder is slashed and the deposits are lost. \n\n   Emits `TipSlashed` if successful. \n\n   #### Complexity \n\n  - O(1).\n \n### tip(hash: `H256`, tip_value: `Compact<u128>`)\n- **interface**: `api.tx.tips.tip`\n- **summary**:    Declare a tip value for an already-open tip. \n\n   The dispatch origin for this call must be _Signed_ and the signing account must be a  member of the `Tippers` set. \n\n   - `hash`: The identity of the open tip for which a tip value is declared. This is formed  as the hash of the tuple of the hash of the original tip `reason` and the beneficiary  account ID. \n\n  - `tip_value`: The amount of tip that the sender would like to give. The median tip value of active tippers will be given to the `who`. \n\n   Emits `TipClosing` if the threshold of tippers has been reached and the countdown period  has started. \n\n   #### Complexity \n\n  - `O(T)` where `T` is the number of tippers. decoding `Tipper` vec of length `T`, insert tip and check closing, `T` is charged as upper bound given by `ContainsLengthBound`.  The actual cost depends on the implementation of `T::Tippers`. \n\n   Actually weight could be lower as it depends on how many tips are in `OpenTip` but it  is weighted as if almost full i.e of length `T-1`. \n \n### tipNew(reason: `Bytes`, who: `MultiAddress`, tip_value: `Compact<u128>`)\n- **interface**: `api.tx.tips.tipNew`\n- **summary**:    Give a tip for something new; no finder's fee will be taken. \n\n   The dispatch origin for this call must be _Signed_ and the signing account must be a  member of the `Tippers` set. \n\n   - `reason`: The reason for, or the thing that deserves, the tip; generally this will be  a UTF-8-encoded URL. \n\n  - `who`: The account which should be credited for the tip.\n\n  - `tip_value`: The amount of tip that the sender would like to give. The median tip value of active tippers will be given to the `who`. \n\n   Emits `NewTip` if successful. \n\n   #### Complexity \n\n  - `O(R + T)` where `R` length of `reason`, `T` is the number of tippers.\n\n  - `O(T)`: decoding `Tipper` vec of length `T`. `T` is charged as upper bound given by `ContainsLengthBound`. The actual cost depends on the implementation of  `T::Tippers`. \n\n  - `O(R)`: hashing and encoding of reason of length `R`\n\n___\n\n\n## transactionStorage\n \n### checkProof(proof: `SpTransactionStorageProofTransactionStorageProof`)\n- **interface**: `api.tx.transactionStorage.checkProof`\n- **summary**:    Check storage proof for block number `block_number() - StoragePeriod`.  If such block does not exist the proof is expected to be `None`.  #### Complexity \n\n  - Linear w.r.t the number of indexed transactions in the proved block for random probing.  There's a DB read for each transaction. \n \n### renew(block: `u32`, index: `u32`)\n- **interface**: `api.tx.transactionStorage.renew`\n- **summary**:    Renew previously stored data. Parameters are the block number that contains  previous `store` or `renew` call and transaction index within that block.  Transaction index is emitted in the `Stored` or `Renewed` event.  Applies same fees as `store`.  #### Complexity \n\n  - O(1).\n \n### store(data: `Bytes`)\n- **interface**: `api.tx.transactionStorage.store`\n- **summary**:    Index and store data off chain. Minimum data size is 1 bytes, maximum is  `MaxTransactionSize`. Data will be removed after `STORAGE_PERIOD` blocks, unless `renew`  is called.  #### Complexity \n\n  - O(n*log(n)) of data size, as all data is pushed to an in-memory trie.\n\n___\n\n\n## treasury\n \n### checkStatus(index: `u32`)\n- **interface**: `api.tx.treasury.checkStatus`\n- **summary**:    Check the status of the spend and remove it from the storage if processed. \n\n   #### Dispatch Origin \n\n   Must be signed. \n\n   #### Details \n\n   The status check is a prerequisite for retrying a failed payout.  If a spend has either succeeded or expired, it is removed from the storage by this  function. In such instances, transaction fees are refunded. \n\n   #### Parameters \n\n  - `index`: The spend index.\n\n   #### Events \n\n   Emits [`Event::PaymentFailed`] if the spend payout has failed.  Emits [`Event::SpendProcessed`] if the spend payout has succeed. \n \n### payout(index: `u32`)\n- **interface**: `api.tx.treasury.payout`\n- **summary**:    Claim a spend. \n\n   #### Dispatch Origin \n\n   Must be signed \n\n   #### Details \n\n   Spends must be claimed within some temporal bounds. A spend may be claimed within one  [`Config::PayoutPeriod`] from the `valid_from` block.  In case of a payout failure, the spend status must be updated with the `check_status`  dispatchable before retrying with the current function. \n\n   #### Parameters \n\n  - `index`: The spend index.\n\n   #### Events \n\n   Emits [`Event::Paid`] if successful. \n \n### removeApproval(proposal_id: `Compact<u32>`)\n- **interface**: `api.tx.treasury.removeApproval`\n- **summary**:    Force a previously approved proposal to be removed from the approval queue. \n\n   #### Dispatch Origin \n\n   Must be [`Config::RejectOrigin`]. \n\n   #### Details \n\n   The original deposit will no longer be returned. \n\n   #### Parameters \n\n  - `proposal_id`: The index of a proposal\n\n   #### Complexity \n\n  - O(A) where `A` is the number of approvals\n\n   #### Errors \n\n  - [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the approval queue, i.e., the proposal has not been approved. This could also mean the  proposal does not exist altogether, thus there is no way it would have been approved  in the first place. \n \n### spend(asset_kind: `FrameSupportTokensFungibleUnionOfNativeOrWithId`, amount: `Compact<u128>`, beneficiary: `MultiAddress`, valid_from: `Option<u32>`)\n- **interface**: `api.tx.treasury.spend`\n- **summary**:    Propose and approve a spend of treasury funds. \n\n   #### Dispatch Origin \n\n   Must be [`Config::SpendOrigin`] with the `Success` value being at least  `amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted  for assertion using the [`Config::BalanceConverter`]. \n\n   #### Details \n\n   Create an approved spend for transferring a specific `amount` of `asset_kind` to a  designated beneficiary. The spend must be claimed using the `payout` dispatchable within  the [`Config::PayoutPeriod`]. \n\n   #### Parameters \n\n  - `asset_kind`: An indicator of the specific asset class to be spent.\n\n  - `amount`: The amount to be transferred from the treasury to the `beneficiary`.\n\n  - `beneficiary`: The beneficiary of the spend.\n\n  - `valid_from`: The block number from which the spend can be claimed. It can refer to the past if the resulting spend has not yet expired according to the  [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after  approval. \n\n   #### Events \n\n   Emits [`Event::AssetSpendApproved`] if successful. \n \n### spendLocal(amount: `Compact<u128>`, beneficiary: `MultiAddress`)\n- **interface**: `api.tx.treasury.spendLocal`\n- **summary**:    Propose and approve a spend of treasury funds. \n\n   #### Dispatch Origin \n\n   Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`. \n\n   #### Details  NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the  beneficiary. \n\n   #### Parameters \n\n  - `amount`: The amount to be transferred from the treasury to the `beneficiary`.\n\n  - `beneficiary`: The destination account for the transfer.\n\n   #### Events \n\n   Emits [`Event::SpendApproved`] if successful. \n \n### voidSpend(index: `u32`)\n- **interface**: `api.tx.treasury.voidSpend`\n- **summary**:    Void previously approved spend. \n\n   #### Dispatch Origin \n\n   Must be [`Config::RejectOrigin`]. \n\n   #### Details \n\n   A spend void is only possible if the payout has not been attempted yet. \n\n   #### Parameters \n\n  - `index`: The spend index.\n\n   #### Events \n\n   Emits [`Event::AssetSpendVoided`] if successful. \n\n___\n\n\n## txPause\n \n### pause(full_name: `(Bytes,Bytes)`)\n- **interface**: `api.tx.txPause.pause`\n- **summary**:    Pause a call. \n\n   Can only be called by [`Config::PauseOrigin`].  Emits an [`Event::CallPaused`] event on success. \n \n### unpause(ident: `(Bytes,Bytes)`)\n- **interface**: `api.tx.txPause.unpause`\n- **summary**:    Un-pause a call. \n\n   Can only be called by [`Config::UnpauseOrigin`].  Emits an [`Event::CallUnpaused`] event on success. \n\n___\n\n\n## uniques\n \n### approveTransfer(collection: `u32`, item: `u32`, delegate: `MultiAddress`)\n- **interface**: `api.tx.uniques.approveTransfer`\n- **summary**:    Approve an item to be transferred by a delegated third-party account. \n\n   The origin must conform to `ForceOrigin` or must be `Signed` and the sender must be  either the owner of the `item` or the admin of the collection. \n\n   - `collection`: The collection of the item to be approved for delegated transfer. \n\n  - `item`: The item of the item to be approved for delegated transfer.\n\n  - `delegate`: The account to delegate permission to transfer the item.\n\n   Important NOTE: The `approved` account gets reset after each transfer. \n\n   Emits `ApprovedTransfer` on success. \n\n   Weight: `O(1)` \n \n### burn(collection: `u32`, item: `u32`, check_owner: `Option<MultiAddress>`)\n- **interface**: `api.tx.uniques.burn`\n- **summary**:    Destroy a single item. \n\n   Origin must be Signed and the signing account must be either: \n\n  - the Admin of the `collection`;\n\n  - the Owner of the `item`;\n\n   - `collection`: The collection of the item to be burned. \n\n  - `item`: The item of the item to be burned.\n\n  - `check_owner`: If `Some` then the operation will fail with `WrongOwner` unless the item is owned by this value. \n\n   Emits `Burned` with the actual amount burned. \n\n   Weight: `O(1)`  Modes: `check_owner.is_some()`. \n \n### buyItem(collection: `u32`, item: `u32`, bid_price: `u128`)\n- **interface**: `api.tx.uniques.buyItem`\n- **summary**:    Allows to buy an item if it's up for sale. \n\n   Origin must be Signed and must not be the owner of the `item`. \n\n   - `collection`: The collection of the item. \n\n  - `item`: The item the sender wants to buy.\n\n  - `bid_price`: The price the sender is willing to pay.\n\n   Emits `ItemBought` on success. \n \n### cancelApproval(collection: `u32`, item: `u32`, maybe_check_delegate: `Option<MultiAddress>`)\n- **interface**: `api.tx.uniques.cancelApproval`\n- **summary**:    Cancel the prior approval for the transfer of an item by a delegate. \n\n   Origin must be either: \n\n  - the `Force` origin;\n\n  - `Signed` with the signer being the Admin of the `collection`;\n\n  - `Signed` with the signer being the Owner of the `item`;\n\n   Arguments: \n\n  - `collection`: The collection of the item of whose approval will be cancelled.\n\n  - `item`: The item of the item of whose approval will be cancelled.\n\n  - `maybe_check_delegate`: If `Some` will ensure that the given account is the one to which permission of transfer is delegated. \n\n   Emits `ApprovalCancelled` on success. \n\n   Weight: `O(1)` \n \n### clearAttribute(collection: `u32`, maybe_item: `Option<u32>`, key: `Bytes`)\n- **interface**: `api.tx.uniques.clearAttribute`\n- **summary**:    Clear an attribute for a collection or item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Owner of the  `collection`. \n\n   Any deposit is freed for the collection's owner. \n\n   - `collection`: The identifier of the collection whose item's metadata to clear. \n\n  - `maybe_item`: The identifier of the item whose metadata to clear.\n\n  - `key`: The key of the attribute.\n\n   Emits `AttributeCleared`. \n\n   Weight: `O(1)` \n \n### clearCollectionMetadata(collection: `u32`)\n- **interface**: `api.tx.uniques.clearCollectionMetadata`\n- **summary**:    Clear the metadata for a collection. \n\n   Origin must be either `ForceOrigin` or `Signed` and the sender should be the Owner of  the `collection`. \n\n   Any deposit is freed for the collection's owner. \n\n   - `collection`: The identifier of the collection whose metadata to clear. \n\n   Emits `CollectionMetadataCleared`. \n\n   Weight: `O(1)` \n \n### clearMetadata(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.uniques.clearMetadata`\n- **summary**:    Clear the metadata for an item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Owner of the  `item`. \n\n   Any deposit is freed for the collection's owner. \n\n   - `collection`: The identifier of the collection whose item's metadata to clear. \n\n  - `item`: The identifier of the item whose metadata to clear.\n\n   Emits `MetadataCleared`. \n\n   Weight: `O(1)` \n \n### create(collection: `u32`, admin: `MultiAddress`)\n- **interface**: `api.tx.uniques.create`\n- **summary**:    Issue a new collection of non-fungible items from a public origin. \n\n   This new collection has no items initially and its owner is the origin. \n\n   The origin must conform to the configured `CreateOrigin` and have sufficient funds free. \n\n   `ItemDeposit` funds of sender are reserved. \n\n   Parameters: \n\n  - `collection`: The identifier of the new collection. This must not be currently in use.\n\n  - `admin`: The admin of this collection. The admin is the initial address of each member of the collection's admin team. \n\n   Emits `Created` event when successful. \n\n   Weight: `O(1)` \n \n### destroy(collection: `u32`, witness: `PalletUniquesDestroyWitness`)\n- **interface**: `api.tx.uniques.destroy`\n- **summary**:    Destroy a collection of fungible items. \n\n   The origin must conform to `ForceOrigin` or must be `Signed` and the sender must be the  owner of the `collection`. \n\n   - `collection`: The identifier of the collection to be destroyed. \n\n  - `witness`: Information on the items minted in the collection. This must be correct. \n\n   Emits `Destroyed` event when successful. \n\n   Weight: `O(n + m)` where: \n\n  - `n = witness.items`\n\n  - `m = witness.item_metadatas`\n\n  - `a = witness.attributes`\n \n### forceCreate(collection: `u32`, owner: `MultiAddress`, free_holding: `bool`)\n- **interface**: `api.tx.uniques.forceCreate`\n- **summary**:    Issue a new collection of non-fungible items from a privileged origin. \n\n   This new collection has no items initially. \n\n   The origin must conform to `ForceOrigin`. \n\n   Unlike `create`, no funds are reserved. \n\n   - `collection`: The identifier of the new item. This must not be currently in use. \n\n  - `owner`: The owner of this collection of items. The owner has full superuser permissions  over this item, but may later change and configure the permissions using  `transfer_ownership` and `set_team`. \n\n   Emits `ForceCreated` event when successful. \n\n   Weight: `O(1)` \n \n### forceItemStatus(collection: `u32`, owner: `MultiAddress`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`, free_holding: `bool`, is_frozen: `bool`)\n- **interface**: `api.tx.uniques.forceItemStatus`\n- **summary**:    Alter the attributes of a given item. \n\n   Origin must be `ForceOrigin`. \n\n   - `collection`: The identifier of the item. \n\n  - `owner`: The new Owner of this item.\n\n  - `issuer`: The new Issuer of this item.\n\n  - `admin`: The new Admin of this item.\n\n  - `freezer`: The new Freezer of this item.\n\n  - `free_holding`: Whether a deposit is taken for holding an item of this collection.\n\n  - `is_frozen`: Whether this collection is frozen except for permissioned/admin instructions. \n\n   Emits `ItemStatusChanged` with the identity of the item. \n\n   Weight: `O(1)` \n \n### freeze(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.uniques.freeze`\n- **summary**:    Disallow further unprivileged transfer of an item. \n\n   Origin must be Signed and the sender should be the Freezer of the `collection`. \n\n   - `collection`: The collection of the item to be frozen. \n\n  - `item`: The item of the item to be frozen.\n\n   Emits `Frozen`. \n\n   Weight: `O(1)` \n \n### freezeCollection(collection: `u32`)\n- **interface**: `api.tx.uniques.freezeCollection`\n- **summary**:    Disallow further unprivileged transfers for a whole collection. \n\n   Origin must be Signed and the sender should be the Freezer of the `collection`. \n\n   - `collection`: The collection to be frozen. \n\n   Emits `CollectionFrozen`. \n\n   Weight: `O(1)` \n \n### mint(collection: `u32`, item: `u32`, owner: `MultiAddress`)\n- **interface**: `api.tx.uniques.mint`\n- **summary**:    Mint an item of a particular collection. \n\n   The origin must be Signed and the sender must be the Issuer of the `collection`. \n\n   - `collection`: The collection of the item to be minted. \n\n  - `item`: The item value of the item to be minted.\n\n  - `beneficiary`: The initial owner of the minted item.\n\n   Emits `Issued` event when successful. \n\n   Weight: `O(1)` \n \n### redeposit(collection: `u32`, items: `Vec<u32>`)\n- **interface**: `api.tx.uniques.redeposit`\n- **summary**:    Reevaluate the deposits on some items. \n\n   Origin must be Signed and the sender should be the Owner of the `collection`. \n\n   - `collection`: The collection to be frozen. \n\n  - `items`: The items of the collection whose deposits will be reevaluated.\n\n   NOTE: This exists as a best-effort function. Any items which are unknown or  in the case that the owner account does not have reservable funds to pay for a  deposit increase are ignored. Generally the owner isn't going to call this on items  whose existing deposit is less than the refreshed deposit as it would only cost them,  so it's of little consequence. \n\n   It will still return an error in the case that the collection is unknown of the signer  is not permitted to call it. \n\n   Weight: `O(items.len())` \n \n### setAcceptOwnership(maybe_collection: `Option<u32>`)\n- **interface**: `api.tx.uniques.setAcceptOwnership`\n- **summary**:    Set (or reset) the acceptance of ownership for a particular account. \n\n   Origin must be `Signed` and if `maybe_collection` is `Some`, then the signer must have a  provider reference. \n\n   - `maybe_collection`: The identifier of the collection whose ownership the signer is  willing to accept, or if `None`, an indication that the signer is willing to accept no  ownership transferal. \n\n   Emits `OwnershipAcceptanceChanged`. \n \n### setAttribute(collection: `u32`, maybe_item: `Option<u32>`, key: `Bytes`, value: `Bytes`)\n- **interface**: `api.tx.uniques.setAttribute`\n- **summary**:    Set an attribute for a collection or item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Owner of the  `collection`. \n\n   If the origin is Signed, then funds of signer are reserved according to the formula:  `MetadataDepositBase + DepositPerByte * (key.len + value.len)` taking into  account any already reserved funds. \n\n   - `collection`: The identifier of the collection whose item's metadata to set. \n\n  - `maybe_item`: The identifier of the item whose metadata to set.\n\n  - `key`: The key of the attribute.\n\n  - `value`: The value to which to set the attribute.\n\n   Emits `AttributeSet`. \n\n   Weight: `O(1)` \n \n### setCollectionMaxSupply(collection: `u32`, max_supply: `u32`)\n- **interface**: `api.tx.uniques.setCollectionMaxSupply`\n- **summary**:    Set the maximum amount of items a collection could have. \n\n   Origin must be either `ForceOrigin` or `Signed` and the sender should be the Owner of  the `collection`. \n\n   Note: This function can only succeed once per collection. \n\n   - `collection`: The identifier of the collection to change. \n\n  - `max_supply`: The maximum amount of items a collection could have.\n\n   Emits `CollectionMaxSupplySet` event when successful. \n \n### setCollectionMetadata(collection: `u32`, data: `Bytes`, is_frozen: `bool`)\n- **interface**: `api.tx.uniques.setCollectionMetadata`\n- **summary**:    Set the metadata for a collection. \n\n   Origin must be either `ForceOrigin` or `Signed` and the sender should be the Owner of  the `collection`. \n\n   If the origin is `Signed`, then funds of signer are reserved according to the formula:  `MetadataDepositBase + DepositPerByte * data.len` taking into  account any already reserved funds. \n\n   - `collection`: The identifier of the item whose metadata to update. \n\n  - `data`: The general information of this item. Limited in length by `StringLimit`.\n\n  - `is_frozen`: Whether the metadata should be frozen against further changes.\n\n   Emits `CollectionMetadataSet`. \n\n   Weight: `O(1)` \n \n### setMetadata(collection: `u32`, item: `u32`, data: `Bytes`, is_frozen: `bool`)\n- **interface**: `api.tx.uniques.setMetadata`\n- **summary**:    Set the metadata for an item. \n\n   Origin must be either `ForceOrigin` or Signed and the sender should be the Owner of the  `collection`. \n\n   If the origin is Signed, then funds of signer are reserved according to the formula:  `MetadataDepositBase + DepositPerByte * data.len` taking into  account any already reserved funds. \n\n   - `collection`: The identifier of the collection whose item's metadata to set. \n\n  - `item`: The identifier of the item whose metadata to set.\n\n  - `data`: The general information of this item. Limited in length by `StringLimit`.\n\n  - `is_frozen`: Whether the metadata should be frozen against further changes.\n\n   Emits `MetadataSet`. \n\n   Weight: `O(1)` \n \n### setPrice(collection: `u32`, item: `u32`, price: `Option<u128>`, whitelisted_buyer: `Option<MultiAddress>`)\n- **interface**: `api.tx.uniques.setPrice`\n- **summary**:    Set (or reset) the price for an item. \n\n   Origin must be Signed and must be the owner of the asset `item`. \n\n   - `collection`: The collection of the item. \n\n  - `item`: The item to set the price for.\n\n  - `price`: The price for the item. Pass `None`, to reset the price.\n\n  - `buyer`: Restricts the buy operation to a specific account.\n\n   Emits `ItemPriceSet` on success if the price is not `None`.  Emits `ItemPriceRemoved` on success if the price is `None`. \n \n### setTeam(collection: `u32`, issuer: `MultiAddress`, admin: `MultiAddress`, freezer: `MultiAddress`)\n- **interface**: `api.tx.uniques.setTeam`\n- **summary**:    Change the Issuer, Admin and Freezer of a collection. \n\n   Origin must be Signed and the sender should be the Owner of the `collection`. \n\n   - `collection`: The collection whose team should be changed. \n\n  - `issuer`: The new Issuer of this collection.\n\n  - `admin`: The new Admin of this collection.\n\n  - `freezer`: The new Freezer of this collection.\n\n   Emits `TeamChanged`. \n\n   Weight: `O(1)` \n \n### thaw(collection: `u32`, item: `u32`)\n- **interface**: `api.tx.uniques.thaw`\n- **summary**:    Re-allow unprivileged transfer of an item. \n\n   Origin must be Signed and the sender should be the Freezer of the `collection`. \n\n   - `collection`: The collection of the item to be thawed. \n\n  - `item`: The item of the item to be thawed.\n\n   Emits `Thawed`. \n\n   Weight: `O(1)` \n \n### thawCollection(collection: `u32`)\n- **interface**: `api.tx.uniques.thawCollection`\n- **summary**:    Re-allow unprivileged transfers for a whole collection. \n\n   Origin must be Signed and the sender should be the Admin of the `collection`. \n\n   - `collection`: The collection to be thawed. \n\n   Emits `CollectionThawed`. \n\n   Weight: `O(1)` \n \n### transfer(collection: `u32`, item: `u32`, dest: `MultiAddress`)\n- **interface**: `api.tx.uniques.transfer`\n- **summary**:    Move an item from the sender account to another. \n\n   This resets the approved account of the item. \n\n   Origin must be Signed and the signing account must be either: \n\n  - the Admin of the `collection`;\n\n  - the Owner of the `item`;\n\n  - the approved delegate for the `item` (in this case, the approval is reset).\n\n   Arguments: \n\n  - `collection`: The collection of the item to be transferred.\n\n  - `item`: The item of the item to be transferred.\n\n  - `dest`: The account to receive ownership of the item.\n\n   Emits `Transferred`. \n\n   Weight: `O(1)` \n \n### transferOwnership(collection: `u32`, new_owner: `MultiAddress`)\n- **interface**: `api.tx.uniques.transferOwnership`\n- **summary**:    Change the Owner of a collection. \n\n   Origin must be Signed and the sender should be the Owner of the `collection`. \n\n   - `collection`: The collection whose owner should be changed. \n\n  - `owner`: The new Owner of this collection. They must have called `set_accept_ownership` with `collection` in order for this operation to succeed. \n\n   Emits `OwnerChanged`. \n\n   Weight: `O(1)` \n\n___\n\n\n## utility\n \n### asDerivative(index: `u16`, call: `Call`)\n- **interface**: `api.tx.utility.asDerivative`\n- **summary**:    Send a call through an indexed pseudonym of the sender. \n\n   Filter from origin are passed along. The call will be dispatched with an origin which  use the same filter as the origin of this call. \n\n   NOTE: If you need to ensure that any account-based filtering is not honored (i.e.  because you expect `proxy` to have been used prior in the call stack and you do not want  the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1`  in the Multisig pallet instead. \n\n   NOTE: Prior to version *12, this was called `as_limited_sub`. \n\n   The dispatch origin for this call must be _Signed_. \n \n### batch(calls: `Vec<Call>`)\n- **interface**: `api.tx.utility.batch`\n- **summary**:    Send a batch of dispatch calls. \n\n   May be called from any origin except `None`. \n\n   - `calls`: The calls to be dispatched from the same origin. The number of call must not  exceed the constant: `batched_calls_limit` (available in constant metadata). \n\n   If origin is root then the calls are dispatched without checking origin filter. (This  includes bypassing `frame_system::Config::BaseCallFilter`). \n\n   #### Complexity \n\n  - O(C) where C is the number of calls to be batched.\n\n   This will return `Ok` in all circumstances. To determine the success of the batch, an  event is deposited. If a call failed and the batch was interrupted, then the  `BatchInterrupted` event is deposited, along with the number of successful calls made  and the error of the failed call. If all were successful, then the `BatchCompleted`  event is deposited. \n \n### batchAll(calls: `Vec<Call>`)\n- **interface**: `api.tx.utility.batchAll`\n- **summary**:    Send a batch of dispatch calls and atomically execute them.  The whole transaction will rollback and fail if any of the calls failed. \n\n   May be called from any origin except `None`. \n\n   - `calls`: The calls to be dispatched from the same origin. The number of call must not  exceed the constant: `batched_calls_limit` (available in constant metadata). \n\n   If origin is root then the calls are dispatched without checking origin filter. (This  includes bypassing `frame_system::Config::BaseCallFilter`). \n\n   #### Complexity \n\n  - O(C) where C is the number of calls to be batched.\n \n### dispatchAs(as_origin: `KitchensinkRuntimeOriginCaller`, call: `Call`)\n- **interface**: `api.tx.utility.dispatchAs`\n- **summary**:    Dispatches a function call with a provided origin. \n\n   The dispatch origin for this call must be _Root_. \n\n   #### Complexity \n\n  - O(1).\n \n### dispatchAsFallible(as_origin: `KitchensinkRuntimeOriginCaller`, call: `Call`)\n- **interface**: `api.tx.utility.dispatchAsFallible`\n- **summary**:    Dispatches a function call with a provided origin. \n\n   Almost the same as [`Pallet::dispatch_as`] but forwards any error of the inner call. \n\n   The dispatch origin for this call must be _Root_. \n \n### forceBatch(calls: `Vec<Call>`)\n- **interface**: `api.tx.utility.forceBatch`\n- **summary**:    Send a batch of dispatch calls.  Unlike `batch`, it allows errors and won't interrupt. \n\n   May be called from any origin except `None`. \n\n   - `calls`: The calls to be dispatched from the same origin. The number of call must not  exceed the constant: `batched_calls_limit` (available in constant metadata). \n\n   If origin is root then the calls are dispatch without checking origin filter. (This  includes bypassing `frame_system::Config::BaseCallFilter`). \n\n   #### Complexity \n\n  - O(C) where C is the number of calls to be batched.\n \n### ifElse(main: `Call`, fallback: `Call`)\n- **interface**: `api.tx.utility.ifElse`\n- **summary**:    Dispatch a fallback call in the event the main call fails to execute.  May be called from any origin except `None`. \n\n   This function first attempts to dispatch the `main` call.  If the `main` call fails, the `fallback` is attempted.  if the fallback is successfully dispatched, the weights of both calls  are accumulated and an event containing the main call error is deposited. \n\n   In the event of a fallback failure the whole call fails  with the weights returned. \n\n   - `main`: The main call to be dispatched. This is the primary action to execute. \n\n  - `fallback`: The fallback call to be dispatched in case the `main` call fails.\n\n   #### Dispatch Logic \n\n  - If the origin is `root`, both the main and fallback calls are executed without applying any origin filters. \n\n  - If the origin is not `root`, the origin filter is applied to both the `main` and `fallback` calls. \n\n   #### Use Case \n\n  - Some use cases might involve submitting a `batch` type call in either main, fallback or both. \n \n### withWeight(call: `Call`, weight: `SpWeightsWeightV2Weight`)\n- **interface**: `api.tx.utility.withWeight`\n- **summary**:    Dispatch a function call with a specified weight. \n\n   This function does not check the weight of the call, and instead allows the  Root origin to specify the weight of the call. \n\n   The dispatch origin for this call must be _Root_. \n\n___\n\n\n## vesting\n \n### forceRemoveVestingSchedule(target: `MultiAddress`, schedule_index: `u32`)\n- **interface**: `api.tx.vesting.forceRemoveVestingSchedule`\n- **summary**:    Force remove a vesting schedule \n\n   The dispatch origin for this call must be _Root_. \n\n   - `target`: An account that has a vesting schedule \n\n  - `schedule_index`: The vesting schedule index that should be removed\n \n### forceVestedTransfer(source: `MultiAddress`, target: `MultiAddress`, schedule: `PalletVestingVestingInfo`)\n- **interface**: `api.tx.vesting.forceVestedTransfer`\n- **summary**:    Force a vested transfer. \n\n   The dispatch origin for this call must be _Root_. \n\n   - `source`: The account whose funds should be transferred. \n\n  - `target`: The account that should be transferred the vested funds.\n\n  - `schedule`: The vesting schedule attached to the transfer.\n\n   Emits `VestingCreated`. \n\n   NOTE: This will unlock all schedules through the current block. \n\n   #### Complexity \n\n  - `O(1)`.\n \n### mergeSchedules(schedule1_index: `u32`, schedule2_index: `u32`)\n- **interface**: `api.tx.vesting.mergeSchedules`\n- **summary**:    Merge two vesting schedules together, creating a new vesting schedule that unlocks over  the highest possible start and end blocks. If both schedules have already started the  current block will be used as the schedule start; with the caveat that if one schedule  is finished by the current block, the other will be treated as the new merged schedule,  unmodified. \n\n   NOTE: If `schedule1_index == schedule2_index` this is a no-op.  NOTE: This will unlock all schedules through the current block prior to merging.  NOTE: If both schedules have ended by the current block, no new schedule will be created  and both will be removed. \n\n   Merged schedule attributes: \n\n  - `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block, current_block)`. \n\n  - `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`.\n\n  - `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`.\n\n   The dispatch origin for this call must be _Signed_. \n\n   - `schedule1_index`: index of the first schedule to merge. \n\n  - `schedule2_index`: index of the second schedule to merge.\n \n### vest()\n- **interface**: `api.tx.vesting.vest`\n- **summary**:    Unlock any vested funds of the sender account. \n\n   The dispatch origin for this call must be _Signed_ and the sender must have funds still  locked under this pallet. \n\n   Emits either `VestingCompleted` or `VestingUpdated`. \n\n   #### Complexity \n\n  - `O(1)`.\n \n### vestOther(target: `MultiAddress`)\n- **interface**: `api.tx.vesting.vestOther`\n- **summary**:    Unlock any vested funds of a `target` account. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `target`: The account whose vested funds should be unlocked. Must have funds still  locked under this pallet. \n\n   Emits either `VestingCompleted` or `VestingUpdated`. \n\n   #### Complexity \n\n  - `O(1)`.\n \n### vestedTransfer(target: `MultiAddress`, schedule: `PalletVestingVestingInfo`)\n- **interface**: `api.tx.vesting.vestedTransfer`\n- **summary**:    Create a vested transfer. \n\n   The dispatch origin for this call must be _Signed_. \n\n   - `target`: The account receiving the vested funds. \n\n  - `schedule`: The vesting schedule attached to the transfer.\n\n   Emits `VestingCreated`. \n\n   NOTE: This will unlock all schedules through the current block. \n\n   #### Complexity \n\n  - `O(1)`.\n\n___\n\n\n## voterList\n \n### putInFrontOf(lighter: `MultiAddress`)\n- **interface**: `api.tx.voterList.putInFrontOf`\n- **summary**:    Move the caller's Id directly in front of `lighter`. \n\n   The dispatch origin for this call must be _Signed_ and can only be called by the Id of  the account going in front of `lighter`. Fee is paid by the origin under all  circumstances. \n\n   Only works if: \n\n   - both nodes are within the same bag, \n\n  - and `origin` has a greater `Score` than `lighter`.\n \n### putInFrontOfOther(heavier: `MultiAddress`, lighter: `MultiAddress`)\n- **interface**: `api.tx.voterList.putInFrontOfOther`\n- **summary**:    Same as [`Pallet::put_in_front_of`], but it can be called by anyone. \n\n   Fee is paid by the origin under all circumstances. \n \n### rebag(dislocated: `MultiAddress`)\n- **interface**: `api.tx.voterList.rebag`\n- **summary**:    Declare that some `dislocated` account has, through rewards or penalties, sufficiently  changed its score that it should properly fall into a different bag than its current  one. \n\n   Anyone can call this function about any potentially dislocated account. \n\n   Will always update the stored score of `dislocated` to the correct score, based on  `ScoreProvider`. \n\n   If `dislocated` does not exists, it returns an error. \n\n___\n\n\n## whitelist\n \n### dispatchWhitelistedCall(call_hash: `H256`, call_encoded_len: `u32`, call_weight_witness: `SpWeightsWeightV2Weight`)\n- **interface**: `api.tx.whitelist.dispatchWhitelistedCall`\n \n### dispatchWhitelistedCallWithPreimage(call: `Call`)\n- **interface**: `api.tx.whitelist.dispatchWhitelistedCallWithPreimage`\n \n### removeWhitelistedCall(call_hash: `H256`)\n- **interface**: `api.tx.whitelist.removeWhitelistedCall`\n \n### whitelistCall(call_hash: `H256`)\n- **interface**: `api.tx.whitelist.whitelistCall`"}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#polkadot", "page_title": "Frequently Asked Questions (FAQs)", "index": 0, "depth": 2, "title": "Polkadot", "anchor": "polkadot", "start_char": 400, "end_char": 413, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot"}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-is-the-minimum-amount-of-ksm-dot-i-can-have-in-my-account", "page_title": "Frequently Asked Questions (FAQs)", "index": 1, "depth": 3, "title": "What is the minimum amount of KSM / DOT I can have in my account?", "anchor": "what-is-the-minimum-amount-of-ksm-dot-i-can-have-in-my-account", "start_char": 413, "end_char": 598, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What is the minimum amount of KSM / DOT I can have in my account?\n\nPlease see information about [Existential Deposits](../learn/learn-accounts.md#existential-deposit-and-reaping)."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#polkadot-roadmap", "page_title": "Frequently Asked Questions (FAQs)", "index": 2, "depth": 3, "title": "Polkadot Roadmap", "anchor": "polkadot-roadmap", "start_char": 598, "end_char": 756, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot Roadmap\n\nFor more information on the Polkadot roadmap please visit the\n[official Polkadot website](https://www.opengov.watch/polkadot-roadmap)."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#polkadot-launch", "page_title": "Frequently Asked Questions (FAQs)", "index": 3, "depth": 3, "title": "Polkadot Launch", "anchor": "polkadot-launch", "start_char": 756, "end_char": 1721, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot Launch\n\nThe Genesis block of the Polkadot network was produced on May 26, 2020 at 15:36:21 UTC, as a Proof\nof Authority (PoA) network, with governance controlled by the single Sudo (super-user) account.\nDuring this time, validators started joining the network and signaling their intention to\nparticipate in consensus.\n\nThe network evolved to become a Proof of Stake (PoS) network on June 18, 2020. With the chain\nsecured by the decentralized community of validators, the Sudo module was removed on July 20, 2020,\ntransitioning the governance of the chain into the hands of the token (DOT) holders. This is the\npoint where Polkadot became decentralized.\n\nThe final step of the transition to full-functioning Polkadot was the enabling of transfer\nfunctionality, which occurred on Polkadot at block number 1_205_128 on August 18, 2020, at 16:39\nUTC.\n\nOn August 21, 2020, Redenomination of DOT occurred. From this date, one DOT (old) equals 100 new\nDOT."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#why-polkadot-targets-1000-validators-while-other-projects-have-hundreds-of-thousands", "page_title": "Frequently Asked Questions (FAQs)", "index": 4, "depth": 3, "title": "Why Polkadot targets 1000 validators while other projects have hundreds of thousands?", "anchor": "why-polkadot-targets-1000-validators-while-other-projects-have-hundreds-of-thousands", "start_char": 1721, "end_char": 2986, "estimated_token_count": 222, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Why Polkadot targets 1000 validators while other projects have hundreds of thousands?\n\nPolkadot's goal to have 1000 validators is set to be something that is practically achievable with high confidence of good performance in a live environment. Furthermore, validators in Polkadot are not the only stakers, and if we consider the number of stakers that can be possible on Polkadot the number can scale up to hundreds of thousands.  Upon improvements, such as implementing signature aggregation for finalization messages, the number of validators can reasonably scale up.\n\nAdditionally, other projects sometimes have a different definition of _validator_ that approximates more closely to remote signing keys without the full operation of a validating node. On Polkadot, each validator runs their own validating node and verifies the relay chain, voting on finality, producing blocks in their decided slots, and verifying parachain state transitions. Other projects may consider validators and \"validating nodes\" as separate entities.\n\nFinally, individuals may participate in the block production process indirectly by\n[nominating](../learn/learn-nominator.md) validators. In this way, individuals who are not running a\nnode can still share in staking rewards."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-is-the-block-time-of-the-relay-chain", "page_title": "Frequently Asked Questions (FAQs)", "index": 5, "depth": 3, "title": "What is the block time of the relay chain?", "anchor": "what-is-the-block-time-of-the-relay-chain", "start_char": 2986, "end_char": 3129, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What is the block time of the relay chain?\n\nBoth the Kusama and Polkadot networks are operating at a rate of one block every six\nseconds."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#does-polkadot-support-smart-contracts", "page_title": "Frequently Asked Questions (FAQs)", "index": 6, "depth": 3, "title": "Does Polkadot support smart contracts?", "anchor": "does-polkadot-support-smart-contracts", "start_char": 3129, "end_char": 3633, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Does Polkadot support smart contracts?\n\nPolkadot will support Solidity smart contracts by late 2025. Smart contracts deployment is already possible on Kusama and testnets. There are also numerous parachains that support EVM and Wasm smart contracts.\n It's possible for parachains to enable smart contract functionality and then\nbenefit from the security and interoperability features of Polkadot. Additionally, existing smart\ncontract chains can connect to Polkadot as a parachain, or via a bridge."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#how-does-the-polkadot-relay-chain-connect-to-external-chains-in-the-ecosystem", "page_title": "Frequently Asked Questions (FAQs)", "index": 7, "depth": 3, "title": "How does the Polkadot relay chain connect to external chains in the ecosystem?", "anchor": "how-does-the-polkadot-relay-chain-connect-to-external-chains-in-the-ecosystem", "start_char": 3633, "end_char": 4223, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How does the Polkadot relay chain connect to external chains in the ecosystem?\n\nOne of the cornerstone interoperability technologies being researched and developed for deployment\non Polkadot is cross-chain [bridges](../learn/learn-bridges.md). Bridges come in a variety of\nflavors with varying levels of trust associated with them. Polkadot is predominantly researching the\ntrust-minimized flavor that imposes economic costs on the operators of the bridge, and therefore\nmakes it economically secure. Bridge efforts are being worked on in concert with other projects in\nthe ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-is-polkadots-transactions-per-second-tps", "page_title": "Frequently Asked Questions (FAQs)", "index": 8, "depth": 3, "title": "What is Polkadot's Transactions Per Second (TPS)?", "anchor": "what-is-polkadots-transactions-per-second-tps", "start_char": 4223, "end_char": 5778, "estimated_token_count": 338, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What is Polkadot's Transactions Per Second (TPS)?\n\nPolkadot is a heterogeneous sharded network comprising a relay chain and numerous parachains, which\nare all individual blockchains built on [Substrate](../../reference/parachains/index.md#substrate) executing in parallel.\nHence, the Transactions Per Second (TPS) of Polkadot is a number that encompasses all the\ntransactions on the relay chain as well as parachains. As the transactions on these Substrate-based\nblockchains are [weights based](../../reference/parachains/blocks-transactions-fees/fees.md#transactions-weights-and-fees), it makes sense to\nuse TPS as a measure for the network performance if all the transactions carry the same weight.\nA performance benchmark test performed in 2024 (dubbed [\"The Spammening\"](https://www.distractive.xyz/case-studies/the-spammening)) demonstrated that Polkadot is capable of at least 623,000 TPS. The test delivered 143,000 TPS when utilizing only 23% of network cores on Kusama, Polkadot's live sister network that shares its codebase.\n\nIt is essential to realize that TPS is inherently a subjective measurement with numerous factors\nthat can contribute to it. It's hard to gauge the usefulness of TPS in isolation (when compared to\nother chains), as it depends on what a transaction does for a particular network. To view how\nPolkadot measures TPS see the Polkadot sTPS\n([Standard Transaction Per Second](https://github.com/paritytech/polkadot-stps/blob/main/docs/introduction.md))\nto consider precisely how benchmarking was performed for Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-is-the-inflation-rate-of-the-dot", "page_title": "Frequently Asked Questions (FAQs)", "index": 9, "depth": 3, "title": "What is the inflation rate of the DOT?", "anchor": "what-is-the-inflation-rate-of-the-dot", "start_char": 5778, "end_char": 6095, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What is the inflation rate of the DOT?\n\nThe inflation rate is approximately 120,000,000 DOT per year.\n\nThe 85% of inflation is rewarded to validators for performing their duties, while the 15% goes to\nthe treasury. Please see the article on [inflation](../learn/learn-DOT.md#dot-inflation) for more\ninformation."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#transfer-fees", "page_title": "Frequently Asked Questions (FAQs)", "index": 10, "depth": 3, "title": "Transfer Fees", "anchor": "transfer-fees", "start_char": 6095, "end_char": 6549, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Transfer Fees\n\nIt is important to note that the cost of transferring DOT is dynamic. Specifically, fee calculation follows\nthe following formula:\n\n```\nbase_fee + (tx_length * length_fee) + WeightToFee(weight)\n```\n\nThe base fee for Polkadot is 0.001 DOT.\n\nPlease see the\n[fee calculation](../../reference/parachains/blocks-transactions-fees/fees.md#how-fees-are-calculated) page in\nthe Polkadot Developer documentation for more detailed information."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#consensus", "page_title": "Frequently Asked Questions (FAQs)", "index": 11, "depth": 2, "title": "Consensus", "anchor": "consensus", "start_char": 6549, "end_char": 6563, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus"}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#why-do-we-need-consensus", "page_title": "Frequently Asked Questions (FAQs)", "index": 12, "depth": 3, "title": "Why do we need Consensus?", "anchor": "why-do-we-need-consensus", "start_char": 6563, "end_char": 7319, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Why do we need Consensus?\n\nConsensus is a method for coming to agreement over a shared state. In order for the state of the\nblockchain to continue to build and move forward, all nodes in the network must agree and come to\nconsensus. It is the way that the nodes in a decentralized network are able to stay synced with each\nother. Without consensus for the decentralized network of nodes in a blockchain, there is no way to\nensure that the state one node believes is true will be shared by the other nodes. Consensus aims to\nprovide the _objective_ view of the state amid participants who each have their own _subjective_\nviews of the network. It is the process by which these nodes communicate and come to agreement, and\nare able to build new blocks."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-are-pow-and-pos", "page_title": "Frequently Asked Questions (FAQs)", "index": 13, "depth": 3, "title": "What are PoW and PoS?", "anchor": "what-are-pow-and-pos", "start_char": 7319, "end_char": 8177, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What are PoW and PoS?\n\nProof of Work (PoW) and Proof of Stake (PoS) have been inaccurately used as short hand to refer to\nconsensus mechanisms of blockchains, but that does not capture the full picture. PoW is the method\nfor agreeing on a block author and part of the fuller\n[Nakamoto consensus](../learn/learn-consensus.md#nakamoto-consensus) that also encompasses a chain\nselection algorithm (longest chain rule in Bitcoin). Similarly, PoS is a set of rules for selecting\nthe validator set and does not specify a chain selection rule or how a chain might reach finality.\nPoS algorithms have traditionally been paired with an algorithm for coming to Byzantine agreement\nbetween nodes. For example, [Tendermint](../learn/learn-comparisons-cosmos.md) is a practical\nByzantine fault tolerant algorithm that uses PoS as its validator set selection method."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#why-not-proof-of-work", "page_title": "Frequently Asked Questions (FAQs)", "index": 14, "depth": 3, "title": "Why not Proof of Work?", "anchor": "why-not-proof-of-work", "start_char": 8177, "end_char": 8472, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Why not Proof of Work?\n\nAlthough simple and effective in coming to a decentralized consensus on the next block producer,\nproof of work with Nakamoto consensus consumes an incredible amount of energy, has no economic or\nprovable finality, and has no effective strategy in resisting cartels."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#validators", "page_title": "Frequently Asked Questions (FAQs)", "index": 15, "depth": 2, "title": "Validators", "anchor": "validators", "start_char": 8472, "end_char": 8487, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Validators"}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#how-do-i-apply-to-be-a-validator", "page_title": "Frequently Asked Questions (FAQs)", "index": 16, "depth": 3, "title": "How do I apply to be a validator?", "anchor": "how-do-i-apply-to-be-a-validator", "start_char": 8487, "end_char": 9656, "estimated_token_count": 255, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How do I apply to be a validator?\n\nThere is no central authority that decides on validators, so there is not per se an _application_\nthat you can fill out. Registering as a validator is permissionless; in order to become one you must\nonly set up a validator node and mark your intention to validate on chain. For detailed instruction\non how to do validate you can consult the\n[validator guide](../../node-infrastructure/run-a-validator/requirements.md#running-a-validator).\n\nHowever, once you've set up a validator and have registered your intention it does not mean that you\nwill be included in the _active set_ right away. The validators are elected to the active set based\non the results of an election algorithm known as [Phragmén's method](../learn/learn-phragmen.md).\nPhragmén's method tries to accomplish two goals: 1) select `n` members from a larger set based on\nstake-weighted votes and 2) equalize the stake backing each validator as much as possible.\n\nYou will likely want to campaign your validator to the community in order to get more backing. You\nare looking for _nominators_ that will put up their tokens to increase the stake for your validator."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#how-are-validators-rewarded", "page_title": "Frequently Asked Questions (FAQs)", "index": 17, "depth": 3, "title": "How are validators rewarded?", "anchor": "how-are-validators-rewarded", "start_char": 9656, "end_char": 10062, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How are validators rewarded?\n\nValidators are rewarded from the [inflation of the relay chain](../learn/learn-DOT.md#dot-inflation),\n[transaction fees](../learn/learn-transactions.md#transaction-fees), and tips. However, they only\ntake a percentage of the former two. More details can be read on the page for\n[validator payouts](../../node-infrastructure/run-a-validator/staking-mechanics/rewards.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator", "page_title": "Frequently Asked Questions (FAQs)", "index": 18, "depth": 3, "title": "What is the minimum stake necessary to be elected as an active validator?", "anchor": "what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator", "start_char": 10062, "end_char": 11273, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What is the minimum stake necessary to be elected as an active validator?\n\nThe minimum stake that is necessary to be elected as an active validator is dynamic and can change\nover time. It depends not only on how much stake is being put behind each validator, but also the\nsize of the active set and how many validators are waiting in the pool.\n\nThere are a few ways to estimate the minimum stake.\n\nOne way can be to navigate to the\n[Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/all-validators). The value at the top of the screen saying \"lowest/avg staked\" is the least staked validator. You need at least this much + 1 to enter the set.\n\nYou can also use some tools some to perform estimations.\n\n- [Offline Election](https://github.com/paritytech/substrate-debug-kit/tree/master/offline-election)\n  can provide exact results of running an election on the current set of validators using the same\n  Rust code that is ran in Polkadot.\n\n- [Validator stats script](https://github.com/w3f/validator-stats) can give you an estimate that is\n  based on the currently elected set, as well as some statistics about Kusama validators."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#governance", "page_title": "Frequently Asked Questions (FAQs)", "index": 19, "depth": 2, "title": "Governance", "anchor": "governance", "start_char": 11273, "end_char": 11288, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Governance"}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-prevents-polkadot-governance-from-failing", "page_title": "Frequently Asked Questions (FAQs)", "index": 20, "depth": 3, "title": "What prevents Polkadot governance from failing?", "anchor": "what-prevents-polkadot-governance-from-failing", "start_char": 11288, "end_char": 12163, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What prevents Polkadot governance from failing?\n\nExamples of [Polkadot's governance](../learn/learn-polkadot-opengov.md) can be found in the runtime upgrades\nthat have successfully taken place through on the testnets, Kusama, and Polkadot itself.\n\nIt is fair to say that the field of on-chain blockchain governance is still new, and no one can\nclaim to know exactly what the optimal version of on-chain governance is yet. However, Polkadot\ntakes a brave step forward in pioneering thought-through mechanisms for evolving a blockchain.\n\nBlockchains need a method to adapt and evolve. Therefore, an on-chain governance system was\nnecessary for the long-term success of Polkadot. Ultimately, it is the token holders that are\nresponsible for preventing Polkadot's governance from failing by using their economic value and\nconviction to sway the progression of the protocol."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#what-prevents-polkadot-governance-from-becoming-plutocratic", "page_title": "Frequently Asked Questions (FAQs)", "index": 21, "depth": 3, "title": "What prevents Polkadot governance from becoming plutocratic?", "anchor": "what-prevents-polkadot-governance-from-becoming-plutocratic", "start_char": 12163, "end_char": 13469, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What prevents Polkadot governance from becoming plutocratic?\n\nA savvy reader might have noticed that the answer to the previous question endowed the token holder\nwith the ultimate responsibility to ensure that Polkadot's governance does not fail. By following\nthe train of this assertion, one might assume that Polkadot's governance is susceptible to becoming\nruled by a few large token holders (called _whales_ in trading parlance) and therefore become a mere\nplutocracy (rule of the rich).\n\nThere are several other mechanisms that are built-in to the governance system to resist this\nplutocratic tendency. One of these mechanisms is called conviction voting, and imbues greater voting\npower to token holders who are willing to lock their tokens on the protocol for longer lengths of\ntime. Longer lock-ups display _conviction_ in a vote. Conviction voting could allow a highly\ndetermined minority to overrule the vote of an apathetic majority in certain situations. Another\nmechanism is known as Adaptive Quorum Biasing. This makes proposals have a varying threshold for\napproval or rejection based on what part of the governance protocol the proposal originated in. For\ndetails on the subtleties of Polkadot's governance system, please see the\n[governance page](../learn/learn-polkadot-opengov.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#parachains", "page_title": "Frequently Asked Questions (FAQs)", "index": 22, "depth": 2, "title": "Parachains", "anchor": "parachains", "start_char": 13469, "end_char": 13484, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachains"}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#how-do-parachain-economics-work", "page_title": "Frequently Asked Questions (FAQs)", "index": 23, "depth": 3, "title": "How do parachain economics work?", "anchor": "how-do-parachain-economics-work", "start_char": 13484, "end_char": 14122, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How do parachain economics work?\n\nParachains have the flexibility to implement their own monetary system or incentive structure for\ncollators. However, this is not strictly necessary. Since the collator's job is to continue to give\nrecent state transitions to the validators on the relay chain who validate each transition, the\nsecurity of the parachain and the Polkadot network is completely separate from parachain economics.\nParachains need collators to continue to progress, so it wouldn't be unreasonable to see them\nincentivize collator nodes in some way, but the specific mechanism is completely up to parachain\nimplementers."}
{"source": "polkadot-docs", "page_id": "wiki-general-faq", "url": "https://developer.polkadot.com/wiki/general/faq/#are-parachains-ephemeral-what-happens-when-a-parachain-fails-to-renew-its-coretime", "page_title": "Frequently Asked Questions (FAQs)", "index": 24, "depth": 3, "title": "Are parachains ephemeral? What happens when a parachain fails to renew its coretime?", "anchor": "are-parachains-ephemeral-what-happens-when-a-parachain-fails-to-renew-its-coretime", "start_char": 14122, "end_char": 15279, "estimated_token_count": 265, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dae18eafa36fea1f203857e5457a565784f76423f2b5b98e6ce0598c983ca113", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Are parachains ephemeral? What happens when a parachain fails to renew its coretime?\n\nParachains are not ephemeral. As long as someone is keeping the data for a parachain, the parachain\ncan move between being a parachain, an\n[on-demand parachain](../learn/learn-parachains.md#on-demand-parachains), or a separate sovereign\nchain at different points of its lifetime. Especially with on-demand parachains, parachains can\nproduce blocks when their usage and throughput makes it necessary.\n\nWhen a parachain could not renew its bulk coretime and needs to keep its chain live, there are a\ncouple of options to consider. One option is to explore secondary coretime marketplaces on\n[Lastic](https://www.lastic.xyz/) or [RegionX](https://hub.regionx.tech/?network=polkadot). The\nother option is run as an on-demand parachain, and purchase coretime to produce one block at a time.\nOn-demand parachains are still secured by the relay chain but don't need to hold a core and can\nproduce a block when it's economically feasible for them. For more information, please refer to the\n[parachains page](../learn/learn-parachains.md#parachains-vs-on-demand-parachains)."}
{"source": "polkadot-docs", "page_id": "wiki-general-funding", "url": "https://developer.polkadot.com/wiki/general/funding/#funding-opportunities-overview", "page_title": "Funding Opportunities", "index": 0, "depth": 2, "title": "Funding Opportunities Overview", "anchor": "funding-opportunities-overview", "start_char": 436, "end_char": 1461, "estimated_token_count": 304, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6516567c322ddd4238f4790fbd239a1f5132def48767a90fc0c73856604bcd1b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Funding Opportunities Overview\n\n```mermaid\nflowchart LR\n    A(Project Focus)\n    A -->|Development| B[Stage of Development]\n    A -->|Research| C[Strategic Funding]\n    A -->|Other| D[Business model exists]\n    B -->|Existing POC| E[Treasury]\n    B -->|No POC| F[Strategic Funding]\n    D -->|No| H[Treasury]\n    D -->|Yes| J[Ecosystem Funds]\n    style C stroke:#e83e8c,stroke-width:2px,stroke-dasharray: 5 5\n    style E stroke:#e83e8c,stroke-width:2px,stroke-dasharray: 5 5\n    style F stroke:#e83e8c,stroke-width:2px,stroke-dasharray: 5 5\n    style H stroke:#e83e8c,stroke-width:2px,stroke-dasharray: 5 5\n    style J stroke:#e83e8c,stroke-width:2px,stroke-dasharray: 5 5\n    click C \"https://grants.web3.foundation/docs/Process/how-to-apply\" \"Apply now\"\n    click F \"https://grants.web3.foundation/docs/Process/how-to-apply\" \"Apply now\"\n    click E \"/wiki/learn/learn-polkadot-opengov-treasury/\" _self\n    click H \"/wiki/learn/learn-polkadot-opengov-treasury/\" _self\n    click J \"/wiki/general/ecosystem-funds/\" _self\n```"}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#what-is-polkadot", "page_title": "Getting Started", "index": 0, "depth": 2, "title": "What is Polkadot?", "anchor": "what-is-polkadot", "start_char": 1, "end_char": 3030, "estimated_token_count": 726, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## What is Polkadot?\n\n!!!info \"Explore Polkadot with [user-friendly wallets](../learn/how-to/where-to-store-dot.md).\"\n\nPolkadot is a **blockchain-based multi-core decentralized cloud computer**. Let's break it down bit by bit:\n\n- **blockchain-based:** Polkadot at its heart has a blockchain that permanently and immutably stores sensitive information about the protocol and applications running on top of it\n- **multi-core:** Like traditional computers, Polkadot has a virtual CPU with multiple virtual cores\n- **decentralized cloud computer:** Instead of being run by a single entity, Polkadot is run by real computers owned by different operators (validators) scattered around the globe, part of a decentralized peer-to-peer network\n\n**Polkadot is a Web3 service provider**: it provides secure and resilient computation and interoperability for any application connected to its network. Applications can be fully-fledged blockchains deployed as rollups on Polkadot (also known as [parachains](../learn/learn-parachains.md)). Instead of bootstrapping their security, rollups can connect to Polkadot via its virtual cores by buying [coretime](../learn/learn-agile-coretime.md) with DOT and tap into Polkadot's multi-billion shared security. By doing so, they inherently access Polkadot's secure interoperability and can communicate with other applications running on different cores of Polkadot's virtual CPU.\n\nPolkadot is owned by the [DOT token](../learn/learn-DOT.md) holders who can shape its future through on-chain [governance](../learn/learn-polkadot-opengov.md) (also called Polkadot\nOpenGov) to orchestrate decisions, including accessing funds from the\n[treasury](../learn/learn-polkadot-opengov-treasury.md). Technical changes to the protocol's code are enacted and implemented automatically. Token holders can cast [direct votes](../learn/learn-polkadot-opengov.md#voting-on-a-referendum), [delegate their voting power](../learn/learn-polkadot-opengov.md#multirole-delegation) to entities and DAOs they trust, and place deposits for their referenda or referenda proposed by others.\n\nIn addition to purchasing coretime and voting in governance, the DOT token gives you the power to participate in Polkadot [staking](../learn/learn-staking.md) and help secure the network.\n\nPolkadot's level of abstraction and generalization allows for building applications \nspecific to their use cases, and for those applications to communicate securely, leveraging each\nother's value proposition. The trustless cooperation between applications makes Polkadot an\nideal ecosystem to build a [web3 future](web3-and-polkadot.md).\n\n<div class=\"row\" style=\"display: flex; gap: 20px; justify-content: center;\">\n  <a \n    href=\"https://www.youtube.com/watch?v=_-k0xkooSlA\" \n    class=\"card-container\" \n    data-aos=\"fade-up\" \n    data-aos-delay=\"100\" \n    style=\"width: 300px; height: 300px;\"\n  >\n    <img src=\"https://img.youtube.com/vi/_-k0xkooSlA/0.jpg\" class=\"card-image\"/>\n    <p class=\"card-title\">Polkadot Explained</p>\n  </a>\n</div>"}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#polkadot-gifts", "page_title": "Getting Started", "index": 1, "depth": 2, "title": "Polkadot Gifts", "anchor": "polkadot-gifts", "start_char": 3030, "end_char": 3551, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Gifts\n\n![Gift](../assets/explore/Gift.png)\n\nPolkadot Gifts provides an easy way to:\n\n- Onboard friends or family who are curious about blockchain but haven’t made the leap yet.\n- Share your love of Polkadot and send any amount of DOT.\n- Say ‘thank you’ or send someone tokens when you don’t know their address.\n- Get friends and family set up to participate in crowdloans.\n\nLearn more about how you can create and send Polkadot Gifts\n[here](https://polkadot.network/blog/introducing-polkadot-kusama-gifts/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#learning-about-polkadot-and-web3", "page_title": "Getting Started", "index": 2, "depth": 2, "title": "Learning about Polkadot and Web3", "anchor": "learning-about-polkadot-and-web3", "start_char": 3551, "end_char": 3690, "estimated_token_count": 24, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Learning about Polkadot and Web3\n\nDepending on your understanding of blockchain, Web3, and Polkadot, several learning resources exist."}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#beginner-level", "page_title": "Getting Started", "index": 3, "depth": 3, "title": "Beginner Level", "anchor": "beginner-level", "start_char": 3690, "end_char": 4740, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Beginner Level\n\n- The [Blockchain Fundamentals MOOC course](https://youtube.com/playlist?list=PLxVihxZC42nF_MCN9PTvZMIifRjx9cZ2J&feature=shared): an introduction to blockchain technology to start familiarizing yourself with concepts such as cryptography and peer-to-peer networks.\n- [Polkadot's light paper](https://github.com/w3f/polkadot-light-paper/blob/master/Polkadot-lightpaper.pdf): a visual, easy to\n  read, and less technical introduction into Polkadot's technology. This paper dives into the\n  components of Polkadot and is tailored for both a non-technical and technical reader.\n- [Polkadot for Beginners: A non-technical guide to decentralization, blockchains & Polkadot](https://linktr.ee/polkadotbook): a book funded by the Polkadot Treasury about Blockchain technology with a dive into the Polkadot protocol, its participants and components.\n- [What is a blockchain, actually?](https://blog.kianenigma.com/what-blockchain-actually/): an online book by [Kian Paimani](https://x.com/kianenigma) reflecting on blockchain technology."}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#intermediate-level", "page_title": "Getting Started", "index": 4, "depth": 3, "title": "Intermediate Level", "anchor": "intermediate-level", "start_char": 4740, "end_char": 5722, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Intermediate Level\n\n- [Polkadot's original white paper](https://github.com/polkadot-io/polkadot-white-paper/blob/master/PolkaDotPaper.pdf): the original Polkadot white\n  paper that describes [Polkadot 1.0](./polkadot-v1.md) and how Polkadot's core components work together.\n- [Polkadot's overview paper](https://arxiv.org/abs/2005.13456): an updated version of the white\n  paper that describes the protocol in more technical terms.\n- [The Technical Explainer Videos](https://www.youtube.com/playlist?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8):\n  These introductory videos explain and demonstrate how to interact with Polkadot using the [Polkadot-JS tools](./polkadotjs.md) and more user-friendly [wallets](https://polkadot.com/ecosystem).\n- [Polkadot Support](../../get-support.md) - Get help with\n  specific errors and problems while using tools such as the [Polkadot Staking Dashboard](./dashboards/staking-dashboard.md) and [Polkadot Developer Interface](./polkadotjs-ui.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#advanced-level", "page_title": "Getting Started", "index": 5, "depth": 3, "title": "Advanced Level", "anchor": "advanced-level", "start_char": 5722, "end_char": 6750, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Advanced Level\n\n- [The Web3 Foundation's research site](https://research.web3.foundation/): up-to-date technical research on Polkadot, including scalability, cryptographic,\n  economic, and security aspects of the protocol.\n- [Polkadot's specification](https://spec.polkadot.network/id-polkadot-protocol): the latest Polkadot Host protocol specification, Polkadot's specification tests of the many components of the network, and the Polkadot Runtime specification. This repo holds algorithms and\n  explores how various processes function in the Polkadot network. The Polkadot specification takes\n  Polkadot's ideas and concepts from the light and the white paper, but focuses on the technical\n  specs of the technology.\n- [ELVES protocol paper](https://eprint.iacr.org/2024/961.pdf): a technical scientific paper of Polkadot's shared security model.\n- [The Polkadot Parachain Host Implementer's Guide](https://paritytech.github.io/polkadot-sdk/book/index.html): an extensive description of Polkadot's shared security model."}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#certified-courses", "page_title": "Getting Started", "index": 6, "depth": 2, "title": "Certified Courses", "anchor": "certified-courses", "start_char": 6750, "end_char": 7705, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Certified Courses\n\n- EdX Courses\n    - [Introduction to blockchain and Web3](https://www.edx.org/learn/blockchain/web3-foundation-introduction-to-blockchain-and-web3): this course introduces the fundamental concepts of Blockchain technology and Web3.\n    - [Introduction to Polkadot](https://www.edx.org/learn/computer-programming/web3-foundation-introduction-to-polkadot): this course provides a comprehensive overview of Polkadot Network, its technology and ecosystem.\n- [The Polkadot Blockchain Academy X (PBA-X)](https://pbax.polkadot.academy/): an online course about cryptography, blockchain, crypto-economics, the Polkadot protocol and Polkadot SDK. See the previous course material [here](https://polkadot-blockchain-academy.github.io/pba-content/).\n- [The Polkadot Blockchain Academy Campus (PBA Campus)](https://polkadot.academy/pba-campus/): a three-week intensive course that will make you a blockchain core developer or a dApp developer."}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#tutorials-for-developers", "page_title": "Getting Started", "index": 7, "depth": 2, "title": "Tutorials for Developers", "anchor": "tutorials-for-developers", "start_char": 7705, "end_char": 8624, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Tutorials for Developers\n\n- [Rust and Polkadot Workshop](https://www.shawntabrizi.com/rust-and-polkadot-workshop/#/): A workshop to teach new students the basics of Blockchains, Rust, and the Polkadot SDK.\n- [DotCodeSchool](https://dotcodeschool.com): An interactive online school that teaches you how to build meaningful web3 applications using the Polkadot SDK.\n- [Polkadot Study](https://polkadot.study/): A platform where developers can write tutorials for\n  the Polkadot ecosystem. Part of the development of the platform was funded by the\n  [Kusama treasury](https://kusama.subsquare.io/referenda/102). The platform also hosts\n  [Substrate in Bits](https://polkadot.study/tutorials/substrate-in-bits/), a technical content\n  series aimed at solving the pain points of developers building with\n  [Polkadot SDK (Substrate)](../../reference/parachains/index.md#substrate) and [Rust](https://www.rust-lang.org/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-getting-started", "url": "https://developer.polkadot.com/wiki/general/getting-started/#hackathon-guides", "page_title": "Getting Started", "index": 8, "depth": 2, "title": "Hackathon Guides", "anchor": "hackathon-guides", "start_char": 8624, "end_char": 8826, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab089d826ebf4c0601c8af44df1fa16ee9debc6705d653644c22fb674b58e66b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Hackathon Guides\n\nThe [Polkadot Hackathon Guide](https://github.com/polkadot-developers/hackathon-guide) provides essential info, tips, and resources to help you in your journey building on Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#active-nomination", "page_title": "wiki-general-glossary", "index": 0, "depth": 2, "title": "Active Nomination", "anchor": "active-nomination", "start_char": 133, "end_char": 404, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Active Nomination\n\nA validator (or validators) that a nominator has selected to nominate and is actively validating\nthis era. The nominator is placing their stake behind this validator for this era and will\npotentially receive staking rewards in return for doing so."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#alexander", "page_title": "wiki-general-glossary", "index": 1, "depth": 2, "title": "Alexander", "anchor": "alexander", "start_char": 404, "end_char": 503, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Alexander\n\nThe fourth (now defunct) proof of concept (PoC-4) [testnet](#testnet) for Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#asset-hub", "page_title": "wiki-general-glossary", "index": 2, "depth": 2, "title": "Asset Hub", "anchor": "asset-hub", "start_char": 503, "end_char": 697, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Asset Hub\n\nA system parachain that hosts all on-chain assets and account functionality on Polkadot, including balances, staking, proxies, and is expected to host smart contracts in Q4 2025."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#attestation", "page_title": "wiki-general-glossary", "index": 3, "depth": 2, "title": "Attestation", "anchor": "attestation", "start_char": 697, "end_char": 890, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Attestation\n\nIn the network's validity system, an _attestation_ is a type of message that validators broadcast\nthat says whether they think a parachain candidate block is valid or invalid."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#auction-parachain", "page_title": "wiki-general-glossary", "index": 4, "depth": 2, "title": "Auction (Parachain)", "anchor": "auction-parachain", "start_char": 890, "end_char": 1054, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Auction (Parachain)\n\nParachain auctions were used by non-system parachains to access Polkadot. The current method is\nthrough purchase of [coretime](#coretime)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#aura", "page_title": "wiki-general-glossary", "index": 5, "depth": 2, "title": "Aura", "anchor": "aura", "start_char": 1054, "end_char": 1221, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Aura\n\nAuthority-based round-robin scheduling (AURA) provides a slot-based block authoring mechanism, where\na known set of authorities take turns producing blocks."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#authority", "page_title": "wiki-general-glossary", "index": 6, "depth": 2, "title": "Authority", "anchor": "authority", "start_char": 1221, "end_char": 1565, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Authority\n\nAn authority is a generic term for the role in a blockchain that can participate in the consensus\nmechanisms. In [GRANDPA](#grandpa-finality-gadget), the authorities vote on chains they consider\nfinal. In BABE, the authorities are block producers. Authority sets can be chosen to be mechanisms\nsuch as Polkadot's NPoS algorithm."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#availability-cores", "page_title": "wiki-general-glossary", "index": 7, "depth": 2, "title": "Availability Cores", "anchor": "availability-cores", "start_char": 1565, "end_char": 1812, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Availability Cores\n\nSlots used to process parachains. The runtime assigns each parachain to an availability core and\nvalidators can fetch information about the cores, such as parachain block candidates, by calling the\nappropriate Runtime API."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#babe", "page_title": "wiki-general-glossary", "index": 8, "depth": 2, "title": "BABE", "anchor": "babe", "start_char": 1812, "end_char": 1913, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## BABE\n\nBlind Assignment for Blockchain Extension (BABE) is Polkadot's block production mechanism."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#bitfield-array", "page_title": "wiki-general-glossary", "index": 9, "depth": 2, "title": "Bitfield Array", "anchor": "bitfield-array", "start_char": 1913, "end_char": 2208, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bitfield Array\n\nA bitfield array contains single-bit values which indicate whether a [candidate](#candidate) is\navailable. The number of items is equal of to the number of\n[availability cores](#availability-cores) and each bit represents a vote on the corresponding core\nin the given order."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#block", "page_title": "wiki-general-glossary", "index": 10, "depth": 2, "title": "Block", "anchor": "block", "start_char": 2208, "end_char": 2324, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Block\n\nA collection of data, such as transactions, that together indicate a state transition of the\nblockchain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#blockspace", "page_title": "wiki-general-glossary", "index": 11, "depth": 2, "title": "Blockspace", "anchor": "blockspace", "start_char": 2324, "end_char": 2841, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Blockspace\n\n[Blockspace](https://polkadot.network/blog/blockspace-blockspace-ecosystems-how-polkadot-is-unlocking-the-full-potential-of-web3)\nis the capacity of a blockchain to finalize and commit operations. It represents a blockchain's\nsecurity, computing, and storage capability as an end product. Blockspace produced by different\nblockchains can vary in quality, availability, and flexibility. Polkadot has a\n[blockspace-centric architecture](https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#block-explorer", "page_title": "wiki-general-glossary", "index": 12, "depth": 2, "title": "Block Explorer", "anchor": "block-explorer", "start_char": 2841, "end_char": 2944, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Block Explorer\n\nAn application that allows a user to explore the different blocks on a blockchain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#blocks-nominations", "page_title": "wiki-general-glossary", "index": 13, "depth": 2, "title": "Blocks Nominations", "anchor": "blocks-nominations", "start_char": 2944, "end_char": 3074, "estimated_token_count": 23, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Blocks Nominations\n\nThis indicates that a validator does not allow any more nominations. This is controlled by\nthe validator."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#bls", "page_title": "wiki-general-glossary", "index": 14, "depth": 2, "title": "BLS", "anchor": "bls", "start_char": 3074, "end_char": 3471, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## BLS\n\nBoneh-Lynn-Shacham (BLS) signatures have a slow signing, very slow verification, require slow and\nmuch less secure pairing friendly curves, and tend towards dangerous malleability. Yet, BLS permits\na diverse array of signature aggregation options far beyond any other known signature scheme, which\nmakes BLS a preferred scheme for voting in consensus algorithms and threshold signatures."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#bonding", "page_title": "wiki-general-glossary", "index": 15, "depth": 2, "title": "Bonding", "anchor": "bonding", "start_char": 3471, "end_char": 3672, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bonding\n\nA process by which tokens can be \"frozen\" in exchange for some other benefit. For example, staking\nis a form of bonding for which you receive rewards in exchange for securing the network."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#bountylearnlearn-polkadot-opengov-treasurymdbounties", "page_title": "wiki-general-glossary", "index": 16, "depth": 2, "title": "[Bounty](../learn/learn-polkadot-opengov-treasury.md#bounties)", "anchor": "bountylearnlearn-polkadot-opengov-treasurymdbounties", "start_char": 3672, "end_char": 4068, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## [Bounty](../learn/learn-polkadot-opengov-treasury.md#bounties)\n\nA mechanism that allows network participants to access treasury funding without going through the\nprocess of submitting an OpenGov referendum. Note that a bounty got funds through OpenGov in the\nfirst place, but the subsequent disbursement of those funds is controlled by curators based on\nachieved milestones by the recipient."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#bridge", "page_title": "wiki-general-glossary", "index": 17, "depth": 2, "title": "Bridge", "anchor": "bridge", "start_char": 4068, "end_char": 4459, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bridge\n\nA parachain that acts as an intermediary between the relay chain and an external chain, in such a\nway that it appears to the relay chain that the external chain is a parachain (i.e., meets the\nnetwork Host's requirements of parachains). Bridges allow for interaction between other blockchains,\nsuch as Ethereum and Bitcoin, that are not natively compatible with the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#byzantine-fault-tolerance", "page_title": "wiki-general-glossary", "index": 18, "depth": 2, "title": "Byzantine Fault Tolerance", "anchor": "byzantine-fault-tolerance", "start_char": 4459, "end_char": 4870, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Byzantine Fault Tolerance\n\nThe property of a system that is tolerant of Byzantine faults; a system where not only may\nindividual subsystems fail, but it may not be clear if a particular subsystem has failed or not.\nThat is, different observers on the system may not agree on whether or not the system has failed.\nEnsuring Byzantine fault tolerance is an important part of developing any distributed system."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#capacity", "page_title": "wiki-general-glossary", "index": 19, "depth": 2, "title": "Capacity", "anchor": "capacity", "start_char": 4870, "end_char": 5042, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Capacity\n\nThe maximum number of nominators signalling intent to nominate a validator (and thus could\npotentially actively nominate that validator in the next session)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#candidate", "page_title": "wiki-general-glossary", "index": 20, "depth": 2, "title": "Candidate", "anchor": "candidate", "start_char": 5042, "end_char": 5219, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Candidate\n\nA candidate is a submitted parachain block to the relay chain validators. A parachain block stops\nbeing referred to as a candidate as soon it has been finalized."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#collations", "page_title": "wiki-general-glossary", "index": 21, "depth": 2, "title": "Collations", "anchor": "collations", "start_char": 5219, "end_char": 5549, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Collations\n\nParachain blocks or candidates that are being proposed to the relay chain validators. More\nspecifically, a collation is a [data structure](https://spec.polkadot.network/#defn-collation) which\ncontains the proposed parachain candidate, including an optional validation parachain Runtime update\nand upward messages."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#collator", "page_title": "wiki-general-glossary", "index": 22, "depth": 2, "title": "Collator", "anchor": "collator", "start_char": 5549, "end_char": 5692, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Collator\n\nA node that maintains a parachain by collecting parachain transactions and producing state\ntransition proofs for the validators."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#collectives", "page_title": "wiki-general-glossary", "index": 23, "depth": 2, "title": "Collectives", "anchor": "collectives", "start_char": 5692, "end_char": 6247, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Collectives\n\nThe Polkadot Collectives parachain was added in [Referendum 81](https://polkadot.subsquare.io/democracy/referenda/81) and exists only on Polkadot (i.e., there is no Kusama equivalent). The Collectives chain hosts on-chain groups that serve the Polkadot network, such as the [Polkadot Technical Fellowship](#technical-fellowship), the [Polkadot Alliance](#polkadot-alliance), and the Ambassador Fellowship. Collectives enable governance through customizable parameters, manage sub-treasuries, and facilitate collaborative decision-making."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#commission", "page_title": "wiki-general-glossary", "index": 24, "depth": 2, "title": "Commission", "anchor": "commission", "start_char": 6247, "end_char": 6634, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Commission\n\nValidators and nominators get paid from block production on the network, where validators can set a\nvariable commission rate, which is initially subtracted from the total rewards that validator is\nentitled to (for that period), where the commission determines the rate of distribution for the\nremaining rewards set out for the nominators that are backing that validator."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#common-good-parachain", "page_title": "wiki-general-glossary", "index": 25, "depth": 2, "title": "Common Good (Parachain)", "anchor": "common-good-parachain", "start_char": 6634, "end_char": 6766, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Common Good (Parachain)\n\nSee [System Parachains](#system-parachains), which is generally preferred over the term \"common\ngood\"."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#community-queue", "page_title": "wiki-general-glossary", "index": 26, "depth": 2, "title": "Community Queue", "anchor": "community-queue", "start_char": 6766, "end_char": 6938, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Community Queue\n\nThe queue for proposals originating from individual accounts (i.e. not the Council) which are\nwaiting to become referenda. Compare the External queue."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#consensus", "page_title": "wiki-general-glossary", "index": 27, "depth": 2, "title": "Consensus", "anchor": "consensus", "start_char": 6938, "end_char": 7232, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus\n\nThe process of a group of entities to agree on a particular data value (such as the ordering and\nmakeup of blocks on a blockchain). There are a variety of algorithms used for determining consensus.\nThe consensus algorithm used by Polkadot is [GRANDPA](#grandpa-finality-gadget)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#coretime", "page_title": "wiki-general-glossary", "index": 28, "depth": 2, "title": "Coretime", "anchor": "coretime", "start_char": 7232, "end_char": 7368, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Coretime\n\nThe time allocated for utilizing a core that can be purchased in bulk or on demand. It is measured\nin relay chain blocks."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#crowdloan", "page_title": "wiki-general-glossary", "index": 29, "depth": 2, "title": "Crowdloan", "anchor": "crowdloan", "start_char": 7368, "end_char": 7644, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Crowdloan\n\nA mechanism used in the past for potential parachains to temporarily source tokens to win an auction\nfor a relay chain core. Tokens gathered in this way were programmatically returned to the lender\nafter the lease period was over or the crowdloan period ended."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#curator", "page_title": "wiki-general-glossary", "index": 30, "depth": 2, "title": "Curator", "anchor": "curator", "start_char": 7644, "end_char": 7765, "estimated_token_count": 23, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Curator\n\nA person, group, or other entity charged with judging and verifying the successful completion of a\nBounty."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#dapp", "page_title": "wiki-general-glossary", "index": 31, "depth": 2, "title": "DApp", "anchor": "dapp", "start_char": 7765, "end_char": 7943, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## DApp\n\nA generic term for a decentralized application, that is, one that runs as part of a distributed\nnetwork as opposed to being run on a specific system or set of systems."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#dot", "page_title": "wiki-general-glossary", "index": 32, "depth": 2, "title": "DOT", "anchor": "dot", "start_char": 7943, "end_char": 8265, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## DOT\n\nThe native token for Polkadot. DOT serves three purposes: network governance (allowing them to vote\non-chain upgrades and other exceptional events), general operation (rewarding good actors and\npunishing bad actors), and bonding (adding new parachains by \"freezing\" DOT while they are connected\nthe relay chain)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#duty-roster", "page_title": "wiki-general-glossary", "index": 33, "depth": 2, "title": "Duty Roster", "anchor": "duty-roster", "start_char": 8265, "end_char": 8512, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Duty Roster\n\nA lookup table that specifies the job that a particular validator is required to do (i.e. attest to\nthe validity of a specific parachain). The duty roster routinely shuffles the validator set into\ndifferent subsets per parachain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#epoch", "page_title": "wiki-general-glossary", "index": 34, "depth": 2, "title": "Epoch", "anchor": "epoch", "start_char": 8512, "end_char": 8750, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Epoch\n\nAn epoch is a time duration in the BABE protocol that is broken into smaller time slots. Each slot\nhas at least one slot leader who has the right to propose a block. In Kusama, it is the same\nduration as a [session](#session)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#era", "page_title": "wiki-general-glossary", "index": 35, "depth": 2, "title": "Era", "anchor": "era", "start_char": 8750, "end_char": 8924, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Era\n\nA (whole) number of sessions, which is the period that the validator set (and each validator's\nactive nominator set) is recalculated and where rewards are paid out."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#equivocation", "page_title": "wiki-general-glossary", "index": 36, "depth": 2, "title": "Equivocation", "anchor": "equivocation", "start_char": 8924, "end_char": 9164, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Equivocation\n\nProviding conflicting information to the network. BABE equivocation entails creating multiple blocks\nin the same slot. [GRANDPA](#grandpa-finality-gadget) equivocation would consist of signing multiple\nconflicting chains."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#external-queue", "page_title": "wiki-general-glossary", "index": 37, "depth": 2, "title": "External Queue", "anchor": "external-queue", "start_char": 9164, "end_char": 9336, "estimated_token_count": 33, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## External Queue\n\n**Not applicable to OpenGov.** The queue for proposals originating with the Council which are\nwaiting to become referenda. Compare the Community queue."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#extrinsic", "page_title": "wiki-general-glossary", "index": 38, "depth": 2, "title": "Extrinsic", "anchor": "extrinsic", "start_char": 9336, "end_char": 9912, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Extrinsic\n\nA [SCALE encoded](../../reference/parachains/data-encoding.md#scale-codec) array consisting of a version\nnumber, signature, and varying data types indicating the resulting runtime function to be called,\nincluding the parameters required for that function to be executed. These state changes are invoked\nfrom the outside world, i.e. they are not part of the system itself. Extrinsics can take two forms,\n\"[inherents](#inherent)\" and \"[transactions](#transaction)\". For more technical details see the\n[polkadot spec](https://spec.polkadot.network/#id-extrinsics)"}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#technical-fellowship", "page_title": "wiki-general-glossary", "index": 39, "depth": 2, "title": "Technical Fellowship", "anchor": "technical-fellowship", "start_char": 9912, "end_char": 10123, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Technical Fellowship\n\nA mostly self-governing expert body with a primary goal of representing humans who embody and\ncontain the technical knowledge base of the Kusama and/or Polkadot networks and protocols."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#finality", "page_title": "wiki-general-glossary", "index": 40, "depth": 2, "title": "Finality", "anchor": "finality", "start_char": 10123, "end_char": 10414, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Finality\n\nThe property of a block that cannot be reverted. Generally, created blocks are not final until some\npoint in the future - perhaps never, in the case of \"probabilistic finality\". The relay chain uses a\ndeterministic finality gadget known as [GRANDPA](#grandpa-finality-gadget)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#finality-gadget", "page_title": "wiki-general-glossary", "index": 41, "depth": 2, "title": "Finality Gadget", "anchor": "finality-gadget", "start_char": 10414, "end_char": 10473, "estimated_token_count": 10, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Finality Gadget\n\nA mechanism that determines finality."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#frame", "page_title": "wiki-general-glossary", "index": 42, "depth": 2, "title": "Frame", "anchor": "frame", "start_char": 10473, "end_char": 10558, "estimated_token_count": 16, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Frame\n\nThe collection of Substrate-provided pallets (Substrate Runtime Modules)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#genesis", "page_title": "wiki-general-glossary", "index": 43, "depth": 2, "title": "Genesis", "anchor": "genesis", "start_char": 10558, "end_char": 10797, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Genesis\n\nThe origin of a blockchain, also known as block 0. It can also be used to reference the initial\nstate of the blockchain at origination.\n\n!!!note \"Example\"\n    In the _genesis_ state Alice, Bob, and Charlie had 30 tokens each."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#governance", "page_title": "wiki-general-glossary", "index": 44, "depth": 2, "title": "Governance", "anchor": "governance", "start_char": 10797, "end_char": 11011, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Governance\n\nThe process of determining what changes to the network are permissible, such as modifications to\ncode or movement of funds. The governance system is on-chain and revolves around stakeholder voting."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#governance-council", "page_title": "wiki-general-glossary", "index": 45, "depth": 2, "title": "Governance Council", "anchor": "governance-council", "start_char": 11011, "end_char": 11377, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Governance Council\n\nAn on-chain entity that consists of several on-chain accounts (starting at 6, eventually moving to\nthe final value of 24). The Council can act as a representative for \"passive\" (non-voting)\nstakeholders. Council members have two main tasks: proposing referenda for the overall stakeholder\ngroup to vote on and cancelling malicious referenda."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#grandpa-finality-gadget", "page_title": "wiki-general-glossary", "index": 46, "depth": 2, "title": "GRANDPA Finality Gadget", "anchor": "grandpa-finality-gadget", "start_char": 11377, "end_char": 11720, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## GRANDPA Finality Gadget\n\nGHOST-based Recursive ANcestor Deriving Prefix Agreement. It is the finality gadget allows\nasynchronous, accountable, and safe finality to the blockchain. For an overview of GRANDPA, see\n[this Medium post](https://medium.com/polkadot-network/polkadot-proof-of-concept-3-a-better-consensus-algorithm-e81c380a2372)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#hard-fork", "page_title": "wiki-general-glossary", "index": 47, "depth": 2, "title": "Hard Fork", "anchor": "hard-fork", "start_char": 11720, "end_char": 12124, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Hard Fork\n\nA permanent diversion of a blockchain occurs quickly due to a high priority change in a consensus\nrule. Clients who follow a hard fork always need to upgrade their clients to continue following the\nupgraded chain. Hard forks are considered permanent divergences of a chain for which non-upgraded\nclients are following consensus rules incompatible to the ones followed by upgraded clients."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#hard-spoon", "page_title": "wiki-general-glossary", "index": 48, "depth": 2, "title": "Hard Spoon", "anchor": "hard-spoon", "start_char": 12124, "end_char": 12419, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Hard Spoon\n\nDefined by Jae Kwon of Cosmos as \"a new chain that takes into account state from an existing chain;\nnot to compete, but to provide broad access.\" A non-contentious blockchain that inherits the state\nof the underlying blockchain and creates a new branch of _the same blockchain_."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#horizontal-relay-routed-message-passing", "page_title": "wiki-general-glossary", "index": 49, "depth": 2, "title": "Horizontal Relay-routed Message Passing", "anchor": "horizontal-relay-routed-message-passing", "start_char": 12419, "end_char": 12866, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Horizontal Relay-routed Message Passing\n\nHorizontal Relay-routed Message Passing, also known as HRMP, is a precursor to the complete XCMP\nimplementation, that mimics the same interface and semantics of XCMP. It is similar to XCMP except\nfor how it stores all messages in the relay chain storage, therefore making it more expensive and\ndemanding more resources than XCMP. The plan is to retire HRMP once the implementation of XCMP is\ncomplete."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#inactive-nomination", "page_title": "wiki-general-glossary", "index": 50, "depth": 2, "title": "Inactive Nomination", "anchor": "inactive-nomination", "start_char": 12866, "end_char": 13062, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Inactive Nomination\n\nA validator (or validators) that a nominator has selected to nominate, but is not actively\nvalidating this era. This type of nomination may become active in a future era."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#inherent", "page_title": "wiki-general-glossary", "index": 51, "depth": 2, "title": "Inherent", "anchor": "inherent", "start_char": 13062, "end_char": 13513, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Inherent\n\nExtrinsics that are \"inherently true.\" Inherents are not gossiped on the network and are put into\nblocks by the block author. They are not provably true the way that the desire to send funds is,\ntherefore they do not carry a signature. A blockchain's [runtime](#runtime) must have rules for\nvalidating inherents. For example, timestamps are inherents. They are validated by being within some\nmargin that each validator deems reasonable."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#injected-account", "page_title": "wiki-general-glossary", "index": 52, "depth": 2, "title": "Injected Account", "anchor": "injected-account", "start_char": 13513, "end_char": 13688, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Injected Account\n\nAn account that is not directly managed by the Polkadot UI but can be accessed through it, such as\naccounts controlled by the Polkadot Developer Signer."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#interoperability", "page_title": "wiki-general-glossary", "index": 53, "depth": 2, "title": "Interoperability", "anchor": "interoperability", "start_char": 13688, "end_char": 13832, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Interoperability\n\nThe ability for some sort of system to exchange and make use of information often compared to\n\"cross-chain\" technologies."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#keep-alive-check", "page_title": "wiki-general-glossary", "index": 54, "depth": 2, "title": "Keep-Alive Check", "anchor": "keep-alive-check", "start_char": 13832, "end_char": 14028, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Keep-Alive Check\n\nThe keep-alive check is used to indicate whether or not a transfer can allow the sending account to\nbe reduced to less than the existential deposit, causing it to be reaped."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#ksm", "page_title": "wiki-general-glossary", "index": 55, "depth": 2, "title": "KSM", "anchor": "ksm", "start_char": 14028, "end_char": 14081, "estimated_token_count": 10, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## KSM\n\nThe abbreviation for Kusama network tokens."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#kusama", "page_title": "wiki-general-glossary", "index": 56, "depth": 2, "title": "Kusama", "anchor": "kusama", "start_char": 14081, "end_char": 14357, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Kusama\n\nThe \"canary network\" for Polkadot. It consists of an early-release, unaudited version of the\nPolkadot software. It is **not** a [testnet](#testnet) - after the transition to NPoS, the network\nis entirely in the hands of the community (i.e., Kusama token holders)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#lease-period", "page_title": "wiki-general-glossary", "index": 57, "depth": 2, "title": "Lease Period", "anchor": "lease-period", "start_char": 14357, "end_char": 14476, "estimated_token_count": 23, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Lease Period\n\nA particular amount of time that a parachain for which the parachain can connect to the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#libp2p", "page_title": "wiki-general-glossary", "index": 58, "depth": 2, "title": "LIBP2P", "anchor": "libp2p", "start_char": 14476, "end_char": 14647, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## LIBP2P\n\nAn open-source library for encrypted peer-to-peer communications and other networking functions.\nMore information at: [https://libp2p.io/](https://libp2p.io/)"}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#liveness", "page_title": "wiki-general-glossary", "index": 59, "depth": 2, "title": "Liveness", "anchor": "liveness", "start_char": 14647, "end_char": 14980, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Liveness\n\nThe property of a distributed system is that it will eventually come to some sort of consensus. A\nsystem stuck in an infinite loop would not be considered live, even if computations are taking\nplace; a system that eventually provides a result, even if incorrect or it takes a long time, is\nconsidered to have liveness."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#mainnet", "page_title": "wiki-general-glossary", "index": 60, "depth": 2, "title": "Mainnet", "anchor": "mainnet", "start_char": 14980, "end_char": 15084, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Mainnet\n\nShort for \"main network\": the fully functional and acting chain that runs its own network."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#message", "page_title": "wiki-general-glossary", "index": 61, "depth": 2, "title": "Message", "anchor": "message", "start_char": 15084, "end_char": 15299, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Message\n\nIn Polkadot's XCMP protocol, a _message_ is arbitrary data that is sent from one parachain (the\negress chain) to another (the ingress chain) through a channel and ensured delivery by the validator\nset."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#message-queue", "page_title": "wiki-general-glossary", "index": 62, "depth": 2, "title": "Message Queue", "anchor": "message-queue", "start_char": 15299, "end_char": 15465, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Message Queue\n\nIn Polkadot's XCMP protocol, a _message queue_ is the list of messages waiting to be processed by a\nparticular receiving parachain over a channel."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#metadata", "page_title": "wiki-general-glossary", "index": 63, "depth": 2, "title": "Metadata", "anchor": "metadata", "start_char": 15465, "end_char": 15578, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Metadata\n\nData that includes information about other data, such as information about a specific transaction."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#motion", "page_title": "wiki-general-glossary", "index": 64, "depth": 2, "title": "Motion", "anchor": "motion", "start_char": 15578, "end_char": 15792, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Motion\n\nA motion is essentially a \"referendum\" or \"decision\" being considered by the Council. The Council\ncan vote on motions like approving Treasury Proposals or making proposals for the community to vote\non."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#next-session", "page_title": "wiki-general-glossary", "index": 65, "depth": 2, "title": "Next Session", "anchor": "next-session", "start_char": 15792, "end_char": 15900, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Next Session\n\nThis indicates that the validator will be a member of the active set in the next session."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#node-explorer", "page_title": "wiki-general-glossary", "index": 66, "depth": 2, "title": "Node Explorer", "anchor": "node-explorer", "start_char": 15900, "end_char": 16063, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Node Explorer\n\nA tool that gives you information about a node, such as the latest blocks sealed, finalized, and the\ncurrent chain state as known by that node."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#nominated-proof-of-stake-npos", "page_title": "wiki-general-glossary", "index": 67, "depth": 2, "title": "Nominated Proof of Stake (NPoS)", "anchor": "nominated-proof-of-stake-npos", "start_char": 16063, "end_char": 16708, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominated Proof of Stake (NPoS)\n\nA Proof-of-Stake system where nominators back validators with their own stake as a show of faith in\nthe good behavior of the validator. Nominated Proof-of-Stake differs from the more generic concept\nDelegated Proof-of-Stake in that nominators are subject to loss of stake if they nominate a bad\nvalidator; delegators are not subject to loss of stake based on the behavior of the validator. Note\nthat some other blockchain technologies may use the term Delegated Proof-of-Stake, even if\ndelegators can be [slashed](../learn/learn-offenses.md). Polkadot uses the Phragmén method to\nallocate stake to nominees."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#nominator", "page_title": "wiki-general-glossary", "index": 68, "depth": 2, "title": "Nominator", "anchor": "nominator", "start_char": 16708, "end_char": 16927, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominator\n\nAccounts that select a set of validators to nominate by bonding their tokens. Nominators receive\nsome of the validators' rewards, but are also liable for slashing if their nominated validators\nmisbehave."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#nft", "page_title": "wiki-general-glossary", "index": 69, "depth": 2, "title": "NFT", "anchor": "nft", "start_char": 16927, "end_char": 17207, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## NFT\n\nA non-fungible token is a token that does not hold the property of fungibility, which, in turn,\nmeans that it cannot be interchangeable and indistinguishable from other tokens. NFTs allow the\ntokenization of unique items and provide exclusive ownership for those tokens."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#on-chain-governance", "page_title": "wiki-general-glossary", "index": 70, "depth": 2, "title": "On-chain Governance", "anchor": "on-chain-governance", "start_char": 17207, "end_char": 17558, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## On-chain Governance\n\nA governance system of a blockchain that is controlled by mechanisms on the blockchain. On-chain\ngovernance allows decisions to be made transparently. Note that there are a variety of different\nalgorithms for making these decisions, such as simple majority voting, adaptive quorum biasing, or\nidentity-based quadratic voting."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#polkadot-opengov", "page_title": "wiki-general-glossary", "index": 71, "depth": 2, "title": "Polkadot OpenGov", "anchor": "polkadot-opengov", "start_char": 17558, "end_char": 17774, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot OpenGov\n\nPreviously known as Governance v2 (Gov2) during early development,\n[Polkadot OpenGov](../learn/learn-polkadot-opengov.md) serves as the current governance protocol for\nboth Kusama and Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#origin", "page_title": "wiki-general-glossary", "index": 72, "depth": 2, "title": "Origin", "anchor": "origin", "start_char": 17774, "end_char": 18036, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Origin\n\nThe initiator of an extrinsic. A simple origin would be the account that is sending a token to\nanother account. Polkadot also supports more complex origin types, such as the\n[root origin](#root-origin), from which privileged functions can be called."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#pallet", "page_title": "wiki-general-glossary", "index": 73, "depth": 2, "title": "Pallet", "anchor": "pallet", "start_char": 18036, "end_char": 18090, "estimated_token_count": 14, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pallet\n\nA [Substrate](#substrate) runtime module."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#parachain", "page_title": "wiki-general-glossary", "index": 74, "depth": 2, "title": "Parachain", "anchor": "parachain", "start_char": 18090, "end_char": 18307, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachain\n\nA blockchain that meets several characteristics that allow it to work within the confines of the\nnetwork Host. Also known as \"parallelized chain\". All parachains start their life-cycle as a\nparathread."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#paraid", "page_title": "wiki-general-glossary", "index": 75, "depth": 2, "title": "ParaID", "anchor": "paraid", "start_char": 18307, "end_char": 18387, "estimated_token_count": 17, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## ParaID\n\nA unique numeric (non-negative integer) identifier for a parachain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#parathread", "page_title": "wiki-general-glossary", "index": 76, "depth": 2, "title": "Parathread", "anchor": "parathread", "start_char": 18387, "end_char": 18745, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parathread\n\nHistorically, the term \"parathread\" has been used in two contexts: a chain registered with a\n`ParaID` on the [relay chain](#relay-chain) that has not yet become a parachain (i.e. not connected\nto a relay chain core), or as an on-demand parachain (i.e. a parachain using on-demand coretime)\nwhich does not produce blocks at regular intervals."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#parachain-registry", "page_title": "wiki-general-glossary", "index": 77, "depth": 2, "title": "Parachain Registry", "anchor": "parachain-registry", "start_char": 18745, "end_char": 18875, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachain Registry\n\nA relatively simple database-like construct that holds both static and dynamic information on each\nchain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#parity-technologies", "page_title": "wiki-general-glossary", "index": 78, "depth": 2, "title": "Parity Technologies", "anchor": "parity-technologies", "start_char": 18875, "end_char": 19106, "estimated_token_count": 43, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parity Technologies\n\nA company, founded by Dr. Gavin Wood and Dr. Jutta Steiner, that is developing Substrate, Kusama and\nPolkadot. It has also released several other projects including Parity Ethereum and Parity Secret\nStore."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#people-chain", "page_title": "wiki-general-glossary", "index": 79, "depth": 2, "title": "People Chain", "anchor": "people-chain", "start_char": 19106, "end_char": 19190, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## People Chain\n\nA [system parachain](#system-parachains) for identity management."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#polkadot", "page_title": "wiki-general-glossary", "index": 80, "depth": 2, "title": "Polkadot", "anchor": "polkadot", "start_char": 19190, "end_char": 19370, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot\n\nA heterogeneous, multi-chain network allowing various blockchains of different characteristics to\nperform arbitrary, cross-chain communication under shared security."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#polkadot-alliance", "page_title": "wiki-general-glossary", "index": 81, "depth": 2, "title": "Polkadot Alliance", "anchor": "polkadot-alliance", "start_char": 19370, "end_char": 19763, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Alliance\n\nThe Polkadot Alliance is an [on-chain collective](#collectives) founded by Acala, Astar, Interlay,\nKilt, Moonbeam, Phala, and Subscan, to establish standards and ethics for open-source development in\n[referendum #94](https://polkadot.subsquare.io/democracy/referenda/94). It aims to support development\nstandards and expose bad actors within the ecosystems of Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#polkadot-sdk", "page_title": "wiki-general-glossary", "index": 82, "depth": 2, "title": "Polkadot SDK", "anchor": "polkadot-sdk", "start_char": 19763, "end_char": 20099, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot SDK\n\nA modular framework for building blockchains. Polkadot is built using\n[Substrate](../../reference/parachains/index.md#substrate). Chains built with Substrate will be easy to connect as\nparachains. For developers, see the\n[Substrate GitHub repository](https://github.com/paritytech/polkadot-sdk/tree/master/substrate)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#polkadot-js", "page_title": "wiki-general-glossary", "index": 83, "depth": 2, "title": "Polkadot-JS", "anchor": "polkadot-js", "start_char": 20099, "end_char": 20166, "estimated_token_count": 13, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot-JS\n\nThe JavaScript API for interacting with Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#preimage", "page_title": "wiki-general-glossary", "index": 84, "depth": 2, "title": "Preimage", "anchor": "preimage", "start_char": 20166, "end_char": 20480, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Preimage\n\nThe on-chain proposals do not require the entire image of extrinsics and data (for instance the WASM\ncode, in case of upgrades) to be submitted, but would rather just need that image's hash. That\n**preimage** can be submitted and stored on-chain against the hash later, upon the proposal's\ndispatch."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#proof-of-stake-pos", "page_title": "wiki-general-glossary", "index": 85, "depth": 2, "title": "Proof of Stake (PoS)", "anchor": "proof-of-stake-pos", "start_char": 20480, "end_char": 20747, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Proof of Stake (PoS)\n\nA method of selecting participation in a consensus system, in which participants are chosen based on\nhow many tokens they have at stake (at risk of loss due to misbehavior). Normally, Proof-of-Stake\nsystems limit the number of participants."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#proof-of-validity", "page_title": "wiki-general-glossary", "index": 86, "depth": 2, "title": "Proof of Validity", "anchor": "proof-of-validity", "start_char": 20747, "end_char": 21003, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Proof of Validity\n\nA proof produced by parachain collators. Based on this proof and the parachain registry, a validator\ncan verify that a parachain has properly executed its state transition function. Proofs of Validity\ngo into the relay chain blocks."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#proof-of-work-pow", "page_title": "wiki-general-glossary", "index": 87, "depth": 2, "title": "Proof of Work (PoW)", "anchor": "proof-of-work-pow", "start_char": 21003, "end_char": 21278, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Proof of Work (PoW)\n\nA method of selecting participants in a consensus system, typically the longest chain rule, in which\nparticipants try to solve a puzzle like finding a partial pre-image of a hash. Normally, a\nProof-of-Work system can have any number of participants."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#proposal", "page_title": "wiki-general-glossary", "index": 88, "depth": 2, "title": "Proposal", "anchor": "proposal", "start_char": 21278, "end_char": 21462, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Proposal\n\nA potential function call to be voted on in a referendum. Proposals can modify the behavior of the\nnetwork, from minor parameter tuning up to replacing the runtime code."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#protocol", "page_title": "wiki-general-glossary", "index": 89, "depth": 2, "title": "Protocol", "anchor": "protocol", "start_char": 21462, "end_char": 21698, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Protocol\n\nA system of rules that allows two or more entities of a communications system to transmit\ninformation. The protocol defines the rules, syntax, semantics, and synchronization of communication\nand possible recovery methods."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#random-seed", "page_title": "wiki-general-glossary", "index": 90, "depth": 2, "title": "Random Seed", "anchor": "random-seed", "start_char": 21698, "end_char": 21888, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Random Seed\n\nA random seed is a pseudo-random number available on-chain. It is used in various places of the\nprotocol, most prominently in [BABE](#babe), the block production mechanism."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#referendum", "page_title": "wiki-general-glossary", "index": 91, "depth": 2, "title": "Referendum", "anchor": "referendum", "start_char": 21888, "end_char": 22258, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Referendum\n\nA vote on whether or not a proposal should be accepted by the network. Referenda may be initiated by\nthe Governance Council, by a member of the public, or as the result of a previous proposal.\nStakeholders vote on referenda, weighted by both the size of their stake (i.e. number of DOT held)\nand the amount of time they are willing to lock their tokens."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#re-genesis", "page_title": "wiki-general-glossary", "index": 92, "depth": 2, "title": "Re-Genesis", "anchor": "re-genesis", "start_char": 22258, "end_char": 22736, "estimated_token_count": 113, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Re-Genesis\n\nRe-Genesis is the process of exporting the current chain state, and creating a new chain that builds\non it. Re-Genesis will involve stop-the-world migration, which results in a period of time when no\nactual blocks are added to the blockchain. In a way, re-genesis can be viewed as a hard fork\nprocess. A formal design of Re-Genesis on Substrate is still under development -\n[Re-Genesis Rationale and Design](https://github.com/paritytech/substrate/issues/7458)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#relay-chain", "page_title": "wiki-general-glossary", "index": 93, "depth": 2, "title": "Relay Chain", "anchor": "relay-chain", "start_char": 22736, "end_char": 22863, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Relay Chain\n\nThe chain that coordinates consensus and communication between parachains (and external chains, via\nbridges)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#remarks", "page_title": "wiki-general-glossary", "index": 94, "depth": 2, "title": "Remarks", "anchor": "remarks", "start_char": 22863, "end_char": 23141, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Remarks\n\nRemarks are extrinsics with no effect. They provide additional information to external inputs,\nacting as _notes_. Remarks are stored alongside block records and do not change the chain's storage;\nthe information is not stored in the chain's trie, but along blocks."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#rococo", "page_title": "wiki-general-glossary", "index": 95, "depth": 2, "title": "Rococo", "anchor": "rococo", "start_char": 23141, "end_char": 23289, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Rococo\n\nRococo was a [testnet](#testnet) set aside for testing parachains, cumulus, and related technology.\nPlease refer to Paseo test network."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#root-origin", "page_title": "wiki-general-glossary", "index": 96, "depth": 2, "title": "Root Origin", "anchor": "root-origin", "start_char": 23289, "end_char": 23559, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Root Origin\n\nA system-level origin in [Substrate](#substrate). This is the highest privilege level and can be\nthought of as the superuser of the runtime origin. To learn about more raw origins in Substrate,\nvisit [Substrate Docs](../../reference/glossary.md#origin)"}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#runtime", "page_title": "wiki-general-glossary", "index": 97, "depth": 2, "title": "Runtime", "anchor": "runtime", "start_char": 23559, "end_char": 23718, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Runtime\n\nThe state transition function of a blockchain. It defines a valid algorithm for determining the\nstate of the next block given the previous state."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#runtime-module", "page_title": "wiki-general-glossary", "index": 98, "depth": 2, "title": "Runtime Module", "anchor": "runtime-module", "start_char": 23718, "end_char": 24015, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Runtime Module\n\nA module that implements specific transition functions and features one might want to have in their\nruntime. Each module should have domain-specific logic. For example, a Balances module has logic to\ndeal with accounts and balances. In Substrate, modules are called \"pallets\"."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#safety", "page_title": "wiki-general-glossary", "index": 99, "depth": 2, "title": "Safety", "anchor": "safety", "start_char": 24015, "end_char": 24312, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Safety\n\nThe property of a distributed system indicating that a particular state transition will not be\nreverted. [GRANDPA](#grandpa-finality-gadget) provides _deterministic_ safety. That is, for a state\nchanged marked as \"safe\" or \"final\", one would require a hard fork to revert that change."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#scalability", "page_title": "wiki-general-glossary", "index": 100, "depth": 2, "title": "Scalability", "anchor": "scalability", "start_char": 24312, "end_char": 24505, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Scalability\n\nWhile an ambiguous concept, [blockchain] scalability can be understood as the ability for the\nnetwork to scale in capabilities (e.g. processing more transactions) when needed."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#sealing", "page_title": "wiki-general-glossary", "index": 101, "depth": 2, "title": "Sealing", "anchor": "sealing", "start_char": 24505, "end_char": 24668, "estimated_token_count": 31, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Sealing\n\nThe process of adding a block to the relay chain. Note that finalization is a separate process -\nblocks are finalized sometime after they are sealed."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#session", "page_title": "wiki-general-glossary", "index": 102, "depth": 2, "title": "Session", "anchor": "session", "start_char": 24668, "end_char": 24850, "estimated_token_count": 35, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Session\n\nA session is a Substrate implementation term for a period that has a constant set of validators.\nValidators can only join or exit the validator set at a session change."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#session-certificate", "page_title": "wiki-general-glossary", "index": 103, "depth": 2, "title": "Session Certificate", "anchor": "session-certificate", "start_char": 24850, "end_char": 24954, "estimated_token_count": 18, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Session Certificate\n\nA message containing a signature on the concatenation of all the Session keys."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#session-key", "page_title": "wiki-general-glossary", "index": 104, "depth": 2, "title": "Session Key", "anchor": "session-key", "start_char": 24954, "end_char": 25117, "estimated_token_count": 34, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Session Key\n\nHot keys that are used for performing network operations by validators, for example, signing\n[GRANDPA](#grandpa-finality-gadget) commit messages."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#shared-security", "page_title": "wiki-general-glossary", "index": 105, "depth": 2, "title": "Shared Security", "anchor": "shared-security", "start_char": 25117, "end_char": 25408, "estimated_token_count": 54, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Shared Security\n\nThe security model used whereby all chains are equally secured. This is achieved by placing proofs\nof the validity of parachain blocks into the relay chain such that, in order to revert finality of a\nsingle parachain, an attacker would need to attack the entire system."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#slashing", "page_title": "wiki-general-glossary", "index": 106, "depth": 2, "title": "Slashing", "anchor": "slashing", "start_char": 25408, "end_char": 25620, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Slashing\n\nThe removal of a percentage of an account's DOT as a punishment for a validator acting maliciously\nor incompetently. For more information, see the [page about offenses](../learn/learn-offenses.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#soft-fork", "page_title": "wiki-general-glossary", "index": 107, "depth": 2, "title": "Soft Fork", "anchor": "soft-fork", "start_char": 25620, "end_char": 26001, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Soft Fork\n\nA backward compatible change to client code causes upgraded clients to start mining a new chain.\nRequires a \"vote-by-hashrate\" of a majority of miners to enact successfully. Soft forks are\nconsidered temporary divergences in a chain since non-upgraded clients do not follow the new\nconsensus rules but upgraded clients are still compatible with old consensus rules."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#software-development-kit-sdk", "page_title": "wiki-general-glossary", "index": 108, "depth": 2, "title": "Software Development Kit (SDK)", "anchor": "software-development-kit-sdk", "start_char": 26001, "end_char": 26139, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Software Development Kit (SDK)\n\nA collection of software tools (and programs) packaged together that can be used to develop\nsoftware."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#spend-period", "page_title": "wiki-general-glossary", "index": 109, "depth": 2, "title": "Spend Period", "anchor": "spend-period", "start_char": 26139, "end_char": 26373, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Spend Period\n\nSuccessfully enacted Treasury track referenda will get funded at the end of the\n[spending period](./chain-state-values.md). Treasury funds are directly\nsent to the beneficiary account at the end of the spend period."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#staking", "page_title": "wiki-general-glossary", "index": 110, "depth": 2, "title": "Staking", "anchor": "staking", "start_char": 26373, "end_char": 26596, "estimated_token_count": 46, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking\n\nThe act of bonding tokens by putting them up as \"collateral\" for a chance to produce a valid block\n(and thus obtain a block reward). Validators and nominators stake their tokens in order to secure\nthe network."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#state-transition-function", "page_title": "wiki-general-glossary", "index": 111, "depth": 2, "title": "State transition function", "anchor": "state-transition-function", "start_char": 26596, "end_char": 26791, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## State transition function\n\nA function that describes how the state of a blockchain can be transformed. For example, it may\ndescribe how tokens can be transferred from one account to another."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#substrate", "page_title": "wiki-general-glossary", "index": 112, "depth": 2, "title": "Substrate", "anchor": "substrate", "start_char": 26791, "end_char": 27124, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Substrate\n\nA modular framework for building blockchains. Polkadot is built using\n[Substrate](../../reference/parachains/index.md#substrate). Chains built with Substrate will be easy to connect as\nparachains. For developers, see the\n[Substrate GitHub repository](https://github.com/paritytech/polkadot-sdk/tree/master/substrate)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#system-parachains", "page_title": "wiki-general-glossary", "index": 113, "depth": 2, "title": "System Parachains", "anchor": "system-parachains", "start_char": 27124, "end_char": 27558, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## System Parachains\n\nParachains that are part of the Polkadot core protocol. These are allocated a parachain execution\ncore by governance rather than by coretime purchase. Examples of system parachains include\n[Asset Hub](../learn/learn-assets.md), [Bridge Hub](../learn/learn-system-chains.md#bridge-hub),\n[Collectives](../learn/learn-system-chains.md#collectives) and\n[People Chain](../learn/learn-system-chains.md#people-chain)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#tabling", "page_title": "wiki-general-glossary", "index": 114, "depth": 2, "title": "Tabling", "anchor": "tabling", "start_char": 27558, "end_char": 27761, "estimated_token_count": 44, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Tabling\n\nIn governance, bringing a proposal to a vote via referendum. Note that this is the British meaning\nof \"tabling\", which is different from the US version, which means \"to postpone\" a measure."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#teleport", "page_title": "wiki-general-glossary", "index": 115, "depth": 2, "title": "Teleport", "anchor": "teleport", "start_char": 27761, "end_char": 27967, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Teleport\n\nSend an asset from an account on one chain to an account on a different chain. This occurs by\nburning an amount on the sending chain and minting an equivalent amount on the destination chain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#testnet", "page_title": "wiki-general-glossary", "index": 116, "depth": 2, "title": "Testnet", "anchor": "testnet", "start_char": 27967, "end_char": 28165, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Testnet\n\nShort for \"test network\": an experimental network where testing and development takes place.\nNetworks are often executed on a testnet before they are deployed to a [mainnet](#mainnet)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#tracks", "page_title": "wiki-general-glossary", "index": 117, "depth": 2, "title": "Tracks", "anchor": "tracks", "start_char": 28165, "end_char": 28577, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Tracks\n\nEach [Origin](#origin) is associated with a single referendum class and each class is associated\nwith a [Track](../learn/learn-polkadot-opengov-origins.md#origins-and-tracks-info). The Track outlines\nthe lifecycle for the proposal and is independent from other class's tracks. Having independent\ntracks allows the network to tailor the dynamics of referenda based upon their implied privilege\nlevel."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#tranche", "page_title": "wiki-general-glossary", "index": 118, "depth": 2, "title": "Tranche", "anchor": "tranche", "start_char": 28577, "end_char": 29041, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Tranche\n\nValidators use a subjective, tick-based system to determine when the approval process should start.\nA validator starts the tick-based system when a new availability core candidates have been proposed,\nwhich can be retrieved via the\n[Runtime API](https://spec.polkadot.network/#sect-rt-api-availability-cores), and increments the\ntick every 500 milliseconds. Each tick/increment is referred to as a “tranche”, represented as an\ninteger, starting at 0."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#transfer", "page_title": "wiki-general-glossary", "index": 119, "depth": 2, "title": "Transfer", "anchor": "transfer", "start_char": 29041, "end_char": 29168, "estimated_token_count": 25, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transfer\n\nSend an asset from one account to another. This generally refers to transfers that occur only on the\nsame chain."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#transaction", "page_title": "wiki-general-glossary", "index": 120, "depth": 2, "title": "Transaction", "anchor": "transaction", "start_char": 29168, "end_char": 29476, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transaction\n\nAn extrinsic that is signed. Transactions are gossiped on the network and incur a transaction fee.\nTransactions are \"provably true\", unlike inherents. For example, one can prove that Alice wants to\nsend funds to Bob by the fact that she signed a transfer-funds message with her private key."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#validator", "page_title": "wiki-general-glossary", "index": 121, "depth": 2, "title": "Validator", "anchor": "validator", "start_char": 29476, "end_char": 29643, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Validator\n\nA node that secures the relay chain by staking DOT, validating proofs from collators on parachains\nand voting on consensus along with other validators."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#vertical-message-passing", "page_title": "wiki-general-glossary", "index": 122, "depth": 2, "title": "Vertical Message Passing", "anchor": "vertical-message-passing", "start_char": 29643, "end_char": 30081, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Vertical Message Passing\n\nVertical message passing consists of two separate types of message passing, Downward Message Passing\n(DMP) and Upward Message Passing (UMP). Downward messages pass from the relay chain to a parachain,\nalthough they may also originate from another parachain via\n[HRMP](#horizontal-relay-routed-message-passing). Upward messages originate from parachains and go\nup to the relay chain via runtime entry points."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#voting", "page_title": "wiki-general-glossary", "index": 123, "depth": 2, "title": "Voting", "anchor": "voting", "start_char": 30081, "end_char": 30316, "estimated_token_count": 43, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Voting\n\nThe process of stakeholders determining whether or not a referendum should pass. Votes are weighted\nboth by the number of DOT that the stakeholder account controls and the amount of time they are\nwilling to lock their DOT."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#waiting-nomination", "page_title": "wiki-general-glossary", "index": 124, "depth": 2, "title": "Waiting Nomination", "anchor": "waiting-nomination", "start_char": 30316, "end_char": 30629, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Waiting Nomination\n\nThe nominator has nominated this validator, but the validator was not elected into the active\nvalidator set this era and thus cannot produce blocks for the canonical chain. If the validator does\nget into the active set in a future era, this may turn into an active or inactive nomination."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#wallet", "page_title": "wiki-general-glossary", "index": 125, "depth": 2, "title": "Wallet", "anchor": "wallet", "start_char": 30629, "end_char": 30754, "estimated_token_count": 22, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Wallet\n\nA program that allows one to store private keys and sign transactions for Polkadot or other\nblockchain networks."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#wasm", "page_title": "wiki-general-glossary", "index": 126, "depth": 2, "title": "Wasm", "anchor": "wasm", "start_char": 30754, "end_char": 30814, "estimated_token_count": 14, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Wasm\n\nThe abbreviation for [WebAssembly](#webassembly)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#watermark", "page_title": "wiki-general-glossary", "index": 127, "depth": 2, "title": "Watermark", "anchor": "watermark", "start_char": 30814, "end_char": 31075, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Watermark\n\nIn Polkadot's parachain messaging scheme, the _watermark_ is the minimum processed send-height of\nthe receiving parachain. All messages on all channels that are sending to this parachain at or\nbefore the watermark are guaranteed to be processed."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#web3-foundation", "page_title": "wiki-general-glossary", "index": 128, "depth": 2, "title": "Web3 Foundation", "anchor": "web3-foundation", "start_char": 31075, "end_char": 31417, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Web3 Foundation\n\nA Switzerland-based foundation that nurtures and stewards technologies and applications in the\nfields of decentralized web software protocols, particularly those that utilize modern cryptographic\nmethods to safeguard decentralization, to the benefit and for the stability of the\n[Web3 ecosystem](./web3-and-polkadot.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#webassembly", "page_title": "wiki-general-glossary", "index": 129, "depth": 2, "title": "WebAssembly", "anchor": "webassembly", "start_char": 31417, "end_char": 31566, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## WebAssembly\n\nAn instruction format for a virtual, stack-based machine. Polkadot Runtime Modules are compiled to\nWebAssembly. Also known as Wasm."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#weights", "page_title": "wiki-general-glossary", "index": 130, "depth": 2, "title": "Weights", "anchor": "weights", "start_char": 31566, "end_char": 32346, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Weights\n\nA permission-less system needs to implement a mechanism to measure and limit usage in order to\nestablish an economic incentive structure, to prevent the network overload, and to mitigate DoS\nvulnerabilities. This mechanism must enforce a limited time-window for block producers to create a\nblock and include limitations on block size, to prevent execution of certain extrinsics which are\ndeemed too expensive and could decelerate the network. This is handled by the weight system, where\nthe cost of the transactions (referred to as [extrinsics](#extrinsic)) are determined before\nexecution. Checkout this section of the Substrate docs covering\n[transaction weights and fees](../../reference/parachains/blocks-transactions-fees/fees.md#transactions-weights-and-fees)."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#westend", "page_title": "wiki-general-glossary", "index": 131, "depth": 2, "title": "Westend", "anchor": "westend", "start_char": 32346, "end_char": 32669, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Westend\n\nThe [testnet](#testnet) is set aside for testing the Polkadot relay chain. Contrary to the Paseo testnet, the Westend testnet is used by the core developers to iterate on\nprotocol-level features like [asynchronous backing](../learn/learn-async-backing.md), etc, that are\nnot relevant for parachain developers."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#witness", "page_title": "wiki-general-glossary", "index": 132, "depth": 2, "title": "Witness", "anchor": "witness", "start_char": 32669, "end_char": 32731, "estimated_token_count": 10, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Witness\n\nCryptographic proof statements of data validity."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#whitelist-pallet", "page_title": "wiki-general-glossary", "index": 133, "depth": 2, "title": "Whitelist Pallet", "anchor": "whitelist-pallet", "start_char": 32731, "end_char": 33036, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Whitelist Pallet\n\nAllows one [Origin ](#origin) to escalate the privilege level of another Origin for a certain\noperation. In terms of OpenGov, it allows the [Fellowship](#technical-fellowship) to authorise a new origin\n(which we will call Whitelisted-Root) to be executed with Root-level privileges."}
{"source": "polkadot-docs", "page_id": "wiki-general-glossary", "url": "https://developer.polkadot.com/wiki/general/glossary/#zombienet", "page_title": "wiki-general-glossary", "index": 134, "depth": 2, "title": "Zombienet", "anchor": "zombienet", "start_char": 33036, "end_char": 33373, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e975dd15eefb6cdd9aba0c29bf6667ea6937f51297bb26e986b3ba3120e141b", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Zombienet\n\nA tool for running local Polkadot and Substrate testnets.\n\n\n# Other Glossaries\n\nSee below other glossaries about the Polkadot Ecosystem.\n\n- [Polkadot Glossary by UX Bounty](https://polkadot-ux-bounty.notion.site/UX-Glossary-v01-1a4e1c2781f3809c9292c6764804fa74)\n- [Glossary by Polkadot Support](../../reference/glossary.md)"}
{"source": "polkadot-docs", "page_id": "wiki-general-governance-apps", "url": "https://developer.polkadot.com/wiki/general/governance-apps/#subsquare", "page_title": "Polkadot Governance Apps", "index": 0, "depth": 2, "title": "SubSquare", "anchor": "subsquare", "start_char": 320, "end_char": 659, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e749cc24c552b25675b17fbf5bd6e29063d03351d50ba835ae33b5cd627ffce", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## SubSquare\n\n[SubSquare](https://subsquare.io/) is a governance platform well-designed for substrate based chains. It monitors on-chain\ngovernance events and provides user interfaces to facilitate various governance workflow. It has supported tens of chains including polkadot, kusama, acala, centrifuge, hydradx, interlay, phala, etc."}
{"source": "polkadot-docs", "page_id": "wiki-general-governance-apps", "url": "https://developer.polkadot.com/wiki/general/governance-apps/#delegation-dashboard", "page_title": "Polkadot Governance Apps", "index": 1, "depth": 2, "title": "Delegation Dashboard", "anchor": "delegation-dashboard", "start_char": 659, "end_char": 2214, "estimated_token_count": 404, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e749cc24c552b25675b17fbf5bd6e29063d03351d50ba835ae33b5cd627ffce", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Delegation Dashboard\n\nThe [Polkadot Delegation Dashboard](https://delegation.polkadot.network/) is a web3 application that\nallows you to delegate your voting power on [Polkadot OpenGov](../learn/learn-polkadot-opengov.md).\n\n!!!info \"How to get added as a Delegate on the Dashboard?\"\n    Anyone interested in being listed as a delegate can add their details on the [Governance-UI repository](https://github.com/paritytech/governance-ui/blob/main/assets/data/polkadot/delegates.json).\n\nTo make OpenGov multi-role delegation easy and intuitive,\n[Delegation Dashboard](https://delegation.polkadot.network/) provides an interactive interface that\ndisplays the list of delegates and their details. The video tutorial below walks through the\nfeatures of the Delegation Dashboard and shows how to perform multi-role delegation.\n\n<div class=\"row\">\n  \n  <a \n    href=\"https://www.youtube.com/watch?v=RapBYZc5ZPo\" \n    class=\"card-container\" \n    data-aos=\"fade-up\" \n    data-aos-delay=\"100\" \n    style=\"width: 300px; height: 300px;\"\n  >\n    <img src=\"https://img.youtube.com/vi/RapBYZc5ZPo/0.jpg\" class=\"card-image\" />\n    <p class=\"card-title\">Delegation Dashboard Tutorial</p>\n  </a>\n</div>\n\nFor detailed instructions on how to delegate your voting power using dashboard, check\n[this guide.](../learn/how-to/delegate-voting-power.md).\n\n**If you become a nomination pool member or a pool admin, you cannot participate in Governance with\nthe bonded tokens in the pool, as they are held in a\n[system account](../learn/learn-account-advanced.md#system-accounts).**"}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#_powered-by-polkadot_-or-_polka_-prefix-clarification", "page_title": "How to Do Your Own Research (DYOR)", "index": 0, "depth": 2, "title": "_Powered by Polkadot_ or _Polka_ prefix clarification", "anchor": "_powered-by-polkadot_-or-_polka_-prefix-clarification", "start_char": 1182, "end_char": 1909, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## _Powered by Polkadot_ or _Polka_ prefix clarification\n\nThe statement \"Powered by Polkadot\" on many projects' sites is often a cause of confusion. This\nusually means that the project is building, or intends to build, on the Polkadot ecosystem, using\n[Substrate](../../reference/parachains/index.md#substrate). But any project can claim that, so the existence of this\nstatement on a project's site infers no information about the project's legitimacy, and it's\ncertainly not a \"seal of approval\" by Web3 Foundation.\n\nThis also applies for projects with a \"Polka\" prefix in their name. Many projects use that to\nassociate themselves with the ecosystem, some legitimately and others only to piggyback on\nPolkadot's reputation."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#_hard_-metrics-to-look-for-when-you-dyor", "page_title": "How to Do Your Own Research (DYOR)", "index": 1, "depth": 2, "title": "_Hard_ metrics to look for when you DYOR", "anchor": "_hard_-metrics-to-look-for-when-you-dyor", "start_char": 1909, "end_char": 1954, "estimated_token_count": 10, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## _Hard_ metrics to look for when you DYOR"}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#association-with-entities-you-trust", "page_title": "How to Do Your Own Research (DYOR)", "index": 2, "depth": 3, "title": "Association with Entities You Trust", "anchor": "association-with-entities-you-trust", "start_char": 1954, "end_char": 4998, "estimated_token_count": 604, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Association with Entities You Trust\n\nNew projects usually try to increase their credibility by associating themselves with well-known\nentities. The thinking is simple: \"These entities that have a good reputation trust us, so if you\ntrust them, by association, you should trust us too\". Indeed, association with a trusted entity can\nbe a strong indicator of the legitimacy of a project.\n\nFor example, if a project had received a [Web3 Foundation Grant](https://grants.web3.foundation),\nthis is an indication that the project is indeed building on the Polkadot ecosystem, and if they\nhave delivered all of their milestones, then their code is most likely of reasonable quality.\n\nFurthermore, Web3 Foundation is not the only entity in the ecosystem that provides grants. Other\nreputable teams in the ecosystem that have developed platforms or prospective parachains provide\ngrants for projects to build on or expand their project. These are also indicators that a project is\ncommitted to building on the broader Polkadot ecosystem.\n\nReceiving funding from reputable VCs and are known to be involved with other reputable Polkadot\nprojects can also be a good indicator.\n\n**However**, claiming such associations and having them is not always the same thing. **You always\nneed to verify any claims a project makes**, and that is probably the most critical takeaway from\nthis guide.\n\nFor example, if a project has the\n[Web3 Foundation Grant badge](https://grants.web3.foundation/docs/Support%20Docs/grant-badge-guidelines)\non their site or claims to have received a grant, check to see if they have received one and that it\nhas not been terminated. The complete list of projects that have successfully applied for a grant\ncan be found [here](https://grants.web3.foundation/applications), where you can see what each\nproject has delivered and if, perhaps, their grant has been terminated.\n\nThe same thing goes for VC funding or another grant, or any advertised association for that matter.\nCheck on the corresponding sites to make sure such claims are valid.\n\nAlso, make sure you understand the _scope_ of the association. Going back to the Web3 grants\nexample, they have a precise scope. They are granted for specific deliverables, and the review team\nonly checks the code and evaluates these deliverables _of the particular project_. So, having\nreceived a Web3 grant provides no information about the general practices of a team, the longevity\nof the project besides the scope of the grant, or other projects the team might be building, which\nis why the badge rules clearly state that it should not be displayed on the team's landing page.\n\nSimilarly, if a project claims to have partnered with a reputable entity, verify its scope and if it\nis indeed a partnership by searching their site for projects they have partnered with, their press\nreleases, or by contacting them directly. And if you see such claims about Web3 Foundation, you can\nbe sure they're false because Web3 Foundation **does not** partner with, or endorse, ecosystem\nprojects."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#open-source", "page_title": "How to Do Your Own Research (DYOR)", "index": 3, "depth": 3, "title": "Open Source", "anchor": "open-source", "start_char": 4998, "end_char": 6658, "estimated_token_count": 356, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Open Source\n\nAn open-source project promotes transparency, builds trust, and potentially ensures project team\nhonesty. Additionally, it makes it very easy to track the project's progress and see how active the\nteam is in developing it.\n\nHowever, that does not mean that any closed source project is not legitimate or the team behind it\nhas something to hide. Many teams choose to keep their code private to protect their intellectual\nproperty. And several teams that do so have gotten a\n[General Grant](https://github.com/w3f/General-Grants-Program), under which members of the grants\nreview team review their private code.\n\nAnother thing that an open-source project allows you to see is if they have copied any code from\nother open sources. This isn't necessarily bad, since no one wants to re-invents the wheel, but\ncopied code should attribute to the source. If it doesn't, this should raise some red flags because\nthe project team tries to feign expertise by passing someone else's code as their own.\n\nA forked repo is easy to spot since it points to the original repo, but partially copied code might\nnot be as easy to find. A quick\n[search](https://duckduckgo.com/?q=search+for+copied+source+code+plagiarism&t=ffab&ia=web) can\nprovide you with some ways and tools to look for plagiarism.\n\nSo, a project being closed source is not necessarily a red flag. It just limits the ability to\nverify the project in that regard, but there are indirect ways as described below. However, a\nproject being open source is undoubtedly a potentially strong indicator of its legitimacy because\nshady or poor practices seldom stay hidden for long in open source code."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#active-development", "page_title": "How to Do Your Own Research (DYOR)", "index": 4, "depth": 3, "title": "Active Development", "anchor": "active-development", "start_char": 6658, "end_char": 7262, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Active Development\n\nIf a project team constantly updates their product, it is always a good indication that they are\nserious and passionate about building. Regularly releasing new features and upgrades, fixing bugs,\nupdating their site and notifying the community of these changes are good earmarks of a legitimate\nproject.\n\nAdditionally, active development _usually_ also means good development to be used as an _indirect_\nindicator for a closed source project.\n\nAn open-source project allows anyone to monitor the development activity through its code repository\ndirectly, such as through GitHub."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#comprehensive-documentation", "page_title": "How to Do Your Own Research (DYOR)", "index": 5, "depth": 3, "title": "Comprehensive Documentation", "anchor": "comprehensive-documentation", "start_char": 7262, "end_char": 8681, "estimated_token_count": 261, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Comprehensive Documentation\n\nThe existence of comprehensive documentation should be considered mandatory for any serious project.\nA couple of years ago, this meant a whitepaper, but lately, we have seen a shift to other forms of\ndocumentation, like wiki pages describing the various aspects.\n\nNo matter the form of the documentation, its existence and completion is necessary, and the more\ndetailed it is, the better. This is where the details of the project or parts of the project are\nexplained in full for prospective investors or users.\n\nThe documentation will also give you an idea of the technical expertise of the team. If the team\nanalyses their technology and technical aspects, this is a potential indication of technical\nprowess. On the other hand, if the team focuses only on tokenomics or analyses their project only in\nbroad, vague terms, this is potentially an indication that there is not a clear path to their goals.\n\nIf you are looking for an example of good documentation, look no further than our own wiki. Of course, you should not expect to find such extensive\ndocumentation on newly launched projects. Our wiki, after all, covers a whole ecosystem and was\npopulated over the course of multiple years. Updates are also constantly being pushed out and edits\nare consistently being made. Nevertheless, this wiki provides a good example of the documentation a\nlegitimate project should provide."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#reputable-team", "page_title": "How to Do Your Own Research (DYOR)", "index": 6, "depth": 3, "title": "Reputable Team", "anchor": "reputable-team", "start_char": 8681, "end_char": 10650, "estimated_token_count": 412, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Reputable Team\n\nSome teams display their team members prominently on their site, along with their social media\nprofiles (usually LinkedIn) and GitHub accounts. This gives prospective users and investors the\nability to verify the team's credentials, track records, and expertise.\n\nBut the keyword here is **verify**! Do not take what you see on the project's team at face value.\nLook them up and verify their track record. Do a Google search for the team members mentioned. If it\ncomes up empty, or the only results are regarding the project you are researching, it is an\nindication that their team members are potentially fake. Their photos on their site, if there are\nany, may also be stock photos, or in other words, also fake. These are usually easily recognisable,\nbut here is a [guide](https://helpdeskgeek.com/how-to/free-reverse-image-search-tools/) on how to do\na reverse image search, if you want to be thorough.\n\nIn some other cases, some developers prefer to maintain their anonymity, using pseudonyms, or the\nteam members are not mentioned at all. This is not necessarily a bad thing. Perhaps the team is a\nstrong proponent of privacy, or they want their work to speak for itself. Still, you should try and\nfind out who is behind the project and what they are doing. For developers, their GitHub activity\nmay be a stronger indicator of honesty. Other team members might be heavily engaged in their\ncommunity, providing guidance and answers, which is always a good sign.\n\nBut if the team are ghosts that do not show up anywhere and only engage with the community through\nproxies, this can be considered a red flag and extra precaution should be taken.\n\nBesides their community, projects that are serious about building on Polkadot usually engage with\nthe [community](community.md). They are active in the various\n[Polkadot and Kusama channels](./community.md), and some of them are Polkadot Ambassadors, or generally\nprominent members of the ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#clear-integration", "page_title": "How to Do Your Own Research (DYOR)", "index": 7, "depth": 3, "title": "Clear Integration", "anchor": "clear-integration", "start_char": 10650, "end_char": 12822, "estimated_token_count": 453, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Clear Integration\n\nThere are many ways for a project to build on Polkadot. Some of the most notable Polkadot projects\nare parachains on Kusama or gearing up to become one. Parachains can purchase\n[coretime](../learn/learn-agile-coretime.md) and access a relay chain's core.\n\nVerifying which projects are parachains on Kusama can be quickly done by visiting the\n[parachains](https://polkadot.js.org/apps/#/parachains) page on\n[polkadot.js.org/apps](https://polkadot.js.org/apps).\n\nBut not all projects that build a chain using [Substrate](../../reference/parachains/index.md#substrate) aim to become a\nparachain. Some use it simply because of its infrastructure to build their customised chain, without\nany plans to connect to the relay chain. And other projects may aim to become a parachain only on\nKusama or directly on Polkadot.\n\nHowever, building a potential parachain is not the only way to build on Polkadot and expand its\necosystem. A project might aim to build a DeFi platform on a parachain, launch a stablecoin or other\ntoken on the Asset Hub, build a decentralized exchange, or any other dApp that one might think of,\nwithout ever touching the relay chain.\n\nBut in all of those cases, their plans to build on Polkadot whatever they may be, should be clearly\nstated on their site and in their documentation. Most importantly, you should look for an\nexplanation of _how_ they plan to achieve that integration. A roadmap that places the integration at\nsome point in the future means close to nothing without clearly stating the steps to get there.\nThese plans should be evaluated in tandem with your research on the technical expertise of the team.\n\nThis is especially true for projects that are already running on another network, like on Ethereum\nor Binance Smart Chain, and have issued tokens there. Many projects do that either to raise funds\nand test their infrastructure or because they aim to build a \"multi-chain\" solution or both. But\nbecause those projects are not built on Substrate, the existence of a clear and robust\nintegration plan with the relay chain should be essential in your research to ensure that they will\nindeed build on it one day."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#_soft_-metrics", "page_title": "How to Do Your Own Research (DYOR)", "index": 8, "depth": 2, "title": "_Soft_ metrics", "anchor": "_soft_-metrics", "start_char": 12822, "end_char": 13326, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## _Soft_ metrics\n\nThe items above are what you should look at first when evaluating a project and should carry most of\nthe weight in your decision. The reason is that they are hard to fake or manipulate, assuming that\nyou are able to verify the information found. Hence we called them \"hard\" metrics.\n\nBut there are other things to look for that might point to a project's legitimacy but can be more\neasily manipulated, so they should not affect your decision heavily. These are called \"soft\"\nmetrics."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#site-quality", "page_title": "How to Do Your Own Research (DYOR)", "index": 9, "depth": 3, "title": "Site Quality", "anchor": "site-quality", "start_char": 13326, "end_char": 14419, "estimated_token_count": 211, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Site Quality\n\nThe quality of a project's site could sometimes provide insights into the legitimacy of a project. A\npoorly constructed site, may:\n\n- have typos, grammatical errors, or poor styling\n- be a template without any serious effort to improve or change it\n- hold little information about the project, without links to their GitHub or other resources\n- not \"feel\" professional\n\nThese are all potential indications that the team is not serious about this project.\n\nBut that does not mean that all well-designed sites are also solid projects. This is a soft metric,\nafter all. Many projects that do not have any plans to build anything substantial still have\nexcellent, or even beautiful-looking, sites. They put many resources into how they present\nthemselves visually to mislead. So, an excellent site does not necessarily indicate a legitimate\nproject, a poor site might indicate an illegitimate one, but the site quality alone usually is not\nenough to reach a conclusion. None of these metrics are sufficient alone; you need to look into all\nof them to make an educated decision."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#social-media-presence", "page_title": "How to Do Your Own Research (DYOR)", "index": 10, "depth": 3, "title": "Social Media Presence", "anchor": "social-media-presence", "start_char": 14419, "end_char": 15695, "estimated_token_count": 246, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Social Media Presence\n\nHaving a vibrant community is a good indication of a legitimate project. A team that engages with\ntheir community, gives updates, answers questions, holds AMAs, and posts articles, is a team that is\ninterested in keeping their community members updated and informed.\n\nThough at the same time, social media presence and engagement can be easily faked and manipulated.\nCreating a Telegram group or a Discord server and filling it with thousands of bots is very easy.\nAlthough bot users need to be identified on Discord according to its terms, scammers have little\nregard for terms and conditions.\n\nA team that tweets five times a day or posts a Medium article every other day may not necessarily be\nthe building something substantial.\n\nSo, make sure that you verify that their social media presence and engagement is genuine. Join their\nchannels, ask questions and see first-hand what the community and the admins look like. If you are\nseeing a lot of users posting very brief comments, like \"Good project\", \"To the moon\", \"Thank you\"\netc, without really engaging, remain skeptical and maintain a critical eye, as these are probably\nbots. Additionally, verify any information shared by the team on social media and also verify the\ncomments of users."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#media-presence", "page_title": "How to Do Your Own Research (DYOR)", "index": 11, "depth": 3, "title": "Media Presence", "anchor": "media-presence", "start_char": 15695, "end_char": 16752, "estimated_token_count": 198, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Media Presence\n\nRelated to social media presence is media presence: third-party articles, mentions in YouTube\nvideos, and general promotions of the project.\n\nWhen it comes to articles, the first thing to check is if the article is genuine coverage or a paid\npress release, especially when a project displays this coverage prominently on their page. Or if the\nauthor has any vested interest in promoting the project. You can check their previous articles to\nsee if they systematically \"shill\" this project or other projects in general.\n\nThis especially applies for YouTubers and influencers in general, who may be dishonest. Many of them\ndo this for a living or as a way to \"pump\" projects they have invested in. Finding good influencers\nthat provide as objective info as possible usually involves its own separate research.\n\nThat is not to say that media exposure is terrible. It is probably the most abundant source of\ninformation outside the project itself, but at the same time, it requires extensive cross-checking\nand verification of information."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#email-communication", "page_title": "How to Do Your Own Research (DYOR)", "index": 12, "depth": 3, "title": "Email Communication", "anchor": "email-communication", "start_char": 16752, "end_char": 17426, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Email Communication\n\nNowadays, many projects use Telegram, Discord, or similar apps for community engagement, as well as\nthe sole channel for communication, updates, and support. But having an email registered with their\ndomain, besides providing another channel of communication, can be considered an additional\ncredibility criterion.\n\nFurthermore, receiving emails from the project's domain makes it easy to verify that the\ncommunication is authentic (but look out for spoofed emails!). On the other hand, communicating\nthrough personal emails or using a public email provider, like Google or Yahoo, might indicate a\nless serious team or one that is spread too thin."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#additional-material", "page_title": "How to Do Your Own Research (DYOR)", "index": 13, "depth": 3, "title": "Additional Material", "anchor": "additional-material", "start_char": 17426, "end_char": 18363, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Additional Material\n\nFact-checking is a skill necessary not only for DYOR but also for filtering out the plethora of\ninformation that we come across on the internet on a daily basis. If you are interested in learning\nmore about fact-checking and claim verification, have a look at the following material.\n\n1. A very nice YouTube series on the art of fact-checking that covers a lot of ground can be found\n   [here](https://www.youtube.com/watch?v=L4aNmdL3Hr0&list=PL8dPuuaLjXtN07XYqqWSKpPrtNDiCHTzU).\n2. Another great resource on fact-checking, for those who prefer to read, can be found\n   [here](https://webliteracy.pressbooks.com).\n3. Wikipedia article on [fact-checking](https://en.wikipedia.org/wiki/Fact-checking)\n\nFinally, you should also check our complementary guide on [how to identify scams](./scams.md), which\nexplains how to identify outright scams and avoid them, as well as how to protect your sensitive\ninformation."}
{"source": "polkadot-docs", "page_id": "wiki-general-how-to-dyor", "url": "https://developer.polkadot.com/wiki/general/how-to-dyor/#one-last-piece-of-advice", "page_title": "How to Do Your Own Research (DYOR)", "index": 14, "depth": 3, "title": "One Last Piece of Advice", "anchor": "one-last-piece-of-advice", "start_char": 18363, "end_char": 18858, "estimated_token_count": 94, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:05e7457cccbcbd38ae063bd7d665c6329bd67ad5fc1ff90f914d047217495d24", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### One Last Piece of Advice\n\nOnce you have read through this material and have done your research and have identified a project\nas legitimate, it is also imperative that you understand what the project does and what novelty it\naims to bring to the ecosystem.\n\nThis does not fall under fact-checking and verifying claims, but it is important to mention: fully\nunderstanding what something does and its prospective impact is an integral part of making an\ninformed decision, so do not overlook it."}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#ledger-devices-compatibility", "page_title": "Using the Polkadot Ledger Apps", "index": 0, "depth": 2, "title": "Ledger Devices Compatibility", "anchor": "ledger-devices-compatibility", "start_char": 2079, "end_char": 2837, "estimated_token_count": 223, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Ledger Devices Compatibility\n\n|   Device    |         Platform         | Battery |               Security               | \n| :---------: | :----------------------: | :-----: | :---------------------------------: | \n| Nano S Plus |            PC<sup>1</sup>             |   No    |   Certified Secure Element (CC EAL6+) |\n|   Nano X    | PC, Mobile via bluetooth |   Yes   |   Certified Secure Element (CC EAL5+) |\n|    Stax     | PC, Mobile via bluetooth or NFC |   Yes   |  Certified Secure Element (CC EAL6+) |\n|    Flex     | PC, Mobile via bluetooth or NFC |   Yes   |  Certified Secure Element (CC EAL6+) |\n\n<sup>1</sup> Because of required WebUSB support, Ledger wallets currently only work on\nChromium-based browsers like Google Chrome.<br/><br/>"}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#requirements", "page_title": "Using the Polkadot Ledger Apps", "index": 1, "depth": 2, "title": "Requirements", "anchor": "requirements", "start_char": 2837, "end_char": 3580, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Requirements\n\nHere is a list of what you will need before using Polkadot with Ledger:\n\n- A Ledger Nano S Plus, Nano X, Stax, Flex, or newer device.\n- [Ledger Live](https://www.ledger.com/ledger-live) installed and up-to-date.\n- The latest firmware for your Ledger device installed (always check for updates in Ledger Live\n  under the \"Manager\" tab; you will need to allow access with your nano).\n- A Chromium-based web browser if you use a browser extension.\n\nLedger devices are tiny computers. They have an operating system (or firmware), and on top of it,\nyou can install applications. Every blockchain needs to develop its own application to use Ledger\ndevices. Make sure you have your Ledger devices with firmware and apps up-to-date."}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#polkadot-ledger-apps", "page_title": "Using the Polkadot Ledger Apps", "index": 2, "depth": 2, "title": "Polkadot Ledger Apps", "anchor": "polkadot-ledger-apps", "start_char": 3580, "end_char": 4039, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Ledger Apps\n\nLedger devices can be equipped with applications that are blockchain-specific. Third parties usually\ndevelop such applications, enabling users to transact securely on the blockchain network. Polkadot\nLedger apps are developed by [Zondax](https://zondax.ch/) and are available\n[here](https://github.com/Zondax/ledger-polkadot). The Polkadot Ledger application allows you to\nmanage Polkadot, Kusama and their parachains native tokens."}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#polkadot-migration-app", "page_title": "Using the Polkadot Ledger Apps", "index": 3, "depth": 3, "title": "Polkadot Migration App", "anchor": "polkadot-migration-app", "start_char": 4039, "end_char": 5351, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot Migration App\n\n!!! warning \"For Migration Only\"\n    This app is only meant for performing the migration to the Polkadot (Generic) App; do not use it frequently.\n\n    After you migrate your assets, delete the Migration app and use the Polkadot App.\n\nThe Polkadot Migration app is for users having **old Ledger accounts not on the Polkadot relay chain\nand [Polkadot System Chains](glossary.md#system-parachains)**. \n\nOld Ledger accounts are accounts\nthat have been created using the old Kusama Ledger app and any parachain Ledger apps (for both\nKusama and Polkadot) except for Polkadot System Chains.\n\nSuppose you have accounts on any Polkadot parachain, Kusama relay chain, and Kusama parachains. In\nthat case, you will need the Polkadot Migration app to move fungible and non-fungible assets (NFT),\nidentities, etc., from old Ledger accounts to a new one or an existing one created with the Polkadot Ledger app.\n\n!!! note \"The migration app has nothing to do with the Asset Hub migration\"\n    The migration app was made before [the Asset Hub migration](../learn/how-to/asset-hub-migration.md).\n    \n    With the Asset Hub migration, users who have old Kusama Ledger accounts will need to use the migration app to transfer funds and assets to a new account generated via the Polkadot (Generic) app."}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#polkadot-generic-app", "page_title": "Using the Polkadot Ledger Apps", "index": 4, "depth": 3, "title": "Polkadot (Generic) App", "anchor": "polkadot-generic-app", "start_char": 5351, "end_char": 6999, "estimated_token_count": 338, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot (Generic) App\n\n!!! info \"Ledger Generic Support\"\n    See [the Parity Metadata page](https://data.parity.io/metadata) to see which Polkadot and Kusama rollup chains support the Polkadot Generic Ledger App.\n\nThe Polkadot Generic Ledger App will allow you to use your Ledger device on the relay chain and\nparachains without being affected by runtime upgrades. The goal is to provide a single application\nfor the entire Polkadot ecosystem without compromising security. This new app will also count with\nClear Signing, allowing you to see what you sign on a trusted display. This way, unintentionally\nsigning rogue transactions can be avoided. [See this page](transaction-attacks.md) to understand\nthe importance of verifying transactions before signing them.\n\nThe Polkadot Ledger Generic app brings the following benefits:\n\n- Innovation Acceleration: Enabling teams to innovate and develop new features for relay chains,\n  parachains, and current/future users.\n- Network Adoption: Facilitating a smoother and more user-friendly adoption of the Polkadot\n  ecosystem.\n- Innovation without compromising security: The new Polkadot app comes with the highest security\n  standards so that users can keep their assets safe.\n- Development Efficiency: The app helps developing teams save costs by having and maintaining their\n  app.\n\nThe Polkadot Ledger Generic app is supported by Ledger Live,\n[Nova Wallet](https://novawallet.io/), [Talisman](https://www.talisman.xyz/),\nand [Subwallet](https://www.subwallet.app/).\n\nFor more information about the Polkadot Generic App, see the\n[Ledger FAQ](https://support.ledger.com/article/360016289919-zd)."}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#migration-process", "page_title": "Using the Polkadot Ledger Apps", "index": 5, "depth": 2, "title": "Migration Process", "anchor": "migration-process", "start_char": 6999, "end_char": 8227, "estimated_token_count": 248, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Migration Process\n\nThe migration process is not meant for Polkadot relay chain and System Chains users. Those users can\ninstall the Polkadot app and operate it as usual. For users of Kusama relay chain, Kusama System\nChains and parachains, and Polkadot parachains, see the procedure below:\n\n- Install Polkadot Migration and Polkadot App.\n- Use a browser extension or mobile wallet that supports the new apps. No application will\n  automatically migrate your assets. You need to manually migrate your assets,\n  [identities](../learn/learn-identity.md), [staking](../learn/learn-staking.md), etc., to the\n  account controlled by the Polkadot app and sign in with the Migration app (some extensions and\n  wallets UI will prompt which app you need to use to sign in depending on the chain you are in).\n- When the migration process is finished, you can delete the Migration app, and everything will be\n  accessible using the Polkadot Generic app.\n\n!!! info \"Staking and Identities\"\n    The migration process will also include removing identities from your old account and resetting them\n    to the new one. You will also need to unstake, wait for the unbonding period, transfer the funds to\n    the new account, and stake again."}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#using-ledger-live", "page_title": "Using the Polkadot Ledger Apps", "index": 6, "depth": 2, "title": "Using Ledger Live", "anchor": "using-ledger-live", "start_char": 8227, "end_char": 8501, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Using Ledger Live\n\nSee [Ledger Live](https://www.ledger.com/ledger-live) to learn how to use Polkadot with Ledger Live.\n\n---\n\n!!! info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the\n    [Polkadot-JS guides about Ledger](../learn/learn-guides-ledger.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-ledger", "url": "https://developer.polkadot.com/wiki/general/ledger/#how-to-guides", "page_title": "Using the Polkadot Ledger Apps", "index": 7, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 8501, "end_char": 9261, "estimated_token_count": 255, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:53a84f85f205d76a142fc37c4aac75efb7b3a49a93152647a89336174baa9c26", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [Ledger — How to Sign a Transaction](../learn/how-to/ledger-sign-transaction.md)\n- [How to Add a Ledger Account](../learn/how-to/add-ledger-account.md)\n- [How to Add Your Ledger Account (Developer Signer)](../learn/how-to/add-ledger-account-signer.md)\n- [Ledger — How to Confirm the Account Address on Your Device](../learn/how-to/ledger-confirm-address.md)\n- [Ledger — How to Migrate Your Account to the Generic App](../learn/how-to/ledger-migrate-generic-app.md)\n- [Ledger — How to Send DOT from Your Account](../learn/how-to/ledger-send-dot.md)\n- [Ledger — Can I Import an Existing Account to My Device?](../learn/how-to/ledger-import-account.md)\n- [Ledger — Can I Use the Polkadot App for Kusama?](../learn/how-to/ledger-kusama-app.md)"}
{"source": "polkadot-docs", "page_id": "wiki-general-maintain-errors", "url": "https://developer.polkadot.com/wiki/general/maintain-errors/#polkadot-js-apps-explorer", "page_title": "Resolving Errors", "index": 0, "depth": 2, "title": "Polkadot-JS Apps Explorer", "anchor": "polkadot-js-apps-explorer", "start_char": 650, "end_char": 1659, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88e908e423ec2ebfb1c6139d0e2cec7f4803c5601e938496521dc9a62ab87344", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot-JS Apps Explorer\n\nHere's how to find out the detailed error description through Polkadot-JS Apps.\n\nA typical failed transactions looks something like this:\n\n![Error while sending a transaction](../assets/errors/01.jpg)\n\nThe image displays only the error name as defined in the code, not its error message. Despite this\nerror being rather self-explanatory, let's find its details.\n\nIn the [explorer tab](https://polkadot.js.org/apps/#/explorer), find the block in which this failure\noccurred. Then, expand the `system.ExtrinsicFailed` frame:\n\n![Error described](../assets/errors/02.jpg)\n\nNotice how the `details` field contains a human-readable description of the error. Most errors will\nhave this, if looked up this way.\n\n[This block](https://polkadot.js.org/apps/#/explorer/query/0xa10104ed21dfe409c7871a975155766c5dd97e1e2ac7faf3c90f1f8dca89104b)\nis a live example of the above.\n\nIf you cannot look up the error this way, or there is no message in the `details` field, consult the\ntable below."}
{"source": "polkadot-docs", "page_id": "wiki-general-maintain-errors", "url": "https://developer.polkadot.com/wiki/general/maintain-errors/#subscan", "page_title": "Resolving Errors", "index": 1, "depth": 2, "title": "Subscan", "anchor": "subscan", "start_char": 1659, "end_char": 2981, "estimated_token_count": 323, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88e908e423ec2ebfb1c6139d0e2cec7f4803c5601e938496521dc9a62ab87344", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Subscan\n\nThe `ExtrinsicFailed` event indicates when a transaction does not succeed\n([example](https://polkadot.subscan.io/extrinsic/19983878-2?event=19983878-53)). This event gives us\nthe `error` and `index` (as seen in the table of the event, in the `dispatch_error` row) indices of\nthe error but does not give us a nice message to understand what it means. We will look up the error\nin the codebase ourselves to understand what went wrong.\n\nFirst, we should understand that the `index` number is the index of the pallet in the runtime from\nwhich the error originated. The `error` is likewise the index of that pallet's errors which is the\nexact one we're looking for. Both of these indices start counting from 0.\n\nFor example, if `index` is 5 and `error` is 3, as in the example linked above, we need to look at\nthe runtime for the fourth error (index 3) in the sixth pallet (index 5).\n\nBy looking at the\n[runtime code](https://github.com/polkadot-fellows/runtimes/blob/main/relay/polkadot/src/lib.rs) we\nsee that the pallet at index 5 is `Balances`. Now we will check the Balances pallet's code which is\nhosted in the Substrate repository, and look for the fourth error in the `Error enum`. According to\nits source the error that we got is `InsufficientBalance`, or in other words, \"Balance too low to\nsend value\"."}
{"source": "polkadot-docs", "page_id": "wiki-general-maintain-errors", "url": "https://developer.polkadot.com/wiki/general/maintain-errors/#common-errors", "page_title": "Resolving Errors", "index": 2, "depth": 2, "title": "Common Errors", "anchor": "common-errors", "start_char": 2981, "end_char": 8757, "estimated_token_count": 1129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88e908e423ec2ebfb1c6139d0e2cec7f4803c5601e938496521dc9a62ab87344", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Common Errors\n\nThe table below lists the most commonly encountered errors and ways to resolve them.\n\n| Error              | Description                                                                                                  | Solution                                                                                                                                                                                                                                                                                                                                                                                  |\n| ------------------ | ------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| BadOrigin          | You are not allowed to do this operation, e.g. trying to create a council motion with a non-council account. | Either switch to an account that has the necessary permissions, or check if the operation you're trying to execute is permitted at all (e.g. calling `system.setCode` to do a runtime upgrade directly, without voting).                                                                                                                                                                  |\n| BadProof           | The transaction's signature seems invalid.                                                                   | It's possible that the node you're connected to is following an obsolete fork - trying again after it catches up usually resolves the issue. To check for bigger problems, inspect the last finalized and current best block of the node you're connected to and compare the values to chain stats exposed by other nodes - are they in sync? If not, try connecting to a different node. |\n| Future             | Transaction nonce too high, i.e. it's \"from the future\", **see note below**.                                 | Reduce the nonce to +1 of current nonce. Check current nonce by inspecting the address you're using to send the transaction.                                                                                                                                                                                                                                                              |\n| Stale              | Transaction nonce too low.                                                                                   | Increase the nonce to +1 of current nonce. Check current nonce by inspecting the address you're using to send the transaction.                                                                                                                                                                                                                                                            |\n| ExhaustsResources  | There aren't enough resources left in the current block to submit this transaction.                          | Try again in the next block.                                                                                                                                                                                                                                                                                                                                                              |\n| Payment            | Unable to pay for TX fee.                                                                                    | You might not have enough free balance to cover the fee this transaction would incur.                                                                                                                                                                                                                                                                                                     |\n| InsufficientBalance | You are trying to send more than your transferable balance allows, e.g. sending out all of your funds without leaving enough to cover the transaction fee or the [existential deposit](../learn/how-to/existential-deposit.md). | The transaction fee is shown before you confirm the transfer. Reduce the amount you're sending so that enough transferable balance remains to pay the fee. To move all of your funds out in one go, use the option to transfer the full account balance, which lets the system account for the fee and existential deposit for you. See [transferring funds](../learn/how-to/transfer-funds.md). |\n| Temporarily banned | The transaction is temporarily banned.                                                                       | The tx is already in pool. Either try on a different node, or wait to see if the initial transaction goes through.                                                                                                                                                                                                                                                                        |\n\n!!!note \"Future Error\"\n    This error will not cause the TX to be discarded immediately. Instead, it will be sent to the\n    [futures queue](../../reference/parachains/blocks-transactions-fees/transactions.md#lifecycle-of-a-transaction), where it\n    will wait to be executed at the correct place in the nonce sequence OR it will get discarded due to\n    some other error (ex. the validity period expires)."}
{"source": "polkadot-docs", "page_id": "wiki-general-maintain-errors", "url": "https://developer.polkadot.com/wiki/general/maintain-errors/#error-table", "page_title": "Resolving Errors", "index": 3, "depth": 2, "title": "Error Table", "anchor": "error-table", "start_char": 8757, "end_char": 8889, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88e908e423ec2ebfb1c6139d0e2cec7f4803c5601e938496521dc9a62ab87344", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Error Table\n\nThe below table is a reference to the errors that exists in Polkadot. It is generated from the\nruntime's metadata."}
{"source": "polkadot-docs", "page_id": "wiki-general-maintain-errors", "url": "https://developer.polkadot.com/wiki/general/maintain-errors/#errors-from-current-pallets-on-polkadot", "page_title": "Resolving Errors", "index": 4, "depth": 3, "title": "Errors from Current Pallets on Polkadot", "anchor": "errors-from-current-pallets-on-polkadot", "start_char": 8889, "end_char": 43066, "estimated_token_count": 2774, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88e908e423ec2ebfb1c6139d0e2cec7f4803c5601e938496521dc9a62ab87344", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Errors from Current Pallets on Polkadot\n\n\n| Pallet                  | Error                                  | Documentation                                                                                                                                    |\n| ----------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |\n| System (0)              |                                        |                                                                                                                                                  |\n|                         | InvalidSpecName (0)                    | The name of specification does not match between the current runtime and the new runtime.                                                        |\n|                         | SpecVersionNeedsToIncrease (1)         | The specification version is not allowed to decrease between the current runtime and the new runtime.                                            |\n|                         | FailedToExtractRuntimeVersion (2)      | Failed to extract the runtime version from the new runtime. Either calling `Core_version` or decoding `RuntimeVersion` failed.                   |\n|                         | NonDefaultComposite (3)                | Suicide called when the account has non-default composite data.                                                                                  |\n|                         | NonZeroRefCount (4)                    | There is a non-zero reference count preventing the account from being purged.                                                                    |\n| Scheduler (1)           |                                        |                                                                                                                                                  |\n|                         | FailedToSchedule (0)                   | Failed to schedule a call                                                                                                                        |\n|                         | NotFound (1)                           | Cannot find the scheduled call.                                                                                                                  |\n|                         | TargetBlockNumberInPast (2)            | Given target block number is in the past.                                                                                                        |\n|                         | RescheduleNoChange (3)                 | Reschedule failed because it does not change scheduled time.                                                                                     |\n| Balances (5)            |                                        |                                                                                                                                                  |\n|                         | VestingBalance (0)                     | Vesting balance too high to send value                                                                                                           |\n|                         | LiquidityRestrictions (1)              | Account liquidity restrictions prevent withdrawal                                                                                                |\n|                         | Overflow (2)                           | Got an overflow after adding                                                                                                                     |\n|                         | InsufficientBalance (3)                | Balance too low to send value                                                                                                                    |\n|                         | ExistentialDeposit (4)                 | Value too low to create account due to existential deposit                                                                                       |\n|                         | KeepAlive (5)                          | Transfer/payment would kill account                                                                                                              |\n|                         | ExistingVestingSchedule (6)            | A vesting schedule already exists for this account                                                                                               |\n|                         | DeadAccount (7)                        | Beneficiary account must pre-exist                                                                                                               |\n| Authorship (6)          |                                        |                                                                                                                                                  |\n|                         | InvalidUncleParent (0)                 | The uncle parent not in the chain.                                                                                                               |\n|                         | UnclesAlreadySet (1)                   | Uncles already set in the block.                                                                                                                 |\n|                         | TooManyUncles (2)                      | Too many uncles.                                                                                                                                 |\n|                         | GenesisUncle (3)                       | The uncle is genesis.                                                                                                                            |\n|                         | TooHighUncle (4)                       | The uncle is too high in chain.                                                                                                                  |\n|                         | UncleAlreadyIncluded (5)               | The uncle is already included.                                                                                                                   |\n|                         | OldUncle (6)                           | The uncle isn't recent enough to be included.                                                                                                    |\n| Staking (7)             |                                        |                                                                                                                                                  |\n|                         | NotController (0)                      | Not a controller account.                                                                                                                        |\n|                         | NotStash (1)                           | Not a stash account.                                                                                                                             |\n|                         | AlreadyBonded (2)                      | Stash is already bonded.                                                                                                                         |\n|                         | AlreadyPaired (3)                      | Controller is already paired.                                                                                                                    |\n|                         | EmptyTargets (4)                       | Targets cannot be empty.                                                                                                                         |\n|                         | DuplicateIndex (5)                     | Duplicate index.                                                                                                                                 |\n|                         | InvalidSlashIndex (6)                  | Slash record index out of bounds.                                                                                                                |\n|                         | InsufficientValue (7)                  | Cannot bond with value less than minimum balance.                                                                                               |\n|                         | NoMoreChunks (8)                       | Cannot schedule more unlock chunks.                                                                                                             |\n|                         | NoUnlockChunk (9)                      | Cannot rebond without unlocking chunks.                                                                                                         |\n|                         | FundedTarget (10)                      | Attempting to target a stash that still has funds.                                                                                               |\n|                         | InvalidEraToReward (11)                | Invalid era to reward.                                                                                                                           |\n|                         | InvalidNumberOfNominations (12)        | Invalid number of nominations.                                                                                                                   |\n|                         | NotSortedAndUnique (13)                | Items are not sorted and unique.                                                                                                                 |\n|                         | AlreadyClaimed (14)                    | Rewards for this era have already been claimed for this validator.                                                                               |\n|                         | OffchainElectionEarlySubmission (15)   | The submitted result is received out of the open window.                                                                                         |\n|                         | OffchainElectionWeakSubmission (16)    | The submitted result is not as good as the one stored on chain.                                                                                  |\n|                         | SnapshotUnavailable (17)               | The snapshot data of the current window is missing.                                                                                              |\n|                         | OffchainElectionBogusWinnerCount (18)  | Incorrect number of winners were presented.                                                                                                      |\n|                         | OffchainElectionBogusWinner (19)       | One of the submitted winners is not an active candidate on chain (index is out of range in snapshot).                                            |\n|                         | OffchainElectionBogusCompact (20)      | Error while building the assignment type from the compact. This can happen if an index is invalid, or if the weights _overflow_.                 |\n|                         | OffchainElectionBogusNominator (21)    | One of the submitted nominators is not an active nominator on chain.                                                                             |\n|                         | OffchainElectionBogusNomination (22)   | One of the submitted nominators has an edge to which they have not voted on chain.                                                               |\n|                         | OffchainElectionSlashedNomination (23) | One of the submitted nominators has an edge which is submitted before the last non-zero slash of the target.                                     |\n|                         | OffchainElectionBogusSelfVote (24)     | A self vote must only be originated from a validator to ONLY themselves.                                                                         |\n|                         | OffchainElectionBogusEdge (25)         | The submitted result has unknown edges that are not among the presented winners.                                                                 |\n|                         | OffchainElectionBogusScore (26)        | The claimed score does not match with the one computed from the data.                                                                            |\n|                         | OffchainElectionBogusElectionSize (27) | The election size is invalid.                                                                                                                    |\n|                         | CallNotAllowed (28)                    | The call is not allowed at the given time due to restrictions of election period.                                                                |\n|                         | IncorrectHistoryDepth (29)             | Incorrect previous history depth input provided.                                                                                                 |\n|                         | IncorrectSlashingSpans (30)            | Incorrect number of slashing spans provided.                                                                                                     |\n| Session (9)             |                                        |                                                                                                                                                  |\n|                         | InvalidProof (0)                       | Invalid ownership proof.                                                                                                                         |\n|                         | NoAssociatedValidatorId (1)            | No associated validator ID for account.                                                                                                          |\n|                         | DuplicatedKey (2)                      | Registered duplicate key.                                                                                                                        |\n|                         | NoKeys (3)                             | No keys are associated with this account.                                                                                                        |\n| Grandpa (11)            |                                        |                                                                                                                                                  |\n|                         | PauseFailed (0)                        | Attempt to signal GRANDPA pause when the authority set isn't live (either paused or already pending pause).                                      |\n|                         | ResumeFailed (1)                       | Attempt to signal GRANDPA resume when the authority set isn't paused (either live or already pending resume).                                    |\n|                         | ChangePending (2)                      | Attempt to signal GRANDPA change with one already pending.                                                                                       |\n|                         | TooSoon (3)                            | Cannot signal forced change so soon after last.                                                                                                  |\n|                         | InvalidKeyOwnershipProof (4)           | A key ownership proof provided as part of an equivocation report is invalid.                                                                     |\n|                         | InvalidEquivocationProof (5)           | An equivocation proof provided as part of an equivocation report is invalid.                                                                     |\n|                         | DuplicateOffenceReport (6)             | A given equivocation report is valid but already previously reported.                                                                            |     |\n| ElectionsPhragmen (17)  |                                        |                                                                                                                                                  |\n|                         | UnableToVote (0)                       | Cannot vote when no candidates or members exist.                                                                                                 |\n|                         | NoVotes (1)                            | Must vote for at least one candidate.                                                                                                            |\n|                         | TooManyVotes (2)                       | Cannot vote more than candidates.                                                                                                                |\n|                         | MaximumVotesExceeded (3)               | Cannot vote more than maximum allowed.                                                                                                           |\n|                         | LowBalance (4)                         | Cannot vote with stake less than minimum balance.                                                                                                |\n|                         | UnableToPayBond (5)                    | Voter cannot pay voting bond.                                                                                                                   |\n|                         | MustBeVoter (6)                        | Must be a voter.                                                                                                                                 |\n|                         | ReportSelf (7)                         | Cannot report self.                                                                                                                              |\n|                         | DuplicatedCandidate (8)                | Duplicated candidate submission.                                                                                                                 |\n|                         | MemberSubmit (9)                       | Member cannot re-submit candidacy.                                                                                                               |\n|                         | RunnerSubmit (10)                      | Runner cannot re-submit candidacy.                                                                                                               |\n|                         | InsufficientCandidateFunds (11)        | Candidate does not have enough funds.                                                                                                            |\n|                         | NotMember (12)                         | Not a member.                                                                                                                                    |\n|                         | InvalidCandidateCount (13)             | The provided count of number of candidates is incorrect.                                                                                         |\n|                         | InvalidVoteCount (14)                  | The provided count of number of votes is incorrect.                                                                                              |\n|                         | InvalidRenouncing (15)                 | The renouncing origin presented a wrong `Renouncing` parameter.                                                                                  |\n|                         | InvalidReplacement (16)                | Prediction regarding replacement after member removal is wrong.                                                                                  |\n| Treasury (19)           |                                        |                                                                                                                                                  |\n|                         | InsufficientProposersBalance (0)       | Proposer's balance is too low.                                                                                                                   |\n|                         | InvalidIndex (1)                       | No proposal or bounty at that index.                                                                                                             |\n|                         | ReasonTooBig (2)                       | The reason given is just too big.                                                                                                                |\n|                         | AlreadyKnown (3)                       | The tip was already found/started.                                                                                                               |\n|                         | UnknownTip (4)                         | The tip hash is unknown.                                                                                                                         |\n|                         | NotFinder (5)                          | The account attempting to retract the tip is not the finder of the tip.                                                                          |\n|                         | StillOpen (6)                          | The tip cannot be claimed/closed because there are not enough tippers yet.                                                                       |\n|                         | Premature (7)                          | The tip cannot be claimed/closed because it's still in the countdown period.                                                                     |\n|                         | UnexpectedStatus (8)                   | The bounty status is unexpected.                                                                                                                 |\n|                         | RequireCurator (9)                     | Require bounty curator.                                                                                                                          |\n|                         | InvalidValue (10)                      | Invalid bounty value.                                                                                                                            |\n|                         | InvalidFee (11)                        | Invalid bounty fee.                                                                                                                              |\n|                         | PendingPayout (12)                     | A bounty payout is pending. To cancel the bounty, you must unassign and slash the curator.                                                       |\n| Claims (24)             |                                        |                                                                                                                                                  |\n|                         | InvalidEthereumSignature (0)           | Invalid Ethereum signature.                                                                                                                      |\n|                         | SignerHasNoClaim (1)                   | Ethereum address has no claim.                                                                                                                   |\n|                         | SenderHasNoClaim (2)                   | Account ID sending tx has no claim.                                                                                                              |\n|                         | PotUnderflow (3)                       | There's not enough in the pot to pay out some unvested amount. Generally implies a logic error.                                                  |\n|                         | InvalidStatement (4)                   | A needed statement was not included.                                                                                                             |\n|                         | VestedBalanceExists (5)                | The account already has a vested balance.                                                                                                        |\n| Vesting (25)            |                                        |                                                                                                                                                  |\n|                         | NotVesting (0)                         | The account given is not vesting.                                                                                                                |\n|                         | ExistingVestingSchedule (1)            | An existing vesting schedule already exists for this account that cannot be clobbered.                                                           |\n|                         | AmountLow (2)                          | Amount being transferred is too low to create a vesting schedule.                                                                                |\n| Identity (28)           |                                        |                                                                                                                                                  |\n|                         | TooManySubAccounts (0)                 | Too many subs-accounts.                                                                                                                          |\n|                         | NotFound (1)                           | Account isn't found.                                                                                                                             |\n|                         | NotNamed (2)                           | Account isn't named.                                                                                                                             |\n|                         | EmptyIndex (3)                         | Empty index.                                                                                                                                     |\n|                         | FeeChanged (4)                         | Fee is changed.                                                                                                                                  |\n|                         | NoIdentity (5)                         | No identity found.                                                                                                                               |\n|                         | StickyJudgement (6)                    | Sticky judgement.                                                                                                                                |\n|                         | JudgementGiven (7)                     | Judgement given.                                                                                                                                 |\n|                         | InvalidJudgement (8)                   | Invalid judgement.                                                                                                                               |\n|                         | InvalidIndex (9)                       | The index is invalid.                                                                                                                            |\n|                         | InvalidTarget (10)                     | The target is invalid.                                                                                                                           |\n|                         | TooManyFields (11)                     | Too many additional fields.                                                                                                                      |\n|                         | TooManyRegistrars (12)                 | Maximum amount of registrars reached. Cannot add any more.                                                                                       |\n|                         | AlreadyClaimed (13)                    | Account ID is already named.                                                                                                                     |\n|                         | NotSub (14)                            | Sender is not a sub-account.                                                                                                                     |\n|                         | NotOwned (15)                          | Sub-account isn't owned by sender.                                                                                                               |\n| Proxy (29)              |                                        |                                                                                                                                                  |\n|                         | TooMany (0)                            | There are too many proxies registered or too many announcements pending.                                                                         |\n|                         | NotFound (1)                           | Proxy registration not found.                                                                                                                    |\n|                         | NotProxy (2)                           | Sender is not a proxy of the account to be proxied.                                                                                              |\n|                         | Unproxyable (3)                        | A call which is incompatible with the proxy type's filter was attempted.                                                                         |\n|                         | Duplicate (4)                          | Account is already a proxy.                                                                                                                      |\n|                         | NoPermission (5)                       | Call may not be made by proxy because it may escalate its privileges.                                                                            |\n|                         | Unannounced (6)                        | Announcement, if made at all, was made too recently.                                                                                             |\n| Multisig (30)           |                                        |                                                                                                                                                  |\n|                         | MinimumThreshold (0)                   | Threshold must be 2 or greater.                                                                                                                  |\n|                         | AlreadyApproved (1)                    | Call is already approved by this signatory.                                                                                                      |\n|                         | NoApprovalsNeeded (2)                  | Call doesn't need any (more) approvals.                                                                                                          |\n|                         | TooFewSignatories (3)                  | There are too few signatories in the list.                                                                                                       |\n|                         | TooManySignatories (4)                 | There are too many signatories in the list.                                                                                                      |\n|                         | SignatoriesOutOfOrder (5)              | The signatories were provided out of order; they should be ordered.                                                                              |\n|                         | SenderInSignatories (6)                | The sender was contained in the other signatories; it shouldn't be.                                                                              |\n|                         | NotFound (7)                           | Multisig operation not found when attempting to cancel.                                                                                          |\n|                         | NotOwner (8)                           | Only the account that originally created the multisig is able to cancel it.                                                                      |\n|                         | NoTimepoint (9)                        | No timepoint was given, yet the multisig operation is already underway.                                                                          |\n|                         | WrongTimepoint (10)                    | A different timepoint was given to the multisig operation that is underway.                                                                      |\n|                         | UnexpectedTimepoint (11)               | A timepoint was given, yet no multisig operation is underway.                                                                                    |\n|                         | WeightTooLow (12)                      | The maximum weight information provided was too low.                                                                                             |\n|                         | AlreadyStored (13)                     | The data to be stored is already stored.                                                                                                         |"}
{"source": "polkadot-docs", "page_id": "wiki-general-maintain-errors", "url": "https://developer.polkadot.com/wiki/general/maintain-errors/#errors-from-deprecated-pallets-on-polkadot", "page_title": "Resolving Errors", "index": 5, "depth": 3, "title": "Errors from Deprecated Pallets on Polkadot", "anchor": "errors-from-deprecated-pallets-on-polkadot", "start_char": 43066, "end_char": 56075, "estimated_token_count": 1040, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88e908e423ec2ebfb1c6139d0e2cec7f4803c5601e938496521dc9a62ab87344", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Errors from Deprecated Pallets on Polkadot\n\n| Pallet                  | Error                                  | Documentation                                                                                                                                    |\n| ----------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |\n| Council (15)            |                                        |                                                                                                                                                  |\n|                         | NotMember (0)                          | Account is not a member                                                                                                                          |\n|                         | DuplicateProposal (1)                  | Duplicate proposals not allowed                                                                                                                  |\n|                         | ProposalMissing (2)                    | Proposal must exist                                                                                                                              |\n|                         | WrongIndex (3)                         | Mismatched index                                                                                                                                 |\n|                         | DuplicateVote (4)                      | Duplicate vote ignored                                                                                                                           |\n|                         | AlreadyInitialized (5)                 | Members are already initialized!                                                                                                                 |\n|                         | TooEarly (6)                           | The close call was made too early, before the end of the voting.                                                                                 |\n|                         | TooManyProposals (7)                   | There can only be a maximum of `MaxProposals` active proposals.                                                                                  |\n|                         | WrongProposalWeight (8)                | The given weight bound for the proposal was too low.                                                                                             |\n|                         | WrongProposalLength (9)                | The given length bound for the proposal was too low.                                                                                             |\n| TechnicalCommittee (16) |                                        |                                                                                                                                                  |\n|                         | NotMember (0)                          | Account is not a member                                                                                                                          |\n|                         | DuplicateProposal (1)                  | Duplicate proposals not allowed                                                                                                                  |\n|                         | ProposalMissing (2)                    | Proposal must exist                                                                                                                              |\n|                         | WrongIndex (3)                         | Mismatched index                                                                                                                                 |\n|                         | DuplicateVote (4)                      | Duplicate vote ignored                                                                                                                           |\n|                         | AlreadyInitialized (5)                 | Members are already initialized!                                                                                                                 |\n|                         | TooEarly (6)                           | The close call was made too early, before the end of the voting.                                                                                 |\n|                         | TooManyProposals (7)                   | There can only be a maximum of `MaxProposals` active proposals.                                                                                  |\n|                         | WrongProposalWeight (8)                | The given weight bound for the proposal was too low.                                                                                             |\n|                         | WrongProposalLength (9)                | The given length bound for the proposal was too low.                                                                                             |\n| Democracy (14)          |                                        |                                                                                                                                                  |\n|                         | ValueLow (0)                           | Value too low                                                                                                                                    |\n|                         | ProposalMissing (1)                    | Proposal does not exist                                                                                                                          |\n|                         | BadIndex (2)                           | Unknown index                                                                                                                                    |\n|                         | AlreadyCanceled (3)                    | Cannot cancel the same proposal twice                                                                                                            |\n|                         | DuplicateProposal (4)                  | Proposal already made                                                                                                                            |\n|                         | ProposalBlacklisted (5)                | Proposal still blacklisted                                                                                                                       |\n|                         | NotSimpleMajority (6)                  | Next external proposal not simple majority                                                                                                       |\n|                         | InvalidHash (7)                        | Invalid hash                                                                                                                                     |\n|                         | NoProposal (8)                         | No external proposal                                                                                                                             |\n|                         | AlreadyVetoed (9)                      | Identity may not veto a proposal twice                                                                                                           |\n|                         | NotDelegated (10)                      | Not delegated                                                                                                                                    |\n|                         | DuplicatePreimage (11)                 | Preimage already noted                                                                                                                           |\n|                         | NotImminent (12)                       | Not imminent                                                                                                                                     |\n|                         | TooEarly (13)                          | Too early                                                                                                                                        |\n|                         | Imminent (14)                          | Imminent                                                                                                                                         |\n|                         | PreimageMissing (15)                   | Preimage not found                                                                                                                               |\n|                         | ReferendumInvalid (16)                 | Vote given for invalid referendum                                                                                                                |\n|                         | PreimageInvalid (17)                   | Invalid preimage                                                                                                                                 |\n|                         | NoneWaiting (18)                       | No proposals waiting                                                                                                                             |\n|                         | NotLocked (19)                         | The target account does not have a lock.                                                                                                         |\n|                         | NotExpired (20)                        | The lock on the account to be unlocked has not yet expired.                                                                                      |\n|                         | NotVoter (21)                          | The given account did not vote on the referendum.                                                                                                |\n|                         | NoPermission (22)                      | The actor has no permission to conduct the action.                                                                                               |\n|                         | AlreadyDelegating (23)                 | The account is already delegating.                                                                                                               |\n|                         | Overflow (24)                          | An unexpected integer overflow occurred.                                                                                                         |\n|                         | Underflow (25)                         | An unexpected integer underflow occurred.                                                                                                        |\n|                         | InsufficientFunds (26)                 | Too high a balance was provided that the account cannot afford.                                                                                  |\n|                         | NotDelegating (27)                     | The account is not currently delegating.                                                                                                         |\n|                         | VotesExist (28)                        | The account currently has votes attached to it and the operation cannot succeed until these are removed, either through `unvote` or `reap_vote`. |\n|                         | InstantNotAllowed (29)                 | The instant referendum origin is currently disallowed.                                                                                           |\n|                         | Nonsense (30)                          | Delegation to oneself makes no sense.                                                                                                            |\n|                         | WrongUpperBound (31)                   | Invalid upper bound.                                                                                                                             |\n|                         | MaxVotesReached (32)                   | Maximum number of votes reached.                                                                                                                 |\n|                         | InvalidWitness (33)                    | The provided witness data is wrong.                                                                                                              |\n|                         | TooManyProposals (34)                  | Maximum number of proposals reached.                                                                                                             |"}
{"source": "polkadot-docs", "page_id": "wiki-general-metadata", "url": "https://developer.polkadot.com/wiki/general/metadata/#how-to-guides", "page_title": "Metadata Explorer", "index": 0, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 642, "end_char": 753, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:06658f4879803c1f43c199206f633fe59ce68c23bfc132086dd77ea85f7b3ad5", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [How to Update the Metadata (Developer Signer)](../learn/how-to/update-metadata-signer.md)"}
{"source": "polkadot-docs", "page_id": "wiki-general-multisig-apps", "url": "https://developer.polkadot.com/wiki/general/multisig-apps/#mimir", "page_title": "Polkadot Multisig Apps", "index": 0, "depth": 2, "title": "Mimir", "anchor": "mimir", "start_char": 501, "end_char": 1367, "estimated_token_count": 209, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91951bddb593f918ab1b0e306f891ffbcd622c1416349a29e3cadc5fb512028d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Mimir\n\nQuick Link: [Demo](https://www.youtube.com/watch?v=amm_Vk0vzP4&t=43s) |\n[Website](https://app.mimir.global/) | [Twitter](https://twitter.com/Mimir_global) |\n[Telegram](https://t.me/+t7vZ1kXV5h1kNGQ9) | [Github](https://github.com/mimir-labs)\n\n- **Support for Various Account Types**: Mimir supports a range of account types including Flexible\n  Multisig, Static Multisig, Nested Multisig, and Extension Wallets.\n- **Transaction Tracking**: Offers real-time synchronization of transactions across different\n  account levels.\n- **Third-Party Application Integration**: Users can access third-party applications with their\n  multisig identities. Mimir supports integration with applications like Polkadot-JS and\n  is planning to expand to others.\n- **User-Friendly Interface**: Designed for ease of use, making complex multisig operations more\n  accessible."}
{"source": "polkadot-docs", "page_id": "wiki-general-multisig-apps", "url": "https://developer.polkadot.com/wiki/general/multisig-apps/#multix-by-chainsafe", "page_title": "Polkadot Multisig Apps", "index": 1, "depth": 2, "title": "Multix by Chainsafe", "anchor": "multix-by-chainsafe", "start_char": 1367, "end_char": 2683, "estimated_token_count": 331, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91951bddb593f918ab1b0e306f891ffbcd622c1416349a29e3cadc5fb512028d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Multix by Chainsafe\n\n!!!info \"Walk-Through Video Tutorial\"\n    See [this video tutorial](https://www.youtube.com/watch?v=APxPsawebJw) and [this article](https://blog.chainsafe.io/multix-a-simple-interface-to-manage-complex-multisigs-on-polkadot-97328be26f9d) for more information about using [Multix](https://multix.chainsafe.io/) for multisig accounts.\n\nThe [Multix tool](https://multix.chainsafe.io/) is an easy-to-use interface to manage complex multisigs. The tool is part of [the open-source Polkadot/Kusama Tech Stack](../general/build-open-source.md#user-interface). Besides being user-friendly, Multix provides several benefits:\n\n- When one person creates the multisig account, all the signatories see the multisig account on\n  their interface.\n- There is no need to pass around the call data to confirm a transaction. Such information is\n  retrieved from the chain and displayed to the users.\n- Thanks to the power of [pure proxies](../learn/learn-proxies-pure.md), adding and removing signatories or adjusting the threshold is now possible without creating new multisigs and Multix provides an intuitive interface to work with pure proxies.\n\nThe pure proxy setup used by [MultiX](https://github.com/ChainSafe/Multix) can be seen on the\n[pure proxy page](../learn/learn-proxies-pure.md#why-pure-proxy)."}
{"source": "polkadot-docs", "page_id": "wiki-general-multisig-apps", "url": "https://developer.polkadot.com/wiki/general/multisig-apps/#nova-spektr", "page_title": "Polkadot Multisig Apps", "index": 2, "depth": 2, "title": "Nova Spektr", "anchor": "nova-spektr", "start_char": 2683, "end_char": 4227, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91951bddb593f918ab1b0e306f891ffbcd622c1416349a29e3cadc5fb512028d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Nova Spektr\n\n![](https://github.com/Leemo94/polkadot-wiki/blob/master/docs/assets/nova_spektr.png?raw=true)\n\nNova Spektr is your all-in-one Polkadot Wallet, engineered with enterprise-grade capabilities such\nas multisigs, proxy accounts, hardware wallets, light clients, and much more. Nova Spektr is\ndesigned to meet the requirements of enterprises, power users, and individual users alike – funded\nby the Polkadot Treasury\n\n- Multichain Wallet – Nova Spektr supports 80+ Polkadot ecosystem networks, and hundreds of tokens\n  consolidating them all under a single interface!\n- Multisigs – Experience superior security with truly multi-chain Multisig Wallets in Nova Spektr!\n- Proxy Discovery – Discover all your Proxy accounts automatically when importing your wallet into\n  Nova Spektr!\n- Collaborative Asset Management – Manage your assets in a simple, secure, and collaborative manner,\n  requiring a predefined level of consensus to be reached for each transaction’s authorization.\n- Hardware Wallet Support – Safeguard your assets even further by pairing your hardware wallet with\n  Nova Spektr!\n- Light Clients – Unleash an unstoppable, fast, and trustless working environment with Nova Spektr\n  by utilizing locally hosted blockchain nodes to manage your digital assets in the Polkadot\n  ecosystem!\n- Data Verification – Benefit from Polkadot and Kusama Light Clients to cryptographically verify\n  data from public blockchain nodes!\n- Open Source & Trustless – Your data remains yours — Nova Spektr never stores or tracks user data!"}
{"source": "polkadot-docs", "page_id": "wiki-general-multisig-apps", "url": "https://developer.polkadot.com/wiki/general/multisig-apps/#polkadot-multisig-by-signet", "page_title": "Polkadot Multisig Apps", "index": 3, "depth": 2, "title": "Polkadot Multisig by Signet", "anchor": "polkadot-multisig-by-signet", "start_char": 4227, "end_char": 4842, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91951bddb593f918ab1b0e306f891ffbcd622c1416349a29e3cadc5fb512028d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot Multisig by Signet\n\n[Polkadot Multisig](https://polkadotmultisig.com/) by Signet is user-friendly software that helps\nteams and businesses use multisigs in the Polkadot ecosystem. Multisigs are generally used by\norganizations to hold treasury assets, pay employees or service providers, receive grants or manage\nan organization's on-chain identity.\n\nPolkadot Multisig is designed to be usable by a non-technical business user and enables a user to be\nproductive and understand multisig transactions. Further information is available on\n[Polkadot Multisig guide.](https://guide.polkadotmultisig.com/en)"}
{"source": "polkadot-docs", "page_id": "wiki-general-multisig-apps", "url": "https://developer.polkadot.com/wiki/general/multisig-apps/#signet", "page_title": "Polkadot Multisig Apps", "index": 4, "depth": 3, "title": "Signet", "anchor": "signet", "start_char": 4842, "end_char": 5104, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91951bddb593f918ab1b0e306f891ffbcd622c1416349a29e3cadc5fb512028d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signet\n\nTalisman [Signet](https://signet.talisman.xyz/) supports multisig ops and enterprise workflow for\nonchain organisations. Enterprise features and self-hosted options are available. Signet is\nproprietary, where as Polkadot Multisig by Signet is free."}
{"source": "polkadot-docs", "page_id": "wiki-general-multisig-apps", "url": "https://developer.polkadot.com/wiki/general/multisig-apps/#polkasafe", "page_title": "Polkadot Multisig Apps", "index": 5, "depth": 2, "title": "Polkasafe", "anchor": "polkasafe", "start_char": 5104, "end_char": 6540, "estimated_token_count": 259, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91951bddb593f918ab1b0e306f891ffbcd622c1416349a29e3cadc5fb512028d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkasafe\n\n![Polkasafe](https://github.com/w3f/polkadot-wiki/assets/874046/586bf051-a7fb-43c0-957e-0b659d50c9ab)\n\n[Polkasafe](https://polkasafe.xyz) - Your gateway to the Ultimate MultiSig experience on Polkadot.\n\nGone are the days of cumbersome MultiSig transactions. PolkaSafe redefines the way you interact with\nthe Polkadot Blockchain, making MultiSig operations not just safer but also incredibly\nuser-friendly.\n\n- Seamless MultiSig Transactions: With PolkaSafe, initiating, approving, and executing MultiSig\n  transactions is a breeze. Whether you're managing funds, delegating responsibilities, or simply\n  securing your assets, the platform's intuitive design ensures every step is straightforward.\n- Collaborative Asset Management: Engage in collective decision-making with stakeholders, team\n  members, or partners. PolkaSafe's collaborative tools make it easy to propose, discuss, and\n  finalize MultiSig transactions, ensuring transparency and consensus. Extrinsic Management: Beyond\n  standard transactions, PolkaSafe simplifies extrinsics – specialized instructions or functions on\n  the Polkadot Blockchain.\n- Whether you're interacting with smart contracts, parachains, or other advanced features,\n  PolkaSafe's MultiSig capabilities ensure every extrinsic is secure and efficient.\n- User-Centric Design: Every feature, from initiating a transaction to diving deep into extrinsics,\n  is designed for clarity and ease."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#role-of-the-polkadot-community-foundation", "page_title": "Polkadot Community Foundation", "index": 0, "depth": 2, "title": "Role of the Polkadot Community Foundation", "anchor": "role-of-the-polkadot-community-foundation", "start_char": 691, "end_char": 1577, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Role of the Polkadot Community Foundation\n\nThe PCF is a real-world extension of the existing on-chain Polkadot governance process. It is an\nunopinionated entity with no agenda, roadmap, or business purpose except to take actions directed to\nit via OpenGov referenda.\n\nIn cases where token holders are interested in proposing treasury expenditures or other actions that\ncould benefit from a real-world legal presence, off-chain accounts, accountable management, and\ncommunity ownership, they may author their proposals to include directions for the PCF to fulfill\nthese functions. The PCF’s functions are fulfilled by\n[a 3rd party foundation administrator](#administrator).\n\nSo long as the PCF receives sufficient detail, funding, and authority to carry out its directions,\nthe PCF administrators will do so within the confines of any legal, regulatory, and contractual\nobligations."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-background", "page_title": "Polkadot Community Foundation", "index": 1, "depth": 2, "title": "PCF Background", "anchor": "pcf-background", "start_char": 1577, "end_char": 2743, "estimated_token_count": 214, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PCF Background\n\nDecentralized protocols and organizations increasingly require a bridge between the analog,\ncentralized world and a more fully digital and decentralized future while complying with applicable\nlaws and regulations.\n\nIn the past, there has been a significant reliance on the\n[Web3 Foundation](https://web3.foundation/) and [Parity Technologies](https://www.parity.io/) to\nadvance the ecosystem off-chain. While those organizations are philosophically aligned to the health\nand growth of Polkadot, their corporate governance structures offer no formal role or rights to DOT\nholders (nor are they in a good position to do so).\n\nAs Polkadot evolves to decentralize governance further, and as Parity and the Web3 Foundation look\nto turn over critical functions to the community, it will benefit from a legal entity to effectuate\nPolkadot community governance in the “real world.”\n\nThe PCF is designed to represent and explicitly serve DOT holders’ interests off-chain. Its\ngoverning documents grant DOT holders permanent, irrevocable rights to guide its activities and\noversee significant matters through the existing on-chain Polkadot OpenGov system."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-activities", "page_title": "Polkadot Community Foundation", "index": 2, "depth": 2, "title": "PCF Activities", "anchor": "pcf-activities", "start_char": 2743, "end_char": 4664, "estimated_token_count": 363, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PCF Activities\n\nThe PCF will take on activities delegated to it by Polkadot governance. The community will likely\ndiscover and evolve its thinking over time about which activities are best delegated to the\nFoundation, but as a rule of thumb, any activity that is best served with a legal contract that\nrequires fiat payments or physical presence, or that requires active project management is\nappropriate for the Foundation to execute on the community’s behalf.\n\nInitially, the Foundation will have a minimal scope to:\n\n- Create and maintain a compliant off-chain organization capable of acting on directives from the\n  community,\n- Taking custody of accounts, logins, keys, and assets as a form of community ownership,\n- Executing contract agreements with partners, vendors, and service providers.\n\nAdditional activities that require additional resources for project management, capital\nexpenditures, business development, technical development, etc., will likely require incremental\nbudget, staff, and legal design, which can be provisioned through subsequent line-item OpenGov\ntreasury proposals. This allows the Foundation to adapt and grow to suit the community’s directives\nas they become concrete.\n\nSome hypothetical future activities that the community may consider delegating to the Foundation can\ninclude:\n\n- Retail marketing activities, e.g., social ad campaigns targeting developers\n- Educational programs, e.g. [Polkadot Blockchain Academy](https://polkadot.academy/)\n- Complex grants programs, e.g., tranched or actively managed awards tied to milestones\n- Community events, e.g., contracting with venues and service providers for physical gatherings\n- Code management, e.g., maintain [the polkadot-js GitHub repo](https://github.com/polkadot-js)\n\nAs the community gains interest in various use cases, it can direct the Foundation to explore them\nin greater depth and report on how it can execute them."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-entity-design", "page_title": "Polkadot Community Foundation", "index": 3, "depth": 2, "title": "PCF Entity Design", "anchor": "pcf-entity-design", "start_char": 4664, "end_char": 4996, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PCF Entity Design\n\nThe proposed structure incorporates several features to optimize trust, risk, and efficiency. It\nbalances community representation with professional robustness, minimizes the treasury assets at\nrisk, maximizes the ability to adjust and evolve, and allows each proposed activity to be evaluated\non its merits."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-corporate-structure", "page_title": "Polkadot Community Foundation", "index": 4, "depth": 2, "title": "PCF Corporate Structure", "anchor": "pcf-corporate-structure", "start_char": 4996, "end_char": 9239, "estimated_token_count": 723, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PCF Corporate Structure\n\nCayman Islands foundation companies offer a unique way to assign important rights to a broader\nstakeholder pool beyond traditional shareholders, directors, and employees. This proposal uses that\nfeature to give DOT holders significant oversight and important powers to ensure that the Foundation\ncarries out its business appropriately.\n\n**Memberless:** There are no members or shareholders who hold an economic claim over the Foundation.\nThis eliminates a common source of conflict between legal entities and the communities they serve.\n\n**Supervisor:** There is a [supervisor role](#supervisor) whose primary purpose is to oversee the\n[Board of Directors](#directors) and ensure that the Foundation’s governing documents are upheld.\nThe supervisor holds legal standing to act on behalf of the foundation if directors diverge from\ntheir commitments or fail in their fiduciary duties. Given that the governing documents specifically\ninstruct the directors to respect token holder preferences, provide adequate transparency, and not\ndilute the rights given to token holders, the Supervisor acts as a direct safeguard for token holder\ninterests.\n\n**Directors:** The Foundation will have a five-member Board of Directors, divided between:\n\n- A three-director majority served by Cayman resident professional governance service providers to\n  ensure the Foundation is sufficiently independent of other entities in the Polkadot ecosystem and\n  to comply with the Cayman Islands economic substance requirements.\n\n- Two seats reserved for future directors to be appointed by Polkadot governance to ensure token\n  holder interests are fully represented and considered in all matters.\n\n**Staff & Administration:** Day-to-day administration will be outsourced to a Cayman Islands-based\nprofessional services firm, reporting to the Board of Directors. These needs may fluctuate over time\ndepending on the scope of activities delegated to the Foundation, and the Foundation will maintain\nflexibility to add, modify, and redirect the administrative staff as needed. The administrator’s\nduties include:\n\n- Operational support and project management\n- Engaging and managing corporate service providers, including legal and bookkeeping\n- Actively engaging and collaborating with the community to help craft, review, and execute\n  governance proposals for Foundation activities\n- Maintaining appropriate documentation and transparency reports and\n- Ensuring legal and regulatory compliance under applicable law\n\n**DOT Holder Rights:** The Foundation’s bylaws ensure special voting rights and protections for DOT\ntoken holders, including:\n\n- Polkadot OpenGov treasury proposals are the Foundation’s funding source, so DOT holders can choose\n  to withhold future funding to cover basic operating expenses if they are unhappy with the\n  Foundation.\n- Delegating specific activities to the Foundation. These activities will be approved as referenda\n  through on-chain Polkadot governance via OpenGov, using any track with adequate spending\n  permissions. If approved, the Foundation’s Directors will review approved referenda, and if they\n  are appropriate and actionable, then the Foundation will execute the requested activities. The\n  token holder-appointed Directors have full access to represent tokenholders’ interests in all\n  matters and may notify the Supervisor and/or the community of any improprieties.\n- Token holders can vote via Polkadot OpenGov’s General Admin track to remove the Supervisor or\n  Directors who are not serving appropriately.\n- Token holders can vote via Polkadot OpenGov’s General Admin track to amend the Foundation’s\n  bylaws.\n- A requirement that the Foundation cannot agree to any deliverables, responsibilities, or payments\n  to third parties unless they have been pre-approved by tokenholders.\n- A requirement that the Foundation make public transparency reports detailing the Foundation’s\n  activities, including but not limited to transactions, proposal status, and ongoing efforts to\n  carry out approved proposals.\n- Token holders can vote via Polkadot OpenGov’s General Admin track to wind up the Foundation or\n  instruct it to transfer some or all of its assets to another charitable object."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-initial-personnel", "page_title": "Polkadot Community Foundation", "index": 5, "depth": 2, "title": "PCF Initial Personnel", "anchor": "pcf-initial-personnel", "start_char": 9239, "end_char": 9789, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PCF Initial Personnel\n\n**Actum Node** interviewed several candidates for each role, including referrals from the\nabove-mentioned law firms, and members of the Polkadot community, and selected the following to\npropose as the initial office holders.\n\nPlease note that some of the candidates requested that their names and backgrounds be partially\nredacted in public internet posts to prevent spam and phishing vectors that could compromise\nthemselves or the Foundation. We extended the same level of privacy to all candidates for the same\nreasons."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#supervisor", "page_title": "Polkadot Community Foundation", "index": 6, "depth": 3, "title": "Supervisor", "anchor": "supervisor", "start_char": 9789, "end_char": 10223, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Supervisor\n\n**J. Bain** is a career fiduciary services professional. He has a regulatory background, having\npreviously worked at the Cayman Islands Monetary Authority, and he has significant experience\noverseeing DAO foundations, other crypto-related entities, and traditional investment fund entities.\nMr. Bain was introduced by our Cayman Islands counsel and recommended by the CEO of a crypto\ninvestment firm that he governs."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#directors", "page_title": "Polkadot Community Foundation", "index": 7, "depth": 3, "title": "Directors", "anchor": "directors", "start_char": 10223, "end_char": 11588, "estimated_token_count": 257, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Directors\n\n**G. Kennedy** is an experienced governance professional. He has a legal background, having served\nas General Counsel and outside counsel to several Cayman and European investment funds, and he sits\non the board of several blockchain-related companies and foundations. Mr. Kennedy was introduced by\nour Cayman Islands counsel and strongly recommended by the General Counsel of an L1 development\ncompany and the CEO of a decentralized identity protocol that he also serves.\n\n**M. Shaw** is an experienced governance professional. He is a serial finance entrepreneur, having\nfounded a DeFi protocol, a digital asset management company, and a data analytics company, among\nothers. He has a finance background with a focus on global markets. Mr. Shaw was introduced by the\nproposed Supervisor J Bain and strongly recommended by the Managing Director of a crypto investment\nfirm where he holds a director seat.\n\n**E. Noyons** is an experienced governance professional. He has an accounting background from a “big\nfour” firm and is a member of the Cayman Islands Institute of Professional Accountants. Mr. Noyons\nwas introduced by our Cayman Islands counsel and strongly recommended by the COO of an NFT Gaming\ncompany where he holds a director seat.\n\nTwo vacant seats, which Polkadot governance and only Polkadot governance can vote to fill at any\ntime."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#administrator", "page_title": "Polkadot Community Foundation", "index": 8, "depth": 3, "title": "Administrator", "anchor": "administrator", "start_char": 11588, "end_char": 12541, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Administrator\n\n[**Autonomous Projects**](https://autonomousprojects.co/) is a team of professionals based in the\nCayman Islands with a collective 30+ years of web3 industry experience spanning legal, regulatory,\nfinance, operations, and investment management. This includes working with clients across the asset\nmanagement and web3 spectrum including Layer 1’s, Layer 2’s, and other scaling solutions, DeFi,\ninfrastructure, gaming, and NFTs across multiple different blockchains where we support our clients\nin the development, implementation, maintenance, support and upgrade of their day-to-day operations\nlayered with a keen understanding of the Cayman Islands’ legal and regulatory landscape.\n\nAfter a competitive process, Autonomous was selected for their previous experience working with the\nPolkadot ecosystem, their emphasis on sound financial & back office management, and their\nflexibility to adapt as the Foundation’s operations evolve."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#how-to-use-the-pcf", "page_title": "Polkadot Community Foundation", "index": 9, "depth": 2, "title": "How to use the PCF", "anchor": "how-to-use-the-pcf", "start_char": 12541, "end_char": 12954, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How to use the PCF\n\nTo execute a proposal, the PCF needs clear, detailed instructions to ensure it acts in the\ncommunity's best interest. Because not all OpenGov proposals involve the PCF, the PCF requires that\nproposers adopt certain requirements to identify what is and is not intended for PCF action.\n\nThere are two types of Proposals: _Foundation Funding Proposals_ and _Foundation Resolution\nProposals_."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#foundation-funding-proposals", "page_title": "Polkadot Community Foundation", "index": 10, "depth": 3, "title": "Foundation Funding Proposals", "anchor": "foundation-funding-proposals", "start_char": 12954, "end_char": 14969, "estimated_token_count": 374, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Foundation Funding Proposals\n\nFoundation Funding Proposals are funding requests from the\n[Polkadot treasury](../learn/learn-guides-treasury.md#creating-a-treasury-proposal), specifying the\namount in the preimage's value field according to the level of spend required, and setting the\nbeneficiary to the PCF multisig wallet address. The Proposal must also include the intended use of\nfunds in a comment on the [Subsquare](https://polkadot.subsquare.io/) website and begin\nwith “[Polkadot Community Foundation]” in its name. The referenda can use any\n[OpenGov origin](../learn/learn-polkadot-opengov-origins.md) with sufficient spending permission.\n\nExamples of Foundation Funding Proposals:\n\n- Request funding for developing a Mobile App\n- Request funding for growing the network's awareness through event attendance\n- Request funding for a Polkadot-branded clothing line\n- Request funding for a Polkadot-related advertisement campaign\n- Request funding for developing a Web3 game on Polkadot utilizing a 3rd party game developer\n- Request funding to diversify a portion of the Polkadot treasury into real-world asset investments\n- Propose funding to run a Polkadot-branded competition\n\nEnsure that the track selected aligns with the funding requested, according to the DOT amount\nallocated per track.\n\n#### Wallet Addresses\n\nDOT requested on the relay chain\n\n```bash\n13ECX4PUNHTdnpXX6KNeyd2qQHmruX6LE42iHuXcaBWVjz3e\n```\n\nUSDT requested on Polkadot Asset Hub\n\n```bash\n167tDhLwaQ6kmqau1zwWx48Ux7CS1rxC9jW5kn8PeRZWAVUy\n```\n\nPlease be aware that any proposals approved for funding by the foundation will require all\nrecipients of those funds to undergo the necessary Know Your Customer (KYC) and/or Know Your\nBusiness (KYB) checks. This process may involve submitting personal information and supporting\ndocumentation. Proposals that do not meet these requirements or fail to provide the necessary\ndocumentation may be subject to rejection by the directors to avoid legal risk to the PCF and its\nother activities."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#foundation-resolution-proposals", "page_title": "Polkadot Community Foundation", "index": 11, "depth": 3, "title": "Foundation Resolution Proposals", "anchor": "foundation-resolution-proposals", "start_char": 14969, "end_char": 15787, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Foundation Resolution Proposals\n\nFoundation Resolution Proposals indicate token holders' wishes for the foundation without requiring\nfunding. These must be of the type\n[system.remark](../learn/learn-guides-polkadot-opengov.md#submitting-a-preimage), with the remark\ntext starting with “[Polkadot Community Foundation]” and submitted using\n[the Wish For Change submission track](../learn/learn-polkadot-opengov-origins.md#wish-for-change).\n\nExamples of Foundation Resolution Proposals (Wish for Change)\n\n- Propose a change to the Foundation’s Bylaws\n- Propose the foundation not utilize certain 3rd party service providers.\n- Propose to remove/change a supervisor\n- Propose to remove/change a director\n- Propose the PCF transfer all or some of its assets to a charitable entity\n- Propose to wind up the foundation"}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#how-to-write-a-funding-proposal-to-pcf", "page_title": "Polkadot Community Foundation", "index": 12, "depth": 2, "title": "How to Write a Funding Proposal to PCF", "anchor": "how-to-write-a-funding-proposal-to-pcf", "start_char": 15787, "end_char": 18812, "estimated_token_count": 530, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How to Write a Funding Proposal to PCF\n\nWhen determining the amount of funding to request for the PCF to execute a proposal, the author must\nconsider the PCF’s costs to execute. If the instructions are unambiguous and actionable, require no\nfurther refinement, exploration, or discretion, and require minimal project management, then no\noverhead is required. Otherwise, the PCF will engage consultants and 3rd party service providers for\nspecialized expertise or external support needed to fulfill its objectives, execute specific tasks,\nor manage complex projects that exceed the capacity or knowledge of its internal team. As the PCF\nsometimes incurs legal or operational costs to execute a proposal, we suggest including a greater\nthan 5% overhead cost or $5,000 above the original funding request as a line item for PCF overhead\nto avoid any unforeseen issues. The PCF will always carry out its directives cost-efficiently and\nreturn any unspent budget to the treasury. Still, if a proposal has insufficient funding, the PCF\nmay be forced to request additional follow-on funding or, in extreme cases, reject a proposal for\nunviability.\n\nWhen consultants or 3rd party service providers for specialized expertise or external support are\nneeded, there are three approaches a proposal author may consider:\n\n1. Submitting a proposal with fully actionable implementation instructions for the PCF, with\n   provisions for activities outside its remit.\n\n2. Submitting a proposal directing the PCF to conduct a consulting or advisory project to create a\n   feasibility study and implementation plan for an idea and share its findings. The community could\n   review the findings and then create a second proposal to execute the project according to the\n   suggested implementation plan.\n\n3. Submitting a single proposal that combines both steps in the second approach, directing the PCF\n   to conduct a consulting or advisory project to create an implementation plan, and then the\n   discretion to proceed immediately into execution.\n\n_For assistance in deciding the best option, the PCF team is happy to discuss and offer proposal\nassessments to advise on sufficient budget, clarity, and structure._\ninfo@polkadotcommunity.foundation\n\nThe PCF’s directors’ roles include ensuring that The Foundation’s actions do not create undue risk\nfor the foundation or the Polkadot community. Following the approval of a proposal via OpenGov, the\ndirectors can potentially reject it, if they determine that implementing it would compromise their\nfiduciary duties, violate the foundation governing documents, the Polkadot community governance\nprocess, or any applicable laws or regulations, cause harm to the PCF or breach existing contracts.\nThey can also reject proposals that lack sufficient detail, are too vague for implementation, or\nlack adequate funding. This is an action the PCF wants to avoid as much as possible; therefore,\nsubmitted proposals must be as detailed and researched as possible to have a greater chance of\napproval."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-faq", "page_title": "Polkadot Community Foundation", "index": 13, "depth": 2, "title": "PCF FAQ", "anchor": "pcf-faq", "start_char": 18812, "end_char": 18824, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PCF FAQ"}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-general-faq", "page_title": "Polkadot Community Foundation", "index": 14, "depth": 3, "title": "PCF General FAQ", "anchor": "pcf-general-faq", "start_char": 18824, "end_char": 24828, "estimated_token_count": 1124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### PCF General FAQ\n\n**Why a Cayman Foundation Company and not a Swiss Foundation?**\n\nA Swiss Foundation structure is a valid option for this entity, but the Cayman structure offers\ngreater operational ease and flexibility. Swiss Foundations are subject to income tax by default\nunless government authorities explicitly grant exceptions, which come with specific requirements. In\ncontrast, Cayman Foundation Companies are tax-exempt by default.\n\n**Can this Foundation service Kusama as well?**\n\nAs the Foundation reserves certain rights and powers for token holders, it is unclear how the\ncombination of DOT and KSM holders, with differing governance instances, can jointly indicate their\npreferences.\n\nAfter gathering input from key members of the Polkadot community and legal counsel, we suggest\nmoving forward with a Foundation to serve only DOT holders initially. Later, as a separate\ninitiative we can consider creating a similar but separate foundation to serve KSM holders, and\nperhaps even help facilitate the creation of similar foundations for any parachain or DAO in the\nPolkadot ecosystem.\n\n**How does this foundation shield token holders and governance participants from liability?**\n\nIf someone were to make a legal claim that a Polkadot OpenGov action harmed them somehow, everyone\nwho participated in governance may be liable. However, suppose the action was taken by a legal\nentity with limited liability, like the Polkadot Community Foundation. In that case, it may be held\nliable, but it absorbs the risk and shields the liability of governance participants and token\nholders. This is an advantage of routing activities through the Foundation.\n\n**How will token holders know if the foundation is doing what it’s supposed to?**\n\nToken holders can appoint 2 of the five directors and the supervisor. The idea is that this lets\nthem choose known people who share their values and are committed to Polkadot to gain full access to\neverything happening inside the foundation, and the ability to represent the token holders in all\ndecisions.\n\nThe bylaws also require quarterly public transparency reports. Over time, that can mature to become\nrobust real-time reporting if:\n\n1. the foundation team does that proactively,\n2. if token holders provide additional funding and explicit instructions to enable real-time\n   reporting, or\n3. if tokenholders vote to amend the bylaws to require real-time reporting.\n\n**How do we avoid service providers or directors turning passive or amassing power over time?**\n\nA vote of token holders can remove any service provider, director, or supervisor at any time. In the\nfuture, the community could decide to implement a seat rotation, term limits, or other measures to\nreduce the risk of bureaucratic power. These are not provisioned in the current proposal but can be\ndecided via a proposal on the Polkadot OpenGov General Admin track at any time.\n\n**Can a director spend the foundation’s money however they want?**\n\nNo. This depends on the operating policies the foundation team puts into place, like how many people\nhave to approve/sign any expenditures, if small expenditures are pre-authorized, etc. As with any\ntraditional company, it is technically possible for someone to spend money they’re not supposed to.\nBut ultimately, there are several types of recourse if this were to happen.\n\nIf a service provider spends money in a way that the directors didn’t authorize, the service\nprovider is likely in breach of their contract and subject to legal action. If a director spends\nmoney that is not properly authorized by the board, the other directors or the supervisor can act.\nIf they don’t, the token holders can replace them with someone who will.\n\nFinally, the design of this Foundation as an option, with funding coming only as needed, minimizes\nthe funds at risk and ensures the Foundation stays reliant on community trust.\n\n**What if there’s a bad actor?**\n\nWe built redundant checks and balances into the governance system. No one person and no one layer of\ngovernance is immune. In addition, we selected professional governance professionals for each role,\nwhose businesses rely heavily on maintaining a good reputation. Ultimately, all trails end with the\ntokenholders’ ability to fire people, withhold budget, or dissolve the foundation in case of any\nextreme events.\n\n**Who can fire a director?**\n\nThe bylaws allow two ways for a director to be fired. By a director vote or token holder vote via\nthe OpenGov General Admin track. What if the directors collude?\n\nColluding directors would have to do so in full sight of the tokenholder-appointed directors and the\nsupervisor. If all those people colluded, the tokenholders could remove them, withhold the budget,\nor dissolve the foundation.\n\n**Who can appoint a Cayman Professional director after one has been removed?**\n\nThe three director seats not tokenholder-appointed are filled by a director vote, meaning all the\ncurrently filled seats include both those appointed by tokenholders and those not. The supervisor\ncan appoint one as a backstop if there are no active directors.\n\nTechnically, these seats that are not tokenholder-appointed do not always have to be filled by\nCayman professionals, but the advice we received is that having a majority based in the Cayman\nIslands is an important tax and regulatory consideration.\n\n**Can the tokenholders sue?**\n\nPotentially, but coordination to prove those bringing suit represent “the token holders” as a class\nwould likely be difficult, costly, and require doxing themselves.\n\nHowever, the supervisor has a unique role in Cayman Foundation Companies with legal standing to sue\ndirectors who violate the Foundation’s governing documents. Those documents instruct the directors\nto respect tokenholder preferences. Suppose tokenholders ever feel that the supervisor is not acting\nappropriately. In that case, they can remove and replace the supervisor at any time by approving a\nproposal to do so on Polkadot OpenGov’s General Admin track."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-proposal-faq", "page_title": "Polkadot Community Foundation", "index": 15, "depth": 3, "title": "PCF Proposal FAQ", "anchor": "pcf-proposal-faq", "start_char": 24828, "end_char": 27789, "estimated_token_count": 580, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### PCF Proposal FAQ\n\n**Who can submit a proposal to the PCF?**\n\nAny token holder who has a valid and actionable idea that aligns with the goals and vision of the\nPolkadot ecosystem can submit a proposal.\n\n**How do I ensure my proposal is appropriately funded?**\n\nProvide a detailed budget breakdown in your proposal, including all anticipated costs. It’s crucial\nto account for all phases of the project, potential contingencies, and any third-party costs, such\nas contractor, consulting, and legal fees.\n\n**Where can I find referenda creation guidelines?**\n\nThis can be found in the\n[Polkadot-JS guides](../learn/learn-guides-polkadot-opengov.md#create-a-referenda-proposal).\n\n**What happens if the proposal isn’t sufficiently funded during the execution phase?**\n\nIf additional funding is needed during the execution phase, you must submit a supplemental funding\nrequest. This request will be evaluated similarly to your original proposal, and additional funds\nwill be allocated if approved.\n\n**What happens to any funds remaining after a proposal has been executed?**\n\nAny remaining funds after the successful completion of a project should be returned to the Polkadot\ncommunity treasury unless otherwise agreed upon in the initial proposal.\n\n**Are there any specific requirements for proposals that involve third parties?**\n\nYes, any proposals that require the PCF to engage with third parties (contractors, etc.) must\ninclude funding for contractor fees, onboarding processes, such as background checks and MSA\nreviews.\n\n**Where is the foundation incorporated?**\n\nThe Polkadot Community Foundation is incorporated in the Cayman Islands.\n\n**Are there any Cayman Islands-specific considerations I need to be aware of?**\n\nYes, proposals must comply with Cayman Islands laws and regulations. Activities prohibited in the\nCayman Islands, such as certain financial transactions or business practices, cannot be funded or\nexecuted. E.g., Activities involving money laundering or gambling.\n\n**Who are the signers on the PCF beneficiary multi-sig?**\n\nThe signers controlling these addresses are experienced, competent, and well-known individuals\nwithin the Polkadot ecosystem.\n\n**Can I get feedback if my proposal is rejected?**\n\nYes, we provide feedback on rejected proposals to help you understand the reasons and improve future\nsubmissions.\n\n**Who can I contact for more information or assistance?**\n\nFor any questions or assistance, please get in touch with the PCF team at\ninfo@polkadotcommunity.foundation\n\n**What does the PCF not do?**\n\nThe PCF will not enact any proposals that create undue risk for the foundation or the Polkadot\ncommunity, compromise their fiduciary duties, violate foundation governing documents, the Polkadot\ncommunity governance process, or any applicable laws or regulations, cause harm to the PCF or breach\nexisting contracts. The foundation will not enact proposals that are too broad and require\ndiscretion/opinion from the PCF."}
{"source": "polkadot-docs", "page_id": "wiki-general-pcf", "url": "https://developer.polkadot.com/wiki/general/pcf/#pcf-supporting-material", "page_title": "Polkadot Community Foundation", "index": 16, "depth": 2, "title": "PCF Supporting Material", "anchor": "pcf-supporting-material", "start_char": 27789, "end_char": 28230, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fef9131382165245318ee21daeba7016ae85e68bf3cf40bb066320dc8b253913", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PCF Supporting Material\n\n\n- [Memorandum of Association of PCF](https://drive.google.com/file/d/1BKlPnt0MMe5o6clb6-BT_mKwnSTuDPle/view)\n- [Polkadot Community Foundation Bylaws](https://drive.google.com/file/d/1WhITXXgbzESy9_wdX5H3uFB_kctYWnX4/view)\n- [PCF Constitution](https://drive.google.com/file/d/13vBTwXodvjxnYx3xIfE_SehrsVx6d4bg/view)\n- [Kusamarian AAG Video Discussion](https://twitter.com/TheKusamarian/status/1838956632610669006)"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#from-chain-centricity-to-application-centricity", "page_title": "Polkadot Direction", "index": 0, "depth": 2, "title": "From Chain-centricity to Application-centricity", "anchor": "from-chain-centricity-to-application-centricity", "start_char": 463, "end_char": 1073, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## From Chain-centricity to Application-centricity\n\nPolkadot has been abstracted and generalized beyond what was originally proposed and envisioned in the [Polkadot whitepaper](https://polkadot.network/whitepaper/).\n\nIf we see Polkadot as a service provider of trustless, resilient and verifiable computation through cores as well as secure interoperability between core-secured rollup chains, the future development of Polkadot can be directed towards the following paradigm shift: from being an chain-focused ecosystem to being an application-focused ecosystem, where applications are not only blockchains."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#offloading-tasks-to-system-chains", "page_title": "Polkadot Direction", "index": 1, "depth": 2, "title": "Offloading Tasks to System Chains", "anchor": "offloading-tasks-to-system-chains", "start_char": 1073, "end_char": 2336, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Offloading Tasks to System Chains\n\nPolkadot 1.0 was a chain-centric paradigm comprising domain-specific rollups that could exchange messages. Trusted communication channels are ensured via a shared security mechanism provided by the ELVES protocol, Polkadot's rollup technology. Polkadot not only provides message-passing\ncapability, but also extra functionalities such as [staking](../learn/learn-staking.md),\n[accounts](../learn/learn-accounts.md), [balances](../learn/learn-transactions.md#balance-transfers),\nand [governance](../learn/learn-polkadot-opengov.md). Having a chain-centric system will ultimately\nend in a chain-centric application and UX.\n\nThe true innovation of Polkadot is about leveraging the unique value proposition offered by\ndifferent chains and using those chains’ collaborative potential to build inter-chain applications\nto solve real-world problems. Those applications will thus need to span across chains.\n\n**Increasingly fewer tasks will be handled by the relay chain** which will focus efforts only on\nprimary tasks: securing the network and providing secure message-passing capability.\n[System parachains](../learn/learn-system-chains.md) will be used to take over secondary relay chain\ntasks such as staking, governance, etc."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#xcm-and-accords", "page_title": "Polkadot Direction", "index": 2, "depth": 3, "title": "XCM and Accords", "anchor": "xcm-and-accords", "start_char": 2336, "end_char": 4270, "estimated_token_count": 373, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### XCM and Accords\n\n[XCMP](../learn/learn-xcm.md) is the transport layer for delivering XCM messages. It gives the\ntransportation method and a secure route but not a framework for binding agreements.\n\n[XCM](../learn/learn-xcm-transport.md) is a format, a language of intention abstracted over\nfunctionality common within chains. It creates an expressive language of what you intend to do or\nwant to happen. XCM messages are transported between different chains using XCMP. Ideally, in a\nfully trustless environment, strong guarantees ensure chains faithfully interpret XCM messages. We\ncan have a secure mode of delivering messages that can be interpreted across protocols, but still\nmessages might be misinterpreted. These guarantees can be achieved with accords.\n\nAn **Accord** is an _opt-in_ treaty across many chains, where treaty logic cannot be changed or\nundermined by one or more of those chains, and Polkadot guarantees faithful execution of this logic.\nAccords will be specific to a particular function, and any chain that enters the accord will be held\nto it and will serve that particular function. To lower the entry barrier, accords can be proposed\npermissionlessly, but because they are opt-in, the accord proposal will take effect until chains\nagree and sign up.\n\nTo sum up, accords ensure that the receiver faithfully interprets XCM messages securely sent via\nXCMP channels. Accords are the missing piece of the puzzle to achieve a fully trustless and\ncollaborative environment between applications.\n\nPolkadot is the only ecosystem where accords can properly exist because it has a homogeneous security\nlayer that provides a specific state transition function for each logic component. This allows\npatterns of cooperation between multiple logic components (i.e., trans-applications) that would not\nbe possible to achieve over bridges.\n\nAccords will be implemented using [SPREE technology](../learn/learn-spree.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#agile-core-usage", "page_title": "Polkadot Direction", "index": 3, "depth": 2, "title": "Agile Core Usage", "anchor": "agile-core-usage", "start_char": 4270, "end_char": 4820, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Agile Core Usage\n\nIn Polkadot 1.0, one core is assigned to one application (in this case, equivalent to a parachain).\nIdeally, core affinity (i.e., which application operates on which core) is unimportant (see below).\nCores do not have any higher friendliness to one application than another.\n\n![core-usage-dumb-noAffinity](../assets/core-usage-dumb-noAffinity.png)\n\nHere, we remove the assumption that each application owns a core and instead that all cores are a\nresource to be consumed and used as needed by all applications in the ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#compressed-cores", "page_title": "Polkadot Direction", "index": 4, "depth": 3, "title": "Compressed Cores", "anchor": "compressed-cores", "start_char": 4820, "end_char": 5176, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Compressed Cores\n\nThe same core can secure multiple blocks of the same application simultaneously. Combining multiple\napplication blocks in the same relay chain core will reduce latency at the expense of increased\nbandwidth for the fixed price of opening and closing a block.\n\n![core-usage-agile-compressed](../assets/core-usage-agile-compressed.png)"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#shared-cores", "page_title": "Polkadot Direction", "index": 5, "depth": 3, "title": "Shared Cores", "anchor": "shared-cores", "start_char": 5176, "end_char": 5747, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Shared Cores\n\nSharing cores with other applications to share costs but with no reduction in latency. Note that\nthis is different from the [split coretime](./polkadot-v2.md#polkadot-20-core-usage-and-functionalities) where one core is used by multiple\napplication at different times to share costs at the expense of higher latency. Shared cores will be\nenabled with [JAM](../learn/learn-jam-chain.md), a semi-coherent system in which data from different\nshards can be scheduled within the same core.\n\n![core-usage-agile-shared](../assets/core-usage-agile-shared.png)"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#agile-composable-computer", "page_title": "Polkadot Direction", "index": 6, "depth": 2, "title": "Agile Composable Computer", "anchor": "agile-composable-computer", "start_char": 5747, "end_char": 6364, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Agile Composable Computer\n\nAll the options of agile [coretime allocation](./polkadot-v2.md#polkadot-20-core-usage-and-functionalities) and\n[core usage](#agile-core-usage) can be composable and enable the creation of an agile decentralized\nglobal computing system.\n\n![core-usage-agile-composable](../assets/core-usage-agile-composable.png)\n\nThus, this new vision is focused on Polkadot’s resource, which is secure, flexible, and available\nblockspace that can be accessed by reserving some time on a core. Agility in allocating coretime and\nusing cores allows for maximized network efficiency and blockspace usage."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-direction", "url": "https://developer.polkadot.com/wiki/general/polkadot-direction/#polkadots-resilience", "page_title": "Polkadot Direction", "index": 7, "depth": 2, "title": "Polkadot's Resilience", "anchor": "polkadots-resilience", "start_char": 6364, "end_char": 8892, "estimated_token_count": 474, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72ec468d80908f326d10d0e4c107326686a561caa5cdfa928fb498c2cda9542e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot's Resilience\n\nSystems that have yet to be engineered with decentralization, cryptography, and game theory in mind\nare breakable and prone to cyber-attacks. Polkadot is basing its resilience on different pillars:\n\n- **Preponderance of light-client usage:** Centralized RPC servers are common but susceptible to\n  attack and not trustless decentralized entry points to using blockchain-based applications. Light\n  client usage on Polkadot is possible through\n  [Smoldot](https://github.com/smol-dot/smoldot).\n- **Zero-Knowledge (ZK) Primitives:** They can have a problematic effect on censorship and\n  centralization as having a big state transition function boiled down to a single proof of correct\n  execution. However, a library of\n  richly featured and high-performance ZK primitives ready for specific use cases is being built.\n  The first use-case will be used to improve privacy for on-chain collectives such as\n  [the Polkadot Technical Fellowship](../learn/learn-polkadot-technical-fellowship.md).\n- **[SAFROLE](../learn/learn-safrole.md) consensus:** New forkless block-production consensus\n  algorithm replacing [BABE](../learn/learn-consensus.md#block-production-babe) and where blocks are\n  not produced unless they are expected to be finalized. This will provide several benefits, such\n  as:\n  - Improved security, parachain performance, and UX from being forkless\n  - Preventing front-running attacks through high-performance transaction routing where transactions\n    are included in blocks in one hop instead of being gossiped, and transaction encryption.\n- **Internode Mixnet:** Shielded transport for short messages that avoids leaking IP information for\n  transactions, and introduces a general messaging system allowing users, chains and off-chain workers,\n  smart contracts, pallets, and anything else existing within a chain to exchange messages containing\n  signatures, intentions, etc.\n- **Social Decentralization:** Resilience is achieved by including many participants contributing to\n  the system and coming to decisions through on-chain governance. Involving as many people as\n  possible ensures resilience against spending becoming systemically misjudged and appropriately\n  directs wealth for spending treasury funds, salaries, and grants. Another crucial way of\n  decentralizing the network is ensuring experts on which the maintenance of the system relies upon\n  are incentivized and recruited over time by the Polkadot network and not by organizations within\n  the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v1", "url": "https://developer.polkadot.com/wiki/general/polkadot-v1/#polkadot-10", "page_title": "Polkadot 1.0", "index": 0, "depth": 2, "title": "Polkadot 1.0", "anchor": "polkadot-10", "start_char": 341, "end_char": 4683, "estimated_token_count": 875, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8ba4216b3246587e5b8aac1e38ed63c9d4e9f8694e3522cc8eea5c1497e075f7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot 1.0\n\nPolkadot 1.0 reflected the status of Polkadot in 2023 at the time of the release of the\n[Polkadot runtime v1.0.0](https://github.com/paritytech/polkadot/releases/tag/v1.0.0). This section\nfocuses on Polkadot 1.0 and some philosophical digressions about network resilience and blockspace.\n\nPolkadot is a blockchain-based decentralized computer that brings to the blockchain industry the following innovations:\n\n- **Rollup Chains (parachains).** These are application-specific chains connected to Polkadot. Polkadot is a sharded network\n  where transactions are processed in parallel within each shard. Continuing the comparison of Polkadot being a decentralized computer, Polkadot has a virtual CPU with virtual cores (shards). Polkadot cores are the gateway for rollup chains to use Polkadot as a service for shared security and interoperability (see below).\n\n    !!!info \"Rollups or Parachains?\"\n        Polkadot rollups used to be referred to as parachains in the past. This reflected the technical nature of parachains, blockchains running in parallel as Polkadot shards. However, the technological nature of parachains is akin to a rollup protocol. Due to the broad industry acceptance of the term \"rollup\", parachains are, in a way, rollup chains: fully-fledged blockchains utilizing Polkadot's rollup mechanism for security guarantees. A comparison between Polkadot rollups and other rollup technologies is available [here](../learn/learn-comparisons-rollups.md#rollup-comparison-table).\n\n- **Execution sharding.** Polkadot introduced execution sharding on top of data sharding. Data sharding essentially refers to rollup data living in each shard (rollup chain), and being permanently fragmented (more on this later). Polkadot also introduced [the ELVES security protocol](../learn/learn-parachains-protocol.md), assigning a subset of validators to each Polkadot virtual core to check incoming data from each rollup. Secondary checks and dispute-driven escalation effects ensure the system stays secure, and eventually, all validators will be engaged in critical situations. Execution sharding is at the core of Polkadot's scalability because:\n\n    - Not all validators always check everything\n    Validators feature an in-core/on-chain dualism: they not only commit to the blockchain's state but also participate in data availability, re-executing, and checking data coming through Polkadot's virtual cores.\n\n    This system allows Polkadot to have many virtual cores and process data coming through those cores simultaneously, natively, and without compromising security.\n\n- **Shared security**. Any rollup chain attached to a Polkadot\n  virtual core can benefit from Polkadot's shared security and interoperability model. This means the Polkadot\n  [Nominated-Proof-of-Stake (NPoS)](../learn/learn-staking.md#nominated-proof-of-stake-npos)\n  mechanism along with ELVES, can secure fully-fledged blockchains out-of-the-box without bootstrap security.\n\n- **Secure interoperability.** Any rollup chain attached to a Polkadot core, as well as Layer-two (L2) chains built on top of them, can benefit from Polkadot's native interoperability via [XCM](../learn/learn-xcm.md) and can thus communicate and exchange value and information with other Polkadot rollup chains. Examples of L2 can be dApps deployed as smart contracts on Moonbeam or Astar.\n\n- **Resilient infrastructure.** This is achieved by keeping the network decentralized without\n  compromising scalability and throughput, and through the on-chain\n  [treasury](../learn/learn-polkadot-opengov-treasury.md) funds that can be accessed through\n  [OpenGov](../learn/learn-polkadot-opengov.md) referendum. Those funds guarantee constant sponsorship for network upgrades, educational material, software development, events, and initiatives.\n\n- **Fast blockchain development.** This is achieved through the modular and\n  flexible [Substrate, located within the Polkadot SDK](./glossary.md#substrate).  Builders can create fully-fledged blockchains designed explicitly around their application and value proposition, while Polkadot takes care of security and interoperability.\n\n- **Fostering next-gen of Web3 core developers.** This is achieved through different initiatives\n  such as [the Polkadot Blockchain Academy](https://polkadot.network/development/academy/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v1", "url": "https://developer.polkadot.com/wiki/general/polkadot-v1/#polkadots-representation", "page_title": "Polkadot 1.0", "index": 1, "depth": 2, "title": "Polkadot's Representation", "anchor": "polkadots-representation", "start_char": 4683, "end_char": 6486, "estimated_token_count": 405, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8ba4216b3246587e5b8aac1e38ed63c9d4e9f8694e3522cc8eea5c1497e075f7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot's Representation\n\nPolkadot is represented as a ring surrounded by multiple blockchains attached to it. Based on Polkadot's design, if a chain's logic can compile to Wasm and adhere to the relay chain API, it can\nconnect to the Polkadot network as a rollup chain. The figure below shows the Polkadot relay chain (circle) with rollup chains attached to the virtual cores (open squares within the circle). A zoomed-in view shows Polkadot's validators (PC icons) guarding two cores. In-core validators will check incoming rollup data following [the ELVES protocol](../learn/learn-parachains-protocol.md).\n\n<div align=\"center\"> <img src=\"../../assets/polkadot-relay-chain.png\" style=\"width:400px;\" alt=\"Polkadot Relay Chain Diagram\"> </div>\n\nPolkadot's rollup chains construct and propose blocks to in-core validators on the relay chain, where the blocks undergo\nrigorous [availability and validity](../learn/learn-parachains-protocol.md) checks before being\nadded to the finalized chain. As the relay chain provides the security guarantees,\n[collators](../learn/learn-collator.md), full nodes of these rollup chains, do not have any security\nresponsibilities, and thus do not require a robust incentive system.\n\nThe [Cross-Consensus Messaging Format (XCM)](../learn/learn-xcm.md) allows rollup chains to send\nmessages of any type to each other. The relay chain's shared security and validation logic \nprovides the environment for trust-free message passing that opens up trustless interoperability.\n\nTo interact with chains that want to use their finalization process (e.g., Bitcoin),\nPolkadot has [trustless bridges](../learn/learn-bridges.md) that offer two-way compatibility, meaning that transactions can happen between Polkadot and other ecosystems without relying on centralized parties."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v1", "url": "https://developer.polkadot.com/wiki/general/polkadot-v1/#polkadot-10-core-usage-and-functionalities", "page_title": "Polkadot 1.0", "index": 2, "depth": 2, "title": "Polkadot 1.0 Core Usage and Functionalities", "anchor": "polkadot-10-core-usage-and-functionalities", "start_char": 6486, "end_char": 8331, "estimated_token_count": 481, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8ba4216b3246587e5b8aac1e38ed63c9d4e9f8694e3522cc8eea5c1497e075f7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot 1.0 Core Usage and Functionalities\n\nThe Polkadot relay chain managed parachains' crowdloans and auctions (replaced by [the coretime marketplace](../learn/learn-agile-coretime.md)). Polkadot's virtual cores were leased via auctions in 3-month chunks for a maximum of two years, and crowdloans allowed users to loan funds to teams for lease deposits in exchange for pre-sale tokens. There was no other way you could access and use cores on Polkadot 1.0.\n\nIn Polkadot 1.0, rollup chains produced blocks at a fixed rate of 12 seconds, whether needed or not. This led to inefficient energy allocation for computation and economic incentives for producing full blocks under heavy traffic and empty blocks under light traffic.\n\nThe figure below shows the core usage for Polkadot 1.0, where the horizontal axis is time, and each\nrow represents a virtual core. Colors show different rollup chains, each using one core (i.e., one rollup, one core formula).\n\n<div align=\"center\"> <img src=\"../../assets/polkadot-v1-cores.png\" style=\"width:600px;\" alt=\"V1 Cores Scheme\"> </div>\n\nThe above setup allowed a **simple and secure, sharded execution environment**.\n\nBelow is an example of two rollup chains accessing two separate Polkadot cores. The CPU load diagram shows that Chain 1 uses Core 1 computation at 50% while Chain 2 uses Core 2 at 25%. We will see how in [Polkadot 2.0](./polkadot-v2.md) in-core computation is used more efficiently.\n\n<div align=\"center\"> <img src=\"../../assets/two-cores.png\" style=\"width:400px;\" alt=\"Two Cores Diagram\"> </div>\n\nThe relay chain also managed other tasks such as [staking](../learn/learn-staking.md),\n[accounts](./../learn/learn-accounts.md), [identities](../learn/learn-identity.md), [balances](../learn/learn-transactions.md#balance-transfers), and [governance](../learn/learn-polkadot-opengov.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v1", "url": "https://developer.polkadot.com/wiki/general/polkadot-v1/#polkadots-resilience", "page_title": "Polkadot 1.0", "index": 3, "depth": 2, "title": "Polkadot's Resilience", "anchor": "polkadots-resilience", "start_char": 8331, "end_char": 10538, "estimated_token_count": 447, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8ba4216b3246587e5b8aac1e38ed63c9d4e9f8694e3522cc8eea5c1497e075f7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot's Resilience\n\nDecentralization is a crucial aspect of blockchain networks, but there is a trade-off between:\n\n- having an over-decentralized network that struggles to reach consensus and consumes a lot of energy to operate, and\n- having a network that reaches consensus fast at the expense of being centralized, making it\n  trivial to manipulate or attack.\n\nIdeally, a network should be decentralized \"enough\" to make it practically impossible for someone to\nexert manipulative or malicious influence on the network. So, **decentralization is a tool, while the\ngoal is resilience**, which is achieved by additionally providing an on-chain treasury and open governance\nmechanism allowing continuous incentives for the network's participants without relying on\nintermediaries or centralized entities.\n\nPolkadot 1.0 achieved resilience through the following strategies:\n\n- **Nominated Proof-of-Stake (NPoS)** where the stake per validator is maximized and evenly distributed across validators, and participation in native staking is decentralized and democratized as much as possible.\n- [**ELVES protocol**](../learn/learn-parachains-protocol.md) allows for the shared security system, where everything coming through Polkadot's virtual cores passes rigorous checking. See [this page](../learn/learn-comparisons-rollups.md#rollup-comparison-table) to explore how Polkadot's rollup technology differs from optimistic and ZK rollups.\n- The [now closed **Decentralized Nodes Program**](https://medium.com/web3foundation/web3-foundation-is-sunsetting-the-decentralized-nodes-program-761b70b1a468) aimed to incentivize new operators to\n  become network participants and further increase physical (how many validator nodes per service\n  provider) and social decentralization (how many validator nodes per operator). Those can be\n  explored with the [Polkawatch App](https://polkadot.polkawatch.app/).\n- An **on-chain treasury and governance** (see: [OpenGov](../learn/learn-polkadot-opengov.md)) where\n  every decision goes through public referenda, and any token holder can cast a vote. Treasury proposals can tap into the treasury funds to fund various initiatives the DOT community deems reasonable."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v1", "url": "https://developer.polkadot.com/wiki/general/polkadot-v1/#polkadots-blockspace", "page_title": "Polkadot 1.0", "index": 4, "depth": 2, "title": "Polkadot's Blockspace", "anchor": "polkadots-blockspace", "start_char": 10538, "end_char": 13959, "estimated_token_count": 698, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8ba4216b3246587e5b8aac1e38ed63c9d4e9f8694e3522cc8eea5c1497e075f7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot's Blockspace\n\nA blockchain is a way to permanently store data and make it verifiable. The storage unit is the block (i.e., blockspace), and once a block is finalized\nonto the chain, it is practically impossible to modify the data within that block. In addition to\nbeing tamper-proof, public permissionless blockchains like Polkadot store data visible to\neverybody (i.e., public), and everybody can cryptographically verify the correctness of such data.\n\nThe design and realization of Polkadot 1.0 allowed its creators to enable the commoditization of\nblockspace.\n\n!!!info \"Blockspace is an umbrella term\"\n    Blockspace is the capacity of a blockchain to finalize and commit operations. It represents a\n    blockchain's security, computing, and storage capabilities as an end product. Blockspace is not measured the same on any chain; there is no standard unit for blockspace. In Bitcoin, blockspace is based on transaction size, in Ethereum, on how much computation is used (gas), and in Polkadot, on how much time is taken to execute a task on a virtual core (coretime).\n\nBlockspace produced by blockchains can vary in security, flexibility, and availability.\n\n- **Security** is intended to show how secure blockspace is. In Proof-of-Stake (PoS) networks, this is\n  directly related to how much stake is locked on validator nodes, how much variance in stake there\n  is between validators (i.e., how easy it is to attack a single validator), and how many validators\n  there are securing the network (i.e., how easy it is for colluding validators to exert influence on\n  the network). Additionally, it is also important to look at how many validators are owned by\n  single operators (this will determine the degree of social centralization of the network), and how\n  many validators run on the same service provider (this will determine the degree of physical\n  centralization of the network).\n- **Flexibility**, intended as how flexible the blockspace is, what can be done with it, and what\n  type of data can be stored. Data quality plays an important role depending on the type of network.\n  One might avoid having situations in which poor quality data floods blockspace, hindering the prompt\n  execution of vital processes.\n- **Availability**, intended to show how available blockspace is and how difficult it is to access it. It\n  should not be too difficult to get your hands on it so that any business model can thrive using\n  it. Ideally, a marketplace must drive the blockspace price based on demand, with secondary market\n  options to ensure the usage of \"second-hand\" blockspace.\n\nPolkadot has been designed around those core blockspace principles. However, its design can be\nfurther improved such that the tasks managed on the relay chain, such as\nbalances transfers, staking, and governance, can be delegated to\n[system chains](../learn/learn-system-chains.md) to increase flexibility and to focus the use of\nthe relay chain to provide shared security and interoperability. Blockspace is only accessible\nthrough auctions, but an auction winner can access a \"freighter of blocks\" regardless of their need. This creates high entry barriers and can lead to energy and resource waste.\n\nFor more information about blockspace, see [this interview](https://youtu.be/e1vISppPwe4) with Robert\nHabermeier, as well as [this article](https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/) by\nhim."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v1", "url": "https://developer.polkadot.com/wiki/general/polkadot-v1/#a-perspective-shift-upcoming-polkadot-features", "page_title": "Polkadot 1.0", "index": 5, "depth": 2, "title": "A Perspective Shift: Upcoming Polkadot Features", "anchor": "a-perspective-shift-upcoming-polkadot-features", "start_char": 13959, "end_char": 15034, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8ba4216b3246587e5b8aac1e38ed63c9d4e9f8694e3522cc8eea5c1497e075f7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## A Perspective Shift: Upcoming Polkadot Features\n\nAs with many other projects before Polkadot, at some point in time after achieving the\ninitially planned goals, a perspective shift allows you to understand better what your project is\nabout and what you have built. This allows you to \"run the extra mile\" and achieve more\nthan initially planned.\n\nThe quote below by [Marcel Proust](https://en.wikipedia.org/wiki/Marcel_Proust) must remind us that\nsometimes a perspective shift is crucial in _understanding_ the world, and perhaps it is more\nimportant than _seeing more_ of the world.\n\n_The only true voyage of discovery, the only fountain of Eternal Youth, would be not to visit\nstrange lands but to possess other eyes._\n\nThus, if we start to see Polkadot with _other eyes_, we can truly envision its potential and what it could become.\n\nPolkadot is perfecting its implementation through [RFCs](#requests-for-comment-rfcs)\nto continue being a decentralized, secure, ubiquitous computing engine to power the next generation of [Web3](./web3-and-polkadot.md) applications."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v1", "url": "https://developer.polkadot.com/wiki/general/polkadot-v1/#requests-for-comment-rfcs", "page_title": "Polkadot 1.0", "index": 6, "depth": 3, "title": "Requests for Comment (RFCs)", "anchor": "requests-for-comment-rfcs", "start_char": 15034, "end_char": 17791, "estimated_token_count": 645, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8ba4216b3246587e5b8aac1e38ed63c9d4e9f8694e3522cc8eea5c1497e075f7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Requests for Comment (RFCs)\n\nWith the release of [Polkadot runtime 1.0](./polkadot-v1.md), Polkadot's codebase is in the hands of\nthe community. Anyone can open a\n[Request for Comment (RFC)](https://github.com/polkadot-fellows/RFCs) to propose and discuss changes\nto the network protocol, runtime logic, public interfaces, and other technical matters.\n\nTo submit an RFC, follow the instructions [here](https://github.com/polkadot-fellows/RFCs#process).\n\nRFCs can only be approved and merged by III-Dan members of\n[Polkadot Technical Fellowship](../learn/learn-polkadot-technical-fellowship.md) via on-chain voting\nmechanism. Definitive approval or rejection is done by issuing the `RFC_APPROVE(xxxx, h)` or\n`RFC_REJECT(xxxx, h)` on-chain remark from the Fellowship origin on the Polkadot Collectives\nparachain, where `xxxx` is the RFC number and `h` is the hash of the raw proposal text.\n\nFor example, the first RFC [RFC-1](https://github.com/polkadot-fellows/RFCs/pull/1) about Agile\nCoretime was proposed by Gavin Wood on the 30th of June 2023 and merged on the 12th of August 2023.\nSubsequently, the Agile Coretime Broker pallet code was added to the Substrate FRAME system.\n\nIn general, the workflow from RFC write-up submission to its implementation follows the timeline\nbelow:\n\n- RFC submitted by following the [instructions](https://github.com/polkadot-fellows/RFCs#process).\n- RFC review by the Technical Fellowship [via GitHub](https://github.com/polkadot-fellows/RFCs)\n- Polkadot Technical Fellowship Referendum of the RFC submitted to the Track `3 / Fellows` by\n  members with a rank greater than or equal to 3.\n- If the Referendum is approved through on-chain vote by the Technical Fellowship, changes discussed\n  in the RFC will be implemented.\n- If the changes requested through the RFC require a broader consensus of DOT holders, an OpenGov\n  referendum may be created. For instance,\n  [adding a new system collective](https://github.com/polkadot-fellows/RFCs/blob/main/text/0012-process-for-adding-new-collectives.md)\n  or making changes to network parameters like inflation rate, treasury inflow, etc.\n\n!!!note \"Polkadot Runtime Code Changes through Root track\"\n    Although the Technical Fellowship maintains the [runtimes of Polkadot and Kusama](https://github.com/polkadot-fellows/runtimes), changes to the network protocol are not gated by the fellowship. Any DOT holder can submit a referendum on [the Polkadot OpenGov Root track](../learn/learn-polkadot-opengov-origins.md#root) to set the runtime code with the proposed changes.\n\nFor more information about the adoption of RFCs within the Polkadot ecosystem, see the\n[original Polkadot Forum post](https://forum.polkadot.network/t/polkadot-protocol-proposals-rfc-process/1421/1)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v2", "url": "https://developer.polkadot.com/wiki/general/polkadot-v2/#polkadot-20-definition", "page_title": "Polkadot 2.0", "index": 0, "depth": 2, "title": "Polkadot 2.0 Definition", "anchor": "polkadot-20-definition", "start_char": 305, "end_char": 1398, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:33366f2c7672a70bbcad506dae290e48f5d8c1aebc37e67fce671eb0eec86ba0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot 2.0 Definition\n\nPolkadot is **a multi-core decentralized computer** that provides resilient and verifiable computation via virtual cores. Chains that continuously operate in parallel on different virtual cores are called [rollup chains](../learn/learn-parachains.md) (also called parachains).\n\nThe Polkadot community [voted on a Wish for Change proposal](https://polkadot.subsquare.io/referenda/747) stating that Polkadot 2.0 includes the following major technical upgrades:\n\n- [asynchronous backing](../learn/learn-async-backing.md) allowing pipelining and thus a more efficient rollup system that grants rollups more throughput without compromising security.\n- [coretime](../learn/learn-agile-coretime.md) allowing agile allocation of cores and thus execution on the Polkadot decentralized computer.\n- [elastic scaling](../learn/learn-elastic-scaling.md) allowing the use of multiple cores simultaneously by the same rollup chain to boost throughput.\n\nThese technical upgrades made the Polkadot decentralized computer more efficient, powerful, and accessible for anyone to use."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v2", "url": "https://developer.polkadot.com/wiki/general/polkadot-v2/#from-slot-auctions-to-coretime-marketplace", "page_title": "Polkadot 2.0", "index": 1, "depth": 2, "title": "From Slot Auctions to Coretime Marketplace", "anchor": "from-slot-auctions-to-coretime-marketplace", "start_char": 1398, "end_char": 4022, "estimated_token_count": 522, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:33366f2c7672a70bbcad506dae290e48f5d8c1aebc37e67fce671eb0eec86ba0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## From Slot Auctions to Coretime Marketplace\n\nPolkadot 1.0 has been abstracted and generalized beyond what was initially proposed and envisioned in the [Polkadot whitepaper](https://polkadot.network/whitepaper/).\n\nPolkadot is a service provider of trustless, resilient, and verifiable computation via cores and secure interoperability between core-secured rollup chains. The future development of Polkadot can be directed towards the following paradigm shift:\n\n- from being an ecosystem where each rollup chain owned an execution core at all times\n  (acquired through a candle auction mechanism), which allowed a simple and secure, sharded execution environment\n- to being an ecosystem where we remove the assumption that each rollup chain\n  owns a core, and instead, all execution cores are a resource to be used as needed by all rollup chains.\n\nThe previously used candle auction mechanism was not agile, made access to blockspace competitive, created high entry barriers, and was designed for long-running single blockchains (i.e., the original vision proposed in the Polkadot whitepaper).\n\nThe end product of a blockchain is [**blockspace**](./polkadot-v1.md#polkadots-blockspace). In the Polkadot context, blockspace is better described by computation provided by validators and secured via the [ELVES protocol](../learn/learn-parachains-protocol.md).\nThe entry points to access Polkadot's computation are the virtual cores. Thus, rollups need to reserve time on Polkadot's cores (or **coretime**) to gain the right to access Polkadot's secure computation and interoperability for a finite period.\n\nThus, classic lease auctions were deprecated to create an agile marketplace for [coretime], where coretime becomes a commodity that can be tokenized, sold, and traded. Rollup chains can purchase:\n\n- **bulk coretime**: a standard purchase of coretime through [the Coretime System Chain](../learn/learn-system-chains.md#existing-system-chains) at a fixed\nprice for a fixed period, with a predictable renewal price.\n- **on-demand coretime**: On-demand purchase of coretime available through ongoing sale for immediate use at a spot price.\n\nThis dramatically decreases the barrier-to-entry for software tinkerers and rollup teams. Coretime will allow any rollup chain to access Polkadot's computation based on their needs, maximizing the use of valuable computation. This setup\nmaximizes the agility of Polkadot and lets the market figure out the best solution needed for rollup chains to be successful.\n\nCoretime sales are burned and contribute to the protocol's revenue by adding deflationary pressure on the DOT token."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-v2", "url": "https://developer.polkadot.com/wiki/general/polkadot-v2/#polkadot-20-core-usage-and-functionalities", "page_title": "Polkadot 2.0", "index": 2, "depth": 2, "title": "Polkadot 2.0 Core Usage and Functionalities", "anchor": "polkadot-20-core-usage-and-functionalities", "start_char": 4022, "end_char": 6868, "estimated_token_count": 663, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:33366f2c7672a70bbcad506dae290e48f5d8c1aebc37e67fce671eb0eec86ba0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot 2.0 Core Usage and Functionalities\n\nWe have seen how in [Polkadot 1.0](./polkadot-v1.md#polkadot-10-core-usage-and-functionalities), one rollup chain has a specific core at all times for a fixed two-year period, whether they needed it or not. However, blocks must be produced when required to achieve full efficiency, and the system must target full block capacity, lowering the probability of incentivizing validators to build blocks half full or, worse, empty.\n\nPolkadot 2.0 generalizes core usage to meet different rollup needs. For more information about coretime, see the [agile coretime documentation](../learn/learn-agile-coretime.md).\n\nThe figure below shows the core usage for Polkadot 2.0. The horizontal axis is time, and each row represents a virtual core. The colors show different rollup chains.\n\n<div align=\"center\"> <img src=\"../../assets/polkadot-v2-cores.png\" style=\"width:600px;\" alt=\"V1 Cores Scheme\"> </div>\n\nAs shown above, coretime can be:\n\n- **split**: Owners of coretime can split or trade it. A rollup R1 can run on Core 1 for a finite period, and then another rollup R2 can run on that core, or R1 can continue running on another core. Some applications might stop running for some time and resume later on. Note that there is no rollup affinity for cores.\n- **interlaced**: Cores can be accessed concurrently, meaning that applications can take turns on a core to share costs or decrease block production rate, for example.\n\nAn application can be assigned to multiple cores simultaneously. Some applications can have a\npermanent core assignment and an intermittent one, for example, in a period of high demand to send\nmultiple blocks to multiple cores at the same time slot to reduce latency. Combining coretime across multiple cores is achieved through [elastic scaling](../learn/learn-elastic-scaling.md).\n\nBelow is an example of two rollup chains accessing two separate Polkadot cores. The CPU load diagram shows that Chain 1 uses Core 1 computation at 100% while Chain 2 uses Core 2 at 25%. Rollups produce blocks every 6 seconds using the pipelining feature (i.e. asynchronous backing).\n\n<div align=\"center\"> <img src=\"../../assets/one-core-full.png\" style=\"width:400px;\" alt=\"Two Cores Diagram\"> </div>\n\nChain 1 uses Core 1 to its maximum capacity and needs more computation from Polkadot to secure additional rollup blocks. Chain 2 can interlace its coretime so that both chains can access Polkadot's secure computation concurrently via Core 2.\n\n<div align=\"center\"> <img src=\"../../assets/two-cores-elastic-scaling.png\" style=\"width:400px;\" alt=\"Two Cores Diagram\"> </div>\n\nChain 1 uses elastic scaling by parallelizing computation on two cores. Note how Chain 2 now uses Core 2 at 50% because it produces blocks every 12 seconds, but now those blocks contain twice the transactions as before."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#vault-vs-ledger", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 0, "depth": 2, "title": "Vault vs. Ledger", "anchor": "vault-vs-ledger", "start_char": 2527, "end_char": 9001, "estimated_token_count": 1344, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Vault vs. Ledger\n\nThe Polkadot Vault and [Ledger](ledger.md) are cold storage solutions because private keys of\naccounts created on the Vault app or Ledger device are not stored on your computer or, more in\ngeneral, on a device that has an internet connection. However, the two solutions differ, and you\nshould consider one or the other depending on your user type.\n\n|                                                                                                             Ledger                                                                                                             |                                                                                                                                                                                                                                                                                     Polkadot Vault                                                                                                                                                                                                                                                                                     |\n| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |\n|              Hardware designed to stay offline and be secure. Certified by French cybersecurity agency [ANSSI](https://cyber.gouv.fr/en).               |                                                                                                                                                                                                                         Hardware not designed to stay offline. The user must switch off all inbound and outbound connections (network, wifi, Bluetooth, NFC).                                                                                                                                                                                                                          |\n|        Hardware is resistant to side-channel attacks via [Secure Element](https://www.ledger.com/academy/security/the-secure-element-whistanding-security-attacks/). The secure element will destroy itself if opened.         |                                                                                                                                                                                                   Although there is no wired connection, side-channel attacks are possible. Without a secure element, the phone can be opened, and the keys will be accessible in its storage unit.                                                                                                                                                                                                    |\n|                                                                                        Accounts derived from one mnemonic seed phrase.                                                                                         | One mnemonic for each account or one mnemonic for multiple accounts via [account derivation](../learn/learn-account-advanced.md#derivation-paths) or default [Substrate address format](../learn/learn-account-advanced.md#address-format). See [this article](../learn/learn-account-advanced.md) for information on whether to use the same account or different accounts on different chains based on your needs. |\n|                                                                          Easy firmware and application upgrades through the Ledger Live application.                                                                           |                                                                                                                    The app should never be connected to the internet after installation, so the version installed on the phone should not be updated directly. For [app upgrades](#update-the-vault-app), users must factory reset the phone and recover all accounts through seed phrases. Metadata updates for each chain must be done via the QR code fountain.                                                                                                                     |\n|                                                                                          Currently, not all parachains are supported.                                                                                          |                                                                                                                                                                                                   Users can add all parachains either through a third-party provider or if they have the wss endpoint and know [how to extract the chain specifications and metadata](#add-chains).                                                                                                                                                                                                    |\n| Ledger app updates on Ledger Live sometimes lag behind chain updates resulting in users only being able to transact if they [install developer versions](ledger.md) (only for advanced users). |                                                                                                                                                                                  Metadata updates are always available to install once released, either through the third-party provider or manually. In this case, the installation process requires familiarity with working on the command prompt.                                                                                                                                                                                  |"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#create-and-import-accounts", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 1, "depth": 2, "title": "Create and Import Accounts", "anchor": "create-and-import-accounts", "start_char": 9001, "end_char": 9952, "estimated_token_count": 218, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Create and Import Accounts\n\nYou can create a new account directly within the Vault app (Add Key Set > Add new Key Set). This\nwill generate a new mnemonic seed phrase on the app. Alternatively, you can import a new account in\nthe app using a seed phrase generated elsewhere with a compatible account generation scheme. For\nexample, you can have an air-gapped laptop with the Subkey tool installed and generate a new account\nthere. The seed phrase of that account can be imported into the Vault App (Add Key Set > Recover Key\nSet).\n\nFor guidelines about how to create an account using Polkadot Vault, see\n[**this video tutorial**](https://youtu.be/hgv1R9mPEXw?t=120) and visit\n[**this article**](../learn/how-to/parity-signer-create-account.md).\n\n!!!info\n    Importing an account into an extension will not import its private key. Only the public key will be\n    imported and you must sign using your air-gapped phone which holds the private key."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#restore-account-on-polkadot-vault", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 2, "depth": 2, "title": "Restore Account on Polkadot Vault", "anchor": "restore-account-on-polkadot-vault", "start_char": 9952, "end_char": 10191, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Restore Account on Polkadot Vault\n\nSee [**this video tutorial**](https://youtu.be/hgv1R9mPEXw?t=407) and\n[**this page**](../learn/how-to/parity-signer-restore-account.md)\nto learn how to restore your account on the Polkadot Vault app."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#signing-transactions-without-metadata", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 3, "depth": 2, "title": "Signing Transactions Without Metadata", "anchor": "signing-transactions-without-metadata", "start_char": 10191, "end_char": 10877, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Signing Transactions Without Metadata\nWith Polkadot Vault v7.0.0 and above, you can sign transactions without adding or updating the network metadata. This functionality must be supported by the wallet that you are using. Note that you still need to add the chain specification for the chain you wish to use.\n\nSigning a transaction using Polkadot Vault remains the same, except the wallet you use should present you with an animated QR code when you sign the transaction. This QR code contains all the data required to sign the transaction without updating the chain’s metadata in your Polkadot Vault. The data contained in the QR code is compressed, allowing for faster scanning."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#signing-extrinsics", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 4, "depth": 2, "title": "Signing Extrinsics", "anchor": "signing-extrinsics", "start_char": 10877, "end_char": 12623, "estimated_token_count": 382, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Signing Extrinsics\n\n!!!warning \"Always check for Metadata Updates\"\n    Before signing extrinsics with the Polkadot Vault app, always check for metadata updates.\n    [**This video tutorial**](https://youtu.be/gbvrHzr4EDY?t=328) will explain how to do it.\n\nRemember to always check for metadata updates before signing transactions. See\n[this article](https://github.com/w3f/polkadot-wiki/pull/4600/files#diff-5d4d0a286cdc7b1d016ee155f9694dbcddc13f5264490fc1a960c38000baca4d)\nto learn how to sign transactions and\n[this article](../learn/how-to/vault-add-chain-metadata.md)\non how to easily add new chains and do metadata updates using the Vault app.\n\nThe procedure to sign transactions with the Vault app is as follows:\n\n- The wallet or browser extension will show a QR code encoding the information about what you are\n  going to sign.\n- After scanning the QR code with the Vault app, you will be presented with decoded information\n  about what you will sign. Make sure the information matches what you intended to sign in the first\n  place. If something does not feel right, do not sign. Check\n  [this page](transaction-attacks.md#corrupted-qr-code-parity-signer) for more information and\n  contact [the Polkadot Support Team](../../get-support.md).\n- If the information shown by the Vault app is correct, you can present the QR code (signature) to\n  the camera on your laptop to sign for the transaction.\n\n!!!info \"QR codes are signature-specific\"\n    Note that QR codes are signature-specific. If someone by chance has access to the QR code signature\n    for one of your transactions, future transactions cannot be signed with that same QR code, and it is\n    impossible to find out the private key of your account only with that QR code."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#update-the-vault-app", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 5, "depth": 2, "title": "Update the Vault App", "anchor": "update-the-vault-app", "start_char": 12623, "end_char": 13200, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Update the Vault App\n\n!!!danger\n    Ensure you always have your mnemonic seed phrase secure and available.\n\nTo securely update the Polkadot Vault app follow the instructions\n[here](https://github.com/novasamatech/parity-signer/blob/master/docs/src/tutorials/Upgrading.md).\nBriefly,\n\n- backup your accounts (Backup key Set > write down the mnemonic seed phrase),\n- factory reset your Vault app (Settings > Wipe all Data),\n- factory reset your phone,\n- re-install the Vault app,\n- go offline (airplane mode, no wifi),\n- recover your accounts (Add Key Set > Recover Key Set)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#security-notes", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 6, "depth": 2, "title": "Security Notes", "anchor": "security-notes", "start_char": 13200, "end_char": 14853, "estimated_token_count": 345, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Security Notes\n\n!!!info \"Remove SIM cards and Forget Networks\"\n    To avoid unintended connection of your phone to the Internet, remove SIM cards, reset eSIM settings,\n    and forget any added WiFi networks. In this way, the only possibility of having an unintended\n    internet connection is either through the cellular network or through WiFi connection.\n\nThe Vault app has a Log that will tell you all activities performed with it. It is important to mark\ndown the last action, you did so that you can do a security check the next time you use the app.\nAlso, the Vault app will always tell you if the phone has been (even briefly) connected to the\nInternet. In case of an unrecognized connection, it is recommended to:\n\n- Backup your accounts (i.e. make sure you have the mnemonic seed phrases)\n- Follow the steps in [Update the Vault app](#update-the-vault-app)\n- Once offline, create a new account on the Vault app\n- Import the compromised accounts and transfer the funds to the new non-compromised account.\n\n!!!danger \"The Vault App has the option to export private keys\"\n    If an account's private key has been exported from the Vault app, the public key will be marked as\n    \"hot\" and the following message will be displayed _This key is marked hot because its root private\n    key has been exported_.\n\nYou might consider exporting the private key if you are switching air-gapped phone. If you choose to\nexport your private key, avoid the following:\n\n- Do not export your private key to a device that is connected to the internet, as your key will not\n  be \"cold\" anymore.\n- Do not print private keys QR codes over an internet connection."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#add-chains", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 7, "depth": 2, "title": "Add Chains", "anchor": "add-chains", "start_char": 14853, "end_char": 15560, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Add Chains\n\nThe Vault app contains default chain specs for Polkadot, Kusama, and Westend. It is possible to add\nmore chains via QR-code, and update their metadata by generating your own QR-code fountain in a\nmetadata portal similar to that [signed by Parity](https://metadata.parity.io/#/polkadot).\nAlternatively, you can use a third-party provider to add chains and their metadata. Check\n[this article](../learn/how-to/vault-add-chain-metadata.md)\nfor detailed instructions. If you choose this approach, you should trust the provider you choose.\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the\n    [Polkadot-JS guides about Polkadot Vault](../learn/learn-guides-vault.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadot-vault", "url": "https://developer.polkadot.com/wiki/general/polkadot-vault/#how-to-guides", "page_title": "Polkadot Vault (formerly Parity Signer)", "index": 8, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 15560, "end_char": 16646, "estimated_token_count": 348, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:605f65005289f97794a9ed3e4dc4bab142d7ee5d875089be1f94bfa165d97a7f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [Polkadot Vault — How to Add a New Chain and Update Metadata](../learn/how-to/vault-add-chain-metadata.md)\n- [Polkadot Vault — How to Add Your Account](../learn/how-to/vault-add-account.md)\n- [Parity Signer — How to Create an Account](../learn/how-to/parity-signer-create-account.md)\n- [Parity Signer — How to Restore Your Account](../learn/how-to/parity-signer-restore-account.md)\n- [Parity Signer — How to Sign a Transaction](../learn/how-to/parity-signer-sign-transaction.md)\n- [Parity Signer — How to Add Your Account](../learn/how-to/parity-signer-add-account.md)\n- [Polkadot Vault — How to Create an Account](../learn/how-to/vault-create-account.md)\n- [Polkadot Vault — How to Restore Your Account](../learn/how-to/vault-restore-account.md)\n- [Polkadot Vault — How to Sign a Transaction](../learn/how-to/vault-sign-transaction.md)\n- [Polkadot Vault — How to Create the Same Account on Different Networks](../learn/how-to/vault-same-account-networks.md)\n- [Polkadot Vault — How to Replicate an Account for Asset Hub](../learn/how-to/vault-replicate-account.md)"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#main-functionalities", "page_title": "Polkadot Developer Interface (Wallet)", "index": 0, "depth": 2, "title": "Main Functionalities", "anchor": "main-functionalities", "start_char": 880, "end_char": 1069, "estimated_token_count": 30, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Main Functionalities\n\nHere we describe those functionalities that will likely be useful to most users. Those\nfunctionalities include account generation, balance transfers, and staking."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#accounts", "page_title": "Polkadot Developer Interface (Wallet)", "index": 1, "depth": 3, "title": "Accounts", "anchor": "accounts", "start_char": 1069, "end_char": 2421, "estimated_token_count": 379, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Accounts\n\nIn this section of the UI, you can see accounts injected from a browser extension, such as the\n[**Polkadot Developer Signer**](./polkadotjs.md#polkadot-developer-signer) or other in-browser wallets. It is also possible to expand balance details and see different\n[**account balance types**](../learn/learn-account-balances.md). You\ncan also:\n\n- Add an account (this option must be enabled under [Settings](#settings)). Note that if you clear\n  the cache of your browser, you will lose it, and you will need to recover it through seed phrase\n  or JSON file.\n- Recover and account from JSON file.\n- Add an account from QR code.\n- Add an account from a [**Ledger**](./ledger.md) device (this option must be enabled under\n  [Settings](#settings)).\n- Create a [**multi-signature account**](../learn/learn-account-multisig.md).\n- Add a proxied account (see\n  [**Pure Proxies**](../learn/learn-proxies-pure.md) for more\n  information).\n\nFor each account visible in the UI, you can perform different actions, including\n[**adding a proxy**](../learn/learn-proxies.md),\n[**setting an identity**](../learn/learn-identity.md), and\n[**sending tokens**](../learn/learn-transactions.md#balance-transfers).\n\nFor more information about adding and recovering accounts, see the\n[**Account Generation**](../learn/learn-accounts.md#account-generation) page."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#network-staking", "page_title": "Polkadot Developer Interface (Wallet)", "index": 2, "depth": 3, "title": "Network (Staking)", "anchor": "network-staking", "start_char": 2421, "end_char": 4195, "estimated_token_count": 470, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Network (Staking)\n\nIn this section of the UI, you can participate in [**staking**](../learn/learn-staking.md). In the\nStaking menu you can access:\n\n- The **Overview** tab showing active or waiting validators.\n- The **Accounts** tab (visible only if you added an account) showing accounts that are used for staking\n  ([**stash and staking proxy**](../learn/learn-staking.md#stash-account-and-staking-proxy)), bonded\n  amount, and nominations. In this tab, you can do staking-related transactions such as bonding more\n  funds or changing nominations. If you have\n  [**staking proxies**](../learn/learn-staking-advanced.md#staking-proxies) here, you can use them\n  while signing for staking-related transactions.\n- The **Payouts** tab (visible only if you added an account) showing any pending rewards that still\n  need to be paid out to you.\n- The **Pool** tab showing all registered [**nomination pool**](../learn/learn-nomination-pools.md)\n  with the respective state (open, blocked, or destroying). This tab can also be used to create and\n  join a pool.\n- The **Targets** tab showing detailed information about validators such as commission and return.\n  More information can be found in the [**Nominator Page**](../learn/learn-nominator.md).\n- The **Bags** tab (visible only if you added an account) showing the bag you are in (\"My bags\") and\n  all bags within the [**bags list**](../learn/learn-staking-advanced.md#bags-list). Here (if\n  applicable), you can rebag accounts that do not belong to the bag you are in, and you can move\n  your account in front of the account having less stake than you.\n- The **Slashes** tab showing if there are any global [slashes](../learn/learn-offenses.md).\n- The **Validator stats** tab showing statistics for a chosen validator."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#settings", "page_title": "Polkadot Developer Interface (Wallet)", "index": 3, "depth": 3, "title": "Settings", "anchor": "settings", "start_char": 4195, "end_char": 4696, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Settings\n\nIn this UI section, you can change general settings such as appearance and language. You can also:\n\n- Allow local in-browser account storage. This is used to add accounts directly in the UI (which\n  differs from having an account injected from a browser extension).\n- Choose to attach Ledger devices. This adds an account directly in the UI from a Ledger device.\n\nUnder Settings you can also do the metadata update. Usually, if there is an update, this will be shown as a notification."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#other-functionalities", "page_title": "Polkadot Developer Interface (Wallet)", "index": 4, "depth": 2, "title": "Other Functionalities", "anchor": "other-functionalities", "start_char": 4696, "end_char": 4823, "estimated_token_count": 21, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Other Functionalities\n\nIn this section, we describe those functionalities that will less likely interest the average user."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#network", "page_title": "Polkadot Developer Interface (Wallet)", "index": 5, "depth": 3, "title": "Network", "anchor": "network", "start_char": 4823, "end_char": 5017, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Network\n\nIn addition to staking, in the Network section, you can also:\n\n- See the Explorer with the most recent blocks and events.\n- Inspect [**parachains**](../learn/learn-parachains.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#governance", "page_title": "Polkadot Developer Interface (Wallet)", "index": 6, "depth": 3, "title": "Governance", "anchor": "governance", "start_char": 5017, "end_char": 5138, "estimated_token_count": 37, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Governance\n\nIn this section of the UI, you can participate in\n[**governance**](../learn/learn-polkadot-opengov.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#developer", "page_title": "Polkadot Developer Interface (Wallet)", "index": 7, "depth": 3, "title": "Developer", "anchor": "developer", "start_char": 5138, "end_char": 6018, "estimated_token_count": 285, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Developer\n\nIn this section of the UI, you can access advanced features such as:\n\n- [Query on-chain data](https://polkadot.js.org/apps/#/chainstate)\n- [Query the node using RPC calls](https://polkadot.js.org/apps/#/rpc)\n- Call [**extrinsics**](../learn/learn-transactions.md) using your account (you are able to see this\n  option only if you have an account in the UI)\n\nThe [Extrinsic tab](https://polkadot.js.org/apps/#/extrinsics) provides the use to access more\ngranular functions such as\n[**pure proxies**](../learn/learn-proxies-pure.md) and\n[**time-delayed proxies**](../learn/learn-proxies.md#time-delayed-proxy), change\n[**nomination pool**](../learn/learn-nomination-pools.md) settings (nomination and roles) and use\n[**non-transfer proxies**](../learn/learn-proxies.md#proxy-types),\n[**destroy assets**](../learn/learn-assets.md#destroying-an-asset), and much more."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#beginners-guide-to-polkadot-js", "page_title": "Polkadot Developer Interface (Wallet)", "index": 8, "depth": 2, "title": "Beginner's Guide to Polkadot-JS", "anchor": "beginners-guide-to-polkadot-js", "start_char": 6018, "end_char": 6316, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Beginner's Guide to Polkadot-JS\n\n- [Introduction to Polkadot-JS](https://www.youtube.com/watch?v=4EQqwGFV1D8)\n- [Create an account using Polkadot-JS](https://www.youtube.com/watch?v=sy7lvAqyzkY)\n- [Network Explorer on Polkadot Developer Interface](https://www.youtube.com/watch?v=g4b4IWR6OrE)"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs-ui", "url": "https://developer.polkadot.com/wiki/general/polkadotjs-ui/#how-to-guides", "page_title": "Polkadot Developer Interface (Wallet)", "index": 9, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 6316, "end_char": 6597, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ae33b0e1d08da7212ce19a20d338232eaa9571b0fdbba9e2c96a4971d78ae0f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [How to Switch Network Nodes](../learn/how-to/switch-network-nodes.md)\n- [How to Change the Developer Interface Language](../learn/how-to/change-interface-language.md)\n- [How to Troubleshoot Connection Issues](../learn/how-to/troubleshoot-connection-issues.md)"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs", "url": "https://developer.polkadot.com/wiki/general/polkadotjs/#polkadot-developer-interface", "page_title": "Polkadot-JS Guides", "index": 0, "depth": 2, "title": "Polkadot Developer Interface", "anchor": "polkadot-developer-interface", "start_char": 1660, "end_char": 2361, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0600ae9a5e85418adfe842c72ca5d33f6a6ec02598cc5101cbd0f60e7807d7ed", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Developer Interface\n\nThe Polkadot Developer Interface is an application that loads in your browser. There is a standard DNS\n[**hosted version**](https://polkadot.js.org/), which always has the latest features, and an\n[**IPFS version**](https://dotapps.io/) that is less frequently updated but is more decentralized.\nThis is also often referred to as Polkadot-JS Apps, UI or the Apps UI. In the Wiki pages we will\nalways refer to Polkadot Developer Interface.\n\nPolkadot-JS Apps has many capabilities that go beyond basic wallet functions such as account\ncreation and sending or receiving transactions. See the [**dedicated section**](./polkadotjs-ui.md)\nfor more information about the UI."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs", "url": "https://developer.polkadot.com/wiki/general/polkadotjs/#polkadot-developer-interface-desktop-app", "page_title": "Polkadot-JS Guides", "index": 1, "depth": 3, "title": "Polkadot Developer Interface Desktop App", "anchor": "polkadot-developer-interface-desktop-app", "start_char": 2361, "end_char": 3175, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0600ae9a5e85418adfe842c72ca5d33f6a6ec02598cc5101cbd0f60e7807d7ed", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot Developer Interface Desktop App\n\nThe Polkadot Developer Interface also exists as a\n[**desktop application**](https://github.com/polkadot-js/apps/releases/) for Windows, Mac and Linux.\nThe main advantage of using it is that by default it stores encrypted accounts on the filesystem\ninstead of browser's local storage. Local storage is susceptible to attacks using XSS (Cross-Site\nScripting). There's no such risk when with files stored on disk.\n\nThe desktop app uses the [**Electron**](https://www.electronjs.org/) framework. It provides the same\nfeatures as web app, the only difference being different account storage.\n\n!!!info Ledger not supported\n    The desktop application does not support Ledger accounts. If you need a cold storage solution you\n    can try Parity Signer (aka Polkadot Vault)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs", "url": "https://developer.polkadot.com/wiki/general/polkadotjs/#querying-on-chain-data", "page_title": "Polkadot-JS Guides", "index": 2, "depth": 3, "title": "Querying On-chain Data", "anchor": "querying-on-chain-data", "start_char": 3175, "end_char": 3701, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0600ae9a5e85418adfe842c72ca5d33f6a6ec02598cc5101cbd0f60e7807d7ed", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Querying On-chain Data\n\nLet's see how we can query on-chain data with Polkadot Developer Interface on the Polkadot network with an\nexample. To find out the current value for existential deposit, navigate to Developer > Chain\nstate > Constants and query the balances pallet for existential deposit as shown in the snapshot\nbelow. You need to click on the plus button to execute the query. The value displayed is in\n[plancks](../learn/learn-DOT.md#the-planck-unit)\n\n![query chain state](../assets/chain-state-constant.png)"}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs", "url": "https://developer.polkadot.com/wiki/general/polkadotjs/#polkadot-developer-signer", "page_title": "Polkadot-JS Guides", "index": 3, "depth": 2, "title": "Polkadot Developer Signer", "anchor": "polkadot-developer-signer", "start_char": 3701, "end_char": 5406, "estimated_token_count": 387, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0600ae9a5e85418adfe842c72ca5d33f6a6ec02598cc5101cbd0f60e7807d7ed", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Developer Signer\n\nThe [**Polkadot Developer Signer**](https://polkadot.js.org/extension/) is not a wallet _per se_\nbut an account management tool. It allows you to create accounts and also import accounts from\n[**Ledger**](./ledger.md) devices or Parity Signer, allowing the signing of\n[**extrinsics**](../learn/learn-transactions.md) using these accounts. It also allows you export\nexisting accounts and restore accounts (given you have the required information to restore them).\n\nThe extension is a robust key storage tool, i.e. even if you clear the cache of your browser your\naccounts will be retained. The extension will recognize any websites that have been flagged for\nmalicious activity. For additional security, the extension will always ask if you want a specific\nwebsite to access the account information on it.\n\nThe extension does not let users interact directly with on-chain functions as one would find on a\nwallet app like Metamask, i.e. it does not allow you to transact or do anything else other than\nadding and managing accounts. However, it provides a simple interface for interacting with\nextension-compliant dApps such as the [**Polkadot Developer Interface**](https://polkadot.js.org/apps/#/explorer)\nand the [**Polkadot Staking Dashboard**](https://staking.polkadot.cloud/#/overview).\n\n!!!info Metadata Updates\n    The browser extension is a tool that interacts with the Polkadot network, but it is disconnected from it when it is not in use. It is important you [**always check for metadata updates**](../learn/learn-guides-accounts.md#polkadot-developer-signer) before using the extension or other account management tools such as Parity Signer (aka Polkadot Vault)."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs", "url": "https://developer.polkadot.com/wiki/general/polkadotjs/#polkadot-js-phishing-list", "page_title": "Polkadot-JS Guides", "index": 4, "depth": 2, "title": "Polkadot-JS Phishing List", "anchor": "polkadot-js-phishing-list", "start_char": 5406, "end_char": 5752, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0600ae9a5e85418adfe842c72ca5d33f6a6ec02598cc5101cbd0f60e7807d7ed", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot-JS Phishing List\n\nThe [**Polkadot-JS phishing list**](https://polkadot.js.org/phishing/) website is a community-driven\ncuration of malicious actors and operators. The Polkadot Developer Signer uses this list to warn a user\nabout suspicious URLs and addresses that are part of the list, and automatically blocks the account\naddress."}
{"source": "polkadot-docs", "page_id": "wiki-general-polkadotjs", "url": "https://developer.polkadot.com/wiki/general/polkadotjs/#how-to-guides", "page_title": "Polkadot-JS Guides", "index": 5, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 5752, "end_char": 5867, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0600ae9a5e85418adfe842c72ca5d33f6a6ec02598cc5101cbd0f60e7807d7ed", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [Where to Download the Polkadot Developer Signer](../learn/how-to/signer-where-to-download.md)"}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#disclaimer-key-security", "page_title": "Protect Yourself from Scams", "index": 0, "depth": 2, "title": "DISCLAIMER: Key Security", "anchor": "disclaimer-key-security", "start_char": 329, "end_char": 1160, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## DISCLAIMER: Key Security\n\nOne of the most attractive targets for malicious actors are your wallet secret seeds or the\noptionally exported backup JSON file. Keep them offline in a secure and private location. If you\nshare these with anyone, they can access your account and execute any transaction.\n\n<div class=\"row\" style=\"display: flex; gap: 20px; justify-content: center;\">\n  \n  <a \n    href=\"https://www.youtube.com/watch?v=ARsdXZycJA\" \n    class=\"card-container\" \n    data-aos=\"fade-up\" \n    data-aos-delay=\"100\" \n    style=\"width: 300px; height: 300px;\"\n  >\n    <img src=\"https://img.youtube.com/vi/ARsdXZycJAg/0.jpg\" class=\"card-image\"/>\n    <p class=\"card-title\">Stay Safe in Polkadot</p>\n  </a>\n</div>\n\n!!!info\n    Visit [this article](../learn/how-to/store-mnemonic-safely.md) for more information about key security."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#essential-rules", "page_title": "Protect Yourself from Scams", "index": 1, "depth": 2, "title": "Essential Rules", "anchor": "essential-rules", "start_char": 1160, "end_char": 2624, "estimated_token_count": 342, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Essential Rules\n\n1. Never ever share your seed phrase or backup JSON file with anyone. If you do that, you hand over\n   all your funds, so don’t do it!\n2. Be careful with extensions/applications and typing in recovery seeds or importing backup JSON\n   files in there, they could be malicious or pretend to be a well-known wallet.\n3. Do not trust anyone online. Malicious actors often pretend to be someone else to gain your trust.\n4. [If you are scammed](#i-got-scammed-what-can-i-do), there is likely **nothing that can be\n   done** to recover your funds. If a scammer gets a hold of your seed phrase, they can transfer all\n   your funds to their account in seconds.\n5. If it sounds too good to be true, it probably is. People, especially celebrities, do not give\n   away crypto for free. Even if they wanted to, they could just ask for your address as opposed to\n   having you send them tokens.\n6. Scams are absolutely rife in this space. It is easy and cheap to set a scam up, and hard to shut\n   one down. Therefore, the user must be diligent to avoid such scams.\n7. If you can, always try to verify new information that you see through an official source, such as\n   [Polkadot network's official blog](../general/community.md) or\n   [Polkadot's Official Support](../../get-support.md). Often, scammers will fake a\n   websites or blog posts, but if you validate such information through a secondary source, you will\n   reduce the chances of being scammed."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#some-common-types-of-scams", "page_title": "Protect Yourself from Scams", "index": 2, "depth": 3, "title": "Some Common Types of Scams", "anchor": "some-common-types-of-scams", "start_char": 2624, "end_char": 4393, "estimated_token_count": 373, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Some Common Types of Scams\n\n- Private messages sent to you over Telegram, X/Twitter, Discord, and other social media - admins or\n  employees will never contact you.\n- \"Giveaways\" advertising that you \"send us some DOT/KSM, we'll send you double back\".\n- Sites where you must enter your seed phrase to \"sync\" your account, claim tokens, unblock\n  transactions, etc.\n- Emails asking for DOT/KSM private keys/seeds/etc., posing as a member of any of our teams.\n- Scammers will take official videos and add \"giveaway\" text around them to look like Polkadot,\n  Kusama, Web3 Foundation, Parity, or another well-known entity supporting the giveaway.\n- Many scammers will create nearly perfect imitations of sites - always triple-check the URL.\n- People are offering to help you stake or get rewards.\n- People responding to publicly asked questions in a private chat.\n- Advertisements pointing to imitations of sites asking you to enter your seed words.\n\nThese are just some of the types of scams. Scammers are inventing new ones all the time. In general,\ndo not trust anyone messaging you that you did not message yourself, and be wary of anyone\nattempting to help you or offer you a \"deal\".\n\nScammers will often imitate the usernames, profile pictures, etc., of well-known members of the\ncommunity. Often the differences in these accounts will be minor, such as `joe_sm1th` or `jo_smith`\ninstead of `joe_smith`. Sometimes, the display name will be identical if uniqueness is not enforced;\ncheck over a 2nd (ideally verifiable) communication channel to be sure you are talking to the right\nperson.\n\nScammers often make it seem like the \"deal\" is only available for a limited time. Do not be tricked\nby this, it is always better to confirm than to risk losing everything."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#admins-will-never-contact-you-directly", "page_title": "Protect Yourself from Scams", "index": 3, "depth": 3, "title": "Admins will never contact you directly", "anchor": "admins-will-never-contact-you-directly", "start_char": 4393, "end_char": 4864, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Admins will never contact you directly\n\nIf you received a message from an admin over Telegram, ignore it. Our team members will never\npersonally message you. Our social media accounts are posted on our website, and our team will\nannounce any new ones. We will never offer to sell you DOT at a discount, air-drop \"rewards\", or\nmessage you privately to help with a problem you posted publicly. Our social media and community\npages can be found [here](./community.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#keep-your-data-secure", "page_title": "Protect Yourself from Scams", "index": 4, "depth": 3, "title": "Keep your data secure", "anchor": "keep-your-data-secure", "start_char": 4864, "end_char": 6331, "estimated_token_count": 315, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Keep your data secure\n\nYou should _never_ share your seed phrase, passwords, private keys, or any other personal data with\nanyone. If you are concerned a wallet could be fake, please check out our list of well-known\n[wallets](https://polkadot.com/ecosystem).\n\nSome simple things that you can do to keep your assets and information secure from hackers:\n\n- Keep your seed phrase only on paper, in a secret and secure location.\n- DO NOT keep your seed phrase on any electronic medium connected to the internet, e.g., cloud\n  services, password managers, your daily computer, etc.\n- Never enter your seed or mnemonic phrase directly into a website.\n- Your seed phrase is a backup in case you lose access to your wallet. Use it only for that purpose\n  and only in wallets you've used before and trust.\n- Your passwords should be strong and unique. It is recommended that you use a password manager app to create and store your passwords. Use fido2 (hardware dongles) for best security, not google\n  authenticator/OTP.\n- Keep your computer free of malware. Although an antivirus can be of great help, it's not a\n  panacea. Safe browsing and downloading is the only way to be sure your computer is clean. Beware\n  of unvetted (not security-scanned) software, such as extensions, 3rd party software, and\n  registries/repositories that come in many forms and shapes.\n- Store your assets in cold storage, like a hardware wallet or\n  [Polkadot Vault](./polkadot-vault.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#always-check-the-source", "page_title": "Protect Yourself from Scams", "index": 5, "depth": 3, "title": "Always check the source", "anchor": "always-check-the-source", "start_char": 6331, "end_char": 6698, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Always check the source\n\nFor any potential scam, always do a background check on the source, i.e., look at any username,\nemail, YouTube channel name, URL, etc. If something seems fishy, that's because it likely is. Never\nenter any personal data if you feel the source could be a scam. Feel free to check with\n[Polkadot's official support](../../get-support.md)."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#check-twice-before-sending-dotksm", "page_title": "Protect Yourself from Scams", "index": 6, "depth": 3, "title": "Check twice before sending DOT/KSM", "anchor": "check-twice-before-sending-dotksm", "start_char": 6698, "end_char": 6975, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Check twice before sending DOT/KSM\n\nA good practice to consider is to verify the address to which you are sending crypto. You shouldn't\nbe sending your assets to an account you do not know or are not familiar with. Crypto is a\ndecentralized space with no room for errors."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#install-the-polkadot-developer-signer", "page_title": "Protect Yourself from Scams", "index": 7, "depth": 3, "title": "Install the Polkadot Developer Signer", "anchor": "install-the-polkadot-developer-signer", "start_char": 6975, "end_char": 7307, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Install the Polkadot Developer Signer\n\nThe extension uses crowd-sourced [anti-phishing measures](https://polkadot.js.org/phishing/) to\nautomatically prevent your browser from displaying known phishing or scam sites. They will be\nblocked upon loading, helping to prevent you from visiting these sites and thus falling for them."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#our-official-sites", "page_title": "Protect Yourself from Scams", "index": 8, "depth": 3, "title": "Our official sites", "anchor": "our-official-sites", "start_char": 7307, "end_char": 7904, "estimated_token_count": 154, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Our official sites\n\nYou can use the following list of our official domains to make sure that you're visiting an official\nsite:\n\n- https://polkadot.com\n- https://polkadot.io\n- https://kusama.network\n- https://web3.foundation\n- https://parity.io\n- https://docs.polkadot.com/\n\nOf course, many projects building on Polkadot and Kusama use similar names. If, however, a site\nposes as Polkadot, Kusama, Web3 Foundation, or Parity on a domain not listed above, then it's most\nlikely a scam.\n\nBesides those, there are also `polkadot.js.org` and `dotapps.io` that host our web wallet and other\ntools."}
{"source": "polkadot-docs", "page_id": "wiki-general-scams", "url": "https://developer.polkadot.com/wiki/general/scams/#i-got-scammed-what-can-i-do", "page_title": "Protect Yourself from Scams", "index": 9, "depth": 2, "title": "I Got Scammed - What Can I Do?", "anchor": "i-got-scammed-what-can-i-do", "start_char": 7904, "end_char": 8245, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2740f0e7f55d5d4fcae2d619df21a616e00b12acc81118a8600a54ad1b985b19", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## I Got Scammed - What Can I Do?\n\nIn the unfortunate case of having fallen for a scam, nothing can likely be done to recover your\nfunds. However, you can still take steps to **prevent further loss**, such as moving any remaining\nassets to a new, secure account. You can also reach out to the [Polkadot community](community.md)\nfor guidance."}
{"source": "polkadot-docs", "page_id": "wiki-general-staking-apps", "url": "https://developer.polkadot.com/wiki/general/staking-apps/#polkadot-staking-dashboard", "page_title": "Polkadot Staking Apps", "index": 0, "depth": 2, "title": "Polkadot Staking Dashboard", "anchor": "polkadot-staking-dashboard", "start_char": 639, "end_char": 2804, "estimated_token_count": 577, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91d49d6335f0e4308d0fa6d1399b209c5ee8d9802126d35249fcace24fe3e836", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot Staking Dashboard\n\n[Polkadot Staking Dashboard](https://staking.polkadot.cloud/) is a Web3 application for native, non-custodial [staking](../learn/learn-staking.md) on Polkadot Hub.\n\n=== \"Simple Mode\"\n\n    ![](../assets/staking-apps/staking-dashboard-simple.webp)\n\n=== \"Advanced Mode\"\n\n    ![](../assets/staking-apps/staking-dashboard-advanced.webp)\n\n The [Polkadot Staking Dashboard](https://staking.polkadot.cloud/) enables users to stake either as a solo nominator or as a [nomination pool](../learn/learn-nomination-pools.md) member, and also supports creating and managing nomination pools. The dashboard offers a Simple mode for new stakers and an Advanced mode for experienced stakers. It works with the most popular browser extension and hardware wallets, and supports [staking proxies](../learn/learn-staking.md#stash-account-and-staking-proxy).\n\nSupport is available via Discord and email accessible within the app. You can also find more information on the dedicated [wiki page](./dashboards/staking-dashboard.md) and\n[articles](../learn/learn-nomination-pools.md).\n\nBelow is a simple list of video tutorials about the Polkadot Staking Dashboard:\n\n- <span class=\"youtube-icon\">YouTube</span> [Stake Your DOT: How to Nominate Validators](https://youtu.be/F59N3YKYCRs?feature=shared)\n- <span class=\"youtube-icon\">YouTube</span> [Stake Your DOT: Join a Nomination Pool](https://youtu.be/dDIG7QAApig?feature=shared)\n- <span class=\"youtube-icon\">YouTube</span> [Staking Dashboard Walkthrough](https://youtu.be/hvXLc4H7rA4?feature=shared)\n- <span class=\"youtube-icon\">YouTube</span> [Everything You Can Do After Staking](https://youtu.be/58pIe8tt2o4?feature=shared)\n- <span class=\"youtube-icon\">YouTube</span> [Create, Manage & Destroy Pools](https://youtu.be/aTFWhwy_Mxg?feature=shared)\n\n#### Staking Companion App\n\nBring the Polkadot Staking Dashboard to your pocket with the [Staking Companion](https://polkadot.cloud/app) app for iOS and Android. Monitor your Polkadot assets, rewards, and nominations from one clean mobile interface. No keys on device, just read-only peace of mind on the go.\n\n![](../assets/staking-apps/companion-app.webp)"}
{"source": "polkadot-docs", "page_id": "wiki-general-staking-apps", "url": "https://developer.polkadot.com/wiki/general/staking-apps/#papi-staking-dashboard", "page_title": "Polkadot Staking Apps", "index": 1, "depth": 2, "title": "PAPI Staking Dashboard", "anchor": "papi-staking-dashboard", "start_char": 2804, "end_char": 3690, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91d49d6335f0e4308d0fa6d1399b209c5ee8d9802126d35249fcace24fe3e836", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## PAPI Staking Dashboard\n\nThe [PAPI Staking Dashboard](https://staking.usepapi.app/polkadot/dashboard) is a fully decentralized, trustless web application for native non-custodial [staking](../learn/learn-staking.md). It operates exclusively via Polkadot light clients with no reliance on centralized RPC endpoints or third-party indexers.\n\nKey features include:\n\n- **Light client support**: All data originates from direct peer connections, with a visible \"trustless\" status indicator confirming the decentralized connection.\n- **Full staking functionality**: Supports real-time interaction, validator filtering, nomination rebalancing, bonding/unbonding, and reward claiming.\n- **Solo nomination and pools**: Manage your staking operations as a solo nominator or participate in [nomination pools](../learn/learn-nomination-pools.md).\n\n![](../assets/staking-apps/papi-dashboard.png)"}
{"source": "polkadot-docs", "page_id": "wiki-general-staking-apps", "url": "https://developer.polkadot.com/wiki/general/staking-apps/#nomi", "page_title": "Polkadot Staking Apps", "index": 2, "depth": 2, "title": "NOMI", "anchor": "nomi", "start_char": 3690, "end_char": 4408, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91d49d6335f0e4308d0fa6d1399b209c5ee8d9802126d35249fcace24fe3e836", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## NOMI\n\n[NOMI](https://apps.turboflakes.io/?app=nomi) is designed to actively involve nominators in native\nstaking on the relay chain. It aims to offer a unique and enhanced nomination experience, using\n[Multiple-Criteria Decision Analysis](https://en.wikipedia.org/wiki/Multiple-criteria_decision_analysis)\n(MCDA) as a base for the analytical research. MCDA is an open and transparent approach for\nevaluating numerous conflicting traits in the decision-making process. For the analysis, validator\ndata is collected at the last block of every session.\n\n[![](https://github.com/turboflakes/apps/blob/main/src/assets/nomi_dashboard.webp?raw=true)](https://turboflakes.io/)\n\nsource: https://github.com/turboflakes/apps"}
{"source": "polkadot-docs", "page_id": "wiki-general-staking-apps", "url": "https://developer.polkadot.com/wiki/general/staking-apps/#subwallet-earning", "page_title": "Polkadot Staking Apps", "index": 3, "depth": 2, "title": "SubWallet Earning", "anchor": "subwallet-earning", "start_char": 4408, "end_char": 4876, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:91d49d6335f0e4308d0fa6d1399b209c5ee8d9802126d35249fcace24fe3e836", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## SubWallet Earning\n\n[SubWallet Web Dashboard](https://web.subwallet.app/) is the all-in-one solution to manage assets\nand stake on multiple networks in the Polkadot, Kusama and Polkadot SDK (Substrate) ecosystems.\n\nThe Web Dashboard features an Earning tab which allows users to stake DOT easily via native\nnomination pools, as well as in liquid staking and lending protocols, without having to manage\nmultiple applications with different interfaces and experiences."}
{"source": "polkadot-docs", "page_id": "wiki-general-transaction-attacks", "url": "https://developer.polkadot.com/wiki/general/transaction-attacks/#clipboard-memory", "page_title": "Why Verify Transactions?", "index": 0, "depth": 3, "title": "Clipboard Memory", "anchor": "clipboard-memory", "start_char": 155, "end_char": 897, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cd0c023d18e60abb982be7563d50126881c5e7cc7f8151c843e666b8552e5d4d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Clipboard Memory\n\n!!!info\n    For a more detailed read about clipboard memory attacks see [this article](https://www.kaspersky.com/blog/cryptoshuffler-bitcoin-stealer/19976/).\n\nThis is a common attack. The clipboard memory is that memory on your computer dedicated to\ncopy-paste operations. There is malicious software that can be remotely installed on your computer\nand that can detect when a cryptocurrency address is copied. For example, you want to send funds to\nAddress A (belonging to you) but after copying address A a malicious software swaps that address\nwith Address B (belonging to an attacker). This attack can be prevented by checking the receiver\naddress before signing. Failing to do so could result in loss of the funds."}
{"source": "polkadot-docs", "page_id": "wiki-general-transaction-attacks", "url": "https://developer.polkadot.com/wiki/general/transaction-attacks/#malicious-websitedapp", "page_title": "Why Verify Transactions?", "index": 1, "depth": 3, "title": "Malicious Website/dApp", "anchor": "malicious-websitedapp", "start_char": 897, "end_char": 1318, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cd0c023d18e60abb982be7563d50126881c5e7cc7f8151c843e666b8552e5d4d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Malicious Website/dApp\n\nThis is a common attack that can happen if you are interacting with a malicious site (dApp). In this\nscenario you want to perform Transaction A on the website, but the dApp will send Transaction B to\nthe extension for signing. In this case the extension will show Transaction B. If you are using a\nLedger device you have a second layer of verification, as it will also display Transaction B."}
{"source": "polkadot-docs", "page_id": "wiki-general-transaction-attacks", "url": "https://developer.polkadot.com/wiki/general/transaction-attacks/#malicious-browser-extension", "page_title": "Why Verify Transactions?", "index": 2, "depth": 3, "title": "Malicious Browser Extension", "anchor": "malicious-browser-extension", "start_char": 1318, "end_char": 1794, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cd0c023d18e60abb982be7563d50126881c5e7cc7f8151c843e666b8552e5d4d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Malicious Browser Extension\n\nThis scenario can happen if you have downloaded a malicious browser extension or a trusted browser\nextension, from a non-trusted source. In this scenario the extension will display that you will sign\nfor an Transaction A but in the background will execute Transaction B. If you are using a\n[Ledger](https://www.ledger.com/) device this attack can be detected because you will be able to see\nTransaction B on the screen of your Ledger device."}
{"source": "polkadot-docs", "page_id": "wiki-general-transaction-attacks", "url": "https://developer.polkadot.com/wiki/general/transaction-attacks/#corrupted-metadata", "page_title": "Why Verify Transactions?", "index": 3, "depth": 3, "title": "Corrupted metadata", "anchor": "corrupted-metadata", "start_char": 1794, "end_char": 2317, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cd0c023d18e60abb982be7563d50126881c5e7cc7f8151c843e666b8552e5d4d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Corrupted metadata\n\nThis attack is least common and might result in signing a non-intended transaction without the\npossibility of verifying it. Before authorizing the metadata update check who is requesting it.\nMetadata updates for browser extensions might be requested by dApps (for example DeFi apps of\nparachains). For the extensions, you should trust the app that requests the update. When updating\nthe metadata for Parity Signer you should trust the issuer of the metadata (or generate the QR\nfountain yourself)."}
{"source": "polkadot-docs", "page_id": "wiki-general-transaction-attacks", "url": "https://developer.polkadot.com/wiki/general/transaction-attacks/#corrupted-qr-code-parity-signer", "page_title": "Why Verify Transactions?", "index": 4, "depth": 3, "title": "Corrupted QR-code (Parity Signer)", "anchor": "corrupted-qr-code-parity-signer", "start_char": 2317, "end_char": 2977, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cd0c023d18e60abb982be7563d50126881c5e7cc7f8151c843e666b8552e5d4d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Corrupted QR-code (Parity Signer)\n\nThis is a sub-case of the malicious dApp scenario. If your account is on\n[Parity Signer](https://www.parity.io/technologies/signer/) the transaction will be displayed as a\nQR code, instead of the extension showing its details and you need to verify it on the device. The\ncorrupted QR code will make you sign for an Transaction B when you want to sign for Transaction A.\nThis will be showed in the Signer app and a careful user will notice it. If the metadata in the\nSigner is already incorrect (or the Signer is corrupted) there is the risk of signing a non-intended\ntransaction without the possibility of verifying it."}
{"source": "polkadot-docs", "page_id": "wiki-general-transaction-attacks", "url": "https://developer.polkadot.com/wiki/general/transaction-attacks/#replay-attack", "page_title": "Why Verify Transactions?", "index": 5, "depth": 3, "title": "Replay Attack", "anchor": "replay-attack", "start_char": 2977, "end_char": 4372, "estimated_token_count": 296, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cd0c023d18e60abb982be7563d50126881c5e7cc7f8151c843e666b8552e5d4d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Replay Attack\n\nA replay attack is where past transactions can be replayed (same [balance](../learn/learn-transactions.md#balance-transfers),\nreceiver account, etc.) without knowing private keys. It is an attack where publicly known data can\nbe \"replayed\" as a new extrinsic. This could happen in the context of\n[reaping accounts](../learn/learn-accounts.md#existential-deposit-and-reaping) because the reaping\nprocess resets the nonce value. If all signed transactions until the nonce before the reaping event\nwere immortal, all past transactions can be replayed once the account is refunded. There is no need\nfor the attacker to know your private key, valid signatures for those past transactions and nonces\nalready exist and are stored on-chain (meaning the private key was already used to generate those\nsignatures).\n\nMaking a [transaction mortal](../learn/learn-transactions.md#mortal-and-immortal-extrinsics) with a\nrelatively short mortality window will almost certainly ensure that replay attacks are not possible,\nwith the only exception being if the account is reaped and then re-funded shortly after submitting a\nmortal transaction, and then an attacker replays that transaction within the mortality window (i.e.,\nthe specified block interval) and such transaction is valid (e.g. if you only have 10 DOT, and you\ntry to issue an extrinsic sending 20 DOT, the transfer will fail)."}
{"source": "polkadot-docs", "page_id": "wiki-general-transaction-attacks", "url": "https://developer.polkadot.com/wiki/general/transaction-attacks/#defense-against-attacks", "page_title": "Why Verify Transactions?", "index": 6, "depth": 2, "title": "Defense against Attacks", "anchor": "defense-against-attacks", "start_char": 4372, "end_char": 4933, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cd0c023d18e60abb982be7563d50126881c5e7cc7f8151c843e666b8552e5d4d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Defense against Attacks\n\n!!!warning\n    If you can't verify the transaction or you suspect you are signing something different than what you intended, don't sign it!\n\nTo avoid being victim of an attack:\n\n- Use only trusted extensions, sites and software in general.\n- Use cold storage options (Ledger, Signer) and verify them. Trust what these devices tell you over\n  what is shown in the app or the browser extension.\n- Update Signer metadata only from trusted sources (or do it yourself).\n- Accept metadata updates for the extension only from trusted apps."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#data-ownership", "page_title": "Web3 and Polkadot", "index": 0, "depth": 2, "title": "Data Ownership", "anchor": "data-ownership", "start_char": 1403, "end_char": 3527, "estimated_token_count": 447, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Data Ownership\n\nIn web3, ownership is achieved and validated through cryptography. Each user has a digital identity\nbound to a set of cryptographic keys usually based on the public key cryptographic scheme, i.e., the\nfamous **public and private key pair**.\n\nUnlike Web2 which is driven by email IDs, phone numbers, and passwords, users onboarding to Web3\njust need to generate a key pair. The public key can be the identity that can be shared with anybody\nto send you messages or assets, while the private key is used to access your account, sign messages,\ntransfer funds, edit identity details, etc. [Keeping your private key secure](./scams.md) is\nessential to avoid identity theft or consequent loss of funds. Scams are one of the main\nfactors hindering web3 adoption. No legitimate person or entity will ever ask you to share your\nprivate key, and those who attempt to do so are likely trying to steal your digital identity and\nanything you own related to it.\n\nTo mitigate risks of key mismanagement (for **non-custodial** accounts, i.e. when you have custody\nof your keys) there are [account abstraction](../learn/learn-account-abstraction.md) solutions that\nseparate the key management from the user experience. To mitigate key hacks, there are cold wallet\nsolutions where the private key is generated and stored on dedicated devices with secure elements\nthat are not exposed to the internet (see [Ledger](./ledger.md)), or dedicated applications that can\nbe installed on air-gapped devices such as phones (see [Polkadot Vault](./polkadot-vault.md)). For\n**custodial** accounts, you trust third parties to manage your keys and give you access whenever\nneeded.\n\nTo summarize, data ownership comes from the fact that any message you sign with your private key\ncomes from your digital identity, and the signature proof can be cryptographically verified. Unless\nsomeone else stole your keys, you and only you are held accountable for signing the messages and are\nresponsible for the information on your account. Transferring an [NFT](../learn/learn-nft.md) between\ntwo accounts is essentially a transfer of ownership."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#trustless-environment", "page_title": "Web3 and Polkadot", "index": 1, "depth": 2, "title": "Trustless Environment", "anchor": "trustless-environment", "start_char": 3527, "end_char": 3994, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Trustless Environment\n\nCryptography also brings the possibility of building a trustless environment where we do not have to\ntrust third parties, or have any relationship between the sender and receiver of a message. We do\nnot need to trust centralized entities since we can verify who wrote the message and who owns what\njust by using cryptography. Trust is embedded in the code. Well-audited and reviewed code ultimately\nprovides a solid, trustless environment."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#data-immutability", "page_title": "Web3 and Polkadot", "index": 2, "depth": 2, "title": "Data Immutability", "anchor": "data-immutability", "start_char": 3994, "end_char": 5184, "estimated_token_count": 241, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Data Immutability\n\nBut what if the data we own can be easily modified or tampered with after they have been signed and\nstored?\n\nHere is where **blockchain** technology plays an important role. Blockchain networks comprise of\ndistributed state machines where increments of data are stored within blocks that build on each\nother using hash functions. For example, the hash of block `N + 1` contains data of that block\ntogether with the hash of the previous block `N`. This creates the situation where if you modify the\ncontent of block `N` you will change the hash of block `N + 1`, `N + 2`, etc. essentially breaking\nthe chain. If a blockchain network is not sufficiently decentralized, it can be possible to add an\ninvalid block (a block with invalid transactions) or to censor certain transactions. In\ndecentralized proof-of-stake blockchains like Polkadot however, such attacks are financially\nexpensive and attempting them can get you [slashed](../learn/learn-offenses.md).\n\nSo, with blockchain as a means of storing data and transactions permanently without an option to\nmodify them, we can ensure what we cryptographically sign with our digital identity is set in stone\ndigitally."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#data-retrievability", "page_title": "Web3 and Polkadot", "index": 3, "depth": 2, "title": "Data Retrievability", "anchor": "data-retrievability", "start_char": 5184, "end_char": 6745, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Data Retrievability\n\nBut what if our data are stored in a blockchain, but that blockchain is run on a centralized server\nor by different computers belonging to the same operator?\n\nThat server or those computers can be easily shut down, the blockchain can be stopped from running\nand its data wiped out. This can be achieved from the inside by the malicious network participants\nor from the outside by regulatory rules and other forces. Though blockchain offers immutability,\nthere would be little sense in using a centralized blockchain to prove ownership as it can possibly\ncease to exist in the future.\n\nData retrievability is dependent on how resilient the blockchain is. Resiliency is achieved through\nelements such as decentralization, economic incentives, and on-chain governance to ensure the\nnetwork can sustain on its own.\n\n!!!info \"Data Retrievability vs. Data Availability\"\n    Data **retrievability** is the ability of nodes to retrieve historical information from the blockchain. Historical data is not needed to verify new blocks; it is only required for syncing full nodes from the Genesis block or serving specific historical requests.\n    \n    Data **availability** assures full nodes can access and verify the full transactions associated with\n    a specific block. It does not necessarily imply that the data is accessible forever. For more\n    information about data availability on Polkadot, see the\n    [dedicated section on the parachain protocol page](../learn/learn-parachains-protocol.md#availability-and-validity-anv-protocol)."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#decentralization", "page_title": "Web3 and Polkadot", "index": 4, "depth": 3, "title": "Decentralization", "anchor": "decentralization", "start_char": 6745, "end_char": 8340, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Decentralization\n\nHaving multiple nodes belonging to numerous independent identities increases network resiliency and\nthus data retrievability.\n\nBlockchain is a state machine, and consensus must be achieved on every single state transition by\nevery node on the blockchain network. In Proof of Work (PoW) based blockchains, which let any node\nin the network produce a block, consensus is achieved probabilistically by building on the longest\nchain (at the cost of energy-intensive computations). Proof of Stake (PoS) based blockchains like\nPolkadot enable deterministic consensus by allowing only a limited number of privileged nodes to\nproduce blocks. A PoW blockchain can be considered centralized if a single entity can capture 51% of\nnetwork nodes. Similarly, a PoS blockchain can be considered centralized if a single entity controls\nmore than one-third of nodes, as a two-thirds majority is required to arrive at a deterministic\nconsensus. Different blockchains have different levels of decentralization.\n\nNowadays, most of the nodes cannot be run on consumer-grade hardware. Node running equipment is\ntypically rented through service providers. Resiliency is also achieved by ensuring nodes run on as\nmany different providers as possible and avoiding a significant share of the nodes being run under\nthe same provider in the same geographic region. A legislation change or a natural disaster could\nimpact a considerable fraction of the nodes and potentially stop the network. Polkadot's level of\ndecentralization can be explored through the [Polkawatch app](https://polkawatch.app/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#decentralized-storage", "page_title": "Web3 and Polkadot", "index": 5, "depth": 3, "title": "Decentralized Storage", "anchor": "decentralized-storage", "start_char": 8340, "end_char": 8938, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Decentralized Storage\n\n[Blockspace](./glossary.md#blockspace) is limited and valuable. Not all data we have can be stored on\nthe blockchain. Large files like pictures, music, movies, etc., typically will never be held on the\nblockchain. But where can we stored those files? To stick to the web3 vision, we need a resilient\nand decentralized storage solution.\n\nThe most important thing is that the proof of ownership is stored on the blockchain through the\nhashes of data and metadata. The files are uploaded on decentralized storage networks hosting\nprotocols like [IPFS](https://ipfs.tech/)."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#stake-allocation", "page_title": "Web3 and Polkadot", "index": 6, "depth": 3, "title": "Stake Allocation", "anchor": "stake-allocation", "start_char": 8938, "end_char": 9424, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Stake Allocation\n\nIn Proof-of-Stake blockchains, security is dictated by how much stake is locked on-chain (financial\nsecurity). In a decentralized network, you want to ensure that the difficulty level for a financial\nattack to happen is equally difficult across all nodes. Polkadot's\n[election algorithm](../learn/learn-phragmen.md) makes sure that the stake is maximized across all\nactive validators, and the variance in stake across validators is minimized as much as possible."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#economic-incentives", "page_title": "Web3 and Polkadot", "index": 7, "depth": 3, "title": "Economic Incentives", "anchor": "economic-incentives", "start_char": 9424, "end_char": 10139, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Economic Incentives\n\nStrong incentives are essential to incentivize network participants to run nodes and secure the\nnetwork. Strong incentives are possible because blockchain is a trustless system where there are no\nintermediaries between who sends a message and who receives it. Such incentives, coupled with\npunishment for bad behavior, ensure that most of the participants make the interest of the network\nand work together to improve it.\n\nBut from where are those incentives coming from? Polkadot's native token\n[DOT is inflationary](../learn/learn-DOT.md#dot-inflation). Inflation is used to pay validators for running\nnodes and reward nominators for providing the necessary stake to secure the network."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#governance-and-treasury", "page_title": "Web3 and Polkadot", "index": 8, "depth": 3, "title": "Governance and Treasury", "anchor": "governance-and-treasury", "start_char": 10139, "end_char": 10598, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Governance and Treasury\n\nIn Polkadot, an on-chain [treasury](../learn/learn-polkadot-opengov-treasury.md) together with an\n[open governance](../learn/learn-polkadot-opengov.md) model allow to access funds in a fully\ndecentralized manner without any bank transaction whatsoever. This opens up the possibility to come\nto a decision through on-chain voting mechanism, promoting a sense of community and creating an\nindependent socio-economical environment."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#decentralized-access-points", "page_title": "Web3 and Polkadot", "index": 9, "depth": 2, "title": "Decentralized Access Points", "anchor": "decentralized-access-points", "start_char": 10598, "end_char": 12302, "estimated_token_count": 359, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Decentralized Access Points\n\nBut what if we have data we own stored on a resilient blockchain, but the only way to access the\nblockchain is through an RPC server? Whoever is behind the server or an attacker could present us\ndata that is not the truth. How can we trustlessly verify that the data is true?\n\nHere is where light clients play a key role. Light clients are clients that can sit on a web browser\nand can fetch data directly from blockchain. The figure below shows the architectural difference\nbetween web2 and web3 applications.\n\n![light-clients](../assets/light-clients.png)\n\nIn web2 applications, data are stored on a centralized server, while in web3 applications, data (or\nbetter data proofs) are stored on the blockchain. With light clients, it is possible to access\nblockchain data through a full node and verify the validity of such data. They efficiently\nsynchronize (_warp sync_ in case of Polkadot) with a full node to obtain (Merkle Root) commitment of\nthe latest chain state, and hence can trustlessly verify any response by full node against the\ncommitment. In this way, we can always verify that the data we see is the truth, which is done\nautomatically by the light client. Polkadot has a browser-embedded light client\n[Substrate connect](https://chromewebstore.google.com/detail/substrate-connect-extensi/khccbhhbocaaklceanjginbdheafklai) that uses the\n[smoldot](https://github.com/smol-dot/smoldot) codebase. Most web3 applications today access\nblockchain data through a centralized RPC server.\n\nFor more details about the inner workings of Smoldot, see\n[this blog post](https://hackmd.io/@s_iGZLIITG6WjSgnFX0pcg/rkmmcvBno) and\n[this video](https://youtu.be/YjsLpfM6a7E)."}
{"source": "polkadot-docs", "page_id": "wiki-general-web3-and-polkadot", "url": "https://developer.polkadot.com/wiki/general/web3-and-polkadot/#interoperability", "page_title": "Web3 and Polkadot", "index": 10, "depth": 2, "title": "Interoperability", "anchor": "interoperability", "start_char": 12302, "end_char": 13927, "estimated_token_count": 295, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:efce4a93f9c2c75aaf974be66b6428af9144f683ec6d3df01dfd49fe86b48000", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interoperability\n\nThe Web3 landscape's expansion into a multi-layered ecosystem highlights the need for\ninteroperability. Blockchains compete and differentiate themselves based on decentralization,\nthroughput, and specific use case focus. Some aim for a single high-performance base-layer\nblockchain, while others focus on decentralization through layer-2 networks. With such diverse\napproaches, it's crucial for distinct on-chain environments to interoperate, especially for\ndevelopers building cross-chain applications and traditional systems interacting with multiple\nblockchains.\n\nVarious cross-chain interactions are employed to achieve interoperability, including token swaps,\ntoken bridges, native payments, contract calls, and programmable token bridges. Each mechanism\nserves specific functions, such as facilitating the exchange of tokens between different blockchains\nor enabling smart contract interactions across chains. Other interoperability solutions validate the\nstate of a source blockchain and relay transactions to the destination blockchain, which is\nessential for completing cross-chain interactions.\n\nInteroperability between chains having different consensus has been a challenging task. Most of\nhacks have exploited vulnerabilities in interoperability protocols. Polkadot provides secure\ninteroperability through [XCM](../learn/learn-xcm.md) and [XCMP](../learn/learn-xcm-transport.md) to\nall blockchains attached to it. For more information, see the [Polkadot 1.0 page](./polkadot-v1.md)\nand\n[the section about XCM and Accords in Polkadot Direction page](./polkadot-direction.md#xcm-and-accords)."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-coc", "url": "https://developer.polkadot.com/wiki/kusama/kusama-coc/#community", "page_title": "Kusama Code of Conduct", "index": 0, "depth": 2, "title": "Community", "anchor": "community", "start_char": 192, "end_char": 2312, "estimated_token_count": 379, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d25612ba759919dda5273c8300b51009897d0d76dafa9b3ffb93461b93a5202e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Community\n\nWe want to foster a sense of collaboration amongst ourselves and the open-source community. Kusama\nparticipants exist to encourage the open exchange of ideas and expression and require an environment\nthat recognizes the inherent worth of every person and group. We are here to collaborate, discuss,\nand even disagree. The key is doing this in a manner that comes from a place of respect and\nprofessionalism. Participants in the Kusama network may consist of an online forum, on-chain\ngovernance participants, parachain deployment teams, validators, enthusiasts, and ecosystem tool\nbuilders. We expect for there to be participation from all backgrounds but like to set some social\nboundaries on how you may be treated and treat others.\n\nKusama community members come from across the globe and are not bordered by race, gender, or\nbackground. Community participants have read through the requisite resources and obtained sufficient\nknowledge about Kusama and all related content. This knowledge equips the community with the\nrequisite information needed to dispense of their duties as a participant.\n\n!!!note \"Examples of Unacceptable Behavior\"\n    These are just a few examples, and you can always consult a team member if you have any questions.\n\n    - Obnoxious, aggressive comments towards individuals or other projects on any medium of\n      communication.\n    - Knowingly distributing false information about Kusama or other projects.\n    - Harassing other individuals or projects.\n\nThat said, please note that Kusama is an edgy and meme-friendly network, and community member\nactions shouldn't be taken too seriously - try to assume jest before malice.\n\n!!!tip \"What To Do If You Witness or Are Subject To Unacceptable Behavior\"\n    If you are being harassed, notice that someone else is being harassed, or have any other concerns\n    relating to harassment, please contact the administrator of the channel you’re in.\n\n    This Code of Conduct may be revised at any time. We are always willing to revise this document based\n    on feedback from the Kusama participants and/or the Polkadot community."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-coc", "url": "https://developer.polkadot.com/wiki/kusama/kusama-coc/#bugs", "page_title": "Kusama Code of Conduct", "index": 1, "depth": 2, "title": "Bugs", "anchor": "bugs", "start_char": 2312, "end_char": 2617, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d25612ba759919dda5273c8300b51009897d0d76dafa9b3ffb93461b93a5202e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Bugs\n\nPlease understand that this network is, despite its success, an experiment with potential flaws, so\nit’s appreciated that community members help report any sort of exploits directly to the team before\nsharing publicly. Please see the [bug bounty program](https://security.parity.io/bug-bounties)."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-getting-started", "url": "https://developer.polkadot.com/wiki/kusama/kusama-getting-started/#polkadots-canary-network", "page_title": "Interact with Kusama", "index": 0, "depth": 3, "title": "Polkadot's Canary Network", "anchor": "polkadots-canary-network", "start_char": 1, "end_char": 1666, "estimated_token_count": 421, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fc6b32ea213d96d8eef4a7a87ab4ecbfe40a938516f0a3f811908b8cb88044d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Polkadot's Canary Network\n\nKusama is a _canary network_ for Polkadot; an earlier release of the code that is available first\nand holds real economic value. For developers, Kusama is a proving ground for runtime upgrades,\non-chain governance, and parachains.\n\n!!!info \"No Promises\"\n    Kusama is owned by those who hold the Kusama tokens (KSM). There's no central kill switch and all\n    changes are made through the protocol's on-chain governance.\n\n    The network is a permissionless and anyone can come along and start using it. Those who participated\n    in the Polkadot sale can claim a proportional amount of KSM through the\n    [Kusama Claims process](../learn/learn-guides-claims.md).\n\n    Kusama is experimental. **Expect Chaos**.\n\n!!!tip \"As a KSM holder\"\n    You can interact with all the features of the Kusama network such as staking (i.e. validating or\n    nominating), governance, basic transfers and everything else.\n\n<div class=\"grid cards\" markdown>\n\n- **[Timeline](kusama-timeline.md)** – Stay up-to-date with the latest action on Kusama.\n- **[Code of Conduct](kusama-coc.md)** - Kusama's Code of Conduct to sustain chaos.\n- **[Bug Bounty](https://security.parity.io/bug-bounties)** - An Overview of how you can help catch bugs.\n- **[Account Recovery](kusama-social-recovery.md)** - Steps on how to perform account recovery on Kusama.\n- **[Adversarial Cheatsheet](kusama-adverserial-cheatsheet.md)** - A Cheatsheet to help you create chaos.\n- **[Kappa Sigma Mu](https://ksmsociety.io/)** - Learn about the Kappa Sigma Mu Society and Join as a Member.\n- **[KSM Inflation](kusama-inflation.md)** - Explanation of KSM's Inflation Model.\n\n</div>"}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-getting-started", "url": "https://developer.polkadot.com/wiki/kusama/kusama-getting-started/#what-can-i-do-with-my-ksm", "page_title": "Interact with Kusama", "index": 1, "depth": 3, "title": "What can I do with my KSM?", "anchor": "what-can-i-do-with-my-ksm", "start_char": 1666, "end_char": 2286, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fc6b32ea213d96d8eef4a7a87ab4ecbfe40a938516f0a3f811908b8cb88044d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What can I do with my KSM?\n\nKSM is the native token of the Kusama Network. KSM can be used for transaction fees, staking,\ngovernance, purchase of coretime, and for enabling several key functionalities on Kusama. See more\ninformation on [the Chain State Values page](../general/chain-state-values.md).\n\nKSM has utility in [Kusama's OpenGov](../learn/learn-polkadot-opengov.md) where you can\n[vote](../learn/learn-polkadot-opengov.md#voting-on-a-referendum),\n[delegate your voting power](../learn/learn-polkadot-opengov.md#multirole-delegation), and place\ndeposits for your referenda or referenda proposed by others."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-getting-started", "url": "https://developer.polkadot.com/wiki/kusama/kusama-getting-started/#kusama-gifts", "page_title": "Interact with Kusama", "index": 2, "depth": 3, "title": "Kusama Gifts", "anchor": "kusama-gifts", "start_char": 2286, "end_char": 2859, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fc6b32ea213d96d8eef4a7a87ab4ecbfe40a938516f0a3f811908b8cb88044d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Kusama Gifts\n\nKusama Gifts provide an easy way to:\n\n- Onboard friends or family who are curious about blockchain but haven’t made the leap yet.\n- Share your love of Kusama and send any amount of KSM.\n- Say ‘thank you’ or send someone tokens when you don’t know their address.\n- Get friends and family set up to participate in crowdloans.\n\nLearn more about how you can create and send Kusama Gifts\n[here](https://gifts.kusama.network/#/About).\n\nWhile Kusama does not support smart contracts natively, building apps on it is possible (e.g. [RMRK.app](https://rmrk.app/))."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-inflation", "url": "https://developer.polkadot.com/wiki/kusama/kusama-inflation/#kusama-inflation-model", "page_title": "Kusama Inflation Model", "index": 0, "depth": 2, "title": "Kusama Inflation Model", "anchor": "kusama-inflation-model", "start_char": 1622, "end_char": 4378, "estimated_token_count": 581, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7df84cd9509001cdecfa0c8643949ea5b3b2d0afc299444fbebf06c09efe27bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Kusama Inflation Model\n\nThe chart below shows the inflation model of the network. Depending on the number of staked tokens,\nthe distribution of the inflation to validators and nominators versus the treasury will change\ndynamically to provide incentives to participate (or not participate) in staking.\n\nThere is a [dynamic _ideal staking rate_](#ideal-staking-rate) (in the figure set to 0.6 or 60%)\nthat the network tries to maintain. The inflation model will incentivize network participants to\nstake when the _current staking rate_ < _ideal staking rate_ and disincentivize staking when\n_current staking rate_ > _ideal staking rate_. The goal is to have the staking rate meet the ideal\nstaking rate. The current staking rate would be the total amount staked in the current era over the\ntotal token supply, where the total amount staked is the stake of all validators and nominators on\nthe network. The ideal staking rate accounts for having sufficient backing of tokens to prevent the possible compromise of security while keeping the native token liquid.\n\n![staking](../assets/rewards-inflation.png)\n\nMore information [here](https://research.web3.foundation/Polkadot/overview/token-economics).\n\n- **x-axis**: Proportion of staked tokens\n- **y-axis**: Annualized percentage (inflation and staking rewards, see below)\n- **Blue line**: Annual inflation rate diverted to NPoS, i.e., the total amount of tokens minted to pay validators and nominators. For instance, 0.1 corresponds to 10% of token inflation diverted to stakers. Since annual token inflation is 10%, all inflation is used to pay validators and nominators, and 0% of token inflation is diverted to the treasury.\n- **Green line**: Annual rewards rate for stakers. For instance, 0.2 corresponds to 20% of annual returns on the staked tokens. You can determine the current annual staking rewards rate by looking at the top bar of the staking overview on [the Polkadot Staking Dashboard](https://staking.polkadot.cloud/#/overview).\n\nAssuming that the ideal staking rate is 60%, all of the inflation would go to the validators and\nnominators if 60% of all tokens are staked. Any deviation from the 60% - positive or negative -\nsends the proportional remainder to the treasury. Deviations from the ideal staking rate are\nreferred to as _staking inefficiencies_. Thus, the treasury does not receive an inflow of funds from\ninflation when the system staking rate equals the ideal staking rate. See\n[this page](../learn/learn-polkadot-opengov-treasury.md) for more information about treasury inflow\nsources.\n\nFor those who are interested in knowing more about the design of the inflation model for the\nnetwork, please see [here](https://research.web3.foundation/Polkadot/overview/token-economics)."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-inflation", "url": "https://developer.polkadot.com/wiki/kusama/kusama-inflation/#ideal-staking-rate", "page_title": "Kusama Inflation Model", "index": 1, "depth": 2, "title": "Ideal Staking Rate", "anchor": "ideal-staking-rate", "start_char": 4378, "end_char": 5571, "estimated_token_count": 268, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7df84cd9509001cdecfa0c8643949ea5b3b2d0afc299444fbebf06c09efe27bb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ideal Staking Rate\n\nThe ideal staking rate can vary between 45% to 75% based on the number of parachains that occupied a\ncore (this excludes the system parachains), based on the implementation\n[here](https://github.com/paritytech/polkadot-sdk/blob/cd901764a52edc04a6d22bea3a526def593ab2a7/polkadot/runtime/common/src/impls.rs#L80).\n\nBriefly, the ideal staking rate can be calculated as follows:\n\n`0.75 - auction_proportion`\n\nwhere `auction_proportion` is obtained by computing `min(auctioned_slots, 60) / 300`. The\n`auctioned_slots` are all the auctioned slots (or cores) without the cores for system parachains.\n\nAssuming there are 50 filled cores, of which five are dedicated to\n[system parachains](../learn/learn-system-chains.md), there are 45 auctioned cores. The\n`auction_proportion` is thus `45 / 300 = 0.15`. The ideal staking rate is `0.75 - 0.15 = 0.6`.\n\nIf the amount of tokens staked goes below 60%, then staking rewards for nominators increase,\nincentivizing them to stake more tokens on the network. On the contrary, staking rewards drop if\nstaked tokens exceed the ideal staking rate. This results from the change in the percentage of\nstaking rewards that go to the Treasury."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-social-recovery", "url": "https://developer.polkadot.com/wiki/kusama/kusama-social-recovery/#create-a-recoverable-account", "page_title": "Social Recovery", "index": 0, "depth": 2, "title": "Create a Recoverable Account", "anchor": "create-a-recoverable-account", "start_char": 681, "end_char": 3260, "estimated_token_count": 541, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642371d89e190f2ed66a485ce163c6e174e508c89179c42b30ebd7d393eb6a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create a Recoverable Account\n\nYou will use your existing account to call `createRecovery` to select a list of accounts you trust\nto help you recover the account when you lose the private key. To create a recoverable account, you\nwill be required to set a `threshold` that is the number of your friends who need to approve the\nrecovery process to recover your account.\n\n![social-recovery-diag-1](../assets/recovery/social-recovery-diag-1.png)\n\n!!!note \"Account Recovery\"\n    If you are recovering an account, ensure that your network is set to Kusama. You can do this by selecting the network from the top right corner in the Polkadot Developer Interface.\n\nFirst, see the [Accounts](https://polkadot.js.org/apps/#/accounts) page on Polkadot-JS Apps that\nshows all available accounts on your browser's local storage and Polkadot Developer Signer. To create a\nrecoverable account, make sure you have some KSM to pay the transaction fees. You will also need\nsome for the reserve required by the account recovery setup.\n\n![kusama accounts page](../assets/kusama/kusama_social_recovery_accounts_page.png)\n\nThen, click the menu beside the \"send\" button, and choose \"Make recoverable\".\n\n![kusama accounts make recoverable](../assets/kusama/kusama_make_recoverable.png)\n\nNow you need to provide the following information:\n\n`trusted social recovery helpers` - A list of accounts that you trust. These can help you if you\nlose the private key. Since setting up a recoverable account requires you to lock up KSM, ensure\nyour account has enough transferable balance to cover it. As you select additional recovery helpers,\nmore KSM will be required.\n\n`recovery threshold` - The number of friends required to submit a `vouchRecovery` transaction in\norder to recover the account.\n\n!!!info\n    1 is the minimum, but it is not recommended to set a small number. If you set 1, that means any of\n    your recovery helpers would be able to recover your account.\n\n\n\n`recovery block delay` - Once the threshold is reached, you will need to wait until the block delay\nhas passed until you can claim the recovery. This is a protection mechanism to allow the account\nowner to have enough time to check and react in case someone pretends to be you and initiates a\nrecovery process.\n\n!!!info\n    Setting the block delay to be a little longer would be better since even if an attacker acquired enough signatures to recover your account, they would still have to wait until the block delay is passed to control your account.\n\n![kusama accounts page2](../assets/kusama/kusama_make_account_recoverable.png)"}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-social-recovery", "url": "https://developer.polkadot.com/wiki/kusama/kusama-social-recovery/#recover-your-account", "page_title": "Social Recovery", "index": 1, "depth": 2, "title": "Recover your Account", "anchor": "recover-your-account", "start_char": 3260, "end_char": 6684, "estimated_token_count": 827, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642371d89e190f2ed66a485ce163c6e174e508c89179c42b30ebd7d393eb6a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Recover your Account\n\nThis section would be showing you how to initiate a recovery process and get back the balance that\nheld in the lost account to the new account.\n\n![social-recovery-diag-2](../assets/recovery/social-recovery-diag-2.png)\n\nThe above diagram shows the whole process of recovering an account.\n\n!!!info\n    Ensure that your new account has enough KSM to pay for the transaction fees and the amount that is\n    used for reserve when making a recovery.\n\nNavigate to the menu beside the send button in the row of your new account and click the \"Initiate\nrecover for another\" option.\n\n![kusama accounts initial recoverable](../assets/kusama/kusama_make_recoverable.png)\n\nThen input the address you would like to recover in the \"recover this account\" field and click\n\"Start recovery\".\n\n![kusama accounts initial recoverable2](../assets/kusama/kusama_make_account_initial.png)\n\nOnce the transaction went through, some KSM will be locked to prevent malicious behavior.\n\n![social-recovery-6](../assets/recovery/social-recovery-6.png)\n\nNow call your friends that you have set in the first section, but heading over to \"Developer\" >\n\"Extrinsics\" and using the recovery pallet. They are required to submit a `vouchRecovery`\ntransaction.\n\n![social-recovery-7](../assets/recovery/social-recovery-7.png)\n\nOnce the threshold is reached and the block delay is passed, use the new account to submit a\n`claimRecovery` transaction that would set a proxy on behalf of your lost account. It means that you\ncan still indirectly use the lost account to interact with the network.\n\n![social-recovery-8](../assets/recovery/social-recovery-8.png)\n\nTo see the proxy information, use your new account by calling the \"recovery->proxy(Accountid)\"\nfunction at the [Chain state](https://polkadot.js.org/apps/#/chainstate) page. It should point to\nyour lost account.\n\n![social-recovery-9](../assets/recovery/social-recovery-9.png)\n\nNext, in order to call the \"closeRecovery\" transaction, you can make use of the \"asRecovered\"\nfunction as your lost account to get the locked KSM.\n\n![social-recovery-10](../assets/recovery/social-recovery-10.png)\n\nOnce the transaction goes through, the reserved KSM from the \"NEW-ACC\" will have been moved to the\nlost account. This is a way of preventing someone from recovering other accounts maliciously.\nImagine if someone tried to initiate recovery on your account; you can do this to slash their locked\nKSM.\n\n![social-recovery-11](../assets/recovery/social-recovery-11.png)\n\nMoving on, we use the `asRecovered` function to submit the `removeRecovery` transaction on behalf of\nthe lost account to release the reserved KSM from your lost account.\n\n![social-recovery-12](../assets/recovery/social-recovery-12.png)\n\nNow your account balance should be transferable.\n\n![social-recovery-13](../assets/recovery/social-recovery-13.png)\n\nFinally, transfer all of your available balance from the lost account to the new account.\n\n![social-recovery-14](../assets/recovery/social-recovery-14.png)\n\nThe recovery process is now complete and successful.\n\n![social-recovery-15](../assets/recovery/social-recovery-15.png)\n\n!!!tip \"Using `Root` origin\"\n    There is still one possible way to recover the account without going through the recovery process. That is by using the `Root` origin. However, in order to use root permissions, you will need to either go through [governance](../learn/learn-polkadot-opengov.md)."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-social-recovery", "url": "https://developer.polkadot.com/wiki/kusama/kusama-social-recovery/#further-reading", "page_title": "Social Recovery", "index": 2, "depth": 2, "title": "Further Reading", "anchor": "further-reading", "start_char": 6684, "end_char": 6879, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d642371d89e190f2ed66a485ce163c6e174e508c89179c42b30ebd7d393eb6a5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Further Reading\n\n- [Substrate's Recovery Pallet](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/recovery/src/lib.rs) -\n  The Rust implementation of the recovery pallet."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-timeline", "url": "https://developer.polkadot.com/wiki/kusama/kusama-timeline/#rollout-plan", "page_title": "Kusama Timeline", "index": 0, "depth": 2, "title": "Rollout plan", "anchor": "rollout-plan", "start_char": 447, "end_char": 1205, "estimated_token_count": 140, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:26fea3adc70510cb4d5e39b4ae5995d4bc6fa0334ba5b1ed1e6ec251c7e4d143", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Rollout plan\n\nThe rollout of full functionality of Kusama was staggered to allow for a safe transition. The first\nPoS phase began with 20 validators. Of the 20, Web3 Foundation ran nine and Parity Technologies ran\nsix. Five were ran by highly staked community members as voted in by the Phragmén election.\n\nWhen the initial transition was successful, additional validator spots were opened 10 at a time in\norder to allow for more validators to enter the active set.\n\nWhen the first transition to PoS took place, the full functionality of Kusama was not fully\navailable. Notably, the Sudo key still existed and was used to initiate further upgrades. Balance\ntransfers were still disabled for a short while.\n\nKusama now has its full functionality enabled."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-timeline", "url": "https://developer.polkadot.com/wiki/kusama/kusama-timeline/#kusamas-first-adventure", "page_title": "Kusama Timeline", "index": 1, "depth": 2, "title": "Kusama's First Adventure", "anchor": "kusamas-first-adventure", "start_char": 1205, "end_char": 2664, "estimated_token_count": 297, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:26fea3adc70510cb4d5e39b4ae5995d4bc6fa0334ba5b1ed1e6ec251c7e4d143", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Kusama's First Adventure\n\n[Source](https://polkadot.network/kusamas-first-adventure/)\n\nOn January 4, 2020, the Polkadot mainnet runtime, which at that time still wasn't live, was uploaded\nto the Kusama chain during a runtime upgrade. The mishap was due to a recent split of the Kusama\nlogic from the Polkadot logic and that runtime was not correctly named. This led to a halt of block\nproduction on the Kusama chain and bricked the chain entirely.\n\nThe solution to the issue involved a rollback of the chain history before the problematic runtime\nupgrade. However, due to intricacies of the block production mechanism, it was also necessary to\nencapsulate the validators of the chain into a time bubble to trick them into believing that they\nwere producing blocks in the past. Furthermore, in order for the chain to catch up to the present\nmoment it was necessary to make time flow in the bubble at a speed of six times greater than the\nspeed of time in the real world. Therefore, the session of Kusama which would normally last one hour\nwould last only 10 minutes until the validators caught up to the present moment.\n\nThe above plan was executed successfully on January 7, 2020. Due to the time warp, the number of\nmissed blocks in the sessions directly following\n[block #516558](https://kusama.subscan.io/block/516558) was significantly higher. This is partly\nwhat contributes to the much higher ratio of missed blocks on Kusama versus Polkadot today."}
{"source": "polkadot-docs", "page_id": "wiki-kusama-kusama-timeline", "url": "https://developer.polkadot.com/wiki/kusama/kusama-timeline/#auctions", "page_title": "Kusama Timeline", "index": 2, "depth": 2, "title": "Auctions", "anchor": "auctions", "start_char": 2664, "end_char": 3824, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:26fea3adc70510cb4d5e39b4ae5995d4bc6fa0334ba5b1ed1e6ec251c7e4d143", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Auctions\n\nKusama promised chaos, and it delivered on that promise. On June 15th, 2021, the roll out of the\nfirst public parachain slot auction commenced, marking the\nbeginning of the end to deliver on the last piece of core functionality outlined in the Polkadot\nwhitepaper: purpose-built, interoperable parachains.\n\nTeams and projects looking to become an official parachain on the Kusama network have been working\nhard to bring their technologies to life, many of whom started a crowdloan campaign in order\nto participate in the slot auctions.\n\nKusama has made history with the permissionless launch of several independent parachains, and\ncontinues to do so with ongoing auction. As parachains become operational, the community will\ndetermine which additional features and network upgrades should be added over time.\n\nWhile Kusama’s current parachains are taking advantage of the built-in features of the network and\nforkless upgradability provided by Substrate, chaos continues, and in the spirit of chaos, more\nteams are eager to deploy on Kusama. The path of Kusama deployment has paved the way to Polkadot's\nparachains as the technology became proven."}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-accounts-vs-address-book", "url": "https://developer.polkadot.com/wiki/learn/how-to/accounts-vs-address-book/#what-is-the-difference-between-them", "page_title": "The Difference Between Accounts and Address Book", "index": 0, "depth": 3, "title": "What is the difference between them?", "anchor": "what-is-the-difference-between-them", "start_char": 532, "end_char": 2346, "estimated_token_count": 488, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eb777ded624350e22ff0667dac43557515ea5cd0a1375209c829028a25dfec7b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What is the difference between them?\n\n#### **Accounts Page**\n\nYou control any address you have under [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts), and you can therefore send funds out or perform other actions with it.\n\nAddresses on your Accounts page have been [created](create-polkadot-account.md) or [restored](restore-account-signer.md) by you either directly on Polkadot Developer Interface in one of the ways highlighted in the image below or through a browser extension. In all cases, you control those addresses because you own their private keys.\n\n![](../../assets/how-to/65031224452.png)\n\n#### **Address Book**\n\nAddresses that show up in your [Address Book](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/addresses) are read-only. They don't require private keys to be added there, allowing you to add any address here as a contact.\n\nHere you can, for example, add your DOT deposit addresses at exchanges that you'd like to monitor or regularly send funds to. Your address book is a passive \"watch tool,\" making sending funds to your contact addresses easier.\n\n![](../../assets/how-to/65031224457.png)\n\nTo add an address to your Address Book, click the \"Add contact\" button, add the account's address, and give it a name. Then click the \"Save\" button.\n\n![](../../assets/how-to/65031224488.png)\n\nYou _cannot_ send funds out of an address in your Address book since it's just a contact address, just like you can't send an email from a friend's email address in your contact list.\n\n!!! danger \"READ THIS FIRST!\"\n\n    If you click the \"Send\" button next to an account in the Address Book, you are initiating a transaction **to that account, not from** as it is for accounts on the Accounts page.\n    ![](../../assets/how-to/65031224505.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-accounts-vs-address-book", "url": "https://developer.polkadot.com/wiki/learn/how-to/accounts-vs-address-book/#how-to-move-an-address-from-the-address-book-to-accounts", "page_title": "The Difference Between Accounts and Address Book", "index": 1, "depth": 3, "title": "How to move an address from the Address book to Accounts", "anchor": "how-to-move-an-address-from-the-address-book-to-accounts", "start_char": 2346, "end_char": 2911, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eb777ded624350e22ff0667dac43557515ea5cd0a1375209c829028a25dfec7b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to move an address from the Address book to Accounts\n\nThe only way to do this is if you own the private keys of the contact address in the form of its mnemonic phrase or backup JSON file. In that case, you could use them to restore access to the addresses on the Accounts page. [Here is how to do that](restore-account-signer.md).\n\nIf the account in your Address book is your Ledger account, here's how you can [connect it to the Polkadot Developer Signer](add-ledger-account-signer.md) or directly to [ Polkadot Developer Interface](add-ledger-account.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-add-ledger-account-signer", "url": "https://developer.polkadot.com/wiki/learn/how-to/add-ledger-account-signer/#how-to-add-your-ledger-account-through-the-polkadot-developer-signer", "page_title": "How to Add Your Ledger Account (Developer Signer)", "index": 0, "depth": 3, "title": "How to add your Ledger account through the Polkadot Developer Signer", "anchor": "how-to-add-your-ledger-account-through-the-polkadot-developer-signer", "start_char": 1578, "end_char": 5035, "estimated_token_count": 814, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a114f8ff42351c3912c587201ae749956235c7edf044a7f243f7a1b7be280f82", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to add your Ledger account through the Polkadot Developer Signer\n\n!!! warning \"IMPORTANT\"\n\n    Ledger is phasing out support for the [Ledger Nano S](https://support.ledger.com/article/Ledger-Nano-S-Limitations). Your funds remain safe, but upgrading is recommended to ensure compatibility with future Polkadot updates.\n\n    Notice that other Ledger models (e.g., Ledger Nano S Plus) aren't affected.\n\n1\\. First, update your browser to the latest version. Please note that Ledger hardware device support is only available on Chromium-based browsers (Chrome, Brave, Edge) where WebUSB and WebHID support is available in the browser.\n\n2\\. Open the Polkadot Developer Signer, go to \"Settings\" > \"Ledger app,\" and ensure you have selected the desired option on the drop-down menu. Select whether you want to add an account from the Generic Polkadot app or migrate your funds using an account from the Polkadot Migration app.\n\n![](../../assets/how-to/65024710813.png)\n\n3\\. Connect and unlock your Ledger and open the Ledger app you selected in the previous step.\n\n4\\. Open the extension and click on the plus (+) button on the top right.\n\n5\\. Click on \"Attach ledger account\":\n\n![](../../assets/how-to/65007877760.png)\n\n5\\. Select the network for which you want to add the account from the drop-down menu.\n\n6\\. Once you do, a text field will appear. Give your account a name.\n\n7\\. Then, the Account type and index will appear. You can leave them to the default values of zero.\n\n8\\. Finally, click on Import Account.\n\n!!! danger \"READ THIS FIRST!\"\n\n    If you choose to change the Account Type and Index, **make sure to note them down for the future**. Every Account Type and Index combination will produce a different account address. If you need to re-add your Ledger account in the future, **you will need to select the same Account Type and Index** in order to access the same account.\n\n![](../../assets/how-to/65024710318.png)\n\n!!! warning \"IMPORTANT\"\n\n    If you get an error \"**No device selected** \", check your browser settings. Go to:\n\n    \"Settings\" > \"Privacy and Security\" > \"Site Settings\" > \"Additional permissions\" > \"USB devices\"\n\n    and make sure \"Sites can ask to connect to USB devices\" is selected. Then try again.\n\n    If this doesn't help, please ensure that your browser has permissions to access USB devices, in particular if it is running as a snap such as Brave on Ubuntu.  As a workaround, uninstall the default version and reinstall it from the official package repositories.\n\nIf your Ledger account doesn't appear on your [Accounts page](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) right away, allow access to it from \"Settings\" > \"Manage Website access,\" ensure that the account is selected, and refresh the page.\n\nRemember that from now on, you will need to approve any extrinsic from the imported account using the Ledger app you used to add it to the Polkadot Developer Signer, whether it was the Generic Polkadot app or the Polkadot Migration app.\n\n* * *\n\nIf you prefer visual instructions, you can check this video which also shows an example of how you can stake using your Ledger account. This video covers Ledger accounts in general, but you can skip to the 2:30 timestamp in the video to view the instructions on how to add your Ledger account in the Polkadot Developer Signer:\n\n[Connect Ledger to Polkadot Developer Interface](https://www.youtube.com/watch?v=7VlTncHCGPc&t=150s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-asset-hub-migration", "url": "https://developer.polkadot.com/wiki/learn/how-to/asset-hub-migration/#whats-polkadot-asset-hub", "page_title": "Asset Hub Migration — What You Must Know", "index": 0, "depth": 3, "title": "What's Polkadot Asset Hub?", "anchor": "whats-polkadot-asset-hub", "start_char": 2054, "end_char": 2880, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c86d082f3a5d4d467d59aa32e753bc445d4139b23362ddec2460bfa2bc0a3e61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What's Polkadot Asset Hub?\n\nPolkadot Asset Hub is a system chain that provides Polkadot with a unified platform for creating and managing assets beyond its native token. Unlike the Polkadot Relay Chain, which supports only DOT, Polkadot Asset Hub enables the storage and transfer of a wide variety of assets, including memecoins, stablecoins, NFTs, and tokens from other Polkadot chains.\n\nPolkadot Asset Hub also facilitates cross-chain transfers, bringing in assets from other networks such as KSM from Kusama and ETH from Ethereum.\n\nSince Polkadot Asset Hub can hold almost any asset, it offers the perfect network to record Polkadot's main balance and support features like governance and staking, leaving the Polkadot Relay Chain with the essential task of providing security and interoperability to Polkadot.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-asset-hub-migration", "url": "https://developer.polkadot.com/wiki/learn/how-to/asset-hub-migration/#benefits-of-polkadot-asset-hub", "page_title": "Asset Hub Migration — What You Must Know", "index": 1, "depth": 3, "title": "Benefits of Polkadot Asset Hub", "anchor": "benefits-of-polkadot-asset-hub", "start_char": 2880, "end_char": 3627, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c86d082f3a5d4d467d59aa32e753bc445d4139b23362ddec2460bfa2bc0a3e61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Benefits of Polkadot Asset Hub\n\nWhile the Polkadot Relay Chain focuses on core functions, Polkadot Asset Hub enhances the user experience with added capabilities. It offers a better user experience with features like:\n\n  * Lower existential deposit: reduced from 1 DOT to 0.01 DOT.\n  * Significantly reduced transaction fees and deposits.\n  * Expanded asset support: stablecoins (USDT, USDC) and other ecosystem tokens.\n  * Fee flexibility: ability to pay transaction fees in any supported asset.\n  * Direct access to trustless Ethereum bridges.\n\nAfter the Polkadot Asset Hub migration, all Polkadot users will benefit from these improvements by default. There's no need to teleport assets, as balances will be migrated automatically.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-asset-hub-migration", "url": "https://developer.polkadot.com/wiki/learn/how-to/asset-hub-migration/#what-would-happen-during-the-migration", "page_title": "Asset Hub Migration — What You Must Know", "index": 2, "depth": 3, "title": "What would happen during the migration?", "anchor": "what-would-happen-during-the-migration", "start_char": 3627, "end_char": 5068, "estimated_token_count": 285, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c86d082f3a5d4d467d59aa32e753bc445d4139b23362ddec2460bfa2bc0a3e61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What would happen during the migration?\n\n!!! tip \"GOOD TO KNOW\"\n\n    This migration was **succesfully** executed on October 7th, 2025, for Kusama and on November 4th, 2025, for Polkadot.\n\nThe migration will take place once all the potential issues have been minimized. However, during the process, there will be a planned service interruption on the Polkadot Relay Chain and Polkadot Asset Hub, lasting approximately 8 to 10 hours. The expected interruptions include:\n\n  * Balance display: Your funds are safe, but your account balance may appear incorrectly during the migration on your wallet. From then on, wallets will query the Polkadot Asset Hub, but the balance records may take some time to update fully.\n  * Transfer limitations: You won't be able to teleport DOT to or from the Polkadot Relay Chain or Polkadot Asset Hub. However, DOT and assets should be able to be transferred within Polkadot Asset Hub.\n  * Feature temporary restrictions: Some functionalities (for example, governance, proxies, multisig, vesting, and other pallets) will be disabled on the Polkadot Relay Chain _during_ the migration. Once the migration is complete, they'll also be available on Polkadot Asset Hub.\n\n!!! warning \"ATTENTION\"\n\n    Funds that participated on crowdloans will still be locked on the Polkadot Relay Chain. However, there's a plan that will be put in place after the migration to refund these funds to Polkadot Asset Hub.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-asset-hub-migration", "url": "https://developer.polkadot.com/wiki/learn/how-to/asset-hub-migration/#what-would-happen-after-the-migration", "page_title": "Asset Hub Migration — What You Must Know", "index": 3, "depth": 3, "title": "What would happen after the migration?", "anchor": "what-would-happen-after-the-migration", "start_char": 5068, "end_char": 6682, "estimated_token_count": 341, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c86d082f3a5d4d467d59aa32e753bc445d4139b23362ddec2460bfa2bc0a3e61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What would happen after the migration?\n\nSince this is only a migration of information and features, your funds remain safe and will be fully recorded in Polkadot Asset Hub. As a regular user, you won't need to interact with the Polkadot Relay Chain after the migration.\n\nWith balances now recorded on the Polkadot Asset Hub, wallets will query this chain to display your account balances. It may take some time for all wallets to fully update and pull data from the new source, but they will.\n\n!!! warning \"ATTENTION\"\n\n    If your wallet shows no balance, it probably hasn't updated to the migration yet. Check for a new version and reach out to the wallet's support team for help.\n\n    If you use Polkadot Developer Interface, connect to Asset Hub:\n    [Polkadot Developer Interface: How to Switch Network Nodes](switch-network-nodes.md)\n\nThe same applies to staking or governance activities. All interactions will occur on the Polkadot Asset Hub. Wallets and interfaces will be ready to support this change, so you don't need to adjust any settings.\n\nIn essence, even if the migration seems complex, end users like you shouldn't be affected and won’t notice any change. It won’t matter where your balances are stored or which network your wallet interacts with—everything will be handled behind the scenes. No action is required on your part, and your funds will remain fully on Polkadot.\n\nThe migration will let the Relay Chain focus on security and interoperability, bringing it closer to the vision of a “[minimal Relay](https://paritytech.github.io/RFCs/approved/0032-minimal-relay.html)“ chain.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-asset-hub-migration", "url": "https://developer.polkadot.com/wiki/learn/how-to/asset-hub-migration/#special-attention-polkadot-vault-users", "page_title": "Asset Hub Migration — What You Must Know", "index": 4, "depth": 3, "title": "Special attention: Polkadot Vault users", "anchor": "special-attention-polkadot-vault-users", "start_char": 6682, "end_char": 7546, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c86d082f3a5d4d467d59aa32e753bc445d4139b23362ddec2460bfa2bc0a3e61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Special attention: Polkadot Vault users\n\nThe only case where user action may be required is for Polkadot Vault users running older versions (≤7.0). Accounts created in Polkadot Vault (formerly Parity Signer) might use by default different derivation paths depending on the network they were generated for (for example, //polkadot if it was created for the Polkadot Relay Chain, //statemint for Polkadot Asset Hub, etc.).\n\nIf you want to continue using your Polkadot (Relay Chain) account on Polkadot Asset Hub, you should create a new Polkadot Asset Hub account and customize the derivation path to match the one used by the Polkadot Relay Chain account. Most likely, the derivation path will be //polkadot.\n\nFind further information in the article “[Polkadot Vault: How to Create the Same Account on Different Networks](vault-same-account-networks.md)”\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-block-explorers", "url": "https://developer.polkadot.com/wiki/learn/how-to/block-explorers/#block-explorers", "page_title": "Block Explorers for Polkadot and Kusama", "index": 0, "depth": 3, "title": "**Block Explorers**", "anchor": "block-explorers", "start_char": 1, "end_char": 621, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8a810439a985297b732dc0d4fbb2660cd2a76c47c9d2db84c236ac6564bcc19e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Block Explorers**\n\nThere are several block explorers that you can use to explore Polkadot, Kusama, and other Substrate chains and parachains. Here is a list of them, which will be updated as more are developed.\n\nEXPLORER| RELAY CHAINS| PARACHAINS| OTHER\n---|---|---|---\n[Subscan](https://www.subscan.io/)| Polkadot and Kusama| Yes| Testnets, XCM transfers\n[Statescan](https://www.statescan.io/)| Polkadot and Kusama| Yes| NFT, testnet\n\n!!! info\n\n    These block explorers are not developed or maintained by Web3 Foundation. If you encounter an issue while using them, please contact their respective team.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-block-explorers", "url": "https://developer.polkadot.com/wiki/learn/how-to/block-explorers/#other-third-party-tools", "page_title": "Block Explorers for Polkadot and Kusama", "index": 1, "depth": 3, "title": "**Other third-party Tools**", "anchor": "other-third-party-tools", "start_char": 621, "end_char": 1211, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8a810439a985297b732dc0d4fbb2660cd2a76c47c9d2db84c236ac6564bcc19e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Other third-party Tools**\n\nIn addition to block explorers, there are other tools and resources. Some of them are listed below:\n\n**TOOL**| **USE**\n---|---\n[Subscan XCM Dashboard](https://polkadot.subscan.io/xcm_dashboard)| HRMP/XCM tool for [Polkadot](https://polkadot.subscan.io/xcm_dashboard) and [Kusama](https://kusama.subscan.io/xcm_dashboard)\n[Polkawatch](https://polkawatch.app/)| Analytics app\n[Polkadot Telemetry](https://telemetry.polkadot.io/)| Node data\n[Polkadot Tech Stack](../../general/build-open-source.md)| List of projects supported by a Web3 Foundation grant\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-cant-find-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/cant-find-account/#assets-on-a-different-network", "page_title": "I Can't Find My Account on the Polkadot Network!", "index": 0, "depth": 3, "title": "Assets on a different network", "anchor": "assets-on-a-different-network", "start_char": 311, "end_char": 934, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f0965789c65620c2aac8204e1e36e16db10969acea67ee6936e1346ca1beac6e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Assets on a different network\n\nPolkadot is a network made up of multiple interconnected blockchains. Your account may hold assets across several of these networks. For example, you might have DOT on the Polkadot Relay Chain, Polkadot Asset Hub, Polkadot People, Hydration, Bifrost, and others.\n\nIf you don't see your assets on a specific network, make sure your wallet is connected to all relevant Polkadot networks and then check your balance again.\n\nAdditionally, you might visit a [block explorer](block-explorers.md) that allows you to check the balance and activity of an account across multiple networks.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-cant-find-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/cant-find-account/#account-below-the-existential-deposit", "page_title": "I Can't Find My Account on the Polkadot Network!", "index": 1, "depth": 3, "title": "Account below the existential deposit", "anchor": "account-below-the-existential-deposit", "start_char": 934, "end_char": 1810, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f0965789c65620c2aac8204e1e36e16db10969acea67ee6936e1346ca1beac6e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Account below the existential deposit\n\nOn the other hand, if you cannot find your DOT address on a [block explorer](block-explorers.md) on any network, it has either not received the minimum amount of assets required to activate the account yet, or its balance dropped below that amount, and it was reaped (deactivated).\n\nThis amount, called the **[existential deposit (ED)](existential-deposit.md),** is currently set at **0.01 DOT** on Polkadot and **0.00000333333 KSM** on Kusama.\n\nYou can reactivate a reaped account by sending at least the ED to it. This will make it findable on block explorers again. For more information, check out our article on the [existential deposit](existential-deposit.md).\n\n!!! tip \"GOOD TO KNOW\"\n\n    Most block explorers keep the transaction history of reaped accounts, so you can still find them even if they've been deactivated.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-change-controller-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/change-controller-account/#how-to-change-your-controller-account", "page_title": "How to Change Your Controller Account", "index": 0, "depth": 3, "title": "How to change your controller account", "anchor": "how-to-change-your-controller-account", "start_char": 831, "end_char": 1877, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b6b57ee61f549e71e06fb868da44158380dd1d542b455dd0e4ba296cea4afd8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to change your controller account\n\n!!! tip \"GOOD TO KNOW\"\n\n    If you don't want to use your stash account often, you can create a staking proxy which can do all staking actions on its behalf. It has the same advantages as the controller, but even more flexibility.\n\n    Check how to do it in the article \"[How to Create a Proxy Account](create-proxy-account.md)\".\n\n1\\. On Polkadot Developer Interface, navigate to Developer > [Extrinsics](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/extrinsics) tab.\n\n2\\. Ensure that your stash account is selected on the top field, \"Using the selected account.\"\n\n3\\. From the drop-down on the right (\"Submit the following extrinsics\"), select the 'staking' pallet and 'setController' from the one on its left.\n\n4\\. Since 'setController' doesn't accept any other parameter, you must click \"Submit Transaction\" and sign the extrinsic from your wallet.\n\n![](../../assets/how-to/65018521622.png)\n\nThat's it. From now on, only your stash account can sign transactions on its behalf.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-change-dot-icon-style", "url": "https://developer.polkadot.com/wiki/learn/how-to/change-dot-icon-style/#how-to-change-the-style-of-your-dot-icon-on-polkadot-developer-interface", "page_title": "How to Change the Style of Your DOT Icon", "index": 0, "depth": 3, "title": "How to Change the Style of Your DOT Icon on Polkadot Developer Interface", "anchor": "how-to-change-the-style-of-your-dot-icon-on-polkadot-developer-interface", "start_char": 608, "end_char": 1287, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:81c801bde0e6043c19389395322085eee2119f44ff2f3f18aa55d337f2b852eb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to Change the Style of Your DOT Icon on Polkadot Developer Interface\n\n1\\. Navigate to the [Settings](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/settings) tab on Polkadot Polkadot Developer Interface:\n\n![](../../assets/how-to/65014963186.png)\n\n2\\. Click on the \"Default icon theme\" to see a drop-down menu:\n\n![](../../assets/how-to/65014963194.png)\n\n\n\n3\\. Select any theme by clicking on it. You can see an example of what the theme looks like here. This example uses \"RoboHash.\"\n\n4\\. Click Save on the bottom right to apply the changes.\n\n5\\. Navigate back to the Accounts tab, and see your new RoboHash icons.\n\n![](../../assets/how-to/65014963285.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-choose-nomination-pool", "url": "https://developer.polkadot.com/wiki/learn/how-to/choose-nomination-pool/#what-you-can-learn-about-a-pool-on-chain", "page_title": "How Do I Know Which Nomination Pool to Choose?", "index": 0, "depth": 3, "title": "What You Can Learn About a Pool On-Chain", "anchor": "what-you-can-learn-about-a-pool-on-chain", "start_char": 1827, "end_char": 5302, "estimated_token_count": 851, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b88a3f1857bcaa59858c0900d3b56031bfc6004ff387839e461f604dec1e1fe8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What You Can Learn About a Pool On-Chain\n\nThe following information about a nomination pool can be found on the [Staking Dashboard](https://staking.polkadot.cloud/#/pools) and [block explorers](block-explorers.md).\n\n#### **Pool Commission**\n\nNomination pools can charge a commission. It is applied to the staking rewards the pool earned after the validators took their commission. On Polkadot and Kusama, a pool commission can be anywhere between 0% and 10%. If a pool has a non-zero percent commission, you'll see it on the [Staking Dashboard](https://staking.polkadot.cloud/#/pools):\n\n![](../../assets/how-to/65028556709.png)\n\nPool administration can change this commission over time. You can read more about [pool commissions](../learn-nomination-pools.md#pool-commissions).\n\n#### **Current Pool Nominations**\n\nTo see all the validators the nomination pool currently nominates, click \"more.\"\n\n![](../../assets/how-to/65028556743.png)\n\nA new screen will be displayed. Click the \"Nominations\" tab to view the validators that this pool is nominating.\n\n![](../../assets/how-to/65028556788.png)\n\nMake sure you agree with the choice the pool administration made. It's recommended to avoid nominating validators with 100% commission. You can check other points to consider in [this article](choose-validators.md).\n\n#### **Total Stake**\n\nYou can see the pool's total stake near the DOT logo.\n\n![](../../assets/how-to/65028556888.png)\n\nMake sure it's well above the current minimum amount required to earn rewards. You can see the minimum on the [Nominate](https://staking.polkadot.cloud/#/nominate) page:\n\n![](../../assets/how-to/65028556928.png)\n\nPlease note that this minimum is dynamic and will change over time, as well as the pool's total stake.\n\n#### **Pool Administration Accounts**\n\nIf you want to see the public address and roles of a specific pool, you have to click on \"More,\" and on the new displayed screen, you'll find all the information regarding the pool:\n\n![](../../assets/how-to/65028556984.png)\n\n\n\nYou'll find more information about [each specific role's meaning](../learn-nomination-pools.md#roles).\n\nHere are a few things to consider about the accounts that manage the pool:\n\n  * Is the same personal account playing all roles, or are there different accounts in the pool administration? Having one personal account for every role may be convenient for the owner, but it also creates a single point of failure. If the only pool manager loses access to their account or just loses their interest, the pool will be left unattended.\n  * Is it a personal account that manages the pool, or a multi-signature one? Multi-signature accounts are controlled by several key owners, not just one, and are a good solution for teams that want to manage a pool collectively.\n  * Do the management accounts have on-chain identities with contact information? You may want to talk to the pool manager, for example, to ask some questions about the pool. Having their contact information will be very helpful in this case.\n\n#### **Pool's Contact Information**\n\nNomination pools don't have on-chain identities with contact information. However, you can sometimes find the pool's website or social media account information in its name. You may need to check the pool on a block explorer to see its full name. On the pool's website or social media, you may find answers to your \"off-chain\" questions, which are covered below, or get in touch with the pool management.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-choose-nomination-pool", "url": "https://developer.polkadot.com/wiki/learn/how-to/choose-nomination-pool/#what-you-can-learn-about-a-pool-off-chain", "page_title": "How Do I Know Which Nomination Pool to Choose?", "index": 1, "depth": 3, "title": "What You Can Learn About a Pool Off-Chain", "anchor": "what-you-can-learn-about-a-pool-off-chain", "start_char": 5302, "end_char": 6836, "estimated_token_count": 313, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b88a3f1857bcaa59858c0900d3b56031bfc6004ff387839e461f604dec1e1fe8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What You Can Learn About a Pool Off-Chain\n\nSome questions about how a nomination pool is managed can't be answered solely by the on-chain information. You may need to talk to the pool management or check the pool's website or social media.\n\n#### **Permissionless Rewards Claiming**\n\nPool members can allow permissionless claiming of their rewards (to their account, to their stake in the pool, or both). Some nomination pools claim rewards for their members as part of their services, allowing members to compound the rewards without paying transaction fees or monitoring the situation. The more often your rewards are compounded, the more effect it has on your total rewards earned.\n\n#### **Nomination Adjustment**\n\nNomination pools nominate validators for all members of the pool based on some criteria, like the ones described in [this article](choose-validators.md). Over time, the selected validators can raise their commission, make significant changes to their infrastructure, or even stop validating. The pool administration should review the pool's nominations and adjust them from time to time. You may want to see how often the nominations are changed and on what criteria.\n\n#### **Community Reputation**\n\nNomination pool administrators can be active on their social media and in the ecosystem channels to answer potential questions, attract new members, and boost their reputation. You can join the [Polkadot community](../../general/community.md) on social media to see what reputation a nomination pool has.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-choose-nomination-pool", "url": "https://developer.polkadot.com/wiki/learn/how-to/choose-nomination-pool/#joining-a-nomination-pool", "page_title": "How Do I Know Which Nomination Pool to Choose?", "index": 2, "depth": 3, "title": "Joining a Nomination Pool", "anchor": "joining-a-nomination-pool", "start_char": 6836, "end_char": 7404, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b88a3f1857bcaa59858c0900d3b56031bfc6004ff387839e461f604dec1e1fe8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Joining a Nomination Pool\n\nOnce you have done your own research and picked a nomination pool, join it. The steps are described in these guides:\n\n[Staking Dashboard documentation on joining a pool](https://docs.staking.polkadot.cloud/en/nomination-pools#joining-a-pool)\n\n[Polkadot Developer Interface: Nomination Pools](nomination-pools-guide.md)\n\nIf you are more of a visual learner, take a look at this video guide:\n\n[Staking Dashboard: Create, Manage and Destroy Nomination Pools | Technical Explainers](https://www.youtube.com/watch?v=aTFWhwy_Mxg&t=787s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-choose-validators", "url": "https://developer.polkadot.com/wiki/learn/how-to/choose-validators/#best-practices-for-nominating-points-to-consider", "page_title": "How to Choose Validators", "index": 0, "depth": 3, "title": "Best Practices for Nominating: Points to consider", "anchor": "best-practices-for-nominating-points-to-consider", "start_char": 1342, "end_char": 5437, "estimated_token_count": 938, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:568fe2e929d5084beb9060b56371ce0d5288d10512926e5f79743d02e5781131", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Best Practices for Nominating: Points to consider\n\n#### **1\\. Choose more than one validator**\n\nIf at least one of the validators you nominate is elected by the election algorithm to be in the active set, you will nominate them with your entire stake. However, there is a risk of getting no rewards if you nominate very few validator candidates and none of them are chosen. Therefore, it is safer to choose as many trustworthy validators as possible (up to 16 on both Polkadot and Kusama).\n\n#### **2\\. Check if the validator has verified their identity**\n\nIf a validator has set its identity, you'll see the details on the [Validators](https://staking.polkadot.cloud/#/validators) tab of the Staking Dashboard or by clicking on the validator's name on the [All Validators](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/all-validators) page of the Polkadot Developer Interface. Besides a displayed name, a validator can indicate their email, website, Twitter account, or something else. You can filter out validators without identities both on the Staking Dashboard and the Polkadot Developer Interface. However, not all validators have verified their identity with a registrar on Polkadot. Validators with a verified identity are marked by a green icon next to their name on the Polkadot Developer Interface. Verified identity affirms that the validator's contact information and name have been confirmed.\n\n![](../../assets/how-to/65032409252.png)\n\n#### **3\\. Be aware of the \"high returns\" validators**\n\n Although it may be enticing to select based only on this criterion, this choice may not be the best one. You need to ensure you're choosing good validators by considering the other factors in this guide and video.\n\n![](../../assets/how-to/65032409596.png)\n\n#### **4\\. Pay attention to the quoted commission**\n\nBlock rewards are shared with nominators, but the validators set the commission they take out for their costs before profits are given out. This rate can vary greatly.\n\n**Be aware that if you nominate a validator with** 100% commission **, you will get** NO rewards. These validators aren't looking for nominators. Also, commissions can change, so keeping an eye on who you're nominating while you're staking is recommended. Both the Staking Dashboard and the Polkadot Developer Interface let you sort validators based on the commissions and filter out validators with high ones.\n\nSelecting validators with 0% commission may also be enticing, but make sure that the validator isn't cutting on infrastructure costs to make up for this 0% commission. It's usually better to choose validators with higher commissions if you trust them more. The impact of the commission on the rewards is pretty small, after all.\n\n#### **5\\. See how much \"skin in the game\" the validator has**\n\nOn the Polkadot Developer Interface, the \"own stake\" column shows how many of their own DOT tokens the validator has staked. The \"total stake\" column shows how much your stake will count towards them.\n\nKeep in mind, though, that validators with low \"self-stake\" don't necessarily have low \"skin in the game.\" Usually, these validators nominate themselves from other accounts, so they do run a risk of losing their own funds if they get slashed.\n\n#### **6\\. Get some background details**\n\nMore information, such as the [era points](../learn-staking.md), elected stake, rewards & slashes, can be found on the Polkadot Developer Interface by clicking the graph icon on the far right of each validator.\n\n!!! tip \"GOOD TO KNOW\"\n\n    When you have decided on your validators, add them to your Favourites: click on the heart icon on the Staking Dashboard or the star icon on Polkadot Developer Interface. This will allow you to quickly select them as your nominations later.\n\n#### **7\\. Nominate!**\n\nNow that you've decided on your validators, you can nominate them through the [Staking Dashboard](https://staking.polkadot.cloud/). The [Staking Dashboard: Overview](../../general/dashboards/staking-dashboard.md) page can help you with the process.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-choose-validators", "url": "https://developer.polkadot.com/wiki/learn/how-to/choose-validators/#check-online-and-join-the-community", "page_title": "How to Choose Validators", "index": 1, "depth": 3, "title": "Check online and join the community", "anchor": "check-online-and-join-the-community", "start_char": 5437, "end_char": 5956, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:568fe2e929d5084beb9060b56371ce0d5288d10512926e5f79743d02e5781131", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Check online and join the community\n\nMany Polkadot validators also publish YouTube videos or guides to staking on Medium to boost their reputation and attract nominators.\n\nCommunity members on the forums often share their recommendations and experiences. Join the conversation on the [Polkadot Watercooler](https://matrix.to/#/#polkadot-watercooler:parity.io) on Element/Matrix.\n\nFurther information on nominating can be found under [good nominator practices](../learn-nominator.md#good-nominator-practices).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-account-subkey", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-account-subkey/#how-to-create-a-new-account-in-subkey", "page_title": "How to Create an Account in Subkey", "index": 0, "depth": 3, "title": "How to create a new account in Subkey", "anchor": "how-to-create-a-new-account-in-subkey", "start_char": 402, "end_char": 2039, "estimated_token_count": 366, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:78730e718f4f5d7ad64bb31a746551daed07156f6807c1e600cd6c9cd2176bc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to create a new account in Subkey\n\n1\\. If you don't have Rust and Cargo installed yet, you'll need to download the stable release using [these steps](https://doc.rust-lang.org/cargo/getting-started/installation.html).\n\n2\\. Next, open a terminal (Mac) or PowerShell (Windows) and enter the following two commands to install the dependencies and Subkey. The official guide is [here.](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/bin/utils/subkey)\n\n```bash\ncurl https://getsubstrate.io -sSf | bash -s -- --fast\ncargo install --force subkey --git https://github.com/paritytech/substrate\n```\n\n3\\. Then, use the following command to generate an account.\n\n```bash\nsubkey generate\n```\n\nThe output should be something similar to this:\n\n```text\nSecret phrase 'your seed phrase will appear here' is account:\nSecret seed:       0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849\nPublic key (hex):  0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746\nPublic key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR\nAccount ID:        0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746\nSS58 Address:      5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR\n```\n\nThis is your new account. Make sure to [save your 12-word mnemonic phrase safely](store-mnemonic-safely.md). For more Subkey commands, please refer to [this guide](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/bin/utils/subkey).\n\n* * *\n\nIf you are more of a visual learner, check this video guide:\n\n[Create your Polkadot Account using Subkey](https://www.youtube.com/watch?v=SWfE_EwxgIU)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-account/#how-to-create-an-account-on-polkadot-developer-interface", "page_title": "How to Create an Account", "index": 0, "depth": 3, "title": "How to Create an Account on Polkadot Developer Interface", "anchor": "how-to-create-an-account-on-polkadot-developer-interface", "start_char": 1045, "end_char": 3212, "estimated_token_count": 590, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:abeb0693bac2cb13d26c64358b447233a92dc248f44ff4f7d7d67a69df8f2f57", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to Create an Account on Polkadot Developer Interface\n\n1. On the Polkadot Developer Interface, navigate to the [Settings](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/settings) tab. In the account options, allow local in-browser account storage and click Save:\n\n![](../../assets/how-to/65032557838.png)\n\n2\\. Navigate to the \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts)\" page and click on the \"+ Account\" button:\n\n![](../../assets/how-to/65032557846.png)\n\n3\\. You'll see a 12-word mnemonic phrase. [Save it safely](store-mnemonic-safely.md) and check the box saying you have done so, and click \"Next\":\n\n!!! warning \"ATTENTION\"\n\n    Make sure to save your mnemonic phrase now, as there is **no way to view it** after the account is created.\n\n![](../../assets/how-to/65032557864.png)\n\n4\\. Give your account a descriptive name and a good password, and click \"Next\":\n\n!!! warning \"ATTENTION\"\n\n    **Your**  **password does not protect your mnemonic phrase**! It is only used to encrypt your account locally on your device. The mnemonic phrase alone can give full access to your account, which is why you can use your mnemonic phrase to restore the account if you forget your password. As a result, an attacker doesn’t need to know your password to compromise your account, just your mnemonic phrase\n\n![](../../assets/how-to/65032557918.png)\n\n5\\. Review the details, and click \"Save.\" This will also download the JSON backup file for the account on your computer:\n\n![](../../assets/how-to/65032557929.png)\n\n6. Your JSON backup file will have the name of your account and will go to your default download folder. Unless you rename it, it will be named like this:\n\n_12rsESKfXTArErw95PC4sBAwEmP3FX3oSEhFAFwY1DGX6SJ7.json_\n\nYour account has been successfully created, and you will see it listed on your \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts)\" page.\n\n* * *\n\nIf you are more of a visual type, check this video guide:\n\n[Creating Accounts, Downloading JSON Backup Files, and Changing Passwords on the UI and Extension](https://www.youtube.com/watch?v=DNU0p5G0Gqc)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-multisig-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-multisig-account/#basics-of-multisigs", "page_title": "How to Create and Use a Multisig Account", "index": 0, "depth": 3, "title": "Basics of multisigs", "anchor": "basics-of-multisigs", "start_char": 519, "end_char": 2349, "estimated_token_count": 388, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e9f91c606154ad04ab8816243c3f4e7a6f20d2a72f28f0cc6db675147e0d2c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Basics of multisigs\n\nA multisig account consists of two parts:\n\n1\\. The signatories.\n\n2\\. The threshold.\n\nThe signatories are the different accounts that constitute the multisig and can be from 2 to 100. This is the number of accounts that can issue transactions from the multisig if an adequate number of the other signatories agree.\n\nThe threshold is the number of signatories that need to approve a transaction for it to happen. Usually, it is at least the majority of the signatories. The minimum threshold can be 2, and the maximum is the number of signatories.\n\nSo, suppose a multisig has, for example, 5 signatories and a threshold of 3. In that case, it's a 3-of-5 multisig, which means that from the five signatories, three need to approve a transaction for it to happen (including the one who initiated the transaction).\n\nIt's **important** to make clear that multisig accounts don't have a mnemonic phrase or private key of their own. They are controlled exclusively by the signatories. Also, the same set of signatories with the same threshold will always produce the same multisig.\n\nFinally, the signatories of a multisig can be any kind of account. They can be a simple account in the Polkadot Developer Signer or a Ledger account controlled by a single person; they can be multisigs themselves, pure proxies, etc. However, the more complex the setup, the more complex it becomes to sign transactions for the multisig. In this article, all signatories are assumed to be simple accounts controlled by one person each.\n\n!!! warning \"IMPORTANT\"\n\n    Once a multisig account is created, you **cannot change** neither the signatories, nor the threshold. If you need to be able to do that, a more complex setup that uses [pure proxies](../learn-proxies-pure.md) is required, but this article won't cover that.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-multisig-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-multisig-account/#who-are-they-useful-for", "page_title": "How to Create and Use a Multisig Account", "index": 1, "depth": 3, "title": "Who are they useful for?", "anchor": "who-are-they-useful-for", "start_char": 2349, "end_char": 4052, "estimated_token_count": 361, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e9f91c606154ad04ab8816243c3f4e7a6f20d2a72f28f0cc6db675147e0d2c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Who are they useful for?\n\nOrganizations are usually the ones that utilize multisigs the most. That's because in an organization, usually, a single person shouldn't be able to manage the organization's funds, but instead, several people, the board of directors, for example, need to agree to a transaction.\n\nIn this case, the organization can create a multisig account, where the signatories are the members of the board, and the threshold is the specific number of directors who need to agree for a transaction to happen.\n\nThese are usually N-of-M multisigs, where the threshold is less than the total number of signatories.\n\nBut multisigs can be used for personal accounts as well. In that case, they offer more security. For example, instead of keeping your funds in a Ledger account (which is very secure on its own), you want more security, so you store them in a 3-of-3 multisig that consists of your Ledger account, an account on Polkadot Vault, and an account on Polkadot Developer Signer. Or on three separate Ledger devices. So, in this scenario, your funds can get compromised only if **all three** of these accounts are compromised. Triple the security.\n\nObviously, signing transactions with such an account is more cumbersome, so you need to find the right balance between security and usability that meets your needs.\n\nThese multisigs are usually N-of-N, meaning that all signatories are needed to approve a transaction because all of them are controlled by the same person, and the goal is more security.\n\n!!! danger \"READ THIS FIRST!\"\n\n    If you create a N-of-N multisig and you lose access to even one of the signatory accounts, **you lose access to the multisig as well.**\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-multisig-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-multisig-account/#how-to-create-a-multisig-account", "page_title": "How to Create and Use a Multisig Account", "index": 2, "depth": 3, "title": "How to create a multisig account", "anchor": "how-to-create-a-multisig-account", "start_char": 4052, "end_char": 6087, "estimated_token_count": 568, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e9f91c606154ad04ab8816243c3f4e7a6f20d2a72f28f0cc6db675147e0d2c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "###  How to create a multisig account\n\nSuppose Alice, Bob, and Charlie want to create a 2-of-3 multisig to manage their startup's funds jointly. Here's how it's done.\n\n1\\. They first need to add everyone else's account in their Address Book on Polkadot Developer Interface. This example plays as Alice, but the other two need to do the same. Obviously, everyone is assumed to have access to their own account on the Accounts page.\n\nOn Polkadot Developer Interface, go to \"Accounts\" > \"[Address Book](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/addresses)\":\n\n![](../../assets/how-to/65016359535.png)\n\n2\\. Click the \"Add contact\" button on the right side. Enter Bob's address and give the contact a name. Then click \"Save\":\n\n![](../../assets/how-to/65016359589.png)\n\n3\\. This will add Bob's account as a _read-only_ account, and you do the same for Charlie's account. In the end, you should have both accounts in your Address book:\n\n![](../../assets/how-to/65016359625.png)\n\n!!! info\n\n    If you are creating a multisig for your personal use, only with accounts you already control yourself, you don't need to add them to the Address Book. They are already in your Accounts page.\n\n4\\. Now it's time to create the multisig account. All three signatories need to do this process to add the multisig to their Accounts page.\n\nGo to the \"Accounts\" page and click on the \"+ Multisig\" button:\n\n![](../../assets/how-to/65016358580.png)\n\n5\\. In the window that opens up, click on Alice's, Bob's, and Charlie's accounts under the \"Available signatories\" column, moving them over to the \"Selected signatories\" column:\n\n![](../../assets/how-to/65016359678.png)\n\n6\\. Then enter the threshold. Since this is a 2-of-3 multisig, leave it at the default value of 2. If you wanted to create a 3-of-3 multisig, you'd need to change it to 3.\n\n7\\. Finally, name the multisig account and click the \"Create\" button.\n\n8\\. The multisig account is created. You can see it on the Accounts page:\n\n![](../../assets/how-to/65016359704.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-multisig-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-multisig-account/#how-to-use-a-multisig-account", "page_title": "How to Create and Use a Multisig Account", "index": 3, "depth": 3, "title": "How to use a multisig account", "anchor": "how-to-use-a-multisig-account", "start_char": 6087, "end_char": 9773, "estimated_token_count": 901, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e9f91c606154ad04ab8816243c3f4e7a6f20d2a72f28f0cc6db675147e0d2c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to use a multisig account\n\nNow that the multisig is created and funded, Alice, Bob, and Charlie want to make a transaction.\n\nWhenever a multisig transaction (call) is initiated, whoever initiated it must **reserve a deposit** of a little more than 0.2 DOT. The exact amount depends on how large is the threshold of the multisig. If you want to know exactly how much it is and how it's calculated, you can check [this article](../learn-account-multisig.md). This reserve is released when the transaction is approved or canceled. The rest of the signatories don't need to reserve a deposit.\n\nThis is done to prevent bloating of the chain state from multisig calls that are initiated but never completed. So, whoever plans to initiate calls needs to have at least 0.25 DOT transferable balance in their account to be able to pay for the deposit.\n\nHere's how it's done. In this example, the Westend testnet is used, but the process is the same on Polkadot.\n\n1\\. Alice is the one that initiates the transaction, which is a balance transfer of 1 WND to Michalis. Do that like any other [balance transfer](transfer-funds.md) from the multisig account:\n\n![](../../assets/how-to/65016359725.png)\n\n2\\. Click on \"Make Transfer,\" and the following screen appears:\n\n![](../../assets/how-to/65016359771.png)\n\nHere, you can see:\n\n  * The sender account, the multisig.\n  * The signatory signing the transaction, Alice.\n  * And the multisig call data, which you need to copy.\n\n3\\. Copy \"multisig call data\" and share it with Bob and Charlie. They'll need this information to finalize the call. Then click \"Sign and Submit.\"\n\n4\\. Once the extrinsic is signed, the multisig call is initiated, and some funds (a little more than 0.2 DOT on Polkadot) are reserved in Alice's account. Also, an icon appears next to the multisig account, indicating there's a pending call that needs approval.\n\n![](../../assets/how-to/65016359904.png)\n\n5\\. Bob sees this, hovers over the icon, and clicks on \"View pending approvals.\" The following screen appears:\n\n![](../../assets/how-to/65016360004.png)\n\nHere, he can see:\n\n  * The depositor who initiated the call, Alice.\n  * Existing approvals: 1 out of 2, Alice.\n  * The signatory that is signing this approval, Bob.\n  * And the place for the multisig call data to be pasted.\n\n6\\. Since this is a 2-of-3 multisig, only one more approval is needed to issue the transaction, so in this case, the second approval is also the final one. The signatory providing the final approval must paste the \"multisig call data\" provided by the initiator (depositor) to finalize the call. So, Bob pastes the call data Alice shared and clicks \"Approve.\"\n\nIf the threshold were higher than 2, then the intermediary signatories wouldn't need to paste the call data; they would approve without it. Only the final signatory needs the call data to provide the final approval.\n\nThis switch is **automatically** enabled or disabled based on whether this is the final approval and **should not be changed.**\n\n7\\. Before signing the transaction, Bob wants to verify what exactly he's signing and ensure Alice didn't make a mistake. He goes to \"Developer\" > \"Extrinsics\" and goes to the tab \"Decode.\" There he pastes the multisig call data and can see exactly what the transaction is from the multisig account he's about to approve:\n\n![](../../assets/how-to/65016360053.jpeg)\n\n8\\. Satisfied that everything is in order (keep in mind that, depending on the call, the value above may be displayed in [Planck](../learn-DOT.md#the-planck-unit)), Bob gives the final approval, and the balance is transferred. Also, Alice's deposit is unreserved:\n\n![](../../assets/how-to/65016360064.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-multisig-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-multisig-account/#how-to-cancel-a-multisig-call", "page_title": "How to Create and Use a Multisig Account", "index": 4, "depth": 3, "title": "How to cancel a multisig call", "anchor": "how-to-cancel-a-multisig-call", "start_char": 9773, "end_char": 11006, "estimated_token_count": 311, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2e9f91c606154ad04ab8816243c3f4e7a6f20d2a72f28f0cc6db675147e0d2c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to cancel a multisig call\n\nSuppose Alice (or Bob or Charlie) realizes that she made a mistake when issuing the extrinsic, and they want to cancel it. This needs to happen before the call is finalized, and **only the initiator (depositor) of the call can cancel it.** Here's how:\n\n1\\. Click on \"View pending approvals,\" as explained above.\n\n2\\. On the modal that opens up, click on the \"Approval type\" drop-down menu and select \"Cancel this call hash.\" Then click \"Reject.\" This will cancel the multisig call and release the reserved deposit in Alice's account.\n\n**Reminder:**  Only the signatory who initiated the call can do that.\n\n![](../../assets/how-to/65016360096.png)\n\n* * *\n\nIn this article, you learned how to create and use a multisig account and what they're useful for. If you want to learn more about multisigs, you can check [this article](../learn-account-multisig.md).\n\nIf you are more of a visual learner, check these video guides:\n\n  * [Start using your Multisig Account with the Polkadot Developer Interface](https://www.youtube.com/watch?v=-cPiKMslZqI)\n  * [Use your Multisig Accounts like a Pro with the Polkadot Developer Interface (Advanced Tutorial)](https://www.youtube.com/watch?v=T0vIuJcTJeQ)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-polkadot-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-polkadot-account/#user-friendly-wallets", "page_title": "How to Create a Polkadot Account", "index": 0, "depth": 3, "title": "User-friendly wallets", "anchor": "user-friendly-wallets", "start_char": 625, "end_char": 1836, "estimated_token_count": 298, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:16be6c668cc433d3f72d8325f21091fac3e147f016168a2cf41572f2499c2f61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### User-friendly wallets\n\n!!! tip \"GOOD TO KNOW\"\n\n    The wallets mentioned in this section are highly recommended most users, specially for newcomers. They provide identical functionalities and security standards, but the interface and user experience are tailored for everyday use.\n\nOn the [wallet options page](where-to-store-dot.md), you can find articles about some wallets well-regarded by the community, describing some of their basic features like creating an account, receiving and sending funds, staking, etc.\n\nThe following articles guide you through the process of creating a Polkadot account using these user-friendly wallets:\n\n  * [Talisman Wallet: How to Create an Account](https://docs.talisman.xyz/talisman/start/installing-talisman/create-a-new-account)\n  * [Nova Wallet: How to Create an Account](https://docs.novawallet.io/nova-wallet-wiki/wallet-management/create-a-new-wallet)\n  * [Subwallet: How to Create an Account](https://docs.subwallet.app/main/mobile-app-user-guide/account-management/create-a-new-account-with-new-seed-phrase)\n  * [PolkaGate: How to Create an Account](https://docs.polkagate.xyz/polkagate/polkagate-extension-user-guide/create-account/create-new-account)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-polkadot-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-polkadot-account/#hardware-wallets", "page_title": "How to Create a Polkadot Account", "index": 1, "depth": 3, "title": "Hardware wallets", "anchor": "hardware-wallets", "start_char": 1836, "end_char": 2460, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:16be6c668cc433d3f72d8325f21091fac3e147f016168a2cf41572f2499c2f61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Hardware wallets\n\nBy creating your Polkadot account using a hardware wallet, you would take advantage of the highest security standards in the industry to store your assets while you can still access and use your Polkadot account whenever you wish.\n\nHere are two articles on how to create your account in Polkadot Vault (rebranding from Parity Signer) and Ledger:\n\n  * [Polkadot Vault](vault-create-account.md) (former [Parity Signer](parity-signer-create-account.md))\n  * [Ledger: Create a Polkadot (DOT) account in Ledger Live](https://support.ledger.com/hc/en-us/articles/360016289919-Polkadot-DOT?docs=true)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-polkadot-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-polkadot-account/#wallet-for-advanced-users", "page_title": "How to Create a Polkadot Account", "index": 2, "depth": 3, "title": "Wallet for advanced users", "anchor": "wallet-for-advanced-users", "start_char": 2460, "end_char": 6369, "estimated_token_count": 954, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:16be6c668cc433d3f72d8325f21091fac3e147f016168a2cf41572f2499c2f61", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Wallet for advanced users\n\nThe following wallets are oriented toward **developers and advanced users** :\n\n  * Polkadot Developer Signer - This is the wallet covered in this article\n  * [Polkadot Developer Interface](create-account.md)\n  * [Subkey (needs technical knowledge)](create-account-subkey.md)\n\n#### **How to create an account with the Polkadot Developer Signer**\n\n!!! warning \"IMPORTANT\"\n\n    The Polkadot Developer Signer is an account manager meant for power users and developers. There are several user-friendly browser extensions that support a lot of features right from the extension. Discover them in [this article](where-to-store-dot.md) and check how to create a Polkadot account with them in the section above.\n\nNo matter the [type](../learn-account-advanced.md) of your account, add your accounts through a browser extension, as it has many advantages:\n\n  * You can use your accounts with any compatible app in the ecosystem, not just the Polkadot Developer Interface.\n  * It provides better security than using a web UI directly.\n  * Your browser won't \"forget\" your accounts if its cookies are cleared.\n\n!!! tip \"GOOD TO KNOW\"\n\n    You will still need to use the Polkadot Developer Interface to use your accounts and issue transactions. The Polkadot Developer Signer is an account manager, not a wallet, and it needs a UI to interact with.\n\n1\\. Install the Polkadot Developer Signer. It is available for both [Google Chrome](https://chrome.google.com/webstore/detail/polkadot%7Bjs%7D-extension/mopnmbcafieddcagagdcbnhejhlodfdd) (and Chromium-based browsers like Brave) and [Firefox](https://addons.mozilla.org/en-US/firefox/addon/polkadot-js-extension/).\n\n\n\n2\\. After installing the extension, you should see the orange and white Polkadot Developer Signer logo in your browser's menu bar. If you don't, click on the little puzzle icon to pin it. Then click it to open the extension:\n\n![](../../assets/how-to/65012434240.png)\n\n3\\. Click the big plus button, or select \"Create new account\" from the small plus icon in the top right.\n\n4\\. A new mnemonic phrase of twelve words will be generated for you. **Make sure to[save the mnemonic phrase safely](store-mnemonic-safely.md) now**, as there is no way to view it after the account is created.\n\n![](../../assets/how-to/65012434372.png)\n\n!!! danger \"READ THIS FIRST!\"\n\n    **[Keep your mnemonic phrase secret and safe!](store-mnemonic-safely.md) Anyone who knows it can have full access to your account!**\n\n5\\. Once you have saved your mnemonic phrase, mark that you have saved it safely and proceed to the next step.\n\n6\\. Give your account a descriptive name. It's for your use only and won't be visible to other users.\n\n![](../../assets/how-to/65012434428.png)\n\n!!! tip \"GOOD TO KNOW\"\n\n    At this point you can choose to use the account on any chain or allow it for a specific chain only, from the drop-down menu. Read [this article](../learn-account-advanced.md) for more details.\n\n7\\. Set a password for your account. You'll need to enter this password when signing any transaction with your account, like sending funds out. Use only Latin letters, numbers, and symbols. It's important you remember your password. There is no way to recover it later.\n\n!!! danger \"READ THIS FIRST!\"\n\n    The password isn't stored anywhere and can't be recovered for you. It's only used to encrypt your account locally on your computer. It does **not** protect your mnemonic phrase.\n\n8\\. Confirm your password and add the account.\n\nYou're all set. Refresh the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page on the Polkadot Developer Interface and you should see your account.\n\n* * *\n\nTo see the whole process of creating an account using the Polkadot Developer Signer, please watch this video tutorial.\n\n[Create an Account using Polkadot Developer Signer](https://www.youtube.com/watch?v=sy7lvAqyzkY)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-proxy-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-proxy-account/#setting-proxies", "page_title": "How to Create a Proxy Account", "index": 0, "depth": 3, "title": "Setting Proxies", "anchor": "setting-proxies", "start_char": 346, "end_char": 1875, "estimated_token_count": 427, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8e2286955eabedea59d889900da961ce9a41fd8bfa2f3eef725e3b0f1e372f1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Setting Proxies\n\n1\\. To set up a proxy account on the [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/explorer), navigate to the \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts)\" page and click on the three vertical dots next to the account you'd like to select.\n\n!!! warning \"IMPORTANT\"\n\n    The assignment of a proxy account in Polkadot or Kusama requires an initial deposit of 0.2004 DOT or 0.00667999998 KSM, plus 0.00033 DOT or 0.000010999989 KSM, respectively, for each proxy account added. This deposit is returned when the proxy is removed.\n\n    The deposit is deducted from your account's free balance, which after the deduction will need to be larger than the [existential deposit](existential-deposit.md), otherwise the call will fail.\n\n2\\. Next, select \"**Add proxy** .\"\n\n![](../../assets/how-to/65031208535.png)\n\n3\\. Select the \"**Add proxy\"** button again in the menu below. This will allow you to select or paste the account that will act as a proxy and the type of proxy it will be.\n\n![](../../assets/how-to/65031208504.png)\n\n4\\. Sign and submit the transaction. The proxy account will then be assigned, and is denoted with a blue symbol on the \"Accounts\" page:\n\n![](../../assets/how-to/65031345504.png)\n\n!!! tip \"GOOD TO KNOW\"\n\n    You can't create a pure proxy type from the \"Accounts\" page; to do this you must be on the \"Extrinsics\" page. To create a pure proxy, follow [these steps](create-pure-proxy.md) instead.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-proxy-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-proxy-account/#removing-proxies", "page_title": "How to Create a Proxy Account", "index": 1, "depth": 3, "title": "Removing Proxies", "anchor": "removing-proxies", "start_char": 1875, "end_char": 2529, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8e2286955eabedea59d889900da961ce9a41fd8bfa2f3eef725e3b0f1e372f1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Removing Proxies\n\nThere are two ways to clear proxies using the UI. The first is by clicking the blue symbol to select \"**Proxy overview**.\"\n\n![](../../assets/how-to/65031345592.png)\n\nThe second is by selecting the menu next to your account and clicking \"**Manage proxies** \" where \"Add Proxy\" used to be:\n\n![](../../assets/how-to/65031345593.png)\n\nEither method will present the same menu, in which you can remove individual proxy accounts, or clear all of them at once:\n\n![](../../assets/how-to/65031345610.png)\n\n!!! info\n\n    Note that to remove the proxy, the extrinsic must be signed with the proxied account or its proxy of type \"Any.\"\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-proxy-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-proxy-account/#types", "page_title": "How to Create a Proxy Account", "index": 2, "depth": 3, "title": "Types", "anchor": "types", "start_char": 2529, "end_char": 3945, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8e2286955eabedea59d889900da961ce9a41fd8bfa2f3eef725e3b0f1e372f1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Types\n\nPolkadot offers different types of proxies you can set, depending on the permissions use case. You can create the following types with the [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts), among others:\n\n  * Any - this proxy type has permission to make any type of transaction, including balance transfers.\n\n  * Non-transfer - this proxy type will allow any type of transaction except for balance transfers.\n\n  * Governance - proxies of this type can make transactions related to governance (ConvictionVoting pallet, Treasury pallet, etc).\n\n  * Staking - these proxies allow staking-related transactions. Not to be confused with the soon-to-be-deprecated _controller_ accounts, which are needed for certain transactions. Staking proxies are meant to allow you to access your stash account less frequently.\n\nFor more proxy types, visit the [Proxy Types](../learn-proxies.md#proxy-types) article.\n\nSee more in-depth info about proxies [in this article](../learn-proxies.md).\n\n!!! warning \"ATTENTION\"\n\n    Controller accounts are being deprecated. You can still use existing ones for now, but creating new ones is no longer possible.\n\n    It is recommended to set your stash account as its own controller (described in [this article](change-controller-account.md)) and create a staking proxy to obtain the same benefits and greater flexibility.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-proxy-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-proxy-account/#what-are-they-useful-for", "page_title": "How to Create a Proxy Account", "index": 3, "depth": 3, "title": "What are they useful for?", "anchor": "what-are-they-useful-for", "start_char": 3945, "end_char": 5018, "estimated_token_count": 223, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a8e2286955eabedea59d889900da961ce9a41fd8bfa2f3eef725e3b0f1e372f1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What are they useful for?\n\nProxies are helpful for a few specific purposes because they add a layer of security. Rather than using funds in one sole account, smaller accounts with unique roles complete tasks for the main stash account.\n\nFor example, perhaps the owner of an account, Ferdie, wishes to delegate certain actions to her friend, such as decisions around Polkadot OpenGov. Rather than hand over her seed phrase, which would give that person full control over the account (and the ability to run away with the funds), they can instead create a governance proxy and set their friend's account as the proxy account. The proxy account won't be able to submit other types of extrinsics such as balance transfers. This allows Ferdie to give her friend permission to execute governance transactions (for example, voting, referenda creation, etc.) on her behalf, in a more trustless manner.\n\n* * *\n\nCheck out this video, which explains proxy accounts in more detail:\n\n[What are Proxy Accounts on Polkadot Network?](https://www.youtube.com/watch?v=1tcygkq52tU)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-pure-proxy", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-pure-proxy/#setting-a-pure-proxy", "page_title": "How to Create a Pure Proxy", "index": 0, "depth": 3, "title": "Setting a Pure Proxy", "anchor": "setting-a-pure-proxy", "start_char": 868, "end_char": 3942, "estimated_token_count": 714, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:10e70f0055067130c24b9ee5b501a6d20100d83778a2158f66ffa7ec3aa25ab9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Setting a Pure Proxy\n\n1\\. To set a pure proxy, head to the Polkadot Developer Interface and navigate to the \"Developer\" > \"[Extrinsics](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/extrinsics)\" tab. A page should display similar to this:\n\n![](../../assets/how-to/65015289747.png)\n\n2\\. Select the proxy type, and add a delay (in block height) if necessary. The index will typically always remain at 0. Sign and submit the transaction to create the pure proxy account.\n\n!!! danger \"READ THIS FIRST!\"\n\n    The first pure proxy you add should always be of _type_ **Any**. Also, if there are multiple pure proxies for the proxied account, you should keep at least _one_ **Any** type. Without having an **Any** type proxy, you won't be able to send funds, add new proxies, kill the pure proxy, or take any action not specifically allowed by the types of the proxies that have been set up for the account.\n\n* * *\n\n#### **Time Delayed Proxies**\n\nThe _delay: u32_ field allows you to set a delay for each call that the proxy account makes. You can enter this value in blocks. For example, if you create a proxy with a delay value of 100 blocks, proxy calls made by this account will take approximately 10 minutes to execute (100 * 6 (seconds) = 600 seconds). Within this delay time frame, the origin account is able to reject the announcement from the proxy account. If your intention is to create a normal proxy account, use the default value of 0.\n\n* * *\n\n#### **Types**\n\nPolkadot offers different types of proxies you can set, depending on the permissions use case. You can create the following types with the [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts):\n\n  * Any – this proxy type has permission to make any type of transaction, including balance transfers.\n\n  * Non-transfer – this proxy type will allow any type of transaction except for balance transfers.\n\n  * Governance – proxies of this type can make transactions related to governance (ConvictionVoting pallet, Treasury pallet, etc).\n\n  * Staking – these proxies allow staking-related transactions. Not to be confused with the soon-to-be-deprecated _controller_ accounts, which are needed for certain transactions. Staking proxies are meant to allow you to access your stash account less frequently.\n\n  * Identity Judgement – proxies that are in charge of allowing registrars to make judgement on an account's identity. See more information [here](../learn-identity.md#judgements).\n\nSee more in-depth info about proxies [in this article](../learn-proxies.md).\n\n!!! warning \"ATTENTION\"\n\n    Controller accounts are being deprecated. You can still use existing ones for now, but creating new ones is no longer possible.\n\n    It's recommended to set your stash account as its own controller (described in [this article](change-controller-account.md)) and create a staking proxy to obtain the same benefits and greater flexibility.\n\n    Check out the article on [creating a proxy account](create-proxy-account.md) for more information.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-pure-proxy", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-pure-proxy/#removing-a-pure-proxy", "page_title": "How to Create a Pure Proxy", "index": 1, "depth": 3, "title": "Removing a Pure Proxy", "anchor": "removing-a-pure-proxy", "start_char": 3942, "end_char": 5660, "estimated_token_count": 454, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:10e70f0055067130c24b9ee5b501a6d20100d83778a2158f66ffa7ec3aa25ab9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Removing a Pure Proxy\n\nThe procedure for removing a Pure Proxy is different, and there are a few functions on the extrinsics page that will help to accomplish this. The following steps can be used to remove your pure proxy:\n\n1\\. Use a block explorer to find the following information:\n\n  * The **account** you created the pure proxy from\n\n  * **Type of proxy** , and index (almost always 0)\n\n  * **Block height** it was created at\n\n  * The **extrinsic index** on the block (on most block explorers, you'll see the extrinsic ID listed as something along the lines of \"11111111-2.\" 11111111 is the block height (block number), and 2 is the extrinsic index.\n\n![](../../assets/how-to/65015290063.png)\n\n2\\. Navigate to the [accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page and make sure you're on the correct network. Click \"**Proxied** \" and add your address; name it PURE PROXY. You should now see this address in your accounts.\n\n![](../../assets/how-to/65015290117.png)\n\n3\\. Navigate to the \"Developer\" > \"[Extrinsics](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/extrinsics)\" page.\n\n4\\. You need to remove the proxy _from_ the pure proxy. It's important to note that pure proxies _work backward_ in that the original account acts as the proxy. Call the extrinsic '**proxy.killPure** ' using the selected account PURE PROXY with the following parameters:\n\n  * _Spawner_ (original account)\n\n  * _Proxy type_ (kind of proxy)\n\n  * _Index 0_ (almost always, but this can be found on the block explorer in the original extrinsic)\n\n  * _Block number x_\n\n  *  _Extrinsic index y_\n\n![](../../assets/how-to/65015290192.png)\n\n5\\. Submit and sign the extrinsic.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-pure-proxy", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-pure-proxy/#what-are-they-useful-for", "page_title": "How to Create a Pure Proxy", "index": 2, "depth": 3, "title": "What are they useful for?", "anchor": "what-are-they-useful-for", "start_char": 5660, "end_char": 6600, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:10e70f0055067130c24b9ee5b501a6d20100d83778a2158f66ffa7ec3aa25ab9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What are they useful for?\n\nPure proxies, in particular, can be used for permissionless management. In the example below, there is a multisig with four different accounts inside. Two of the accounts, Alice and Bob, have a pure proxy attached to them. In the case that the multisig account wanted to add or remove Alice or Bob or even add a new account into the pure proxy, the pure proxy would take care of that change. If a multisig wanted to modify itself without a pure proxy, a whole new multisig would be created.\n\n![](../../assets/how-to/65013327265.png)\n\n* * *\n\nIf you are more of a visual learner, check these videos from the Tech Ed team. They show how to create and delete pure proxies and when you may want to use them:\n\n  * [Creating and Deleting Pure Proxies on Polkadot](https://www.youtube.com/watch?v=T443RcCYP24)\n  * [When and Why you can use Pure Proxies on Polkadot](https://www.youtube.com/watch?v=YkYApbhU3i0)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-vanity-address", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-vanity-address/#how-to-create-your-vanity-address", "page_title": "How to Create a Vanity Address", "index": 0, "depth": 3, "title": "How to create your vanity address", "anchor": "how-to-create-your-vanity-address", "start_char": 297, "end_char": 2936, "estimated_token_count": 694, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5959767be735f3a7840b93f8a32881c9cbb23a849adcc3d25a7f99796af634f1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to create your vanity address\n\n1\\. On the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page on Polkadot Developer Interface, click on the [Vanity generator](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts/vanity) tab.\n\n2\\. Enter the word, letter, or number combination you want your address to contain in the \"search for\" field. You can choose if you want it to be case-sensitive. You can also specify what type of account you'd like to generate: Edwards will allow you to find the address you want faster, but Schnorrkel is more secure. Once you've set the parameters, click the \"Start generation\" button.\n\n!!! info\n\n    The address format in Polkadot SDK-based chains is SS58, a modification of [Base58Check](https://en.bitcoin.it/wiki/Base58Check_encoding) from Bitcoin. This encoding does not allow characters that look the same in some fonts (i.e., 0OIl).\n\nThis example uses the word \"dot\":\n\n![](../../assets/how-to/65016177838.png)\n\n3\\. The vanity generator will produce a series of addresses, starting with _d_ , _do,_ and finally, _dot_. Note that it may take some time before the accounts appear, depending on the length of the combination you are searching for and the type you chose:\n\n![](../../assets/how-to/65012654115.png)\n\n**4\\. When you find an address you like, click the \"Save\" button on the right to claim this address. The accounts aren't saved if you don't choose to do this.**\n\nClicking the \"Save\" button will open a window to save your private key. In the vanity generator, only **Raw seed** is available for generated addresses. To ensure you can always restore your account, [save the raw seed safely.](store-mnemonic-safely.md)\n\n!!! warning \"IMPORTANT\"\n\n    **Do not switch to** **Mnemonic** when saving an account in the vanity generator. The mnemonic phrase generated will correspond to a **random account** and not the one you wanted to save.\n\nAfter you've saved your raw seed, click on the checkbox and then click \"Next\":\n\n![](../../assets/how-to/65012654131.png)\n\n5\\. Give your new account a name. An account name is only for your convenience and won't be displayed to anyone else. Set a [good password](store-mnemonic-safely.md) for your account. Then click \"Next\" again:\n\n![](../../assets/how-to/65012654136.png)\n\n6\\. You can save your account and download your JSON backup file on the following screen. Your JSON backup file is a secondary backup method, which, combined with the password you just set, will allow you to restore your account at any time in the future. You need to [store it safely](store-mnemonic-safely.md).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-create-vanity-address", "url": "https://developer.polkadot.com/wiki/learn/how-to/create-vanity-address/#recognizable-account-icons", "page_title": "How to Create a Vanity Address", "index": 1, "depth": 3, "title": "Recognizable account icons", "anchor": "recognizable-account-icons", "start_char": 2936, "end_char": 4026, "estimated_token_count": 288, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5959767be735f3a7840b93f8a32881c9cbb23a849adcc3d25a7f99796af634f1", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Recognizable account icons\n\nYou may have noticed that each Polkadot account has an icon like this:\n\n![](../../assets/how-to/65012654243.png)\n\nThese are also called identicons, and it is a visual representation of your account address. Your identicon is generated when you [create a new account on Polkadot](create-polkadot-account.md). It appears next to your address on your Accounts page on Polkadot-JS or a [block explorer](../learn-account-advanced.md).\n\nAlthough account identicons seem random, generating many accounts increases your chance of finding a recognizable account identicon. Like these:\n\n![](../../assets/how-to/65012654310.png)![](../../assets/how-to/65012654309.png)![](../../assets/how-to/65012654293.png)![](../../assets/how-to/65012654277.png)\n\nYou can use the vanity generator to generate multiple accounts and pick a memorable identicon from the list of generated addresses.\n\n!!! info\n\n    The look of the identicons can be changed to different styles. Check the article \"[How to Change the Style of Your DOT icon](change-dot-icon-style.md)\" to learn how.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-delegate-voting-power", "url": "https://developer.polkadot.com/wiki/learn/how-to/delegate-voting-power/#conviction-locks", "page_title": "How to Delegate Your Voting Power on Polkadot OpenGov", "index": 0, "depth": 3, "title": "Conviction locks", "anchor": "conviction-locks", "start_char": 973, "end_char": 2201, "estimated_token_count": 256, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4afcffbfdcc4e1e68d41f6d3c4a8bf1e28f9086c1ed9b3bf5ff1e08574deb927", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Conviction locks\n\nWhen you [vote in a referendum](vote-opengov.md), you can increase your voting power by locking your tokens for a longer period of time. This is known as the \"conviction lock.\" Similarly, you can choose the duration of the conviction lock you wish to apply to your delegation. Read about conviction locking in the article \"[Voluntary Locking](../learn-polkadot-opengov.md#voluntary-locking-conviction-voting).\"\n\nIt's important to highlight that the duration of the locking period of your balance depends on the conviction lock you chose when you delegated your vote, not the conviction used by your delegate. For example, if you delegated with a 1x conviction and your delegate votes with a 6x conviction, your balance will be locked for a duration equivalent to a 1x conviction.\n\n!!! warning \"IMPORTANT\"\n\n    Undelegating your voting power doesn't mean that your funds will be immediately accessible, even if your selected delegate never voted. Your voting balance will become available after the conviction lock period you applied to it has expired and only once you unlock it.\n\n    Learn how to unlock your referenda locks in \"[How to Remove Expired Referenda Locks](remove-referenda-locks.md)\"\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-delegate-voting-power", "url": "https://developer.polkadot.com/wiki/learn/how-to/delegate-voting-power/#delegate-on-the-polkadot-developer-interface", "page_title": "How to Delegate Your Voting Power on Polkadot OpenGov", "index": 1, "depth": 3, "title": "**Delegate on the Polkadot Developer Interface**", "anchor": "delegate-on-the-polkadot-developer-interface", "start_char": 2201, "end_char": 6254, "estimated_token_count": 981, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4afcffbfdcc4e1e68d41f6d3c4a8bf1e28f9086c1ed9b3bf5ff1e08574deb927", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Delegate on the Polkadot Developer Interface**\n\n1\\. Go to the [\"Governance\" > \"Referenda](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/referenda)\" tab on the Polkadot Developer Interface and click on the \"Delegate\" button:\n\n![](../../assets/how-to/65032406717.png)\n\n2\\. A new panel will show you the following options for your delegation:\n\n  * The account you will be delegating from (1).\n  * You can apply that delegation to every track by toggling the option for it (2).\n  * A list of tracks on \"Submission track\" (3) if you want to delegate on specific ones.\n  * The voting balance you will be delegating (4).\n  * The conviction lock (5). It's a multiplier to your voting balance, so these two determine the \"voting power\" you are delegating. The greater the conviction, the greater the voting power, and the longer the tokens will be locked for the referenda voted by your delegate.\n\n![](../../assets/how-to/65032407014.png)\n\n3\\. After you are done configuring your delegation settings, click \"Next,\" and a new panel will appear where you must select your delegate. You might have three options:\n\n  * Paste your delegate of choice in the \"Delegate to address\" field:\n\n![](../../assets/how-to/65032407103.png)\n\n  * The \"Validators\" button will be active if any of your accounts are nominating. You might select any of your nominated validators in case you want to delegate your voting power to them.\n\nAfter selecting an account, a brief overview of its Polkadot OpenGov activity will be displayed below it. This summary shows the number of votes of the account in each track, either for active referenda or for concluded referenda for which the account owner hasn't removed the expired locks. It also shows any tracks on which the account itself is delegating:\n\n![](../../assets/how-to/65032407268.png)\n\nThis information can help you identify the delegates who are or have been active in Polkadot OpenGov and determine if they themselves are delegating to others.\n\n!!! warning \"ATTENTION\"\n\n    Delegations don't propagate. If you delegate to an account which is already delegating on a track, your voting power won't be considered in any referenda on that track.\n\n4\\. When you are satisfied with your delegation, click 'Delegate,' and that's it. Your voting power will participate in every referendum your delegate votes on within the selected tracks.\n\n!!! warning \"IMPORTANT\"\n\n    If you voted on a track, you won't be able to delegate on the same track until the locking period has passed (or you remove and unlock your vote). Otherwise, you will get the error '[convictionVoting.AlreadyVoting](https://paritytech.github.io/polkadot-sdk/master/pallet_conviction_voting/pallet/enum.Error.html#variant.AlreadyVoting)'.\n\n#### **Undelegate on the Polkadot Developer Interface**\n\nIf you wish to stop delegating, whether because you want to vote personally or delegate to another account, you can remove your delegations for specific tracks from the \"Developer\" tab on Polkadot Developer Interface. Follow the steps below to proceed:\n\n1\\. Go to the [\"Developer\" > \"Extrinsic\"](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/extrinsics) tab on Polkadot Developer Interface:\n\n![](../../assets/how-to/65032407417.png)\n\n2\\. Select the account for which you want to remove an existing delegation (1), select 'convictionVoting' from the drop-down on the left (2), and 'undelegate(class)' from the one on the right (3). In the \"class\" field (4), enter the track index for which you want to undelegate (check [this page](../learn-polkadot-opengov-origins.md#origins-and-tracks-info) to learn the index of each track).\n\n![](../../assets/how-to/65032408487.png)\n\n3\\. Click on the \"Submit Transaction\" button, review and sign the transaction on your wallet, and that's it, you just undelegated all your voting power for the selected track.\n\n!!! warning \"ATTENTION\"\n\n    If you want to remove your delegation for several tracks, you need to individually execute the 'convictionVoting.undelegate' extrinsic for each one.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-error-frozen-cant-transfer", "url": "https://developer.polkadot.com/wiki/learn/how-to/error-frozen-cant-transfer/#error-when-sending-all-your-dot", "page_title": "Error 'Frozen' — I Can't Transfer All My DOT", "index": 0, "depth": 3, "title": "Error when sending all your DOT", "anchor": "error-when-sending-all-your-dot", "start_char": 923, "end_char": 2151, "estimated_token_count": 257, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:853811d4f1b714f404e9110b613b729ab5153e1c7f855bc7bb7ec0cc95e37f0b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Error when sending all your DOT\n\nThe native token DOT is usually responsible for keeping an account active by maintaining the [existential deposit](existential-deposit.md). However, there are also other assets known as “sufficient assets,\" such as USDC, USDT, or ETH, that can independently keep an account alive without relying on DOT.\n\nOther assets, such as DED or MYTH, are considered [non-sufficient assets](existential-deposit.md#native-sufficient-and-non-sufficient-assets), meaning they can't keep the account alive on their own on the Polkadot network. If the balance of DOT (or any other sufficient asset) falls below the ED, the account is reaped, becomes inactive, and all non-sufficient assets in it are destroyed. This situation is what the failed transaction and error message avoid.\n\nUnfortunately, not all wallets display every asset stored in an account. This can lead to confusion, and you might think you only hold DOT, while other assets like DED or MYTH are still present but hidden. In such cases, if you attempt to send all your DOT to another account, the transaction may fail. This prevents the deactivation of the account, which would otherwise destroy the remaining non-sufficient assets.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-error-frozen-cant-transfer", "url": "https://developer.polkadot.com/wiki/learn/how-to/error-frozen-cant-transfer/#how-to-prevent-the-frozen-error", "page_title": "Error 'Frozen' — I Can't Transfer All My DOT", "index": 1, "depth": 3, "title": "How to prevent the 'frozen' error", "anchor": "how-to-prevent-the-frozen-error", "start_char": 2151, "end_char": 2940, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:853811d4f1b714f404e9110b613b729ab5153e1c7f855bc7bb7ec0cc95e37f0b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to prevent the 'frozen' error\n\nIf you're using a wallet that doesn't support viewing or managing multiple assets on Polkadot (for example, Trust Wallet, Ledger Wallet, etc.), you have two options:\n\n  * **Leave a small balance of DOT** in your account to maintain the existential deposit and cover transaction fees. Keeping around 0.015 DOT should be enough. If you face a similar situation in Kusama, you can leave about 0.0002 KSM to keep the account active and pay for the transaction fees.\n  * **Restore or import your account using a different wallet** that supports multiple assets (for example, Nova Wallet, Talisman, Subwallet). Once you can see all your assets, transfer the non-sufficient assets (DED, MYTH, etc.) to another account before sending out all your DOT.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-error-key-pair", "url": "https://developer.polkadot.com/wiki/learn/how-to/error-key-pair/#error", "page_title": "Error: \"Unable to Retrieve Key Pair\"", "index": 0, "depth": 3, "title": "Error", "anchor": "error", "start_char": 408, "end_char": 707, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f49d623389b29273ad5b4d0bf722e19910da2057c43ffb384882b0d2582ab9f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Error\n\nAlthough uncommon, some users have reported the \"Unable to retrieve the key pair\" error. It happens when the account does not match the keypair stored for that particular address.\n\n![](../../assets/how-to/65016148589.png)\n\nBelow you will find a list of ways to troubleshoot this.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-error-key-pair", "url": "https://developer.polkadot.com/wiki/learn/how-to/error-key-pair/#possible-causes-and-solutions", "page_title": "Error: \"Unable to Retrieve Key Pair\"", "index": 1, "depth": 3, "title": "Possible causes and solutions", "anchor": "possible-causes-and-solutions", "start_char": 707, "end_char": 2967, "estimated_token_count": 535, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f49d623389b29273ad5b4d0bf722e19910da2057c43ffb384882b0d2582ab9f5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Possible causes and solutions\n\nThe error may be due to several reasons and situations. Below you will be guided through some of them and offered some possible solutions to the problem.\n\n#### **Are you using a Ledger hardware wallet?**\n\nMake sure your Ledger device is connected to your computer, it's unlocked, and the Polkadot app is open.\n\n#### **Troubleshoot the Polkadot Developer Signer**\n\nUpdate your browser to the latest version and then restart it.\n\n  1. Go to [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts). It's likely that you'll see a small \"1\" next to Settings. If that's the case, go to Settings > Metadata and click on \"Update metadata\".\n  2. Then go to the Accounts page and try sending again.\n\nIf that doesn't work, please do the following:\n\n  1. Open the extension and click on the gear icon on the top right.\n  2. Click on \"Manage Website Access\". Is [polkadot.js.org](https://polkadot.js.org/) listed there and enabled?\n  3. If it's not, try to enable it and then refresh the Accounts page and try sending again.\n  4. If it's not clickable, then go back, click on the gear again and click on \"Open extension in new window\".\n  5. Follow the same process to enable it.\n\n#### **Disable other extensions**\n****\n\nIf none of the above solved the issue, then there could be another extension interfering with the Polkadot Developer Signer. In order to troubleshoot this, disable them one by one and try again.\n\nStart with any Substrate extension (any wallet able to connect to Polkadot, Kusama or their parachains), and any crypto-related extensions to pinpoint exactly which extension is causing trouble.\n\n![](../../assets/how-to/65016148751.png)\n\n#### **Restore the account**\n\nIf the issue persists after trying the possible solutions above, it might be solved after restoring the account from your mnemonic phrase or the JSON file.\n\n!!! warning \"IMPORTANT\"\n\n    Do not remove the account from the Polkadot account before checking that you have access to its mnemonic phrase or JSON file and password.\n\nFollow the article \"[How to restore your account in the Polkadot Developer Signer](restore-account-signer.md)\" to restore your account back to the Polkadot Developer Signer.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-existential-deposit", "url": "https://developer.polkadot.com/wiki/learn/how-to/existential-deposit/#facts-to-know-about-the-existential-deposit", "page_title": "What is the Existential Deposit?", "index": 0, "depth": 3, "title": "Facts to know about the existential deposit", "anchor": "facts-to-know-about-the-existential-deposit", "start_char": 1335, "end_char": 2576, "estimated_token_count": 247, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7a19e67f1c78c16278558e9a38bc8fc101a298de6ff6aa66f3ed385da297ab3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Facts to know about the existential deposit\n\n  * Accounts that have never received a deposit aren't discoverable on block explorers.\n  * If you send funds lower than the ED to an empty account, the account won't receive the funds (nominators need to pay attention to this when collecting staking rewards, see below).\n  * If you send all (or almost all) of your funds out of an account, which will result in the remaining balance going under the ED, the account will be reaped, and any remaining funds will be burned.\n\n  * An account can be reactivated at any time. However, this won't bring back any previously burned funds.\n\n  * To protect yourself from accidentally slipping below the ED amount and losing your funds, ensure the remaining balance after the transaction stays above the ED. However, most of the wallets would display a warning if you try otherwise.\n\n  * Exchanges have their own minimum deposit requirements for **each** asset, usually slightly higher than the ED. Make sure to check with your exchange what these minimums are before sending any funds to it.\n  * There are other sufficient assets besides DOT or KSM that can contribute toward the existential deposit and keep an account alive, like USDC or ETH.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-existential-deposit", "url": "https://developer.polkadot.com/wiki/learn/how-to/existential-deposit/#how-to-prevent-going-below-the-existential-deposit", "page_title": "What is the Existential Deposit?", "index": 1, "depth": 3, "title": "How to prevent going below the existential deposit", "anchor": "how-to-prevent-going-below-the-existential-deposit", "start_char": 2576, "end_char": 3543, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7a19e67f1c78c16278558e9a38bc8fc101a298de6ff6aa66f3ed385da297ab3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to prevent going below the existential deposit\n\nMost native Polkadot and Kusama wallets will warn you if a transaction could cause your account to be reaped by leaving a balance below the existential deposit (0.01 DOT or 0.00000333333 KSM). However, if you want to keep your account alive, always ensure that the remaining balance after each transaction stays above the required existential deposit.\n\nPlease note that the existential deposit is spendable and that it simply keeps your account active. If you wish to deactivate your account, you can transfer out your entire balance at any time. You can also reactivate your account at any time by depositing at least the existential deposit.\n\n!!! warning \"ATTENTION\"\n\n    An account needs to be activated with the existential deposit before staking rewards can be sent to it. **DO NOT direct staking rewards to an inactive account.** If a reward is below 0.01 DOT, it won't arrive and you'll lose it.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-existential-deposit", "url": "https://developer.polkadot.com/wiki/learn/how-to/existential-deposit/#native-sufficient-and-non-sufficient-assets", "page_title": "What is the Existential Deposit?", "index": 2, "depth": 3, "title": "Native, sufficient, and non-sufficient assets", "anchor": "native-sufficient-and-non-sufficient-assets", "start_char": 3543, "end_char": 5891, "estimated_token_count": 501, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a7a19e67f1c78c16278558e9a38bc8fc101a298de6ff6aa66f3ed385da297ab3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Native, sufficient, and non-sufficient assets\n\nThere are three types of assets on Polkadot and Kusama:\n\n  * **Native asset** : The native asset for Polkadot is DOT, while for Kusama it is KSM. These are considered when determining if an account is active, as long as they are present over a certain amount (0.01 DOT or 0.000003333 KSM)\n  * **Sufficient asset** : These aren't native tokens, but they have been approved by governance to keep an account active if the account holds an amount above their designated existential deposit. A sufficient asset doesn't require the account to have any balance in the native token to be received.\n  * **Non-sufficient asset** : These aren't native tokens and can't maintain an account's activity on their own. To hold a non-sufficient asset in an account, the account needs to exist on-chain, which means it needs to have a balance in the native or sufficient asset at least as much as the existential deposit.\n\nCurrently, the sufficient tokens and foreign assets (native assets on other networks) in Polkadot Asset Hub are:\n\n  * USDC (asset ID: 1337)\n  * USDT (asset ID: 1984)\n  * ETH (foreign asset transferred via Snowbridge)\n  * WETH (foreign asset transferred via Snowbridge)\n  * KSM (foreign asset transferred via Polkadot <> Kusama bridge)\n  * USDC (foreign asset transferred via Snowbridge)\n  * USDT (foreign asset transferred via Snowbridge)\n\nSufficient tokens and foreign assets in Kusama Asset Hub are:\n\n  * RMRK (asset ID: 8)\n  * ETH (foreign asset transferred via Snowbridge)\n  * WETH (foreign asset transferred via Snowbridge)\n  * DOT (foreign asset transferred via Polkadot <> Kusama bridge)\n  * USDC (foreign asset transferred via Snowbridge)\n  * USDT (foreign asset transferred via Snowbridge)\n  * USDT (native asset ID: 1984). Discontinued.\n\n!!! warning \"ATTENTION\"\n\n    Anyone can create and name an asset on Asset Hub, which means many assets may share familiar names. However, that doesn't guarantee they're the real or official versions. To avoid scams, always verify the asset's unique ID before accepting or paying for it. For instance, the legitimate USDC on Asset Hub has the ID 1337, anything else is fake USDC.\n\n    If you don't know what the asset ID is for the token you're interested in, **contact the issuer** of the token and find out, before accepting any tokens.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-export-json-backup", "url": "https://developer.polkadot.com/wiki/learn/how-to/export-json-backup/#in-the-polkadot-developer-signer", "page_title": "How to Export Your JSON Backup File", "index": 0, "depth": 3, "title": "In the Polkadot Developer Signer", "anchor": "in-the-polkadot-developer-signer", "start_char": 702, "end_char": 1168, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bb52bab1f90927d77b413d29659ab909fcfaf5ac2367be238e07970ca40dbcc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### In the Polkadot Developer Signer\n\n1\\. To export your JSON backup file, click on the three dots to the right of your account and select \"Export Account\":\n\n![](../../assets/how-to/65015988233.png)\n\n2\\. Next, you will be asked for your account's password. Enter it, and click on the button to export the account.\n\n3\\. Finally, the JSON file will be downloaded to your default Downloads folder. Its filename will be like this:\n\n_[your account address].json_\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-export-json-backup", "url": "https://developer.polkadot.com/wiki/learn/how-to/export-json-backup/#export-all-accounts-in-the-polkadot-developer-signer", "page_title": "How to Export Your JSON Backup File", "index": 1, "depth": 3, "title": "Export all accounts in the Polkadot Developer Signer", "anchor": "export-all-accounts-in-the-polkadot-developer-signer", "start_char": 1168, "end_char": 2135, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bb52bab1f90927d77b413d29659ab909fcfaf5ac2367be238e07970ca40dbcc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "###  Export all accounts in the Polkadot Developer Signer\n\nThe Polkadot Developer Signer allows you to export all your accounts added to it in a single \"batch\" file.\n\n1\\. Click on the plus icon and select \"Export all accounts\":\n\n![](../../assets/how-to/65015988270.png)\n\n2\\. Enter a password for the batch JSON file.\n\n!!! warning \"ATTENTION\"\n\n    The password you enter in this step is for the batch JSON file **only.** You will need this password in order to restore your accounts from the JSON file.\n\n    This password is **unrelated** to the individual passwords of your accounts. After restoring from the batch file, each account will still need its own password to make transactions.\n\n3\\. The JSON file will be downloaded to your default Downloads folder. Its filename will be like this:\n\n_batch_exported_account_1641303451011.json_\n\nwhere the number at the end is a [Unix timestamp](https://en.wikipedia.org/wiki/Unix_time) of the time it was exported.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-export-json-backup", "url": "https://developer.polkadot.com/wiki/learn/how-to/export-json-backup/#on-the-polkadot-developer-interface", "page_title": "How to Export Your JSON Backup File", "index": 2, "depth": 3, "title": "On the Polkadot Developer Interface", "anchor": "on-the-polkadot-developer-interface", "start_char": 2135, "end_char": 3870, "estimated_token_count": 417, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bb52bab1f90927d77b413d29659ab909fcfaf5ac2367be238e07970ca40dbcc6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### On the Polkadot Developer Interface\n\n1\\. First, navigate to the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page of the Polkadot Developer Interface:\n\n![](../../assets/how-to/65015988470.png)\n\n2\\. Next, click the three dots to the right of the \"send\" button, and select \"Create a backup file for this account\":\n\n![](../../assets/how-to/65015988507.png)\n\nThis will only work for accounts that were [created directly on the Polkadot Developer Interface](create-account.md). Please check the sections above if you added your account through the Polkadot Developer Signer.\n\n3\\. You will be asked to enter the account's password, which will also be the JSON file's password.\n\n4\\. Finally, the JSON file will be downloaded to your default Downloads folder. Its filename will be like this:\n\n_[your account address].json_\n\n* * *\n\nThat's it. Your backup JSON file has been exported.\n\nIf you ever need to restore your accounts, you can do so with this file and the password. For more details on how to restore, check these articles:\n\n[How to restore your account in the Polkadot Developer Signer](restore-account-signer.md)\n\n[Polkadot Developer Interface: How to Restore Your Account](restore-account.md)\n\n* * *\n\nIf you prefer visual instructions, this video covers the creation of accounts and exporting the JSON file, as well as changing your password, both on the Polkadot Developer Interface and the Polkadot Developer Signer. The instructions for manually exporting the file from the Polkadot Developer Signer are at the 03:13 timestamp:\n\n[Creating Accounts, Downloading JSON Backup Files, and Changing Passwords on the UI and Extension](https://www.youtube.com/watch?v=DNU0p5G0Gqc&t=193s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-export-transaction-history", "url": "https://developer.polkadot.com/wiki/learn/how-to/export-transaction-history/#how-to-view-and-export-your-transaction-history", "page_title": "How to Export Your Transaction History in a .csv File", "index": 0, "depth": 3, "title": "How to view and export your transaction history", "anchor": "how-to-view-and-export-your-transaction-history", "start_char": 256, "end_char": 1535, "estimated_token_count": 330, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25ee47c7ed2ad3b993c5cc876a7c4cae17e9dc6abf3722f1560ee5823c8626ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to view and export your transaction history\n\n1\\. First, check [this article](block-explorers.md) on how to view your account's balance on a block explorer.\n\n2\\. In this example, we use Subscan. Click on the \"Transfers\" tab and then on \"View All (x) Transfers\":\n\n![](../../assets/how-to/65030158980.png)\n\n3\\. Next, scroll to the bottom of the page and click on the \"Download\" button.\n\n![](../../assets/how-to/65030158988.png)\n\n4\\. Verify you are human by filling in the reCAPTCHA, and the CSV file will be downloaded to your computer.\n\n!!! info \"Downloading your full history\"\n\n    The download button exports only the transactions shown on the current page, so you need to repeat the process for each page. To download your entire history in bulk, you need a [Subscan API key](https://support.subscan.io/) and to run a script against the API.\n\n#### **How to view and export your staking rewards**\n\nYour staking rewards will not automatically be included in the output file. However, you can export them exactly the same way by clicking on the \"Reward\" tab.\n\n#### **How to view and export your cross-chain transfers**\n\nSimilarly, if you want to view and export your transaction history to and from rollups, you can do it in the same way from the \"XCM transfer\" tab.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-find-copy-address", "url": "https://developer.polkadot.com/wiki/learn/how-to/find-copy-address/#how-to-copy-your-accounts-address-from-polkadot-developer-interface", "page_title": "Polkadot Developer Interface: How Can I Find (and Copy) my Address?", "index": 0, "depth": 3, "title": "How to copy your account's address from Polkadot Developer Interface", "anchor": "how-to-copy-your-accounts-address-from-polkadot-developer-interface", "start_char": 715, "end_char": 1640, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd33cc4919e604eeb4a5f9b8e196729841c507ddc477f2c000846ef6db83cbbf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to copy your account's address from Polkadot Developer Interface\n\nThere are two ways to copy your address:\n\n1\\. You can see your address by clicking on your account name. This will open a pop-up on the right, showing your DOT address, account name, balance, and other information. You can copy the address from there:\n\n![](../../assets/how-to/65016066495.png)\n\n2\\. You can copy your address quicker by clicking on your account icon. Every account has its own icon, also called an identicon:\n\n![](../../assets/how-to/65016066523.png)\n\nHover over this icon, and you'll see a green plus next to your cursor. To copy your address, just click on the identicon. A checkmark will appear in the top right corner to indicate that the address was copied:\n\n![](../../assets/how-to/65016066721.jpeg)\n\nOnce copied, you can paste your account address into a text file, a block explorer, or anywhere else you want to view it.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-ledger-confirm-address", "url": "https://developer.polkadot.com/wiki/learn/how-to/ledger-confirm-address/#how-to-confirm-your-address-on-ledger", "page_title": "Ledger — How to Confirm the Account Address on Your Device", "index": 0, "depth": 3, "title": "How to confirm your address on Ledger", "anchor": "how-to-confirm-your-address-on-ledger", "start_char": 1272, "end_char": 2272, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6ce4cc7667695bf7fedc924071bdfd81fe17dc4c1212aa340bc1905bdc0059a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to confirm your address on Ledger\n\n!!! tip \"GOOD TO KNOW\"\n\n    This is available only if your Ledger account has been added directly on Polkadot Developer Interface (it will have a type of '_hardware')_. If it is added in the Polkadot Developer Signer or any other browser extension (type '_extension')_ , this functionality won't be available.\n\n1\\. On the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page on Polkadot Developer Interface, click on the three dots next to your Ledger account and select \"Show address on hardware device\":\n\n![](../../assets/how-to/65032425759.png)\n\n2\\. The \"Please review\" message will appear on your Ledger. Press the right button to see your address and compare it to the one shown in the UI or the one you just pasted to receive funds:\n\n![](../../assets/how-to/65032425761.jpg)\n\n3\\. Then press the right button again. Press both buttons on the \"Approve\" or \"Reject\" screen to discard the message on your device.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-ledger-import-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/ledger-import-account/#is-it-possible-to-import-my-account-to-ledger", "page_title": "Ledger: Can I Import an Existing Account from Polkadot Developer Interface to my Ledger Device?", "index": 0, "depth": 3, "title": "Is it possible to import my account to Ledger?", "anchor": "is-it-possible-to-import-my-account-to-ledger", "start_char": 402, "end_char": 1485, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:47d1fb9d6af482f67a9b07c853a3c6fbc0bb4d0d2739dba5aa0f47c141d08af8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Is it possible to import my account to Ledger?\n\nUnfortunately, the answer is no, it's not possible. Accounts created in Polkadot Developer Interface, the Polkadot Developer Signer, and other third-party ecosystem [wallets](where-to-store-dot.md), use a different [derivation mechanism](../learn-account-advanced.md#portability) than Ledger.\n\nThis means that if you were to restore your Ledger with the 12-word mnemonic phrase of your account, you wouldn't get the same account.\n\nBut even if it was possible, it wouldn't be recommended. A hardware wallet's security relies on the fact that the private keys are never, nor have ever been, exposed online. Restoring on Ledger an account that was previously online would severely compromise its security.\n\nFurthermore, if it is not a new device, restoring your Ledger with a mnemonic phrase other than the one you got when you first set it up would remove any previously created accounts on **all chains** , which means you would lose access to any accounts you had previously created on your Ledger, along with their funds!\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-ledger-import-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/ledger-import-account/#what-can-i-do", "page_title": "Ledger: Can I Import an Existing Account from Polkadot Developer Interface to my Ledger Device?", "index": 1, "depth": 3, "title": "What can I do?", "anchor": "what-can-i-do", "start_char": 1485, "end_char": 2098, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:47d1fb9d6af482f67a9b07c853a3c6fbc0bb4d0d2739dba5aa0f47c141d08af8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What can I do?\n\nThe best approach is to create a new account on your Ledger and [send all your funds](send-all-funds.md) from your existing account(s) to it.\n\nIf you have staked funds in your account, then you would need to unstake them first and wait until they are ready to be withdrawn. Here's how to unstake your funds:\n\n  * [Using the Staking Dashboard](../../general/dashboards/staking-dashboard.md)\n  * [Using Polkadot Developer Interface](unstake-tokens.md)\n\nThe unbonding process takes 1-2 days for nominators and 28 days for validators, and during that time you won't receive staking rewards.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-ledger-kusama-app", "url": "https://developer.polkadot.com/wiki/learn/how-to/ledger-kusama-app/#what-happened-with-the-kusama-app", "page_title": "Ledger: Can I Use the Ledger Polkadot App for Kusama?", "index": 0, "depth": 3, "title": "What happened with the Kusama app?", "anchor": "what-happened-with-the-kusama-app", "start_char": 1270, "end_char": 2147, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:423dcccad2e1702afa121920b7270f490fdabe1dc169d13404cfbcccc7217673", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What happened with the Kusama app?\n\nIn a few words, the standalone Kusama app is now obsolete. You must use either the \"Polkadot Migration\" app or the Polkadot app. Currently, there are now two scenarios you might face:\n\n  * If you previously used the Kusama app (v26.x, now obsolete), download and install the \"Polkadot Migration\" app from Ledger Live. This will allow you to access your Kusama account and operate on the Kusama network. Then, we recommend [migrating your funds](ledger-migrate-generic-app.md) to an account generated by the new Polkadot app for better long-term support.\n  * If you never used the old Kusama app, you can use the Polkadot app directly to interact with Kusama, without any additional steps. Connect your Ledger to any [compatible wallet](where-to-store-dot.md), and they will offer a friendly interface to interact with any network.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-ledger-send-dot", "url": "https://developer.polkadot.com/wiki/learn/how-to/ledger-send-dot/#how-to-send-dot-from-your-ledger-account", "page_title": "Polkadot Developer Interface: How to Send DOT from Your Ledger Account", "index": 0, "depth": 3, "title": "How to Send DOT from Your Ledger Account", "anchor": "how-to-send-dot-from-your-ledger-account", "start_char": 1029, "end_char": 3389, "estimated_token_count": 616, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c1bfd904e49cdfe22fbcaef72915bae36ca59abd8411fe79e197268a672d426c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to Send DOT from Your Ledger Account\n\nThe steps change slightly depending on whether your account is added [directly on the Polkadot Developer Interface](add-ledger-account.md) or [through the Polkadot Developer Signer](add-ledger-account-signer.md). We recommend adding your Ledger account through the extension for extra convenience and safety.\n\n1\\. Connect and unlock your Ledger and open the Polkadot app. Always remember to keep your app updated.\n\n![](../../assets/how-to/65015945810.png)\n\n2\\. Initiate the transfer from the Polkadot Developer Interface, either from the [\"Account\" tab](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) or from the top menu, as described in [this article](transfer-funds.md).\n\n3\\. When you reach the step to sign the transaction, you won't be asked for a password because Ledger accounts don't have one. Click \"Sign and Submit\":\n\n![](../../assets/how-to/65032472036.png)\n\n4\\. The modal will disappear, and on the top-right corner, a moving circle will appear, indicating there is a pending transaction, while the UI awaits confirmation from the Ledger device.\n\n![](../../assets/how-to/65032472101.png)\n\nYou can hover your mouse over the blue square to expand the entire message.\n\n![](../../assets/how-to/65032472144.png)\n\nIf your Ledger account is **not** in the Polkadot Developer Extension, skip to step 6.\n\n5\\. The pop-up window of the extension will appear. Click on \"Sign on Ledger.\" The button will become inactive while awaiting confirmation from the Ledger device.\n\n![](../../assets/how-to/65032477611.png)\n\n6\\. The \"Please review\" message will appear on your Ledger. Click on the right button to review the details of the transaction, then \"Approve\" (or \"Reject\") the transaction.\n\n![](../../assets/how-to/65015945733.png)\n\nTo learn more about how to verify what extrinsic you're signing with Ledger (and other account types), check [this article](verify-extrinsic.md).\n\nAnd that's it! After a few seconds, the transaction should be recorded and validated on-chain. You can check further details about it in any of the many [block explorers](block-explorers.md) in Polkadot.\n\n* * *\n\nIf you are more of a visual learner, check this video:\n\n[Transfer your Funds using Ledger Nano, Parity Signer, Polkadot-JS UI & Browser Extension](https://www.youtube.com/watch?v=gbvrHzr4EDY)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-ledger-sign-transaction", "url": "https://developer.polkadot.com/wiki/learn/how-to/ledger-sign-transaction/#signing-a-transaction-on-ledger", "page_title": "Ledger — How to Sign a Transaction", "index": 0, "depth": 3, "title": "Signing a transaction on Ledger", "anchor": "signing-a-transaction-on-ledger", "start_char": 809, "end_char": 2750, "estimated_token_count": 494, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58f905d7f026309050d6b7329cbdd5658be0925b2455a44599a57e5f311e5c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signing a transaction on Ledger\n\n!!! warning \"IMPORTANT\"\n\n    For most users, adding Ledger through the **Polkadot Developer Signer** is strongly recommended. [Click here to see the benefits and instructions.](add-ledger-account-signer.md)\n\nWhether you add your Ledger through the [Polkadot Developer Signer](add-ledger-account-signer.md) or directly on the[ Polkadot Developer Interface](add-ledger-account.md), you need a UI to interact with your accounts and initiate transactions.\n\n1. Connect your Ledger to the computer, unlock it, and open the Polkadot app:\n\n![](../../assets/how-to/65012721851.jpeg)\n\n2\\. On the Polkadot Developer Interface, initiate a transaction and click \"Sign and Submit\":\n\n![](../../assets/how-to/65032432187.png)\n\n3. **Skip this step if you added your Ledger directly to the Polkadot Developer Interface.** If you added your Ledger through the Polkadot Developer Signer, a new window would pop up:\n\n![](../../assets/how-to/65016332727.png)\n\nIt is the Polkadot Developer Signer asking you to sign a transaction. Click on the \"Sign on Ledger\" button. The button will grey out, awaiting confirmation from your Ledger device.\n\n4\\. The message \"Please review\" will appear on your Ledger device:\n\n![](../../assets/how-to/65012721854.jpeg)\n\nPress the right button to check the transaction details:\n\n[How can I verify what extrinsic I'm signing?](verify-extrinsic.md)\n\n5\\. After you have checked the transaction details, you will see \"Approve\" on your Ledger device. To sign the transaction, press both buttons on this screen:\n\n![](../../assets/how-to/65012721855.jpeg)\n\nTo reject the transaction, move to the next screen that says \"Reject\" and press both buttons to confirm:\n\n![](../../assets/how-to/65012721860.jpeg)\n\n6\\. You've signed the transaction. It will be included in the blockchain within a few seconds. You can now open any of the [block explorers](block-explorers.md) to view your transaction.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-ledger-sign-transaction", "url": "https://developer.polkadot.com/wiki/learn/how-to/ledger-sign-transaction/#cannot-sign-a-transaction", "page_title": "Ledger — How to Sign a Transaction", "index": 1, "depth": 3, "title": "Cannot sign a transaction?", "anchor": "cannot-sign-a-transaction", "start_char": 2750, "end_char": 4168, "estimated_token_count": 360, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:58f905d7f026309050d6b7329cbdd5658be0925b2455a44599a57e5f311e5c21", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cannot sign a transaction?\n\n#### **The new window doesn't appear**\n\nIf a new window doesn't pop up after you click \"Sign and Submit,\" please check if your browser blocked it:\n\n[![](../../assets/how-to/65012690426.png)](../../assets/how-to/65012680827.png)\n\nYou can allow pop-ups after you click on the blocked window icon.\n\nThe Polkadot Developer Signer icon in the toolbar will have a red number on it if you have unsigned transactions waiting. If you blocked or accidentally closed the window, click the extension icon to open it and proceed.\n\nIf you have added your Ledger directly to the Polkadot Developer Interface and not through the extension, no new window will appear. You can move to the next step of the guide.\n\n#### **My transaction failed**\n\nSigning a transaction means that it will be included in the blockchain. However, it doesn't always mean it will be executed. You can check the result of your transaction on a block explorer. Sometimes a transaction can't be executed, and it fails:\n\n![](../../assets/how-to/65012690425.png)\n\nPlease check [this article](why-cant-i-transfer-dot.md) to help you understand why your transaction failed, fix the issue, and send the transaction again.\n\n#### **I get an error**\n\nSeveral possible reasons can cause errors when signing a transaction on Ledger. If you can't resolve it, you can ask the [Polkadot community](../../general/community.md) for help.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-nomination-pools-guide", "url": "https://developer.polkadot.com/wiki/learn/how-to/nomination-pools-guide/#benefits-of-a-nomination-pool", "page_title": "Nomination Pools on the Polkadot Developer Interface", "index": 0, "depth": 3, "title": "Benefits of a Nomination Pool", "anchor": "benefits-of-a-nomination-pool", "start_char": 611, "end_char": 943, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e5703b72afa07fbee24007b9343cbd03632640048f809883b460afa391ce40a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Benefits of a Nomination Pool\n\nBenefits of joining a nomination pool:\n\n  * 1 DOT as minimum staking.\n  * No minimum to receive rewards (as low as 1 DOT can earn rewards).\n  * More control over rewards.\n  * The pool nominator will select validators on your behalf.\n  * Selected validators can attract more staking input.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-nomination-pools-guide", "url": "https://developer.polkadot.com/wiki/learn/how-to/nomination-pools-guide/#how-to-join-a-pool", "page_title": "Nomination Pools on the Polkadot Developer Interface", "index": 1, "depth": 3, "title": "How to Join a Pool", "anchor": "how-to-join-a-pool", "start_char": 943, "end_char": 2110, "estimated_token_count": 312, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e5703b72afa07fbee24007b9343cbd03632640048f809883b460afa391ce40a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to Join a Pool\n\nAny nominator can join a nomination pool. This article goes through the steps to do it using the Polkadot Developer Interface.\n\n!!! info\n\n    The convenience of being a member of a nomination pool may involve having to pay a commission set by the pool manager. Check the pool's commission before joining one.\n\n1. To join a nomination pool, navigate to the **Network > Staking Async > Pools** [page](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/pools) on the Polkadot Developer Interface and select the \"**\\+ Join** \" button next to the selected pool:\n\n!!! warning \"ATTENTION\"\n\n    Choose your nomination pool wisely. Before switching pools, a member must wait for the unbounding process: 1-2 days on Polkadot and 7 days on Kusama.\n\n!!! tip \"GOOD TO KNOW\"\n\n    An account can only be a member of one pool at a time.\n\n![](../../assets/how-to/65032558157.png)\n\n2\\. Enter the value you would like to contribute to the pool:\n\n![](../../assets/how-to/65032558212.png)3\\. Take the transaction fees into account and sign and submit the transaction:\n\n\n![](../../assets/how-to/65032558230.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-nomination-pools-guide", "url": "https://developer.polkadot.com/wiki/learn/how-to/nomination-pools-guide/#how-to-exit-a-pool", "page_title": "Nomination Pools on the Polkadot Developer Interface", "index": 2, "depth": 3, "title": "How to Exit a Pool", "anchor": "how-to-exit-a-pool", "start_char": 2110, "end_char": 2831, "estimated_token_count": 203, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e5703b72afa07fbee24007b9343cbd03632640048f809883b460afa391ce40a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to Exit a Pool\n\n!!! warning \"ATTENTION\"\n\n    You **cannot rebond during the unbonding period** with a nomination pool. If you change your mind, you must wait for the unbonding period to end before you can join a nomination pool again.\n\nMembers can exit the pool at any time by selecting \"**Unbond funds** \" instead, as shown in the screenshot above. This is in the same drop-down menu under \"**Network** \"  **> \"Staking**\"  **> \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)\" >** **Pooled**.\n\n!!! tip \"GOOD TO KNOW\"\n\n    Funds exiting a pool will be subject to the normal unbonding period, which is 7 days on Kusama, and 1-2 days on Polkadot.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-nomination-pools-guide", "url": "https://developer.polkadot.com/wiki/learn/how-to/nomination-pools-guide/#how-to-claim-rewards", "page_title": "Nomination Pools on the Polkadot Developer Interface", "index": 3, "depth": 3, "title": "How to Claim Rewards", "anchor": "how-to-claim-rewards", "start_char": 2831, "end_char": 3547, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e5703b72afa07fbee24007b9343cbd03632640048f809883b460afa391ce40a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to Claim Rewards\n\nThe member can claim their portion of any rewards that have accumulated since the previous time they claimed (or, in the case that they have never claimed, any rewards that have accumulated since the era after they joined). Rewards are split pro rata among the actively bonded members.\n\nOn the Polkadot Developer Interface, navigate to \"**Network** \"  **> \"Staking**\"  **> \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)\" > \"Pooled**,\" where you can view your pool member account details. To claim rewards, click on the three vertical dots and click on \"**Withdraw claimable**.\"\n\n![](../../assets/how-to/65032559217.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-nomination-pools-guide", "url": "https://developer.polkadot.com/wiki/learn/how-to/nomination-pools-guide/#withdraw-unbonded-funds", "page_title": "Nomination Pools on the Polkadot Developer Interface", "index": 4, "depth": 3, "title": "Withdraw Unbonded Funds", "anchor": "withdraw-unbonded-funds", "start_char": 3547, "end_char": 4124, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e5703b72afa07fbee24007b9343cbd03632640048f809883b460afa391ce40a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Withdraw Unbonded Funds\n\nSimilar to nominating manually, the funds will need to be fully unlocked after the unbonding period ends. Withdrawing completely ends the relationship to the pool, allowing you to join a different pool if desired.\n\nTo do this, select the \"Withdraw unbonded\" button from the menu above after the necessary period of time has elapsed. If you would like to unbond all funds, it's highly recommended that you use the \"all unbonded\" toggle. Doing so ensures that all funds are unbonded, even some that may not display due to rounding by the UI.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-nomination-pools-guide", "url": "https://developer.polkadot.com/wiki/learn/how-to/nomination-pools-guide/#limitations", "page_title": "Nomination Pools on the Polkadot Developer Interface", "index": 5, "depth": 3, "title": "Limitations", "anchor": "limitations", "start_char": 4124, "end_char": 4664, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5e5703b72afa07fbee24007b9343cbd03632640048f809883b460afa391ce40a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Limitations\n\n  * In order for a member to switch pools, they must wait for the unbonding period to end: 1-2 days on Polkadot and 7 days on Kusama.\n\n  * Auto-compounding isn't active by default, but it can be done either manually or permissionlessly if you opt for it.\n  * A member can partially unbond the staked funds in the pool (at most 16 partial unbonds).\n  * Rebonding during the unbonding period isn't possible.\n\nSee [Nomination Pools](../learn-nomination-pools.md) for more information on how to create and destroy pools.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-opengov-participate", "url": "https://developer.polkadot.com/wiki/learn/how-to/opengov-participate/#how-to-use-subsquare", "page_title": "How to Participate in Polkadot OpenGov", "index": 0, "depth": 3, "title": "How to use Subsquare", "anchor": "how-to-use-subsquare", "start_char": 845, "end_char": 7520, "estimated_token_count": 1659, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:304e32a271f4b4d705b97b1207aae47191f474a638ab10ffa93f80031b4f96b8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to use Subsquare\n\n[Subsquare](https://www.subsquare.io/) is a complete platform that allows you to engage with the democratic processes across multiple Polkadot SDK-based networks. The sections below outline how to participate in Polkadot OpenGov using Subsquare.\n\n#### **Connect your wallet**\n\nYou can check the content and status of any proposals without connecting an account. However, any further interaction with Subsquare (for example, voting, delegation, commenting, etc.) will require you to connect an account from your wallet. Follow the steps below to do so.\n\n1\\. Go to [Subsquare.io](https://www.subsquare.io/) and expand the network selector by clicking the \"Launch App\" button on the top-right corner. Select the network in which you want to participate. This article guides you on Polkadot, but many features are shared on other networks.\n\n![](../../assets/how-to/65023204942.png)2\\. Once on the main site, click \"Connect.\"\n\n![](../../assets/how-to/65023205009.png)\n\n3\\. From the wallet selection panel, connect with the one controlling your account. Then, choose it from the drop-down menu at the bottom of the panel.\n\n4\\. Click \"Next,\" and Subsquare will use the selected account to interact with Polkadot OpenGov.\n\n![](../../assets/how-to/65023340837.png)\n\n#### **How to vote**\n\nOnce you have connected your account, you can vote on any ongoing referenda. To do it, follow the simple steps below:\n\n1\\. To vote on a referendum, navigate to it by selecting it from \"Recent Proposals\" or by hovering over the left panel and clicking on the track where the desired referendum is located.\n\n![](../../assets/how-to/65023206546.png)\n\n2\\. After selecting a referendum, the right side of the site should display the current voting status. You can click '\"Vote\" at the bottom of that panel to cast your vote.\n\n![](../../assets/how-to/65023451429.png)\n\n3\\. On the following panel, you'll be able to set up your vote. Begin by confirming the voting account.\n\n4\\. Select the direction of your vote:\n\n  * Aye: Vote in favor of the referendum.\n  * Nay: Vote against the referendum.\n  * Split: Select the amount of voting power allocated for aye, nay, or abstention.\n  * Abstain: Your vote won't be taken into account for the approval of the referendum, but it will increase the [support](../learn-polkadot-opengov.md#approval-and-support) for it.\n\n5\\. Enter the amount of tokens you wish to lock. The \"voting balance\" is displayed in the top-right corner. Keep in mind that locks can overlap, allowing the same balance to be used for staking or voting on other referenda.\n\n6\\. Select the conviction with which you want to vote. This factor will multiply your voting power while increasing the locking period.\n\n7\\. Once you have entered and reviewed all the required information, click “Confirm\" and sign the voting extrinsic with your account from your wallet.\n\n![](../../assets/how-to/65023206922.png)\n\n#### **How to remove and unlock expired votes**\n\nOnce the referenda on which you voted have finished, you can remove and unlock expired votes. You can do it easily in just one extrinsic from Subsquare. Follow the steps below:\n\n1\\. Click Overview on the left side of the screen.\n\n2\\. Go to the “Account” tab.\n\n3\\. In the “Account” tab, you can remove each vote separately by clicking the “X” to the right of each referendum.\n\n4\\. You can also remove and unlock all your expired votes by clicking “Clear expired votes.”\n\n![](../../assets/how-to/65023436450.png)\n\n5\\. In the “Clear expired votes” panel, you can review the referenda for which votes will be removed and tracks where they’ll be unlocked. Once you have checked the information provided, click “Confirm” and sign the extrinsic from your wallet.\n\n![](../../assets/how-to/65023436509.png)\n\n#### **How to delegate**\n\nParticipating in Polkadot OpenGov provides an avenue to contribute to decisive decisions for the protocol's future or Polkadot's Treasury management. However, keeping up with the continuous stream of proposals and analyzing them all may not be feasible. In such instances, you can delegate your voting power to a community member you trust.\n\nYou can easily delegate from Subsquare by following the steps below:\n\n1\\. Connect your account following the steps in the previous section.\n\n2\\. Go to the left panel and click on \"[Delegation](https://polkadot.subsquare.io/delegation).\"\n\n![](../../assets/how-to/65023248679.png)\n\n3\\. In the screen below, you can view the current delegations (A) from your connected account, paste the account address of the delegate (B), or select one from the section at the bottom (C).\n\n![](../../assets/how-to/65023249013.png)\n\n4\\. To delegate, paste your delegate's address (B) or select it from the delegates who have shown their interest in being a delegate (C), then click \"Delegate.\"\n\n5\\. On the screen below, configure your delegation by selecting the tracks you'd like to delegate on. Note that you can select multiple tracks, and you can't delegate on tracks where you have non-expired votes or ongoing delegations.\n\n6\\. Enter the balance you'd like to delegate from the available \"voting balance\" on the top-right corner of the panel.\n\n7\\. Select the conviction that will be applied to your voting power. This will multiply your voting power and increase the locking period after you undelegate.\n\n8\\. After reviewing all set parameters, click \"Confirm.\" Sign with your account, and you're all set.\n\n![](../../assets/how-to/65023249372.png)\n\n#### **How to undelegate**\n\nUndelegating from Subsquare is as easy as delegating. Follow the steps below to undelegate from one or all tracks:\n\n1\\. Go to the \"[Delegation](https://polkadot.subsquare.io/delegation)\" section on the left side of Subsquare.\n\n![](../../assets/how-to/65023249637.png)\n\n2\\. Click \"Detail\" on the bottom-right of the \"Delegates\" panel.\n\n![](../../assets/how-to/65023249661.png)\n\n3\\. In \"My Delegation\" tab, you'll see your current delegations on different tracks.\n\n4\\. Click the \"X\" at the top of the delegations section to undelegate your voting power in all tracks, or click the \"X\" next to each track to do it individually.\n\n![](../../assets/how-to/65023249754.png)\n\n5\\. Click \"Confirm\" on the displayed panel, sign the transaction from your wallet, and you're done. Depending on the conviction you delegated with, your balance will be ready to be unlocked once the locking period has passed since you initiated the undelegation.\n\n!!! warning \"ATTENTION\"\n\n    Once the unlocking period has passed after undelegating, you can unlock your votes by following this article: \"[Removing Expired Voting Locks](../learn-guides-polkadot-opengov.md#removing-expired-voting-locks).\"\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-parity-signer-add-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/parity-signer-add-account/#how-to-add-your-account-through-the-polkadot-developer-signer", "page_title": "Parity Signer — How to Add Your Account", "index": 0, "depth": 3, "title": "How to add your account through the Polkadot Developer Signer", "anchor": "how-to-add-your-account-through-the-polkadot-developer-signer", "start_char": 754, "end_char": 1944, "estimated_token_count": 323, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab32e91781fce59b5b5bbf1105fd1c4cda5367760e30ad8f58eb72e32e2f61a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to add your account through the Polkadot Developer Signer\n\n1\\. [Create](parity-signer-create-account.md) or [restore](parity-signer-restore-account.md) an account in Parity Signer.\n\n2\\. Open the [Polkadot Developer Signer](signer-where-to-download.md) in your browser toolbar. Click on the gear icon to open the settings. Here, allow QR camera access, then choose \"Open extension in new window.\"\n\n![](../../assets/how-to/65012721702.png)\n\n3. The extension will open in a new window. You will see a camera icon in the URL bar: click on it and allow the extension to access your camera.\n\n4\\. You may need to reload the extension page. Then click on the plus icon and choose \"Attach external QR-signer account.\"\n\n![](../../assets/how-to/65012721732.png)\n\n5\\. A camera will open on your browser. Now, open your Parity Signer app and navigate to the Keys tab. Tap on your account twice to see a QR code.\n\n6\\. Show the QR code in Parity Signer to the camera. Your Parity Signer account is now added to the extension. You'll also see the account on the \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts)\" page on the Polkadot Developer Interface.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-parity-signer-add-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/parity-signer-add-account/#how-to-add-your-account-directly-to-the-polkadot-developer-interface", "page_title": "Parity Signer — How to Add Your Account", "index": 1, "depth": 3, "title": "How to add your account directly to the Polkadot Developer Interface", "anchor": "how-to-add-your-account-directly-to-the-polkadot-developer-interface", "start_char": 1944, "end_char": 3077, "estimated_token_count": 310, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ab32e91781fce59b5b5bbf1105fd1c4cda5367760e30ad8f58eb72e32e2f61a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to add your account directly to the Polkadot Developer Interface\n\n!!! warning \"IMPORTANT\"\n\n    **Adding your Parity Signer account through the**[**Polkadot Developer Signer**](signer-where-to-download.md) is highly recommended. It provides better security and convenience.\n\n1\\. [Create](parity-signer-create-account.md) or [restore](parity-signer-restore-account.md) an account in Parity Signer.\n\n2\\. To add your account directly on the Polkadot Developer Interface, go to the \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts)\" page and click \"Add via Qr\":\n\n[![](../../assets/how-to/65012721612.png)](../../assets/how-to/65012709859.png)\n\n3\\. Allow the Polkadot Developer Interface to use your camera. If you don't see a pop-up request, click on a camera icon in the URL bar and allow the website to access your camera.\n\n4\\. A camera will open on your browser. Now, open your Parity Signer app and navigate to the Keys tab. Tap on your account twice to see a QR code.\n\n5\\. Show the QR code in Parity Signer to the camera. Your Parity Signer account is now added to the Accounts page.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-parity-signer-create-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/parity-signer-create-account/#how-to-create-a-new-account-in-parity-signer", "page_title": "Parity Signer — How to Create an Account", "index": 0, "depth": 3, "title": "How to create a new account in Parity Signer", "anchor": "how-to-create-a-new-account-in-parity-signer", "start_char": 873, "end_char": 1594, "estimated_token_count": 213, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d9349ec20e2c9184d3a48324ad03b1f267d127de6d1b9a81c280d71b63d97227", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to create a new account in Parity Signer\n\n1. Download the Parity Signer app from the [official source here](https://signer.parity.io/) and install it on your phone. After that, enable airplane mode, disable bluetooth, and disconnect any cables.\n\n2\\. Open the app, tap on the plus button in the Keys tab, and select **New seed.**\n\n![](../../assets/how-to/65010269766.png)\n\n3. **[Save your mnemonic phrase safely](store-mnemonic-safely.md)**.  **Anyone who knows it can have full access to your account.**\n\n**![](../../assets/how-to/65010269838.png)**\n\n4\\. That's it. This will bring you back to your account on the Keys page.\n\n!!! tip \"GOOD TO KNOW\"\n\n    Your PIN matches your phone's passcode by default.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-parity-signer-create-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/parity-signer-create-account/#what-can-i-do-next", "page_title": "Parity Signer — How to Create an Account", "index": 1, "depth": 3, "title": "What can I do next?", "anchor": "what-can-i-do-next", "start_char": 1594, "end_char": 2633, "estimated_token_count": 273, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d9349ec20e2c9184d3a48324ad03b1f267d127de6d1b9a81c280d71b63d97227", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What can I do next?\n\nYou can add your Parity Signer account to the Polkadot Developer Signer to use it with [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts). The step-by-step guide can be found [here](parity-signer-add-account.md) and video instructions can be found at the [4:58](https://www.youtube.com/watch?v=hgv1R9mPEXw&t=298s) timestamp in the video below.\n\n!!! warning \"IMPORTANT\"\n\n    It's important to update the metadata whenever there is a runtime upgrade, otherwise Parity Signer won't be able to decode and sign extrinsics. Parity Signer allows for air-gapped metadata updates. You can find the latest updates [here](https://metadata.parity.io/).\n\n* * *\n\nIf you are more of a visual type, please check this video guide. The specific instructions on how to create the account can be found at the 2:00 timestamp, but watching the whole video is recommended.\n\n[Create and Restore your Accounts on Parity Signer](https://www.youtube.com/watch?v=hgv1R9mPEXw&t=120s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-parity-signer-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/parity-signer-restore-account/#what-can-i-do-next", "page_title": "Parity Signer — How to Restore Your Account", "index": 0, "depth": 3, "title": "What can I do next?", "anchor": "what-can-i-do-next", "start_char": 2768, "end_char": 3777, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:78c387e0a8634b33df50600283de7cc68afa7ff239ed47131913827e50e91287", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What can I do next?\n\nYou can add your Parity Signer account to the Polkadot Developer Signer to use it with [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts). The step-by-step guide can be found [here](parity-signer-add-account.md) and video instructions can be found at the [4:58](https://www.youtube.com/watch?v=hgv1R9mPEXw&t=298s) timestamp in the link at the bottom of the article.\n\n!!! warning \"IMPORTANT\"\n\n    It's important to update the metadata whenever there is a runtime upgrade, otherwise Parity Signer won't be able to decode and sign extrinsics. Parity Signer allows for air-gapped metadata updates. You can find the latest updates [here](https://metadata.parity.io/).\n\n* * *\n\nIf you are more of a visual type, please check this video guide. The instructions on how to restore your account can be found at the 6:47 timestamp:\n\n[Create and Restore your Accounts on Parity Signer](https://www.youtube.com/watch?v=hgv1R9mPEXw&t=407s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-parity-signer-sign-transaction", "url": "https://developer.polkadot.com/wiki/learn/how-to/parity-signer-sign-transaction/#signing-a-transaction-with-parity-signer-on-polkadot-developer-interface", "page_title": "Parity Signer — How to Sign a Transaction", "index": 0, "depth": 3, "title": "Signing a transaction with Parity Signer on Polkadot Developer Interface", "anchor": "signing-a-transaction-with-parity-signer-on-polkadot-developer-interface", "start_char": 762, "end_char": 2530, "estimated_token_count": 441, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17f30fe7bb253b37e01fcb0eb515627434c53442018c5442f42795713cbb3927", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signing a transaction with Parity Signer on Polkadot Developer Interface\n\n\n\nWhen you [create](parity-signer-create-account.md) your accounts in Parity Signer, you need a UI to interact with your accounts and initiate transactions.\n\n!!! warning \"IMPORTANT\"\n\n    For most users, adding Parity Signer accounts in the **[Polkadot Developer Signer](signer-where-to-download.md)** is strongly recommended.\n\n    Click [here](parity-signer-add-account.md) to see the instructions.\n\n1. Initiate a transaction on the Polkadot Developer Interface and click \"Sign via QR\" or \"Sign and Submit\":\n\n![](../../assets/how-to/65032426070.png)\n\n2\\. If you have added your Parity Signer account through the Polkadot Developer Signer, a new window will pop up and you'll see a QR code. If you have added your Parity Signer account directly on the Polkadot Developer Interface, you'll see a QR code on the left and a camera screen on the right.\n\n![](../../assets/how-to/65032426106.png)\n\n![](../../assets/how-to/65032429575.jpeg)\n\n3\\. Open your Parity Signer app, navigate to the Scan tab, and scan the QR code you see on your computer.\n\n4. Now you can check the transaction details in Parity Signer before signing. Tap \"Unlock key and sign\" if the details are correct, or tap \"Decline\" to reject the transaction.\n\n5\\. In the Parity Signer app, a QR code for the signature will appear. If you have added your Parity Signer account through the extension, click the \"Sign signature via camera\" button. Show the QR code to the camera on your computer.\n\n6\\. You've signed the transaction. It will be included in the blockchain within a few seconds. You can now open any of the [block explorers](block-explorers.md) to view your transaction:\n\n![](../../assets/how-to/65032426315.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-parity-signer-sign-transaction", "url": "https://developer.polkadot.com/wiki/learn/how-to/parity-signer-sign-transaction/#cannot-sign-a-transaction", "page_title": "Parity Signer — How to Sign a Transaction", "index": 1, "depth": 3, "title": "Cannot sign a transaction?", "anchor": "cannot-sign-a-transaction", "start_char": 2530, "end_char": 4286, "estimated_token_count": 443, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17f30fe7bb253b37e01fcb0eb515627434c53442018c5442f42795713cbb3927", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cannot sign a transaction?\n\nSometimes a transaction can't be signed. The sections below describe some of the causes and possible solutions.\n\n#### **Camera doesn't start**\n\nIf your camera doesn't start, please allow the Polkadot Developer Interface or the extension to use your camera. A pop-up should appear asking for your permission. For the extension, please click on the gear icon and open the extension in a new window first.\n\n![](../../assets/how-to/65016125183.png)\n\nIf you denied access or accidentally closed the pop-up, click on the camera icon near your URL bar and allow camera access.\n\nHowever, for the Polkadot Developer Signer to ask permission to use your camera, you first need to enable the option to allow camera access within the extension itself.\n\n1\\. Open the extension and click on the gear icon on the top right\n\n2\\. Check \"Allow QR Camera Access.\" The first time you do this, you may need to click on \"Open the extension in a new window\" and do these steps from there.\n\n![](../../assets/how-to/65016536264.png)\n\n#### **Cannot scan a QR code**\n\nPlease make sure that the full QR code is visible to the camera. You may need to tilt your device a bit to avoid screen glares.\n\n#### **My transaction failed**\n\nSigning a transaction means that it will be included in the blockchain. However, it doesn't always mean it will be executed. You can check the result of your transaction on a block explorer. Sometimes a transaction can't be executed, and it fails:\n\n![](../../assets/how-to/65016106656.png)![](../../assets/how-to/65016106650.png)\n\nPlease check the article \"[Why can't I Transfer Tokens?](why-cant-i-transfer-dot.md)\" to help you understand why your transaction failed, fix the issue, and send the transaction again.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-password-not-working", "url": "https://developer.polkadot.com/wiki/learn/how-to/password-not-working/#what-to-do-if-your-password-is-not-working", "page_title": "My Password Is Not Working", "index": 0, "depth": 3, "title": "What to do if your password is not working", "anchor": "what-to-do-if-your-password-is-not-working", "start_char": 883, "end_char": 2019, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ab4e456a5b66a3a86a1830dbb2bbcaad218969414a7c7ad34d92e154d5edcbf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What to do if your password is not working\n\n![](../../assets/how-to/65015941148.png)\n\nIf your password doesn't work, check the following details:\n\n  * **Is CAPS LOCK on?**  This is one of the most common oversights.\n\n  * **Did you make a typo?** Type your password in a text file or a blank email to see what you are typing. This can also help if **your keyboard is switched to a different language.**\n\n  * **Is there a blank space before or after your password?** This can accidentally happen when you copy/paste a password.\n\n  * **Does your password contain special characters, like é?**  These characters will behave differently if typed or copy-pasted and may result in your password not being recognised. Please check [this issue](https://github.com/polkadot-js/extension/issues/892) for more information. Consider changing your password, as described below, and use only Latin characters, numbers, and symbols.\n\n  * **Do you use the correct password for the correct account?** If you have several accounts, make sure you are using the correct password for the corresponding account. Each account has its own password.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-password-not-working", "url": "https://developer.polkadot.com/wiki/learn/how-to/password-not-working/#how-to-resetchange-your-password", "page_title": "My Password Is Not Working", "index": 1, "depth": 3, "title": "How to reset/change your password", "anchor": "how-to-resetchange-your-password", "start_char": 2019, "end_char": 3042, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ab4e456a5b66a3a86a1830dbb2bbcaad218969414a7c7ad34d92e154d5edcbf", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to reset/change your password\n\n!!! tip \"GOOD TO KNOW\"\n\n    The password of your account is used to encrypt your account's private key **on your computer** , because your account's details \"live\" **only** on your computer and **only** **you** have access to it.\n\n    As a result, no one can reset or change your password for you. The only way to do that is by restoring with your account's mnemonic phrase.\n\nIf you have forgotten your password and you really can't access your account, then **you can reset your password by restoring your account from your mnemonic phrase**. (You can also restore an account with your JSON file, but since that would require the same password, this won't be of use to you.)\n\nDuring the process of restoring your account from your mnemonic phrase, you will have the chance to set a new password. For detailed instructions on how to restore an account on the Polkadot Developer Interface and the Polkadot Developer Signer, please see [this tutorial](restore-account-signer.md).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-polkadot-vs-kusama", "url": "https://developer.polkadot.com/wiki/learn/how-to/polkadot-vs-kusama/#what-the-two-networks-have-in-common", "page_title": "Polkadot and Kusama — What's the Difference?", "index": 0, "depth": 3, "title": "What the two networks have in common", "anchor": "what-the-two-networks-have-in-common", "start_char": 400, "end_char": 994, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:acbbbfa467345a7fbd26247cf12828884dabf9246302c9ca411b73c60e946096", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What the two networks have in common\n\nKusama was released as an early version of the same code to be used in Polkadot, which means they share the same underlying architecture.\n\nBoth Polkadot and Kusama have:\n\n  * Nominated Proof of Stake (NPoS) system.\n\n  * Rollups (parachains) connected to the Relay chain.\n\n  * Rollups communicating with each other and with the Relay chain via [XCM](../learn-architecture.md#xcm).\n  * Forkless upgrades that don't require validators to upgrade in advance.\n  * On-chain governance that gives every DOT or KSM owner a say in how the network will change."}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-polkadot-vs-kusama", "url": "https://developer.polkadot.com/wiki/learn/how-to/polkadot-vs-kusama/#key-differences", "page_title": "Polkadot and Kusama — What's the Difference?", "index": 1, "depth": 3, "title": "Key differences", "anchor": "key-differences", "start_char": 994, "end_char": 3140, "estimated_token_count": 548, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:acbbbfa467345a7fbd26247cf12828884dabf9246302c9ca411b73c60e946096", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Key differences\n\n!!! info\n\n    The information below refers to Polkadot Asset Hub and Kusama Asset Hub unless otherwise specified.\n\n| **POLKADOT** | **KUSAMA** |\n|---|---|\n| High security | Low barriers to entry for parachain deployment |\n| High stability | Low bond requirements for validators and parachains |\n| More conservative governance and upgrade | Latest technology |\n| High validator rewards | Low slashing penalties |\n|  | Fast iteration |\n| Existential deposit: 0.01 DOT ([Sufficient assets](existential-deposit.md), like USDC or ETH, might contribute toward the existential deposit) | Existential deposit: 0.000003333333 KSM ([Sufficient assets](existential-deposit.md), like USDC or ETH, might contribute toward the existential deposit) |\n| **Staking** |  |\n| Minimum stake: 250 DOT | Minimum stake: 0.1 KSM |\n| Unbonding and slash defer: 28 days | Unbonding and slash defer: 7 days |\n| Era: 24 hours, Epoch: 4 hours | Era: 6 hours, Epoch: 1 hour |\n| **Crowdloans** |  |\n| Deprecated in favor of Agile Coretime | Deprecated in favor of Agile Coretime |\n| **Proxies** |  |\n| Deposit base: 0.2004 DOT<br>Additional deposit per proxy: 0.00033 DOT | Deposit base: 0.00667999998 KSM<br>Add. deposit per proxy: 0.000010999989 KSM |\n| **Identity** |  |\n| On People parachain:<br>Deposit base: 0.20017 DOT<br>Per encoded byte of information: 0.00001 DOT | On People parachain:<br>Deposit base: 0.006672333321 KSM<br>Per encoded byte of information: 0.000000333333 KSM |\n| Deposit per sub-account: 0.20053 DOT | Deposit per sub-account: 0.066667 KSM |\n| **Multisig** |  |\n| Deposit base: 0.20088 DOT<br>Additional deposit per signatory: 0.00032 DOT | Deposit base: 0.006695999964 KSM<br>Add. deposit per signatory: 0.000010666656 KSM |\n| **Democracy** |  |\n| OpenGov | OpenGov |\n| Deposit to create proposal: From 1 DOT | Deposit to create proposal: From 0.033333 KSM |\n| Periods depending on the track:<br>Decision, 7 - 28 days<br>Confirm, 10 minutes - 2 days<br>Min. enactment, 10 minutes - 1 day | Periods depending on the track:<br>Decision, 7 - 14 days<br>Confirm, 10 minutes - 1 day<br>Min. enactment, 10 minutes - 1 day |\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-polkadot-vs-kusama", "url": "https://developer.polkadot.com/wiki/learn/how-to/polkadot-vs-kusama/#use-cases", "page_title": "Polkadot and Kusama — What's the Difference?", "index": 2, "depth": 3, "title": "Use cases", "anchor": "use-cases", "start_char": 3140, "end_char": 4636, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:acbbbfa467345a7fbd26247cf12828884dabf9246302c9ca411b73c60e946096", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Use cases\n\nKusama is the \"canary network\" for Polkadot. It is **not** a testnet and has an economic value. All new things come to Kusama first to be tried in a live, fully decentralized, and community-controlled network with real-world conditions and lower stakes.\n\nKusama may be the perfect environment for ambitious experiments with new ideas and innovations in areas like governance, incentives, monetary policy, and DAOs (decentralized autonomous organizations). Future upgrades to the Polkadot runtime will likely be deployed to Kusama before Polkadot. This way, not only will these new technologies and features be observed under real-world conditions, but teams who have deployed to both networks will also get an advanced look at how their own technology will perform under those upgrades.\n\nPolkadot is and always will be the primary network for deploying enterprise-level applications and those that entail high-value transactions requiring bank-level security, stability, and robustness. It can also be an upgrade path for early-stage applications.\n\nMany projects will maintain parachains on both networks, experimenting and testing new technologies and features on Kusama before deploying them to Polkadot. Some teams will decide just to stay on Kusama. Projects that require high-throughput but don't necessarily require bank-like security, such as some gaming, social networking, and content distribution applications, are particularly good candidates for this use case.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-polkadot-vs-kusama", "url": "https://developer.polkadot.com/wiki/learn/how-to/polkadot-vs-kusama/#whats-next", "page_title": "Polkadot and Kusama — What's the Difference?", "index": 3, "depth": 3, "title": "What's next?", "anchor": "whats-next", "start_char": 4636, "end_char": 5012, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:acbbbfa467345a7fbd26247cf12828884dabf9246302c9ca411b73c60e946096", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What's next?\n\nOver time, Polkadot and Kusama networks will evolve independently. Their respective communities will decide whether the networks will be converging or diverging. Governance on both Polkadot and Kusama is decentralized and permissionless, and everyone who owns the native token (DOT for Polkadot and KSM for Kusama) has a say in how the network is run.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-receive-dot", "url": "https://developer.polkadot.com/wiki/learn/how-to/receive-dot/#how-to-receive-funds-to-your-account", "page_title": "How to Receive DOT to My Account", "index": 0, "depth": 3, "title": "How to receive funds to your account", "anchor": "how-to-receive-funds-to-your-account", "start_char": 603, "end_char": 2448, "estimated_token_count": 449, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbac54fee263754552d4095ee283533349fd0fb1820b3955da2289168e143b44", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to receive funds to your account\n\nTo receive funds to an account, you need to copy your account address and either share it with the sender or use it yourself, if you are sending funds from an exchange or another one of your accounts.\n\n1\\. Go to the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page Polkadot Developer Interface. That's where you can see all your accounts, regardless of [type](../learn-account-advanced.md).\n\n2\\. Click on the icon next to your account. This will **copy** the account's address.\n\n![](../../assets/how-to/65012505066.png)\n\n3\\. Paste the account to the proper destination.\n\n  * If you receive funds from someone else, share the address with them.\n  * If you withdraw funds from an exchange, paste the address in the appropriate field on the exchange's withdrawal page.\n  * If you are sending funds from another account of yours on Polkadot Developer Interface, check [this article](transfer-funds.md) on how to do it.\n  * If you are sending funds from a different wallet, paste the address in the recipient's field on that wallet.\n\n!!! danger \"READ THIS FIRST!\"\n\n    Always **triple-check** the address after you've pasted it to make sure it's the correct one. Blockchain transactions are **irreversible** and if you accidentally send funds to the wrong address, there's no way to get them back.\n\n!!! info\n\n    If you are using a Ledger you can confirm you have pasted the correct address on your Ledger device. Check [this article](ledger-confirm-address.md) on how to do that.\n\n4\\. After you have sent your funds to your account, your balance will update automatically after a few seconds. Keep in mind that exchanges don't process withdrawals right away, so if you are sending from an exchange, it may take longer for your funds to show up in your account.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-remove-referenda-locks", "url": "https://developer.polkadot.com/wiki/learn/how-to/remove-referenda-locks/#check-expired-referendum-locks", "page_title": "How to Remove Expired Referenda Locks", "index": 0, "depth": 3, "title": "**Check expired referendum locks**", "anchor": "check-expired-referendum-locks", "start_char": 1160, "end_char": 1439, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:829ad7100f76689530bc543157c7f97fe4ca8214c903c08425ab5b71f9d4cd47", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Check expired referendum locks**\n\nBy clicking on the arrow icon located at the far right of your account and hovering over the small clock icon next to the referenda locked balance, you can check for any expired locks.\n\n**![](../../assets/how-to/65016419564.png)**\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-remove-referenda-locks", "url": "https://developer.polkadot.com/wiki/learn/how-to/remove-referenda-locks/#remove-expired-locks", "page_title": "How to Remove Expired Referenda Locks", "index": 1, "depth": 3, "title": "**Remove expired locks**", "anchor": "remove-expired-locks", "start_char": 1439, "end_char": 1790, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:829ad7100f76689530bc543157c7f97fe4ca8214c903c08425ab5b71f9d4cd47", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Remove expired locks**\n\nTo remove all expired referenda locks from your account, follow these steps:\n\n1\\. Click on the three dots on the right side of your account.\n\n2\\. Select \"Clear expired referenda locks\":\n\n**![](../../assets/how-to/65016419565.png)**\n\n3.  Then sign and submit the extrinsic and all the expired locks will be removed.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-request-cancel-judgement", "url": "https://developer.polkadot.com/wiki/learn/how-to/request-cancel-judgement/#requesting-a-judgement", "page_title": "How to Request and Cancel Identity Judgement", "index": 0, "depth": 3, "title": "Requesting a Judgement", "anchor": "requesting-a-judgement", "start_char": 974, "end_char": 2865, "estimated_token_count": 469, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31c7fecc2e2985483e1149eb974cdd07ba57568729ca42b989dd6fb94dbc1203", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Requesting a Judgement\n\n1\\. Navigate to the [Extrinsics](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-people-rpc.polkadot.io#/extrinsics) tab and select '**identity.requestJudgement** '.\n\nIf you don't know which registrar to pick, first check the available registrars by going to \"Chain State,\" under \"Developer\" > \"Chain state,\" and selecting 'identity.registrars' to get the full list. You can also check [this page](../learn-identity.md#registrars), which lists the current Polkadot registrars.\n\n**Modify the settings below according to the registrar's instructions, and click \"Submit Transaction.\"**\n\n![](../../assets/how-to/65024784167.png)\n\n!!! warning \"ATTENTION\"\n\n    Web3 Foundation's Registrar (Registrar Index 0) **no longer accepts judgement requests**. This change doesn't affect identities already judged by the registrar.\n\n    For new identity judgments, please utilize the other registrars:\n\n    [Registrars](../learn-identity.md#registrars)\n\nThis will make your identity go from unjudged:\n\n![](../../assets/how-to/65012681846.png)\n\nTo \"waiting\":\n\n![](../../assets/how-to/65012681848.png)\n\n2\\. At this point, direct contact with the registrar may be required - the contact info is in their identity as shown above. Each registrar will have their own set of procedures to verify your identity and values, and only once you've satisfied their requirements will the process continue.\n\nOnce the registrar has confirmed the identity, a green checkmark should appear next to your account name with the appropriate confidence level:\n\n![](../../assets/how-to/65012681863.png)\n\n_Note that changing even a single field's value after you've been verified will un-verify your account and you'll need to start the judgement process anew. However, you can still change fields while the judgement is going on - it's up to the registrar to keep an eye on the changes._\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-request-cancel-judgement", "url": "https://developer.polkadot.com/wiki/learn/how-to/request-cancel-judgement/#cancelling-a-judgement", "page_title": "How to Request and Cancel Identity Judgement", "index": 1, "depth": 3, "title": "Cancelling a Judgement", "anchor": "cancelling-a-judgement", "start_char": 2865, "end_char": 3651, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31c7fecc2e2985483e1149eb974cdd07ba57568729ca42b989dd6fb94dbc1203", "last_updated": "2026-10-28T08:43:55+00:00", "text": "###  Cancelling a Judgement\n\nYou may decide that you don't want to be judged by a registrar (for instance, because you realize you entered incorrect data or selected the wrong registrar). In this case, after submitting the request for judgement but before your identity has been judged, you can issue a call to cancel the judgement using an extrinsic.\n\n![](../../assets/how-to/65024784223.png)\n\n1\\. To do this, first, go to the \"Extrinsics\" tab and select the 'identity' pallet, then 'cancelRequest'. Ensure that you are calling this from the correct account (the one for which you initially requested judgement). For the 'reg_index', put the index of the registrar from which you requested judgement.\n\n2\\. Submit the transaction, and the requested judgement will be cancelled.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-request-cancel-judgement", "url": "https://developer.polkadot.com/wiki/learn/how-to/request-cancel-judgement/#registrars", "page_title": "How to Request and Cancel Identity Judgement", "index": 2, "depth": 3, "title": "Registrars", "anchor": "registrars", "start_char": 3651, "end_char": 4179, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:31c7fecc2e2985483e1149eb974cdd07ba57568729ca42b989dd6fb94dbc1203", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Registrars\n\nRegistrars can set a fee for their services and limit their attestation to certain fields. For example, a registrar could charge 1 DOT to verify one's legal name, email, and GPG key. When a user requests judgement, they'll pay this fee to the registrar who provides the judgement on those claims. Users set a maximum fee they're willing to pay and only registrars below this amount would provide judgement.\n\nSee [this article](../learn-guides-identity.md#registrars) for more on how to become a registrar.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-restore-account-signer", "url": "https://developer.polkadot.com/wiki/learn/how-to/restore-account-signer/#restore-from-your-12-word-mnemonic-phrase", "page_title": "How to Restore Your Account (Developer Signer)", "index": 0, "depth": 3, "title": "Restore from your 12-word mnemonic phrase", "anchor": "restore-from-your-12-word-mnemonic-phrase", "start_char": 1241, "end_char": 2315, "estimated_token_count": 297, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fda6f1f35738d0b5436e9bba6b4755f58baef441d0470747d3f0668b574412fb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Restore from your 12-word mnemonic phrase\n\n1\\. Open the [Polkadot Developer Signer](signer-where-to-download.md) and click on the \"plus (+)\" sign on the top right. Then select \"Import account from pre-existing seed.\"\n\n![](../../assets/how-to/65001747786.png)\n\n2\\. On the next screen, enter your mnemonic seed words.\n\n![](../../assets/how-to/65001748368.png)\n\n!!! warning \"IMPORTANT\"\n\n    If you're getting an error and your mnemonic phrase isn't accepted, please check [this article](mnemonic-invalid.md).\n\n3\\. Once entered, more fields will appear. Enter a name for your account and set a password, then click on the orange button at the bottom.\n\n![](../../assets/how-to/65001748434.png)\n\nYour account has now successfully been restored and will appear in the list of accounts in the Polkadot Developer Signer.\n\n![](../../assets/how-to/65001748534.png)\n\nIt will also appear in the list of accounts on the Polkadot Developer Interface under the [\"extension\" category](../learn-account-advanced.md) (you may have to refresh the page first before you can see it).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-restore-account-signer", "url": "https://developer.polkadot.com/wiki/learn/how-to/restore-account-signer/#restore-from-your-json-file", "page_title": "How to Restore Your Account (Developer Signer)", "index": 1, "depth": 3, "title": "Restore from your JSON file", "anchor": "restore-from-your-json-file", "start_char": 2315, "end_char": 3773, "estimated_token_count": 386, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fda6f1f35738d0b5436e9bba6b4755f58baef441d0470747d3f0668b574412fb", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Restore from your JSON file\n\n1\\. Open the Polkadot Developer Signer and click on the \"plus (+)\" button. Then select \"Restore account from backup JSON file.\"\n\n![](../../assets/how-to/65001747794.png)\n\n2\\. On the next screen, select your JSON file from your computer or drag and drop it in the \"Backup file\" field.\n\n![](../../assets/how-to/65001748692.png)\n\n3\\. Now enter the **password you set for your account** when you created it and click \"Restore.\"\n\n![](../../assets/how-to/65001748751.png)\n\n!!! warning \"IMPORTANT\"\n\n    If you are restoring a \"batch\" JSON file, which contains **all** the accounts in the extension, that you had previously [exported](export-json-backup.md) from the extension, the file will have its own password, the one you set when you exported it. This password may or may not be the same as any individual password for the accounts it contains.\n\nYour account has now been successfully restored, and you will see it in the list of accounts in the Polkadot Developer Signer:\n\n![](../../assets/how-to/65001748774.png)\n\nYou will also see it in the list of accounts on the Polkadot Developer Interface under the [\"extension\" category](../learn-account-advanced.md) (you may have to refresh the page first before you can see it).\n\n* * *\n\nIf you are a visual learner, you can find the same instructions in the video below:\n\n[Restore your Account using the Polkadot Developer Signer](https://www.youtube.com/watch?v=9ohp8k4Hz8c)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/restore-account/#restore-from-your-12-word-mnemonic-phrase", "page_title": "How to Restore Your Account", "index": 0, "depth": 3, "title": "Restore from your 12-word mnemonic phrase", "anchor": "restore-from-your-12-word-mnemonic-phrase", "start_char": 1319, "end_char": 2936, "estimated_token_count": 461, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72742512ff17d26692b0bb2cc8f5c3218cd0af092585475cbebbe0dd5b47de7f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Restore from your 12-word mnemonic phrase\n\n1. On the Polkadot Developer Interface, navigate to the [Settings](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/settings) tab. In the account options, allow local in-browser account storage and click \"Save\":\n\n![](../../assets/how-to/65032555452.png)\n\n2\\. Navigate to the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page and click on the \"+ Account\" button:\n\n![](../../assets/how-to/65032555459.png)\n\n3\\. Delete the pre-generated 12 words shown and enter your own mnemonic phrase instead. Once you enter all the words, you should see an account address and icon generated.\n\n!!! warning \"IMPORTANT\"\n\n    If you're getting an error and your mnemonic phrase isn't accepted, please check [this article](mnemonic-invalid.md).\n\n4\\. Tick the box \"I have saved my mnemonic seed safely\" and click \"Next\":\n\n![](../../assets/how-to/65032555485.png)\n\n5\\. Give your account a descriptive name and a good password, then click \"Next\":\n\n![](../../assets/how-to/65032555534.png)\n\n6. Review the details and click \"Save.\" This will also download the JSON backup file for the account on your computer.\n\n![](../../assets/how-to/65032555537.png)\n\n7\\. Your JSON backup file will have the name of your account and will go to your default download folder. Unless you rename it, it'll be named like this:\n\n_12rsESKfXTArErw95PC4sBAwEmP3FX3oSEhFAFwY1DGX6SJ7.json_\n\nYour account has been successfully restored, and you'll see it listed on your [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/restore-account/#restore-from-your-json-file", "page_title": "How to Restore Your Account", "index": 1, "depth": 3, "title": "Restore from your JSON file", "anchor": "restore-from-your-json-file", "start_char": 2936, "end_char": 4229, "estimated_token_count": 385, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72742512ff17d26692b0bb2cc8f5c3218cd0af092585475cbebbe0dd5b47de7f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Restore from your JSON file\n\n!!! warning \"IMPORTANT\"\n\n    You can't restore a \"batch\" JSON file (that contains multiple accounts) directly on the Polkadot Developer Interface. These files can only be used to [restore in the Polkadot Developer Signer](restore-account-signer.md).\n\n1. On the Polkadot Developer Interface, navigate to the [Settings](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/settings) tab. In the account options, allow local in-browser account storage and click \"Save\":\n\n![](../../assets/how-to/65032555564.jpeg)\n\n2\\. Navigate to the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page and click on the \"From JSON\" button:\n\n![](../../assets/how-to/65032555767.png)\n\n3\\. On the next screen, either click in the \"backup file\" field to select your JSON backup file or drag and drop it into the field. Once you add the file, you'll see the name and icon of the account:\n\n![](../../assets/how-to/65032555619.png)\n\n4\\. Enter the password you set for your account when you created it, and click Restore:\n\n![](../../assets/how-to/65032555670.png)\n\nYour account has been successfully restored, and you'll see it listed on your [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/restore-account/#restore-from-your-raw-private-key", "page_title": "How to Restore Your Account", "index": 2, "depth": 3, "title": "Restore from your raw private key", "anchor": "restore-from-your-raw-private-key", "start_char": 4229, "end_char": 5686, "estimated_token_count": 397, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72742512ff17d26692b0bb2cc8f5c3218cd0af092585475cbebbe0dd5b47de7f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Restore from your raw private key\n\n1\\. Go to the Polkadot Developer Interface and navigate to the [Settings](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/settings) tab. In the account options, allow local in-browser account storage and click \"Save\":\n\n![](../../assets/how-to/65032555731.jpeg)\n\n2\\. Navigate to the Accounts page and click on the \"+ Account\" button:\n\n![](../../assets/how-to/65032555769.jpeg)\n\n3\\. Click on the word \"Mnemonic\" and select \"Raw seed\" from the drop-down menu that appears. Delete the shown private key and enter yours instead.\n\n!!! warning \"IMPORTANT\"\n\n    **If your key doesn't start with 0x, add it manually in front of it.**\n\n![](../../assets/how-to/65032555812.png)\n\n4\\. This should generate your account address at the top of the window. Check the \"I have saved my mnemonic seed safely\" box and click \"Next.\"\n\n5\\. Give your account a descriptive name and a good password. Click Next, then review the details and click Save.\n\nYour account has been successfully restored, and you'll see it listed on your [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page.\n\n\n\n* * *\n\nIf you would like to follow a video tutorial instead, here is a video to help you restore your account from the mnemonic phrase or the JSON file from the Polkadot Developer Interface:\n\n[Restore your Account using the Polkadot Developer Interface](https://www.youtube.com/watch?v=cBsZqFpBANY)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-restrict-account-network", "url": "https://developer.polkadot.com/wiki/learn/how-to/restrict-account-network/#in-the-polkadot-browser-extension", "page_title": "How to Restrict Your Account to One Network", "index": 0, "depth": 3, "title": "In the Polkadot Browser Extension", "anchor": "in-the-polkadot-browser-extension", "start_char": 766, "end_char": 1407, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eda6e80f72570c1c4adb8cb7ad4bad6ed9dce1caa17a74d316fc7d7139a06c60", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### In the Polkadot Browser Extension\n\n**1.** Click on the Polkadot browser extension next to the URL bar to open it.\n\n**2.** Click on the three dots next to your account, and pick the network from the drop-down menu instead of \"Allow use on any chain\":\n\n![](../../assets/how-to/65016515046.png)\n\n**3.** A colorful tag with the network's name will appear next to your account. Your account now will only appear when you are connected to the chosen network:\n\n![](../../assets/how-to/65016515091.png)\n\nDepending on the network, you may also see your [account address](../learn-accounts.md#unified-address-format) and identicon change.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-restrict-account-network", "url": "https://developer.polkadot.com/wiki/learn/how-to/restrict-account-network/#on-the-polkadot-developer-interface", "page_title": "How to Restrict Your Account to One Network", "index": 1, "depth": 3, "title": "On the Polkadot Developer Interface", "anchor": "on-the-polkadot-developer-interface", "start_char": 1407, "end_char": 2137, "estimated_token_count": 213, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:eda6e80f72570c1c4adb8cb7ad4bad6ed9dce1caa17a74d316fc7d7139a06c60", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### On the Polkadot Developer Interface\n\n**1.** Navigate to the \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts)\" page and [switch to the network](switch-network-nodes.md) you want to use.\n\n**2.** Your accounts added directly on the Polkadot Developer Interface will appear under \"Accounts,\" and you will see a warning sign next to them if they are available on all networks:\n\n![](../../assets/how-to/65016515491.png)\n\n**3.** Click on the three dots next to the account, and enable the \"Only this network\" switch:\n\n![](../../assets/how-to/65016515553.png)\n\n**4.**  The warning sign will now disappear, and the account will only appear on the Accounts page when connected to this network.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-see-staking-rewards", "url": "https://developer.polkadot.com/wiki/learn/how-to/see-staking-rewards/#staking-dashboard", "page_title": "How to See My Staking Rewards", "index": 0, "depth": 3, "title": "Staking Dashboard", "anchor": "staking-dashboard", "start_char": 261, "end_char": 729, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f81785e1297c915e08286262a8c79e6dee1413363e199c1b5b5990c82178e8e0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Staking Dashboard\n\nTo view your rewards on the Staking Dashboard, navigate to the [Payouts tab](https://staking.polkadot.cloud/#/payouts).\n\nHere, you can view the following:\n\n  * Total reward distribution for the current era\n  * Timeline of your rewards payout history\n  * List of your recent payouts\n\n![](../../assets/how-to/65013263784.png)\n\nFor a full breakdown of what each of these indicates, click on the small information icon next to each section.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-see-staking-rewards", "url": "https://developer.polkadot.com/wiki/learn/how-to/see-staking-rewards/#block-explorers", "page_title": "How to See My Staking Rewards", "index": 1, "depth": 3, "title": "Block Explorers", "anchor": "block-explorers", "start_char": 729, "end_char": 1413, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f81785e1297c915e08286262a8c79e6dee1413363e199c1b5b5990c82178e8e0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Block Explorers\n\nOn most block explorers, you can enter your address in the Search field to see information about it. Here's how to find staking rewards on [Subscan](https://www.subscan.io/).\n\n#### Subscan\n\nIf your account has ever received staking rewards, you will see the \"Reward\" tab on your account's page. Clicking on it will bring up a list of all your incoming staking rewards:\n\n![](../../assets/how-to/65016492411.png)\n\n* * *\n\nIf you're more of a visual learner, check this video guide. You can skip to 13:15 to see how to check your staking rewards:\n\n[Staking on Polkadot: The After-Staking using the Dashboard](https://www.youtube.com/watch?v=58pIe8tt2o4&t=795s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-send-all-funds", "url": "https://developer.polkadot.com/wiki/learn/how-to/send-all-funds/#send-all-of-your-funds", "page_title": "How to Send All of Your Funds Out of Your Account", "index": 0, "depth": 3, "title": "Send all of your funds", "anchor": "send-all-of-your-funds", "start_char": 1620, "end_char": 3698, "estimated_token_count": 553, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b6714c871ff4a2897e189cadca8bbac1849c3cb71c237a7bf3d6eb06c9b94265", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Send all of your funds\n\nTo send all of your funds and reap the account, you should follow the steps below:\n\n1\\. Click on \"Transfer\" in the Accounts menu or click the \"Send\" button on the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page next to the account you want to send from:\n\n![](../../assets/how-to/65032403845.png)\n\n2\\. Both options will take you to the following pop-up window, where you can enter the destination account and the amount you want to send. If you clicked the \"Send\" button to get here, the \"Send from\" account will already be set.\n\nFor the receiving account, you can either select an account from the drop-down menu, which lists all your accounts and all the accounts in your Address Book, or simply paste an address. The receiving account doesn't have to be in your Address Book.\n\n3\\. On the same screen, first disable the \"keep alive\" check:\n\n![](../../assets/how-to/65032405058.png)\n\n4\\. This will make a new option appear below: \"Transfer the full account balance, reap the sender\":\n\n![](../../assets/how-to/65032405178.png)\n\n5\\. When you switch that option on and make the transfer, the transaction costs will automatically be deducted from the total amount. Also, your account will be reaped, as it will fall below the[ Existential Deposit](existential-deposit.md) amount.\n\nYou can reactivate it anytime by depositing a minimum of 0.01 DOT.\n\n6\\. Once you have entered all the details, click on the \"Make Transfer\" button. It will take you to the pop-up window shown below, which will display your expected transaction fees in [microDOT](../learn-DOT.md#the-planck-unit):\n\n![](../../assets/how-to/65032405293.png)\n\n7\\. Once you're ready to make your transaction, click the \"Sign and Submit\" button:\n\n![](../../assets/how-to/65032405334.png)\n\n8\\. Sign the transaction with the sender account on your wallet.\n\n9\\. You've signed the transaction, and it will be included in the blockchain within a few seconds. You can now open any of the [block explorers](block-explorers.md) to view your transaction.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-send-all-funds", "url": "https://developer.polkadot.com/wiki/learn/how-to/send-all-funds/#missing-transfer-the-full-account-balance-reap-the-sender-option", "page_title": "How to Send All of Your Funds Out of Your Account", "index": 1, "depth": 3, "title": "Missing \"transfer the full account balance, reap the sender\" option", "anchor": "missing-transfer-the-full-account-balance-reap-the-sender-option", "start_char": 3698, "end_char": 4956, "estimated_token_count": 292, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b6714c871ff4a2897e189cadca8bbac1849c3cb71c237a7bf3d6eb06c9b94265", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Missing \"transfer the full account balance, reap the sender\" option\n\nIf you don't see this option, your account either holds exactly 0.01 DOT or is very close to it.\n\nTo fix this, send a small amount of DOT to this account to increase the transferrable balance so that the transaction fee can be deducted without the transferrable balance dropping below 0.01 DOT. Transaction fees are very low on Polkadot, so increasing the balance to even 0.012 DOT should be sufficient, but to be safe, it's recommended that you have at least 0.02 DOT. You will then see the \"Reap the sender\" option appear, and you can send your entire balance out.\n\nAnother possibility is that your account has other types of balances, like locked or reserved. In that case, the account can't be reaped, so you must manually enter the amount you want to send. You can read about different types of balances [here](../learn-account-balances.md). Also, the transferable balance can be below 0.01 DOT, but if it's too low, the UI won't let you send out funds.\n\n* * *\n\nIf you are more of a visual learner, check this video on the topic:\n\n[Transfer your Funds using Ledger Nano, Parity Signer, Polkadot Developer Interface & Browser Extension](https://www.youtube.com/watch?v=gbvrHzr4EDY)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-set-clear-identity", "url": "https://developer.polkadot.com/wiki/learn/how-to/set-clear-identity/#setting-an-identity", "page_title": "How to Set and Clear an Identity", "index": 0, "depth": 3, "title": "**Setting an Identity**", "anchor": "setting-an-identity", "start_char": 1293, "end_char": 2907, "estimated_token_count": 411, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d1fe758be6d1f97897da994b0a1c26fe16c58c46fa3d10d91d211d0a6f036516", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Setting an Identity**\n\nUsers can set an identity by registering through default fields such as legal name, display name, website, X handle (formerly Twitter), Matrix handle, etc. along with some extra, custom fields for which they would like attestations (see [Judgements](../learn-identity.md#judgements)).\n\n!!! warning \"ATTENTION\"\n\n    Web3 Foundation's Registrar (Registrar Index 0) **no longer accepts judgement requests**. This change doesn't affect identities already judged by the registrar.\n\n    For new identity judgments, please utilize the other registrars:\n    [Registrars](../learn-identity.md#registrars)\n\nUsers must reserve funds in a bond to store their information on chain: 0.20017 DOT, and 0.00001 DOT per byte of encoded information (or about 0.006673 KSM and 0.0000003 KSM, respectively, in Kusama). These funds are _locked_ , not spent - they are returned when the identity is cleared.\n\nThese amounts can also be extracted by querying constants through the \"[Chain state constants](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-people-rpc.polkadot.io#/chainstate/constants)\" tab on Polkadot Developer Interface.\n\nTo set an identity, follow the steps below:\n\n1\\. Click the three vertical dots next to your account and select \"Set on-chain identity.\"\n\n![](../../assets/how-to/65024782723.png)\n\n2\\. A popup will appear, offering the default fields. Use the toggle to fill in any fields you wish.\n\n![](../../assets/how-to/65024783045.png)\n\n3\\. Click \"**Set Identity** \" to finish the process.\n\n![](../../assets/how-to/65024783034.png)\n\n4\\. Sign and submit the transaction.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-set-clear-identity", "url": "https://developer.polkadot.com/wiki/learn/how-to/set-clear-identity/#clearing-an-identity", "page_title": "How to Set and Clear an Identity", "index": 1, "depth": 3, "title": "**Clearing an Identity**", "anchor": "clearing-an-identity", "start_char": 2907, "end_char": 4345, "estimated_token_count": 314, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d1fe758be6d1f97897da994b0a1c26fe16c58c46fa3d10d91d211d0a6f036516", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Clearing an Identity**\n\nUsers can clear their identity information and have their deposit returned. Clearing an identity also clears all sub-accounts and returns their deposits.\n\nTo clear an identity:\n\n1\\. Make sure the account with your on-chain identity is connected to Polkadot Developer Interface and navigate to the \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-people-rpc.polkadot.io#/accounts)\" tab.\n\n2\\. Click the three dots corresponding to the account you want to clear and select \"Set on-chain identity.\"\n\n3\\. Select \"**Clear Identity** ,\" and sign and submit the transaction.\n\nIt is possible to kill an identity that it deems erroneous. This results in a slash of the deposit.\n\n!!! warning \"IMPORTANT\"\n\n    The set identity calls go on-chain. Hence, the contact information is available publicly, for both legitimate entities, like registrars or validators, but also scammers who might impersonate them.\n\n    The strings in the identity fields are good candidates for homograph attacks, as someone could list a fraudulent website (web3.f0undation instead of web3.foundation for example) and still get verified by the registrar (if the checks are automated)!\n\n    In a decentralized network, one should be cautious making transactions with accounts solely based on their identity.\n\n!!! info\n\n    If you are looking to set sub-accounts instead, see [this article](set-subaccount-identities.md).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-set-subaccount-identities", "url": "https://developer.polkadot.com/wiki/learn/how-to/set-subaccount-identities/#what-is-a-sub-identity-for", "page_title": "How to Set Identities for Sub Accounts", "index": 0, "depth": 3, "title": "What is a sub-identity for?", "anchor": "what-is-a-sub-identity-for", "start_char": 989, "end_char": 1694, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74af06cd95b5e6713b0d56c5c37b6a4d2f0d706490c3548483318984cbbfb661", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What is a sub-identity for?\n\nUsers can also link accounts by setting \"sub accounts,\" each with its own identity, under a primary account. The system reserves a bond for each sub account. An example of how you might use this would be a validation company running multiple validators. A single entity, \"My Staking Company,\" could register multiple sub accounts that represent the Stash accounts of each of their validators (for example \"My Staking Company/01,\" \"My Staking Company/02,\" \"My Staking Company/03,\" etc.).\n\n!!! info\n\n    An account can have a maximum of 100 sub-accounts. Note that a deposit of 0.20053 DOT (or 0.006684333309 KSM on Kusama People) is required for every sub-account.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-set-subaccount-identities", "url": "https://developer.polkadot.com/wiki/learn/how-to/set-subaccount-identities/#steps-to-set-a-sub-identity", "page_title": "How to Set Identities for Sub Accounts", "index": 1, "depth": 3, "title": "Steps to set a sub-identity", "anchor": "steps-to-set-a-sub-identity", "start_char": 1694, "end_char": 2474, "estimated_token_count": 223, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:74af06cd95b5e6713b0d56c5c37b6a4d2f0d706490c3548483318984cbbfb661", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Steps to set a sub-identity\n\n1\\. Go to the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-people-rpc.polkadot.io#/accounts) tab while connected to the People chain.\n\n2\\. Click on the three vertical dots corresponding to the account to which you already set the identity. You should see an option to \"Set on-chain sub-identities.\" Click on it.\n\n![](../../assets/how-to/65012682079.png)\n\n3\\. In the pop-up window, select your account from the drop-down and enter some text to differentiate your sub-identity in the in \"Sub name\" field. Then, click on the \"Set subs\" button.\n\n![](../../assets/how-to/65012682085.png)\n\n4\\. Sign and submit the transaction from the parent account with the identity.\n\nYou should now see the sub-identity displayed on-chain.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-sign-transaction-signer", "url": "https://developer.polkadot.com/wiki/learn/how-to/sign-transaction-signer/#signing-a-transaction-in-the-polkadot-developer-signer", "page_title": "How to Sign a Transaction (Developer Signer)", "index": 0, "depth": 3, "title": "Signing a transaction in the Polkadot Developer Signer", "anchor": "signing-a-transaction-in-the-polkadot-developer-signer", "start_char": 487, "end_char": 2247, "estimated_token_count": 447, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ddc26a1d9d5828a2ecef95aee2f05abb8326a5aae37145c9ec0f5364c395bf5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signing a transaction in the Polkadot Developer Signer\n\nWhen you create your accounts in the Polkadot Developer Signer, you need a UI to interact with your accounts and initiate transactions.\n\n!!! warning \"IMPORTANT\"\n\n    The Polkadot Developer Signer is an account manager meant for power users and developers. There are several user-friendly browser extensions that support a lot of features right from the extension. Discover them in [this article](where-to-store-dot.md).\n\n1\\. On the [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/), after you initiate a transaction and click \"Sign and Submit,\" a new window will pop up:\n\n![](../../assets/how-to/65012680339.png)\n\n2\\. It is the Polkadot Developer Signer asking you to sign a transaction. Here you can check the transaction details once again:\n\n[How can I verify what extrinsic I'm signing?](verify-extrinsic.md)\n\n!!! info\n\n    In the transaction details, **the amount is displayed in Planck**. One DOT contains 10,000,000,000 Planck. You can read more about it in this [article](../learn-DOT.md#the-planck-unit).\n\n3\\. To sign the transaction, enter your account password and click the \"Sign the transaction\" button:\n\n![](../../assets/how-to/65012680569.png)\n\n4\\. If you want to send other transactions soon, click the \"Remember my password for the next 15 minutes\" checkbox. It will allow you to skip entering your password for the next 15 minutes. You can make it 15 more minutes every time you send a transaction.\n\n5\\. You've signed the transaction. It will be included in the blockchain within a few seconds. You can now open any of the [block explorers](block-explorers.md) to view your transaction:\n\n![](../../assets/how-to/65016106404.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-sign-transaction-signer", "url": "https://developer.polkadot.com/wiki/learn/how-to/sign-transaction-signer/#cannot-sign-a-transaction", "page_title": "How to Sign a Transaction (Developer Signer)", "index": 1, "depth": 3, "title": "Cannot sign a transaction?", "anchor": "cannot-sign-a-transaction", "start_char": 2247, "end_char": 3771, "estimated_token_count": 401, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6ddc26a1d9d5828a2ecef95aee2f05abb8326a5aae37145c9ec0f5364c395bf5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cannot sign a transaction?\n\nSometimes a transaction can't be signed. The sections below describe some of the causes and possible solutions.\n\n#### **The new window doesn't appear**\n\nIf a new window doesn't pop up after you click \"Sign and Submit,\" please check if your browser blocked it:\n\n![](../../assets/how-to/65012680827.png)\n\nYou can allow pop-ups after you click on the blocked window icon.\n\nThe Polkadot Developer Signer icon in the toolbar will have a red number on it if you have unsigned transactions waiting:\n\n![](../../assets/how-to/65016106482.png)\n\nIf you blocked the window, hid it, or accidentally closed it, click on the extension icon to open it and sign the transaction.\n\n#### **My password is invalid**\n\nThis article lists a few things to try:\n\n[My password is not working](password-not-working.md)\n\nIf you don't know your password but have your mnemonic phrase, you can [restore your account](restore-account-signer.md) and set a new password.\n\n#### **My transaction failed**\n\nSigning a transaction means that it will be included in the blockchain. However, it doesn't always mean it will be executed. You can check the result of your transaction on a block explorer. Sometimes a transaction can't be executed, and it fails:\n\n![](../../assets/how-to/65016106656.png)![](../../assets/how-to/65016106650.png)\n\nPlease check the article \"[Why can't I Transfer Tokens?](why-cant-i-transfer-dot.md)\" to help you understand why your transaction failed, fix the issue, and send the transaction again.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-sign-transaction", "url": "https://developer.polkadot.com/wiki/learn/how-to/sign-transaction/#cannot-sign-a-transaction", "page_title": "How to Sign a Transaction", "index": 0, "depth": 3, "title": "Cannot sign a transaction?", "anchor": "cannot-sign-a-transaction", "start_char": 1957, "end_char": 2934, "estimated_token_count": 256, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:23ada9a9733ea13fdc5d2c0a8155567f2b7a3c9320e95fc80ad8d5c7353da0f4", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cannot sign a transaction?\n\nSometimes a transaction can't be signed. The sections below describe some of the causes and possible solutions.\n\n#### **My password is invalid**\n\nThis article compiles a few things to try:\n\n[My password is not working](password-not-working.md)\n\nIf you don't know your password but have your mnemonic phrase, you can [restore your account](restore-account-signer.md) and set a new password.\n\n#### **My transaction failed**\n\nSigning a transaction means that it will be included in the blockchain. However, it doesn't always mean it will be executed. You can check the result of your transaction on a block explorer. Sometimes a transaction can't be executed, and it fails:\n\n![](../../assets/how-to/65016106656.png)![](../../assets/how-to/65016106650.png)\n\nPlease check the article \"[Why can't I Transfer Tokens?](why-cant-i-transfer-dot.md)\" to help you understand why your transaction failed, fix the issue, and send the transaction again.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-stake-nominate", "url": "https://developer.polkadot.com/wiki/learn/how-to/stake-nominate/#what-to-know-before-starting", "page_title": "How Do I Stake (Nominate) on Polkadot?", "index": 0, "depth": 3, "title": "What to know before starting", "anchor": "what-to-know-before-starting", "start_char": 629, "end_char": 1746, "estimated_token_count": 299, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ec584df86003fe5a19f6a9991b7881280348b28cab7d8ce0e309d15da3d41ee", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What to know before starting\n\n  * **Nominating currently requires a**  **minimum of 250 DOT staked funds on Polkadot(0.1 KSM on Kusama)**. Please ensure you're above that minimum, or you won't be able to nominate.\n\n!!! warning \"IMPORTANT\"\n\n    Not all nominators with over 250 DOT will get staking rewards. The minimum amount needed to **earn rewards** is **dynamic** and can be found on the [Targets](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/all-validators) page on Polkadot Developer Interface. Please refer to [this referendum](https://polkadot.subsquare.io/democracy/referenda/55) for details.\n\n  * If you are staking **above the dynamic minimum**  amount and still **aren't receiving rewards** , it's possible that your account needs to be re-adjusted by calling an extrinsic. This is due to the new **bags-list** feature. You can find instructions on how to fix this [here](../learn-staking-advanced.md).\n  * If you don't have enough DOT to earn rewards, consider [joining a nomination pool](nomination-pools-guide.md) instead of staking solo.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-stake-nominate", "url": "https://developer.polkadot.com/wiki/learn/how-to/stake-nominate/#how-to-stake-using-the-polkadot-developer-interface", "page_title": "How Do I Stake (Nominate) on Polkadot?", "index": 1, "depth": 3, "title": "How to stake using the Polkadot Developer Interface", "anchor": "how-to-stake-using-the-polkadot-developer-interface", "start_char": 1746, "end_char": 4215, "estimated_token_count": 598, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9ec584df86003fe5a19f6a9991b7881280348b28cab7d8ce0e309d15da3d41ee", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to stake using the Polkadot Developer Interface\n\n!!! tip \"GOOD TO KNOW\"\n\n    Controller accounts have been removed from staking. Staking now uses your stash account together with an optional staking proxy.\n    If you don't want to use your stash account often, you can create a staking proxy which can perform all staking actions on its behalf, giving you added flexibility.\n\n    Check out the article on [creating a proxy account](create-proxy-account.md) for more information.\n\nYou can nominate validators (also known as \"staking\") on Polkadot Developer Interface using these steps:\n\n1\\. Create a Polkadot account if you don't have one yet:\n\n[How to Create a Polkadot Account](create-polkadot-account.md)\n\n2\\. \"Navigate to Network\" > \"Staking Async\" > \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)\" page on Polkadot Developer Interface:\n\n![](../../assets/how-to/65031344278.png)\n\n\n\n3\\. Click on the \"+ Nominator\" button on the top right.\n\n4\\. Choose your Stash account from the drop-down menu.\n\n5\\. Select the amount you want to bond. Make sure you leave a small amount of DOT transferrable in both the stash and the staking proxy. You'll need some transferrable funds to pay transaction fees when changing your nominations, bonding more, or unbonding.\n\n6\\. Choose your reward destination. You can auto-compound your staking rewards (increasing the amount at stake), send them to your stash account as free balance, or send them to any other account.\n\n![](../../assets/how-to/65031344289.png)\n\n!!! danger \"READ THIS FIRST!\"\n\n    Make sure that you have**at least 0.01 DOT** in the account that you are directing your staking rewards to. If you receive rewards of less than 0.01 DOT and they're sent to an empty account, you'll **lose them**. This has to do with the [existential deposit](existential-deposit.md) on Polkadot.\n\n7\\. Click \"Next.\" Now, you need to select your validators. Please ensure you've read the article on [choosing your validators](choose-validators.md). You can nominate up to 16 validators on both Polkadot and Kusama. Nominating more trustworthy validators increases your chance to earn rewards consistently.\n\n8\\. Once you're done, click \"Bond & Nominate.\" Review the transaction and click \"Sign and submit\" to finish the process.\n\n* * *\n\nThat's it. You'll begin earning rewards after the next era or the era after that, depending on the timing of your nominations.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-store-mnemonic-safely", "url": "https://developer.polkadot.com/wiki/learn/how-to/store-mnemonic-safely/#storing-your-mnemonic-phrase", "page_title": "How to Store Your Mnemonic Phrase & Backup Safely", "index": 0, "depth": 3, "title": "Storing your mnemonic phrase", "anchor": "storing-your-mnemonic-phrase", "start_char": 683, "end_char": 2564, "estimated_token_count": 421, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:06d2e452519fdb3148d7215e0ac95bfa8463a2a77a67f18867bd1efaac871379", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Storing your mnemonic phrase\n\nThe mnemonic phrase is the key to your account. If you lose access to your account (for example, you forget the password), you can always [restore it with the mnemonic phrase](restore-account-signer.md). Each mnemonic phrase generates a unique account, so you can't change it, unlike the password. It gives full access to your account to anyone who has it, so you need to keep it secret and safe. The mnemonic phrase is shown to you once when [creating an account](create-polkadot-account.md). The [supported wallets](where-to-store-dot.md) and most of the wallets in the ecosystem use 12-word mnemonic phrases. However, some wallets, like the Ledger hardware wallet, use 24 words.\n\n  * Write your mnemonic phrase down on paper.\n  * Make sure to write all 12 or 24 words in the correct order. The same words in a different order won't restore your account.\n  * Consider keeping several copies of the mnemonic phrase in separate locations: for example, one in your home safe and one in a safety deposit box at your bank.\n  * To protect your mnemonic phrase from physical damage, you can store it in a sealed plastic bag to prevent water damage, in a fireproof safe, etched in metal, etc.\n * Do **not** store your mnemonic phrase on any electronic device. Don't store it on a USB drive, on your computer, on your phone, or in the cloud. Do **not** take screenshots or send it to yourself via email or messenger.\n\n!!! warning \"ATTENTION\"\n\n    **Your password does not protect your mnemonic phrase.**  It is only used to encrypt your account locally on your device. The mnemonic phrase alone can give full access to your account, which is why you can use your mnemonic phrase to restore the account if you forget your password. As a result, an attacker doesn’t need to know your password to compromise your account, just your mnemonic phrase.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-store-mnemonic-safely", "url": "https://developer.polkadot.com/wiki/learn/how-to/store-mnemonic-safely/#storing-your-json-backup-file", "page_title": "How to Store Your Mnemonic Phrase & Backup Safely", "index": 1, "depth": 3, "title": "Storing your JSON backup file", "anchor": "storing-your-json-backup-file", "start_char": 2564, "end_char": 4053, "estimated_token_count": 320, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:06d2e452519fdb3148d7215e0ac95bfa8463a2a77a67f18867bd1efaac871379", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Storing your JSON backup file\n\nJSON is a file format for storing and sharing data that uses human-readable text. Your JSON backup file is named like this: _your_account_address.json_. Unlike your mnemonic phrase, your JSON backup file is password-protected. It has all the information to restore your account, but you can't just read it because it is encrypted for safety. To restore your account with the JSON backup file, you must have both the file and the password to decrypt it. If you don't have a backup file yet, you can create it for your account or all of them at once:\n\n[How to export your JSON backup file](export-json-backup.md)\n\n  * You can save your JSON backup file on any electronic medium. It's safer to store it on a USB drive than on a device connected to the internet.\n  * You can make several copies of the backup file and store them on different devices in case one of them gets damaged.\n  * Your backup file is only as secure as the password you used to encrypt it. The recommended way to create passwords is with a dedicated password manager app. It can create random, unique passwords and store them securely.\n  * Otherwise, you can use a password of random four to five words. These are nearly impossible for computers to guess due to the number of combinations possible but are much easier for humans to remember.\n  * Do **not** reuse your password for any websites or apps.\n  * Do **not** store your password in the same place as your backup file.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-store-mnemonic-safely", "url": "https://developer.polkadot.com/wiki/learn/how-to/store-mnemonic-safely/#storing-your-raw-seed", "page_title": "How to Store Your Mnemonic Phrase & Backup Safely", "index": 2, "depth": 3, "title": "Storing your raw seed", "anchor": "storing-your-raw-seed", "start_char": 4053, "end_char": 5413, "estimated_token_count": 300, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:06d2e452519fdb3148d7215e0ac95bfa8463a2a77a67f18867bd1efaac871379", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Storing your raw seed\n\nRaw seed is a hexadecimal number derived from the mnemonic phrase. It can also be called a private key. Most of the wallets in the ecosystem provide a mnemonic phrase instead of a raw seed. However, if you created your Polkadot account in an older wallet or the [vanity generator](create-vanity-address.md), you may have a raw seed and no mnemonic phrase. To [restore your account from the raw seed](restore-account.md#restore-from-your-raw-private-key), you'll need to use the Polkadot Developer Interface web wallet instead of the Polkadot Developer Signer.\n\nLike the mnemonic phrase, your raw seed gives full access to the account to anyone who knows it. **It is**  **not password-protected**.\n\n  * Save your raw seed in a temporary text document and print it using a non-public printer.\n\n  * Consider keeping several copies of the printed raw seed in separate locations and protecting them from physical damage.\n  * Make sure to permanently delete the text document with your raw seed after you print it.\n  * **Do not store your raw seed online or on any electronic device.**\n  * When restoring your account with the raw seed, double-check it after entering it to avoid any mistakes or typos.\n  * Consider having a secondary backup option, like [exporting your JSON backup file](export-json-backup.md),  whenever possible.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-switch-network-nodes", "url": "https://developer.polkadot.com/wiki/learn/how-to/switch-network-nodes/#switching-nodes", "page_title": "How to Switch Network Nodes", "index": 0, "depth": 3, "title": "Switching Nodes", "anchor": "switching-nodes", "start_char": 837, "end_char": 1416, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:36831a1fc2f30dabcbd2000c11035ca001bc6f4693fb8196fc66a881aa259473", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Switching Nodes\n\nIf you're experiencing connection issues or having trouble making a transaction on the [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts), it can be useful to switch to another network node and try again.\n\n1\\. To do this, first click on the current network on the top left.\n\n![](../../assets/how-to/65031478400.png)\n\n2\\. Expand the drop down menu and you will see several nodes. Simply select a different node here.\n\n3\\. Click the \"Switch\" button on top.\n\n![](../../assets/how-to/65031478439.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-switch-network-nodes", "url": "https://developer.polkadot.com/wiki/learn/how-to/switch-network-nodes/#switching-networks", "page_title": "How to Switch Network Nodes", "index": 1, "depth": 3, "title": "Switching Networks", "anchor": "switching-networks", "start_char": 1416, "end_char": 2544, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:36831a1fc2f30dabcbd2000c11035ca001bc6f4693fb8196fc66a881aa259473", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Switching Networks\n\nYou can also use the same panel to switch to a completely different network, for example from Polkadot to Kusama.\n\n1. On the [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts), click on the currently selected network on the top left. In the case below, you're currently on the Polkadot Asset Hub network.\n\n![](../../assets/how-to/65031478453.png)\n\n2\\. In the panel that opens, select the network you want to switch to. In this example, you're selecting Kusama Asset Hub. There are several nodes available and it doesn't matter which is selected. Only if you experience some connection issues, switch to another one.\n\n3\\. Click on the \"Switch\" button.\n\n![](../../assets/how-to/65031478499.png)\n\n4\\. You are now on the Kusama Asset Hub network and can access your KSM accounts here.\n\nYou can switch back to Polkadot or any other parachain in the same way.\n\n* * *\n\nCheck out this educational tutorial for a more detailed description:\n\n[Learn How to Switch RPC Nodes on the Polkadot Developer Interface](https://www.youtube.com/watch?v=thj4dIMB5A8)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-teleport-dot-ksm", "url": "https://developer.polkadot.com/wiki/learn/how-to/teleport-dot-ksm/#transaction-fees", "page_title": "How to Teleport DOT or KSM", "index": 0, "depth": 3, "title": "Transaction fees", "anchor": "transaction-fees", "start_char": 970, "end_char": 2559, "estimated_token_count": 353, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bedee1ce1a41700b5f666cbb8a71b8745d9d0f3d4eabc56aae6e1dbe0d78d48", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transaction fees\n\nThere are two types of fees that are imposed when teleporting your DOT or KSM, and they are deducted differently.\n\n#### Transaction fees on the source chain\n\nLike with regular transfers, these fees are deducted from your transferable balance.\n\n!!! warning \"ATTENTION\"\n\n    Teleports don't have the \"keep alive\" safeguard like normal transfers. This means that you need to make sure that your balance after the application of fees is above the existential deposit, otherwise your account will be reaped (deactivated) and **any remaining balance will be lost.**\n\n    If you want to teleport your entire balance, and reap your account, make sure to account for the source chain fees, when choosing the amount to teleport.\n\n#### Transaction fees on the destination chain\n\nTeleports come with an additional fee on the destination chain. This fee is deducted from the teleported amount of DOT or KSM. The remainder needs to be greater than the existential deposit of the destination chain. Otherwise, the entire balance you teleported will be lost.\n\n!!! tip \"GOOD TO KNOW\"\n\n    These are the existential deposits on the following chains:\n\n    * **Polkadot Asset Hub** : 0.01 DOT\n    * **Polkadot People** : 0.1 DOT\n    * **Polkadot Bridge Hub** : 0.1 DOT\n    * **Polkadot Coretime** : 0.1 DOT\n    * **Polkadot Relay Chain** : 1 DOT\n\n    * **Kusama Asset Hub:**  0.0000033333 KSM\n    * **Kusama People:** 0.000033333333 KSM\n    * **Kusama Bridge Hub:** 0.000033333333 KSM\n    * **Kusama Coretime:** 0.000033333333 KSM\n    * **Kusama Relay Chain:** 0.00033333333 KSM\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-teleport-dot-ksm", "url": "https://developer.polkadot.com/wiki/learn/how-to/teleport-dot-ksm/#how-to-teleport-your-assets-between-chains", "page_title": "How to Teleport DOT or KSM", "index": 1, "depth": 3, "title": "How to teleport your assets between chains", "anchor": "how-to-teleport-your-assets-between-chains", "start_char": 2559, "end_char": 3971, "estimated_token_count": 365, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3bedee1ce1a41700b5f666cbb8a71b8745d9d0f3d4eabc56aae6e1dbe0d78d48", "last_updated": "2026-10-28T08:43:55+00:00", "text": "###  How to teleport your assets between chains\n\n!!! danger \"READ THIS FIRST!\"\n\n    Do not attempt to **teleport funds directly to exchange** deposit addresses. Although the address format is the same, exchanges might not be able to detect teleports or deposits on every chain. Such deposits will be **irretrievable**.\n\n1\\. Make sure to [switch](switch-network-nodes.md) to the source chain.\n\n2\\. On top of the page, navigate to \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts)\" > \"Teleport\":\n\n![](../../assets/how-to/65031176795.png)\n\n3\\. This opens the \"Teleport assets\" interface:\n\n![](../../assets/how-to/65031176756.png)\n\nHere, you can choose:\n\n  * **Send from account** : choose your account with the source token.\n  * **Destination chain** : choose the network to send the assets to.\n  * **Send to address** : choose or paste the account receiving the funds on the destination chain.\n  * **Amount** : enter the amount you wish to teleport. This amount doesn't include the transfer fee on the source chain, but the fee on the destination chain will be deducted from it.\n\n4\\. After reviewing transaction information and fees, click the \"Teleport\" button, then sign and submit your transaction.\n\n* * *\n\nIf you are more of a visual type, this video tutorial guides you through the teleport process:\n\n[Teleporting | Technical Explainers](https://youtu.be/3tE9ouub5Tg)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-transfer-usdt", "url": "https://developer.polkadot.com/wiki/learn/how-to/transfer-usdt/#how-to-transfer-usdt", "page_title": "How to Transfer Tether (USDT) on Polkadot", "index": 0, "depth": 3, "title": "How to transfer USDT", "anchor": "how-to-transfer-usdt", "start_char": 1372, "end_char": 1910, "estimated_token_count": 180, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3b8196c4084e65c536d546d543461ac4cd8008ef381bd798a510281d40155530", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to transfer USDT\n\n1\\. Go to [Polkadot Asset Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fstatemint.api.onfinality.io%2Fpublic-ws#/accounts).\n\n2\\. Next, navigate to the \"Network\" > \"Assets\" page and click on the \"[Balances](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fstatemint.api.onfinality.io%2Fpublic-ws#/assets/balances)\" tab.\n\n3\\. Click the \"Send\" button. Then enter the receiver address and the amount to transfer.\n\n4\\. Sign and submit the transaction, and that's it.\n\n![](../../assets/how-to/65031027022.gif)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-troubleshoot-connection-issues", "url": "https://developer.polkadot.com/wiki/learn/how-to/troubleshoot-connection-issues/#troubleshooting", "page_title": "Polkadot Developer Interface: How to Troubleshoot Connection Issues", "index": 0, "depth": 3, "title": "Troubleshooting", "anchor": "troubleshooting", "start_char": 880, "end_char": 2206, "estimated_token_count": 276, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1999586372b09bd8ef504afe41322fec807b946b61ef28298de1acf47024daac", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Troubleshooting\n\n  * Do you have another DOT extension installed? Disable them and try again. Some of them might be interfering with the Polkadot Developer Signer.\n\nIf this does not help, try out the following options:\n\n  * [Switch to another network node](switch-network-nodes.md) (e.g., OnFinality, Dwellir, Parity, etc., in the image above). This usually fixes things in case one node has connection issues. Simply select another node and then click the \"Switch\" button at t top.\n\n  * Update your browser to the latest version.\n\n  * Try a different browser. Please note that in this case, you won't see any of your accounts because they exist in your current browser, but we're trying to figure out the connection issue, so that's ok for now.\n\n  * If you're using a VPN, please disable it.\n\n  * Restart your router.\n\n  * Are you perhaps on a company network? Sometimes, company networks have firewall rules that prevent access to certain sites.\n\n  * Disable automatic translations. Some browsers allow translating any site to your language of choice automatically. However, sometimes it might interfere with the Polkadot Developer Interface and block the connection.\n\n  * If none of these things work, connect your computer to a hotspot on your phone and see if you can connect through that instead of your WiFi.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-unstake-tokens", "url": "https://developer.polkadot.com/wiki/learn/how-to/unstake-tokens/#step-1-chilling", "page_title": "How to Unstake Your Tokens", "index": 0, "depth": 3, "title": "Step 1: Chilling", "anchor": "step-1-chilling", "start_char": 2005, "end_char": 3301, "estimated_token_count": 352, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2151d52ceebd1dd5371aeabf4ca5f8e8b3b484d31a646de57d627fea204fede8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Step 1: Chilling\n\n#### Unbond all your tokens\n\nNavigate to the \"Network\" > \"Staking Async\" > \"[Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)\"page on Polkadot Developer Interface. If you want to unbond _all_ your funds, you need to chill your account first, that is, stop nominating. Click on the Stop button to the right of your account:\n\n[![](../../assets/how-to/65011122678.png)](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)\n\n!!! warning \"IMPORTANT\"\n\n    If you don't click the Stop button first, you will be unable to unbound _all_ your funds and will receive an '**InsufficientBond** ' error.\n\n#### Unbond only some tokens\n\nIf you want to unbond only part of your funds while keeping some bonded to continue nominating, you don't need to click the Stop button. Instead, proceed to Step 2. Just **make sure that your bonded funds are still above the minimum bond needed to nominate**. Otherwise, you'll receive the 'InsufficientBond' error mentioned above.\n\n#### I don't see a Stop button\n\nIf you don't see the Stop button, it means you're not nominating any validators. The \"active/inactive/waiting\" column will also be missing. In that case, you can move to Step 2.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-unstake-tokens", "url": "https://developer.polkadot.com/wiki/learn/how-to/unstake-tokens/#step-2-unbonding", "page_title": "How to Unstake Your Tokens", "index": 1, "depth": 3, "title": "Step 2: Unbonding", "anchor": "step-2-unbonding", "start_char": 3301, "end_char": 4207, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2151d52ceebd1dd5371aeabf4ca5f8e8b3b484d31a646de57d627fea204fede8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Step 2: Unbonding\n\nOnce you've clicked the Stop button and chilled your account successfully, they'll still be bonded. This means they stay ready to be used to nominate. To make them transferable again, you first need to unbond them. This process will take 1-2 days on Polkadot and 7 days on Kusama.\n\nTo do this, click the three dots next to the account you want to unbond tokens for, and select \"**Unbond funds** .\"\n\n![](../../assets/how-to/65011122820.png)\n\nA small clock will appear next to your unbonding balance. Hovering over it with your cursor will show you how much time remains until the funds are unbonded.\n\n![](../../assets/how-to/65008174698.png)\n\n!!! info\n\n    If you change your mind once the unbonding period has been initiated, you can rebond your funds following this guide: \"[Polkadot Developer Interface: How to Rebond Tokens During the Unbonding Period](rebond-tokens.md)\"\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-unstake-tokens", "url": "https://developer.polkadot.com/wiki/learn/how-to/unstake-tokens/#step-3-withdrawing", "page_title": "How to Unstake Your Tokens", "index": 2, "depth": 3, "title": "Step 3: Withdrawing", "anchor": "step-3-withdrawing", "start_char": 4207, "end_char": 4807, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2151d52ceebd1dd5371aeabf4ca5f8e8b3b484d31a646de57d627fea204fede8", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Step 3: Withdrawing\n\nOnce the unbonding period has passed, your unbonded funds can be withdrawn and made transferable. To do this, you can either:\n\n  * Click “**Withdraw Unbonded** ,” which will then be available in the same menu as above.\n  * Or click on the blue padlock icon next to the \"redeemable\" balance. This is shown both under \"Network\" > \"Staking\" > \"Accounts\" and on the \"Accounts\" page under the detailed balance of the account\n\n![](../../assets/how-to/65016356416.png)\n\nYour transferrable balance will subsequently increase by the number of tokens you've just fully unbonded.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-update-metadata-signer", "url": "https://developer.polkadot.com/wiki/learn/how-to/update-metadata-signer/#how-to-update-the-polkadot-developer-signer-metadata-on-the-polkadot-developer-interface", "page_title": "How to Update the Metadata (Developer Signer)", "index": 0, "depth": 3, "title": "How to update the Polkadot Developer Signer metadata on the Polkadot Developer Interface", "anchor": "how-to-update-the-polkadot-developer-signer-metadata-on-the-polkadot-developer-interface", "start_char": 1653, "end_char": 3111, "estimated_token_count": 424, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:12cd51a5cd222a384c58a93b2c4744c020311fb2a9672d1c4baee83184e46f00", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to update the Polkadot Developer Signer metadata on the Polkadot Developer Interface\n\n1\\. If one of your extensions needs to be updated, you'll see a counter next to [Settings](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/settings) and a warning on the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page on the Polkadot Developer Interface:\n\n![](../../assets/how-to/65032425522.png)\n\n2\\. Please navigate to Settings and switch to the [Metadata](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/settings/metadata) tab, or simply click the link in the message :\n\n![](../../assets/how-to/65032425540.png)\n\nHere, you'll see what extensions can be updated. Click the \"Update metadata\" button to apply updates.\n\n3\\. An extension window will pop up:\n\n![](../../assets/how-to/65032425572.png)\n\nHere, you can see:\n\n  * **From** : the source of the metadata. Remember only to accept updates from trusted sources.\n  * **Chain** : each chain has its own metadata, so you must update it separately for each network you use.\n  * **Decimals** and **Symbol** : this defines the divisibility of the native coin (how many [Planck](../learn-DOT.md#the-planck-unit) units make up one coin) and specifies the coin's ticker symbol.\n  * **Upgrade** : the runtime version you used until now and the version you're about to use.\n\n4\\. Complete the process by clicking \"Yes, do this metadata update.\"\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-add-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-add-account/#how-to-add-your-account-through-the-polkadot-developer-signer", "page_title": "Polkadot Vault — How to Add Your Account", "index": 0, "depth": 3, "title": "How to add your account through the Polkadot Developer Signer", "anchor": "how-to-add-your-account-through-the-polkadot-developer-signer", "start_char": 784, "end_char": 2139, "estimated_token_count": 381, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b02cb9f803e983cd2860e146b6e73ca7a383616917bbe49667466e0ff3575fab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to add your account through the Polkadot Developer Signer\n\n1\\. [Create](vault-create-account.md) or [restore](vault-restore-account.md) an account in Polkadot Vault.\n\n2\\. Open the [Polkadot Developer Signer](signer-where-to-download.md) in your browser toolbar. Click on the gear icon to open the settings. Here, allow QR camera access, then choose \"Open extension in new window.\"\n\n![](../../assets/how-to/65016543777.png)\n\n3. The extension will open in a new window. You will see a camera icon in the URL bar: click on it and allow the extension to access your camera.\n\n4\\. You may need to reload the extension page. Then click on the plus icon and choose \"Attach external QR-signer account.\"\n\n![](../../assets/how-to/65016543775.png)\n\n5\\. A camera will open on your browser. Now, open your Polkadot Vault app and select the account you want to add.\n\n![](../../assets/how-to/65016560922.png)\n\n6\\. On the next screen, select the chain on which you want to use that account. This will show up the account's address on that chain in QR code.\n\n![](../../assets/how-to/65016560996.png)\n\n7\\. Show the QR code to the camera. Your Polkadot Vault account is now added to the extension. You'll also see the account on the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page on the Polkadot Developer Interface.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-add-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-add-account/#how-to-add-your-account-directly-on-the-polkadot-developer-interface", "page_title": "Polkadot Vault — How to Add Your Account", "index": 1, "depth": 3, "title": "How to add your account directly on the Polkadot Developer Interface", "anchor": "how-to-add-your-account-directly-on-the-polkadot-developer-interface", "start_char": 2139, "end_char": 3223, "estimated_token_count": 296, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b02cb9f803e983cd2860e146b6e73ca7a383616917bbe49667466e0ff3575fab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to add your account directly on the Polkadot Developer Interface\n\n!!! warning \"IMPORTANT\"\n\n    **Adding your Polkadot Vault account through the**  [**Polkadot Developer Signer**](signer-where-to-download.md) is highly recommended. It provides better security and convenience.\n\n1\\. [Create](vault-create-account.md) or [restore](vault-restore-account.md) an account in Polkadot Vault.\n\n2\\. To add your account directly on the Polkadot Developer Interface, go to the [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page and click \"Add via Qr\":\n\n[![](../../assets/how-to/65016543776.png)](../../assets/how-to/65012709859.png)\n\n3\\. Allow Polkadot Developer Interface to use your camera. If you don't see a pop-up request, click on a camera icon in the URL bar and allow the website to access your camera.\n\n4\\. A camera will open on your browser. Follow steps 5 & 6 in the previous section to get your account's QR code in Polkadot Vault.\n\n5\\. Show the QR code to the camera. Your Polkadot Vault account is now added to the Accounts page.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-add-chain-metadata", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-add-chain-metadata/#metadata-updates", "page_title": "Polkadot Vault — How to Add a New Chain and Update Metadata", "index": 0, "depth": 3, "title": "Metadata updates", "anchor": "metadata-updates", "start_char": 868, "end_char": 1477, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df767442125698b567ee3fa2ce41423f206a9c00006f0b8e2d1151f660015f6e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Metadata updates\n\nThere are three situations when you need to update the metadata:\n\n  * When you want to sign a transaction for the first time with one of the provided chains (Polkadot, Kusama, Westend)\n  * When you add a new chain (see instructions in the next section)\n  * When there is a new runtime version for the chain you are trying to use\n\nIf you see the following message when you try to sign a transaction, it means that Polkadot Vault doesn't have the metadata to decode and sign the transaction. In that case, you need to update the metadata.\n\n![](../../assets/how-to/65016559124.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-add-chain-metadata", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-add-chain-metadata/#how-to-update-the-metadata", "page_title": "Polkadot Vault — How to Add a New Chain and Update Metadata", "index": 1, "depth": 3, "title": "How to update the metadata", "anchor": "how-to-update-the-metadata", "start_char": 1477, "end_char": 2513, "estimated_token_count": 286, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df767442125698b567ee3fa2ce41423f206a9c00006f0b8e2d1151f660015f6e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to update the metadata\n\nIn this example, the metadata for Polkadot is updated, but the instructions are the same for any other chain you may have added, with the potential exception of the metadata source (see next section).\n\n1\\. Navigate to [Parity's metadata portal](https://metadata.parity.io/#/polkadot) and select Polkadot on the sidebar.\n\n![](../../assets/how-to/65020698526.png)\n\n2\\. Open the Polkadot Vault app on your phone and click on the \"Scanner\" tab.\n\n![](../../assets/how-to/65020698633.png)\n\n3\\. Scan the QR fountain. Keep your phone as still as possible until the progress bar fills.\n\n![](../../assets/how-to/65016559211.png)\n\n4\\. In the next screen, you can see the issuer's details and the version of the metadata you are about to add. Click on \"Approve.\"\n\n![](../../assets/how-to/65016559243.png)\n\nThat's it. Now you can sign transactions with your Polkadot accounts. If you haven't added your account on Polkadot Developer Interface yet, check [this article](vault-add-account.md) for instructions.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-add-chain-metadata", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-add-chain-metadata/#how-to-add-a-new-chain", "page_title": "Polkadot Vault — How to Add a New Chain and Update Metadata", "index": 2, "depth": 3, "title": "How to add a new chain", "anchor": "how-to-add-a-new-chain", "start_char": 2513, "end_char": 4070, "estimated_token_count": 400, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df767442125698b567ee3fa2ce41423f206a9c00006f0b8e2d1151f660015f6e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to add a new chain\n\nPolkadot Vault supports three chains out of the box: Polkadot, Kusama, and Westend. But you can add additional chains if you can scan a **trusted** spec QR code and metadata QR fountain.\n\nCurrently, there exists one metadata portal that supports a plethora of Substrate chains curated by [Nova wallet](https://novawallet.io). Alternatively, if you are a technically oriented user, you can [create your own QR codes and metadata portal](https://github.com/paritytech/metadata-portal).\n\nThe instructions below are based on Nova's metadata portal, but the same instructions apply to any other source.\n\n1\\. Navigate to [Nova's metadata portal](https://metadata.novasama.io/) and select the chain you want to add from the sidebar. In this example, Acala is added to Polkadot Vault.\n\n2\\. Navigate to the \"Acala\" tab.\n\n![](../../assets/how-to/65020698611.png)\n\n3\\. Open Polkadot Vault and click on the \"Scanner\" tab. This will open your phone's camera to scan the spec QR code.\n\n4\\. On the screen that opens up, you can see the details of the issuer and the chain you are about to add. Click \"Approve,\" and the chain is added.\n\n![](../../assets/how-to/65016559480.png)\n\n5\\. After approving the addition of the new network, you'll be prompted to create a new key (account) for that network. It will be added to the main tab under the selected key set.\n\n![](../../assets/how-to/65020699164.png)\n\n6\\. Finally, navigate back to the \"Metadata\" tab on the metadata portal and update the metadata as described in the previous section.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-add-chain-metadata", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-add-chain-metadata/#how-to-generate-an-account-for-a-newly-added-chain", "page_title": "Polkadot Vault — How to Add a New Chain and Update Metadata", "index": 3, "depth": 3, "title": "How to generate an account for a newly added chain", "anchor": "how-to-generate-an-account-for-a-newly-added-chain", "start_char": 4070, "end_char": 5746, "estimated_token_count": 465, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:df767442125698b567ee3fa2ce41423f206a9c00006f0b8e2d1151f660015f6e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to generate an account for a newly added chain\n\n!!! warning \"IMPORTANT\"\n\n    The instructions below concern any key sets (accounts) that you have created **before** adding the new chain. Any key sets you create **after** might have access to these chains if you included them.\n    \n\n1\\. Navigate to the home screen and click on the plus (+) sign on the top right.\n\n![](../../assets/how-to/65020699190.png)\n\n2\\. On the next screen, select the network for which you want to create an account. In this example, Acala is selected.\n\n![](../../assets/how-to/65020699195.png)\n\n3\\. Then click \"Create Key.\"\n\n!!! warning \"ATTENTION\"\n\n    In the latest version of Polkadot Vault (>6.2.0) the accounts for each network are derived from the mnemonic phrase using a **[custom derivation path](../learn-account-advanced.md#derivation-paths)** (\"//polkadot\" for Polkadot, \"//kusama\" for Kusama, etc.)\n\n    If you are using an older version, you can click on \"Add Custom Derivation Path\" and use an empty path (remove the \"//\"). This will allow you to use the same account that you use on the existing chains on the newly added chain too.\n\n4\\. Enter your phone's PIN and you're now ready to [add your account](vault-add-account.md) for that chain on Polkadot Developer Interface and sign transactions with it.\n\n* * *\n\nHere is a video if you want a visual guide on how to update metadata in your Polkadot Vault (mark [04:56](https://www.youtube.com/watch?v=IG_RGLsb2g0&t=296s)) and how to add a new network (mark [06:31](https://www.youtube.com/watch?v=IG_RGLsb2g0&t=391s)).\n\n[How to use Polkadot Vault | Technical Explainers](https://www.youtube.com/watch?v=IG_RGLsb2g0&t=296s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-create-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-create-account/#how-to-create-a-new-account-in-polkadot-vault", "page_title": "Polkadot Vault — How to Create an Account", "index": 0, "depth": 3, "title": "How to create a new account in Polkadot Vault", "anchor": "how-to-create-a-new-account-in-polkadot-vault", "start_char": 620, "end_char": 4446, "estimated_token_count": 963, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9169948c75819de5bb1d336a4bd1491df66dfb09215d67418b50ea8d694ff90f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to create a new account in Polkadot Vault\n\n1\\. Download the Polkadot Vault app for your factory-reset phone [from the official site](https://signer.parity.io/) and install it on your phone.\n\n2\\. Read through the introductory screens and click \"Continue,\" then agree to the Terms of Service and Privacy Policy.\n\n3\\. After that, you are prompted to enable Airplane mode, turn off WiFi, and disconnect any cables. Once you do these steps, click \"Next.\"\n\nRemember that **Polkadot Vault is meant to work as cold storage** , and that can only be achieved if your phone is air-gapped from the outside world.\n\n![](../../assets/how-to/65016492960.png)\n\n4\\. On the next screen, you're ready to create your first set of keys. Click the \"Add Key Set\" button and select \"Add new Key Set.\"\n\n![](../../assets/how-to/65020681761.png)\n\n5\\. Next, enter a name for the key set.\n\n!!! info\n\n    This is basically the account's name. But because a Substrate account can be used on all networks, the mnemonic phrase will generate addresses for multiple networks, and you can add more networks and use your account on all of them.\n\n![](../../assets/how-to/65016493000.png)\n\n6\\. On the next screen, you are presented with your account's mnemonic phrase. As prompted by the app, **make sure to write it down on paper and keep it in a safe place.**  \n\nYou can also use \"Banana Split\" for more security. [\"Banana Split\"](https://bs.parity.io) is a self-hosted app that you can use to split your mnemonic phrase into pieces using [Shamir's Secret Sharing scheme](https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing).\n\nOnce you write down the mnemonic phrase, click \"Next.\" Tick the checkboxes confirming that you have written down the recovery phrase and understood the consequences of losing it, and click \"Next.\"\n\n![](../../assets/how-to/65020681806.png)\n\n!!! warning \"ATTENTION\"\n\n    You **should not** take a screenshot of your mnemonic phrase. You should write the mnemonic phrase **only on paper** and store it somewhere **safe and secret.**\n\n7\\. The following screen will allow you to select the networks for which you want to create the account. For most Polkadot Vault versions, Polkadot, Kusama, and Westend networks are preselected.\n\n!!! warning \"IMPORTANT\"\n\n    If you are using a Polkadot Vault version older than v7.1, you should add Polkadot Asset Hub (Statemint) and Kusama Asset Hub (Statemine) to Polkadot Vault.\n\n    Follow the article below to learn how to add Polkadot Asset Hub (Statemint) to your Polkadot Vault:\n\n    [Polkadot Vault: How to Add a New Chain and Update the Metadata](vault-add-chain-metadata.md)\n\nClick \"Done\" and that's it, your accounts are ready to use.\n\n![](../../assets/how-to/65031299580.png)\n\n8\\. After completing the process, you'll be transferred back to the home screen, where you can see your newly created accounts.\n\n![](../../assets/how-to/65031299663.png)\n\n!!! warning \"ATTENTION\"\n\n    In the most recent Polkadot Vault versions (>v6.2.0) the accounts for each network are derived from the mnemonic phrase using a **[custom derivation path](../learn-account-advanced.md#derivation-paths)** (\"//statemint\" for Polkadot Asset Hub, \"//statemine\" for Kusama Asset Hub, etc.). Notice the label over each account in the screenshot above.\n\n    When restoring your account on another wallet, add this derivation path for each network.\n\n9\\. Click on it to view the address on each of the selected networks. Further clicking on each of the networks will present your account on that network in QR code, which you can use to add it to any wallet that supports this functionality.\n\n10\\. If you don't want to use the account on all networks, you can click on the settings icon on the right and select just the networks you want to use the account with.\n\n![](../../assets/how-to/65031299931.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-create-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-create-account/#what-can-i-do-next", "page_title": "Polkadot Vault — How to Create an Account", "index": 1, "depth": 3, "title": "What can I do next?", "anchor": "what-can-i-do-next", "start_char": 4446, "end_char": 5021, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9169948c75819de5bb1d336a4bd1491df66dfb09215d67418b50ea8d694ff90f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What can I do next?\n\nYou can add your Polkadot Vault account to the Polkadot Developer Signer to use it with every compatible wallet listed in the article below:\n\n[Where to Store DOT: Polkadot Wallet Options](where-to-store-dot.md)\n\n!!! warning \"IMPORTANT\"\n\n    In older versions (<v7.1), it's important to update the metadata whenever there is a runtime upgrade, otherwise Polkadot Vault won't be able to decode and sign extrinsics. Polkadot Vault allows for air-gapped metadata updates. You can find instructions in [this article](vault-add-chain-metadata.md).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-create-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-create-account/#if-you-are-a-user-of-parity-signer", "page_title": "Polkadot Vault — How to Create an Account", "index": 2, "depth": 3, "title": "If you are a user of Parity Signer", "anchor": "if-you-are-a-user-of-parity-signer", "start_char": 5021, "end_char": 5853, "estimated_token_count": 180, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9169948c75819de5bb1d336a4bd1491df66dfb09215d67418b50ea8d694ff90f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### If you are a user of Parity Signer\n\nIf you are already using Parity Signer, please read the following information first:\n\n  * Parity Signer has been deprecated and has been replaced by Polkadot Vault.\n  * Your phone won't automatically update the app from Parity Signer to Polkadot Vault.\n  * You can keep using Parity Signer as it is; you don't need to update to Polkadot Vault if you don't want to.\n\n!!! danger \"READ THIS FIRST!\"\n\n    If you choose to upgrade to Polkadot Vault, you first need to uninstall Parity Signer and install Polkadot Vault from scratch. **This means that all data, including your accounts, will be deleted from your device.**\n\n    After the upgrade you will need to [restore your accounts](vault-restore-account.md) from their mnemonic phrases, re-add any networks, and update their metadata.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-create-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-create-account/#what-are-the-benefits-of-polkadot-vault-compared-to-parity-signer", "page_title": "Polkadot Vault — How to Create an Account", "index": 3, "depth": 3, "title": "What are the benefits of Polkadot Vault compared to Parity Signer", "anchor": "what-are-the-benefits-of-polkadot-vault-compared-to-parity-signer", "start_char": 5853, "end_char": 6742, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9169948c75819de5bb1d336a4bd1491df66dfb09215d67418b50ea8d694ff90f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What are the benefits of Polkadot Vault compared to Parity Signer\n\nPolkadot Vault comes with two main improvements compared to Parity Signer:\n\n1\\. A better design and user experience.\n\n2\\. No need to update the metadata after each runtime upgrade if used with compatible wallets.\n\n3\\. The ability to add networks from different sources. This means that in addition to Polkadot, Kusama, and Westend, which are provided out of the box and supported by [Parity's metadata portal](https://metadata.parity.io/#/polkadot), you can add more networks from [Nova's metadata portal](https://metadata.novasama.io/#/polkadot).\n\n* * *\n\nIn the video below, you can follow how Filippo guides you through the process of how to create a new account. Go to the mark 09:09 to see it in action:\n\n[How to use Polkadot Vault | Technical Explainers](https://www.youtube.com/watch?v=IG_RGLsb2g0&t=549s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-replicate-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-replicate-account/#default-derivation-path-for-each-network", "page_title": "Polkadot Vault: Replicate a Polkadot Account for Asset Hub", "index": 0, "depth": 3, "title": "Default derivation path for each network", "anchor": "default-derivation-path-for-each-network", "start_char": 1113, "end_char": 2083, "estimated_token_count": 186, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be3d3fecee70ea9f6105a9b649a3a4dc105d12c29ee48cc065115758143a33fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Default derivation path for each network\n\nThe main goal of Polkadot Vault is security. That is why, even though it uses the same mnemonic phrase for multiple accounts, it applies a unique derivation path to accounts on different networks. For instance, when you create an account for Polkadot (Relay Chain), the derivation path defaults to //polkadot, while for Polkadot Asset Hub it is //statemint. This difference leads to distinct accounts, even if the same mnemonic is used.\n\nTo resolve this and use an account on Polkadot Asset Hub that was originally created for Polkadot Relay Chain, you simply need to customize the derivation path for the Asset Hub account based on your existing Relay Chain account. Follow the steps below to learn how:\n\n!!! tip \"GOOD TO KNOW\"\n\n    Different versions of the Polkadot Vault may look slightly different from the screenshots below, but the core principle remains the same: customize the derivation path for the new account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-replicate-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-replicate-account/#customize-the-derivation-path", "page_title": "Polkadot Vault: Replicate a Polkadot Account for Asset Hub", "index": 1, "depth": 3, "title": "Customize the derivation path", "anchor": "customize-the-derivation-path", "start_char": 2083, "end_char": 3660, "estimated_token_count": 412, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:be3d3fecee70ea9f6105a9b649a3a4dc105d12c29ee48cc065115758143a33fd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Customize the derivation path\n\n1\\. You must identify and note down the derivation path applied to the Polkadot Relay Chain you want to replicate for Polkadot Asset Hub. Each account's derivation path is displayed above its public address (//derivationPath).\n\n![](../../assets/how-to/65030994313.png)\n\nAccounts in the same keyset on different networks (notice the different network logo in the screenshot above) share the same mnemonic but have distinct derivation paths (e.g., //statemint and //polkadot) by default, resulting in separate accounts and public addresses.\n\n2\\. Now, create a new keyset by tapping the \"+\" sign.\n\n![](../../assets/how-to/65030994319.png)\n\n3\\. Select the desired network (e.g., \"Statemint\") and tap the option at the bottom to modify the derivation path.\n\n![](../../assets/how-to/65030994328.png)\n\n4\\. Enter the one you noted down in the first step (e.g., //polkadot).\n\n![](../../assets/how-to/65030994375.png)\n\n5\\. After confirming you have written down the custom derivation path, you should see the new account in your keyset.\n\n![](../../assets/how-to/65030994400.png)\n\nEven if they operate on different networks (notice the logo), they will be the same account as long as they are derived from the same mnemonic phrase and use the same derivation path.\n\nAnd that's it! You can now use the same account in Polkadot Vault across different networks.\n\n!!! warning \"ATTENTION\"\n\n    If you want to replicate multiple accounts, you should add //1, //2, //3, … to the custom derivation path to recreate each subsequent account (e.g., //polkadot//1)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-restore-account/#how-to-restore-your-account-in-polkadot-vault", "page_title": "Polkadot Vault — How to Restore Your Account", "index": 0, "depth": 3, "title": "How to restore your account in Polkadot Vault", "anchor": "how-to-restore-your-account-in-polkadot-vault", "start_char": 1340, "end_char": 5250, "estimated_token_count": 968, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5438166a4182e036c20a2eaee391fafa3f5d9ad34d41d77bebb173a48c3b9196", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to restore your account in Polkadot Vault\n\n1\\. Download the Polkadot Vault app [from the official site](https://signer.parity.io/) and install it on your phone.\n\n2\\. If this is a new installation, read through the introductory screens and click \"Continue,\" then agree to the Terms of Service and Privacy Policy.\n\n3\\. Again, if this is a new installation, you are then prompted to enable Airplane mode, turn off WiFi, and disconnect any cables. Once you do these steps, click \"Next.\"\n\nRemember that Polkadot Vault is meant to work as cold storage and that can only be achieved if your phone is air-gapped from the outside world.\n\n![](../../assets/how-to/65016492960.png)\n\n4\\. On the next screen, click the \"Recover Key Set\" button.\n\n![](../../assets/how-to/65020682437.png)\n\n5\\. Next enter a name for the key set.\n\n!!! info\n\n    This is basically the account's name. But because a Substrate account can be used on all networks, the mnemonic phrase will generate addresses on Polkadot, Kusama, and Westend, and you can add more networks and use your account on all of them.\n\n![](../../assets/how-to/65016514739.png)\n\n6\\. In the next screen, you enter the mnemonic phrase of the account you want to restore. As you start typing each word the app suggests possible words from the wordlist that match what you typed. You can click on the proper suggested word to fill it. This way, you can avoid spelling mistakes.\n\n!!! warning \"IMPORTANT\"\n\n    Remember that Polkadot Vault (and Parity Signer) provide a 24-word mnemonic phrase for accounts created in both apps. You will need to enter all 24 words in the **correct order** to successfully restore your account.\n\n    If you have a 12-word mnemonic phrase, that account wasn't created by either app (although it might have been created by an older version of Parity Signer).\n\n    Ledger accounts also have 24-word mnemonic phrases, but they aren't compatible with Polkadot Vault. Make sure you're **not trying to restore your Ledger account in Polkadot Vault.**\n\n![](../../assets/how-to/65016514748.png)\n\n7\\. The following screen will allow you to select the networks for which you want to create the account. By default Polkadot, Kusama, and Westend are preselected. Click \"Done\" and that's it, your accounts are ready to use.\n\n![](../../assets/how-to/65020682597.png)\n\n8\\. After completing the process, you'll be transferred to the account's page, where you can see the address on each supported network.\n\n![](../../assets/how-to/65020686040.png)\n\n!!! warning \"ATTENTION\"\n\n    In the latest version of Polkadot Vault (>6.2.0) the accounts for each network are derived from the mnemonic phrase using a **[custom derivation path](../learn-account-advanced.md#derivation-paths)** (\"//polkadot\" for Polkadot, \"//kusama\" for Kusama, etc.)\n\n    If you're restoring an account that doesn't match your old one, use the same derivation path you used during its creation:\n\n    * In the account's screen above, click the \"+\" icon.\n    * Choose the network.\n    * Select \"Add Custom Derivation Path\" at the bottom.\n    * Leave empty the \"Derivation Path Name\" field.\n    * Click \"Done\" and check if the right account has been restored.\n\n9\\. Further clicking on each of the networks will present your account on that network in QR code, which you can use to add it to the Polkadot Developer Signer, the Polkadot Developer Interface, or another app that supports this functionality. Detailed instructions can be found below.\n\n![](../../assets/how-to/65020686027.png)\n\n10\\. If you don't want to use the account on all networks, you can click on the settings icon on the right and select just the networks you want to use the account with.\n\n![](../../assets/how-to/65020686023.png)\n\n10\\. Clicking on the back arrow will take you to the home screen, where you can see all of your accounts.\n\n!!! tip \"GOOD TO KNOW\"\n\n    The PIN for the app is your phone's passcode.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-restore-account/#what-can-i-do-next", "page_title": "Polkadot Vault — How to Restore Your Account", "index": 1, "depth": 3, "title": "What can I do next?", "anchor": "what-can-i-do-next", "start_char": 5250, "end_char": 5873, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5438166a4182e036c20a2eaee391fafa3f5d9ad34d41d77bebb173a48c3b9196", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What can I do next?\n\nYou can add your Polkadot Vault account to the Polkadot Developer Signer to use it with [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts), if it's not there already. The step-by-step guide can be found [here](vault-add-account.md).\n\n!!! warning \"IMPORTANT\"\n\n    It's important to update the metadata whenever there is a runtime upgrade, otherwise Polkadot Vault won't be able to decode and sign extrinsics. Polkadot Vault allows for air-gapped metadata updates. You can find instructions in [this article](vault-add-chain-metadata.md).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-restore-account/#if-you-are-a-user-of-parity-signer", "page_title": "Polkadot Vault — How to Restore Your Account", "index": 2, "depth": 3, "title": "If you are a user of Parity Signer", "anchor": "if-you-are-a-user-of-parity-signer", "start_char": 5873, "end_char": 6708, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5438166a4182e036c20a2eaee391fafa3f5d9ad34d41d77bebb173a48c3b9196", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### If you are a user of Parity Signer\n\nIf you are already using Parity Signer, please read the following information first:\n\n  * Parity Signer has been deprecated and has been replaced by Polkadot Vault.\n  * Your phone won't automatically update the app from Parity Signer to Polkadot Vault.\n  * You can keep using Parity Signer as it is; you don't need to update to Polkadot Vault if you don't want to.\n\n!!! danger \"READ THIS FIRST!\"\n\n    If you choose to upgrade to Polkadot Vault, you first need to uninstall Parity Signer and install Polkadot Vault from scratch. **This means that all data, including your accounts, will be deleted from your device.**\n\n    After the upgrade you will need to restore your accounts from their mnemonic phrases (as described in this article), re-add any networks, and update their metadata.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-restore-account", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-restore-account/#what-are-the-benefits-of-polkadot-vault-compared-to-parity-signer", "page_title": "Polkadot Vault — How to Restore Your Account", "index": 3, "depth": 3, "title": "What are the benefits of Polkadot Vault compared to Parity Signer", "anchor": "what-are-the-benefits-of-polkadot-vault-compared-to-parity-signer", "start_char": 6708, "end_char": 7803, "estimated_token_count": 272, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5438166a4182e036c20a2eaee391fafa3f5d9ad34d41d77bebb173a48c3b9196", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### What are the benefits of Polkadot Vault compared to Parity Signer\n\nPolkadot Vault comes with two main improvements compared to Parity Signer:\n\n1\\. A better design and user experience\n\n2\\. Faster reading of QR fountains for [metadata updates](vault-add-chain-metadata.md)\n\n3\\. The ability to add networks from different sources. This means that in addition to Polkadot, Kusama, and Westend, which are provided out of the box and supported by [Parity's metadata portal](https://metadata.parity.io/#/polkadot), you can add more networks from [Nova's metadata portal](https://metadata.novasama.io/#/polkadot), other sources that might be available in the future, or even metadata you [created yourself manually](https://github.com/paritytech/metadata-portal).\n\n* * *\n\nIf you are a visual learner, you might be interested in checking the video below at mark [08:51](https://youtu.be/IG_RGLsb2g0?t=531) where Filippo will guide you on how to recover a mnemonic phrase on Polkadot Vault.\n\n[How to use Polkadot Vault | Technical Explainers](https://www.youtube.com/watch?v=IG_RGLsb2g0&t=531s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-same-account-networks", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-same-account-networks/#mnemonic-phrase-and-derivation-paths", "page_title": "Polkadot Vault — How to Create the Same Account on Different Networks", "index": 0, "depth": 3, "title": "Mnemonic phrase and derivation paths", "anchor": "mnemonic-phrase-and-derivation-paths", "start_char": 927, "end_char": 2229, "estimated_token_count": 256, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f3cfcdc1b0398963d7682846c63a65329b098cdcc26af5575af028365acee94", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Mnemonic phrase and derivation paths\n\nAccounts in the Polkadot ecosystem are deterministically created based on two key components: the mnemonic phrase and the derivation path. A specific combination of them will always generate the same account. Learn more about portability and derivation paths in the sections below:\n\n[Portability](../learn-account-advanced.md#portability) and [Derivation Paths](../learn-account-advanced.md#derivation-paths)\n\nWhen creating an account, the wallet typically generates a mnemonic phrase that must be securely stored offline. However, a single mnemonic can be used to generate multiple accounts by adjusting the derivation path. While most wallets apply a default derivation path, some offer advanced settings that let users customize it.\n\nEven though an account is deterministically generated, its public address can have different representations depending on the network. For example, the same account's public address starts with 1 in Polkadot while in Kusama, it starts with a capital letter. Converting formats between Polkadot-based chains is simple using tools like \"[Subscan Transformer](https://polkadot.subscan.io/tools/format_transform).\" Learn more about account formats in the article below:\n\n[Account address formats](../learn-accounts.md)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-same-account-networks", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-same-account-networks/#account-creation-in-polkadot-vault", "page_title": "Polkadot Vault — How to Create the Same Account on Different Networks", "index": 1, "depth": 3, "title": "Account creation in Polkadot Vault", "anchor": "account-creation-in-polkadot-vault", "start_char": 2229, "end_char": 5120, "estimated_token_count": 723, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f3cfcdc1b0398963d7682846c63a65329b098cdcc26af5575af028365acee94", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Account creation in Polkadot Vault\n\nPolkadot Vault supports multiple accounts across different networks. However, since version 6.2.0, it defaults to using a [hard derivation path](../learn-account-advanced.md#soft-and-hard-derivation) (that is, \"//\") specific to each network. For example, a Polkadot account will have the path \"//polkadot,\" while a Kusama account will have \"//kusama.\" This means they're entirely separate accounts, not just different representations of the same one.\n\n* * *\n\n#### Derive the same account for other network\n\nTo use an account in Polkadot Vault on a different network than the one it was originally created for, you must replicate its original derivation path. Follow the steps below to learn how to do it on recent (+6.2.0) versions of Polkadot Vault.\n\n!!! info\n\n    In case you first need to create a new account or restore an existing one on Polkadot Vault, follow the artciles below for step-by-step guidance:\n\n    [Polkadot Vault: How to Create an Account](vault-create-account.md)\n    [Polkadot Vault: How to Restore Your Account](vault-restore-account.md)\n\n1. In Polkadot Vault, each account’s derivation path is displayed next to it. Accounts in the same keyset on different networks (notice the network logo in the screenshot below) share the same mnemonic but have distinct derivation paths (for example, \"//statemint\" and \"//polkadot\") by default, resulting in separate accounts.\n\n![](../../assets/how-to/65028020310.png)\n\nIf you want to use the same account on a different network, note its derivation path and proceed to the following step.\n\n2\\. Next, create a new keyset by tapping the \"+\" sign.\n\n![](../../assets/how-to/65028000060.png)\n\n3\\. Select the desired network and tap the option to modify the derivation path.\n\n![](../../assets/how-to/65028020363.png)\n\n4\\.  Enter the one you saved in the first step (for example, \"//polkadot\")\n\n!!! warning \"IMPORTANT\"\n\n    Derivation paths are case-sensitive.\n\n    For instance, \"//polkadot\" will generate a different account as \"//**P** olkadot\".\n\n![](../../assets/how-to/65028000192.png)\n\n5\\. Remember to write down the derivation path. Without it, you won't be able to restore your account, even with its mnemonic phrase.\n\n![](../../assets/how-to/65028000253.png)\n\n6. Even if they operate on different networks, they will be the same account as long as they are derived from the same mnemonic phrase and use the same derivation path.\n\n![](../../assets/how-to/65028020659.png)\n\n7 (Optional). You can now verify if the public address of the newly created account matches the network-specific format of the original account. Enter its public address in the Subscan's tool below to check it:\n\n<https://polkadot.subscan.io/tools/format_transform>\n\nAnd that's it. You can now use the same account (that is, the same mnemonic and derivation path) across different networks in Polkadot Vault.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-sign-transaction", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-sign-transaction/#signing-a-transaction-with-polkadot-vault-on-polkadot-developer-interface", "page_title": "Polkadot Vault — How to Sign a Transaction", "index": 0, "depth": 3, "title": "Signing a transaction with Polkadot Vault on Polkadot Developer Interface", "anchor": "signing-a-transaction-with-polkadot-vault-on-polkadot-developer-interface", "start_char": 478, "end_char": 2573, "estimated_token_count": 527, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ebd56b1e18443426c6152e7906e1b8ed78bc6837d5b2999e0dec9ca211b8630d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Signing a transaction with Polkadot Vault on Polkadot Developer Interface\n\nWhen you [create](vault-create-account.md) your accounts in Polkadot Vault, you need a UI to interact with your accounts and initiate transactions.\n\n!!! warning \"IMPORTANT\"\n\n    For most users, adding Polkadot Vault accounts in the **[Polkadot Developer Signer](signer-where-to-download.md)** is strongly recommended. Click here to see the instructions.\n\n1. Initiate a transaction on the Polkadot Developer Interface and click \"Sign via QR\" or \"Sign and Submit\":\n\n![](../../assets/how-to/65032429901.png)\n\n2\\. If you have added your Polkadot Vault account through the Polkadot Developer Signer, a new window will pop up, and you will see a QR code. If you have added your Polkadot Vault account directly on the Polkadot Developer Interface, you will see a QR code on the left and a camera screen on the right.\n\n![](../../assets/how-to/65032429913.png)\n\n![](../../assets/how-to/65032429567.png)\n\n3\\. Open your Polkadot Vault app, click the Scanner tab, and scan the QR code you see on your computer.\n\n![](../../assets/how-to/65032430009.jpg)\n\n4. Enter your phone's PIN to sign the transaction. Once you do that, you can see the transaction's information, the account that you signed with, and the QR of the signature. You can click on the transaction information to see all the details.\n\n!!! danger \"READ THIS FIRST!\"\n\n    Always check the information of the transaction you are about to broadcast to ensure it is the one you intended. Once a transaction is broadcast, there's no way to take it back.\n\n![](../../assets/how-to/65032429734.png)\n\n5\\. Now, it's time to present the signed transaction to your computer. If you have added your Polkadot Vault account through the extension, click the \"Sign signature via camera\" button. Show the QR code to the camera on your computer.\n\n6\\. You've signed the transaction. It will be included in the blockchain within a few seconds. You can now open any of the [block explorers](block-explorers.md) to view your transaction:\n\n![](../../assets/how-to/65032430023.png)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vault-sign-transaction", "url": "https://developer.polkadot.com/wiki/learn/how-to/vault-sign-transaction/#cannot-sign-a-transaction", "page_title": "Polkadot Vault — How to Sign a Transaction", "index": 1, "depth": 3, "title": "Cannot sign a transaction?", "anchor": "cannot-sign-a-transaction", "start_char": 2573, "end_char": 4579, "estimated_token_count": 516, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ebd56b1e18443426c6152e7906e1b8ed78bc6837d5b2999e0dec9ca211b8630d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cannot sign a transaction?\n\nSometimes a transaction can't be signed. The sections below describe some of the causes and possible solutions.\n\n#### **The camera doesn't start**\n\nIf your camera doesn't start, please allow Polkadot Developer Interface or the extension to use your camera. A pop-up should appear asking for your permission. For the extension, please click on the gear icon and open the extension in a new window first.\n\n![](../../assets/how-to/65016536414.png)\n\nIf you denied access or accidentally closed the pop-up, click on the camera icon near your URL bar and allow camera access.\n\nHowever, for the Polkadot Developer Signer to ask permission to use your camera, you first need to enable the option to allow camera access within the extension itself.\n\n1\\. Open the extension and click on the gear icon on the top right\n\n2\\. Check \"Allow QR Camera Access.\" The first time you do this, you may need to click on \"Open the extension in a new window\" and do these steps from there.\n\n![](../../assets/how-to/65016536416.png)\n\n#### **Cannot scan a QR code**\n\nPlease make sure that the whole QR code is visible to the camera. You may need to tilt your device a bit to avoid screen glare.\n\n#### **My transaction failed**\n\nSigning a transaction means that it will be included in the blockchain. However, it doesn't always mean it will be executed. You can check the result of your transaction on a block explorer. Sometimes a transaction can't be executed, and it fails:\n\n![](../../assets/how-to/65016536415.png)![](../../assets/how-to/65016536413.png)\n\nPlease check the article \"[Why can't I Transfer Tokens?](why-cant-i-transfer-dot.md)\" to help you understand why your transaction failed, fix the issue, and send it again.\n\n* * *\n\nIf you're a visual learner, here's a video for you. On mark 14:04, you'll see how you can initiate a transaction and sign it from your Polkadot Vault.\n\n[How to use Polkadot Vault | Technical Explainers](https://www.youtube.com/watch?v=IG_RGLsb2g0&t=844s)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-verify-extrinsic", "url": "https://developer.polkadot.com/wiki/learn/how-to/verify-extrinsic/#verify-an-extrinsic-in-the-polkadot-developer-signer", "page_title": "How to Verify What Extrinsic You're Signing", "index": 0, "depth": 3, "title": "Verify an extrinsic in the Polkadot Developer Signer", "anchor": "verify-an-extrinsic-in-the-polkadot-developer-signer", "start_char": 395, "end_char": 2440, "estimated_token_count": 533, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1861bd0145556a76bbc37aa42b33a731d538caa81385ce98cee375b800c10f84", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify an extrinsic in the Polkadot Developer Signer\n\nThe [Polkadot Developer Signer](signer-where-to-download.md) is your gateway to the Web 3.0 Polkadot ecosystem, as it can connect to many compatible apps and websites. Because of that, it is essential that you verify your extrinsics before signing them, especially when interacting with a new site or app.\n\nWhen you are about to issue an extrinsic, a pop-up window will appear, asking you to sign the extrinsic with the selected account. In this window, you can see what you're signing. Review the window, following from top to down:\n\n![](../../assets/how-to/65016225532.png)\n\n1\\. **Account icon, name, and address** : the account you are using to issue the extrinsic. If you are making a transfer, this will be the sender.\n\n2\\. **From** : the site that requests approval.\n\n3\\. **Chain** : the network you are issuing the extrinsic on (Polkadot, Kusama, etc.)\n\n4\\. **Version**  and  **Nonce** don't need to be checked every time. The version of the network changes with a runtime upgrade. The nonce changes every time you issue a new extrinsic and will be reset if your account is deactivated.\n\n5\\. **Method** : the extrinsic you are about to sign. **It is very important.** Click on the arrow here to see the details and verify them:\n\n![](../../assets/how-to/65016225863.png)\n\nIn this example, it is a transfer with a \"keep-alive\" check. In the details, you can see the recipient address and the amount being sent in [Plancks](../learn-DOT.md#the-planck-unit).\n\n6\\. **Info** : a short description of the method you are about to use. Click on the arrow to see it:\n\n![](../../assets/how-to/65016226020.png)\n\n7\\. **Lifetime** : the block range during which the extrinsic is valid and can be included in the chain. In almost all cases, it should be \"mortal\"; otherwise, the extrinsic can be replayed.\n\nIf any details are incorrect, **do not sign the transaction** and click \"**Cancel** \" instead. You can enter your password and sign the transaction if all the details are correct.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-verify-extrinsic", "url": "https://developer.polkadot.com/wiki/learn/how-to/verify-extrinsic/#verify-an-extrinsic-in-the-polkadot-developer-interface", "page_title": "How to Verify What Extrinsic You're Signing", "index": 1, "depth": 3, "title": "Verify an extrinsic in the Polkadot Developer Interface", "anchor": "verify-an-extrinsic-in-the-polkadot-developer-interface", "start_char": 2440, "end_char": 3957, "estimated_token_count": 393, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1861bd0145556a76bbc37aa42b33a731d538caa81385ce98cee375b800c10f84", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify an extrinsic in the Polkadot Developer Interface\n\nIf you are using the [Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts), you will see the confirmation window after you enter the extrinsic's details, where you confirm it is what you mean to sign. Click on the arrow next to the extrinsic you are about to sign to see the details:\n\n![](../../assets/how-to/65032433865.png)\n\n1\\. **Method** : the extrinsic you are about to sign. **It is very important.** Click on the arrow to see the details. You will see a short description of the method you are about to use. In this example, it is a transfer with a \"keep-alive\" check. In the details, you can see the recipient address, its icon, and the amount being sent in DOT. If the recipient account is in your [address book](accounts-vs-address-book.md) or on the Accounts page, you will also see the name you gave to the recipient account.\n\n2\\. **Fees** : the fee you will pay from your remaining transferrable balance for broadcasting this transaction. On Polkadot, it is nominated in [milliDOT](../learn-DOT.md#the-planck-unit).\n\n3\\. **Sending from my account** : the account you are using to issue the extrinsic. You can see the account icon, name, and address. If you are making a transfer, this will be the sender.\n\nIf any details are incorrect, **do not sign the transaction**  and click the **X button** in the top right corner. You can click \"Sign and Submit\" if all the details are correct.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-verify-extrinsic", "url": "https://developer.polkadot.com/wiki/learn/how-to/verify-extrinsic/#verify-an-extrinsic-using-ledger", "page_title": "How to Verify What Extrinsic You're Signing", "index": 2, "depth": 3, "title": "Verify an extrinsic using Ledger", "anchor": "verify-an-extrinsic-using-ledger", "start_char": 3957, "end_char": 5950, "estimated_token_count": 508, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1861bd0145556a76bbc37aa42b33a731d538caa81385ce98cee375b800c10f84", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verify an extrinsic using Ledger\n\nIf you are using a Ledger account, you will see the same details as above, depending on whether you have added your account in the [Polkadot Developer Signer](add-ledger-account-signer.md) or on the [Polkadot Developer Interface](add-ledger-account.md). The difference is that the extrinsic is signed on the Ledger, where you can verify (again) its details.\n\n!!! danger \"READ THIS FIRST!\"\n\n    If you connected to a phishing site, it might show one extrinsic on the screen, but actually is sending a different one to your Ledger device. The _true_ extrinsic details will be shown on your Ledger device regardless. **Always trust your Ledger device over what is shown on your computer.** The Ledger shows what you're signing.\n\nWhen you click to sign on the Ledger, the extrinsic details will be shown on the device's screen. Click on the buttons on your device to scroll through them.\n\n1\\. First, the extrinsic to be signed is shown. It must match what you see on your computer. The first comes the pallet, then the specific extrinsic. In this example, it is \"Balances\" and \"Transfer keep alive\":\n\n![](../../assets/how-to/65008281975.jpg)\n\n2\\. In the next screen, you can see the extrinsic details. In this example, it's the destination account:\n\n![](../../assets/how-to/65008282268.jpg)\n\n3\\. Next comes the amount involved. In this example, it is the amount to be transferred:\n\n![](../../assets/how-to/65008282299.jpg)\n\n4\\. If all the details are correct, you get to approve the extrinsic in the next screen. If the details aren't what you expected or what was shown on your computer's screen, **do not approve.** Instead, move to the **next screen** and **reject** the transaction:\n\n![](../../assets/how-to/65008282351.jpg)\n\n* * *\n\nIf you are more of a visual type, check this video on the topic:\n\n[How and Why to verify Extrinsics using Polkadot Developer Interface, Browser Extension and Ledger Nano](https://www.youtube.com/watch?v=bxMs-9fBtFk)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-view-transaction-history", "url": "https://developer.polkadot.com/wiki/learn/how-to/view-transaction-history/#how-to-find-your-account-on-block-explorers", "page_title": "Where Can I See the Transaction History of my Polkadot Account?", "index": 0, "depth": 3, "title": "How to Find Your Account on Block Explorers", "anchor": "how-to-find-your-account-on-block-explorers", "start_char": 280, "end_char": 1505, "estimated_token_count": 335, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:984b03fd87e27fdae2d1a621aa6c826350ed62ef96491042aa0d3091be9228ed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to Find Your Account on Block Explorers\n\n#### **Directly from Block Explorers**\n\nYou can go to the block explorer you want to use directly and find your account there.\n\nOn [Subscan](https://www.subscan.io/), you can choose the network by clicking \"Supported Networks\" or using the \"Networks\" icon at the top of the screen:\n\n![](../../assets/how-to/65032451008.png)\n\nChoose the network among all the available options where you want to review your account:\n\n![](../../assets/how-to/65032451169.png)\n\nOnce your network has been selected, paste on the search bar your public address:\n\n![](../../assets/how-to/65032451262.png)\n\n**Through Polkadot Developer Interface**\n\nYou can see your account on a block explorer from your [Accounts](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/accounts) page on the Polkadot Developer Interface. You can see the buttons by clicking on your account's name:\n\n![](../../assets/how-to/65032451599.png)\n\nOr by clicking the drop-down menu next to your account:\n\n![](../../assets/how-to/65032451621.png)\n\nClicking on any of the block explorer buttons will take you to your account's page on the chosen explorer, displaying the information from the correct network.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-view-transaction-history", "url": "https://developer.polkadot.com/wiki/learn/how-to/view-transaction-history/#how-to-see-your-account-history", "page_title": "Where Can I See the Transaction History of my Polkadot Account?", "index": 1, "depth": 3, "title": "How to See Your Account History", "anchor": "how-to-see-your-account-history", "start_char": 1505, "end_char": 2066, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:984b03fd87e27fdae2d1a621aa6c826350ed62ef96491042aa0d3091be9228ed", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to See Your Account History\n\n#### **On Subscan**\n\nBy default, the Extrinsics tab will be open, which includes any extrinsics signed from your account (including staking, voting, etc.). Switch to the Transfers tab if you'd like to see only your incoming and outgoing transfers:\n\n![](../../assets/how-to/65032454202.png)\n\n#### **Exporting your transaction history**  \n\nIf you'd like to view your entire history in a spreadsheet, you can follow [these instructions](export-transaction-history.md) to export your transaction history into .csv format.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vote-opengov", "url": "https://developer.polkadot.com/wiki/learn/how-to/vote-opengov/#tools-for-polkadot-opengov", "page_title": "How to Vote on Polkadot OpenGov", "index": 0, "depth": 3, "title": "**Tools for Polkadot OpenGov**", "anchor": "tools-for-polkadot-opengov", "start_char": 764, "end_char": 1277, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5babf36d8ffefbb94b71c444f7e400bb185649173d35169121ac44c284a845c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Tools for Polkadot OpenGov**\n\nBuilt by the community, several tools allow you to participate in the governance of Polkadot and Kusama. Here is a list of some of them:\n\n  * [Subsquare](https://www.subsquare.io/). It offers a place to discuss and add contextual information to the referenda. It allows commenting on each referendum, and also voting and delegating.\n  * [Nova Wallet](https://novawallet.io/). Mobile wallet with extensive tools to facilitate voting and delegating from your own wallet.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vote-opengov", "url": "https://developer.polkadot.com/wiki/learn/how-to/vote-opengov/#voting-on-polkadot-developer-interface", "page_title": "How to Vote on Polkadot OpenGov", "index": 1, "depth": 3, "title": "**Voting on Polkadot Developer Interface**", "anchor": "voting-on-polkadot-developer-interface", "start_char": 1277, "end_char": 5732, "estimated_token_count": 1048, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5babf36d8ffefbb94b71c444f7e400bb185649173d35169121ac44c284a845c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Voting on Polkadot Developer Interface**\n\n!!! warning \"IMPORTANT\"\n\n    Polkadot Developer Interface is a web wallet meant for power users and developers. For everyday use, there are several user-friendly wallets that support a plethora of features and platforms. Discover them in [this article](where-to-store-dot.md).\n\nIf you have an account on Polkadot Developer Interface or it is connected to the UI (for example using the Polkadot Developer Signer), you can vote directly on the trusted Polkadot Developer Interface in a few simple steps:\n\n1\\. On the Polkadot Developer Interface, go to the [\"Governance\" > \"Referenda\"](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/referenda) tab.\n\n![](../../assets/how-to/65032514099.png)\n\n2\\. On this page, you will be presented with a filter for the tracks for which there are active referenda. For information about the different tracks, you can read [this article](../learn-polkadot-opengov.md#origins-and-tracks).\n\n_![](../../assets/how-to/65032514242.png)_\n\n3\\. For each referendum, information like the index of the referendum, proposer, who made the decision deposit, its status, votes weight in favor or against the referendum, and a voting button are shown. If you click on the rightmost down arrow, you can expand the current status for each ongoing referendum:\n\n![](../../assets/how-to/65032514357.png)\n\nThe \"Approval\" graph plots a horizontal line representing the current percentage of voting power (balance multiplied by conviction) voting in favor (ayes) of that referendum.\n\nThe \"Support\" graph represents the percentage of \"ayes\" plus abstentions out of the total possible number of votes (excluding conviction adjustments) that can be made within the system.\n\nThe orange line in both graphs indicates the minimum threshold for approval and support that a referendum must keep to be approved. Each track has different thresholds and conditions to meet. Read [this article](../learn-polkadot-opengov.md#approval-and-support) for further details about these and other parameters in OpenGov.\n\nIt's important to notice that each referendum should be accompanied by contextual information about it, but that information isn't stored on-chain, so Polkadot Developer Interface can't show it. You can click on the [Subsquare](https://www.subsquare.io/) icon on each referendum (bottom left corner) to discuss and read further about each referendum. This is the _de facto_ site built by the community where the proposers can share info about their proposals.\n\n4\\. By clicking on the \"Vote\" button, a new panel pops up with the following information:\n\n  * The account you'll be voting from (1).\n  * The direction of the vote (2):\n* \"Aye\" in favor of the referendum.\n* \"Nay,\" against it.\n* \"Split,\" you can split your voting power into both options.\n* \"Abstain,\" your vote will count for the referendum support (total voting balance) but not for its approval (voting power ratio of \"Ayes\" or \"Nays\").\n  * The voting balance (3). The amount of DOT (or KSM) you'll vote with. If you're voting from a delegate account, the delegated voting power won’t be visible here, but it will be taken into account for the referendum result.\n\n  * The conviction you're voting with (4). It's a multiplier to your voting balance, so these two determine your \"voting power.\" The greater the conviction, the greater your voting power and the longer the tokens will be locked for that referendum. Learn more about \"conviction locking\" in the article \"[Voluntary Locking](../learn-polkadot-opengov.md#voluntary-locking-conviction-voting).\"\n\n![](../../assets/how-to/65032514802.png)\n\n!!! tip \"GOOD TO KNOW\"\n\n    Locks applied to your assets overlap. It means that with the same locked balance you could vote on several referenda at the same time.\n\n    Read the [article](../learn-account-balances.md) for further information of types of balances.\n\n5\\. After setting your vote, click on \"Vote.\" Review the transaction details on the new panel and click \"Sign and Submit.\" And that's it, you just voted on a referendum.\n\n!!! info\n\n    If you want to participate in Polkadot OpenGov but you either don't have time to review all the referenda or you think other people can be more knowledgeable than you about certain topics, you can delegate your voting power to trusted members.\n\n    Learn how to do it in the article \"[Polkadot OpenGov: How to Delegate your Voting Power](delegate-voting-power.md).\"\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-vote-opengov", "url": "https://developer.polkadot.com/wiki/learn/how-to/vote-opengov/#discussion-channels", "page_title": "How to Vote on Polkadot OpenGov", "index": 2, "depth": 3, "title": "**Discussion channels**", "anchor": "discussion-channels", "start_char": 5732, "end_char": 6189, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5babf36d8ffefbb94b71c444f7e400bb185649173d35169121ac44c284a845c5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### **Discussion channels**\n\nThe [Kusama Direction](https://matrix.to/#/#Kusama-Direction:parity.io) and [Polkadot Direction](https://matrix.to/#/#Polkadot-Direction:parity.io) channels on Matrix are dedicated to discussions and announcements related to governance. If you have an interest in participating in governance or staying up-to-date with the latest referenda, consider joining these channels and engaging in the discussions happening there.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-what-is-asset-hub", "url": "https://developer.polkadot.com/wiki/learn/how-to/what-is-asset-hub/#whats-asset-hub", "page_title": "What is Asset Hub and How Do I Use It?", "index": 0, "depth": 3, "title": "What's Asset Hub?", "anchor": "whats-asset-hub", "start_char": 905, "end_char": 2510, "estimated_token_count": 313, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2f7fd40812ae87d4f90f6d8171677ab6acf20ce5193d0afe4d8934a77661a5f2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What's Asset Hub?\n\nOriginally, Asset Hub was created as a system chain designed to hold more than just the native token. Features such as NFTs were deployed on Asset Hub so that the Polkadot ecosystem could offer functionality beyond what the Relay Chain provided. Today, Asset Hub continues to provide these capabilities and, after the [migration](asset-hub-migration.md), it also hosts features that previously ran on the Relay Chain. More recently, Asset Hub was enhanced with smart contract capabilities, transforming it into a more flexible and programmable network.\n\nHere are the key things to know about Asset Hub and its role in the Polkadot ecosystem:\n\n  * Features that already existed on Asset Hub, such as creating new assets or NFTs, continue to function as always.\n  * Developers can deploy smart contracts and users can interact with them.\n\n  * For regular users, Asset Hub is the main network needed for everyday activity on Polkadot.\n  * Most wallets automatically handle the network connection, so users often don't need to choose the network manually.\n  * The Relay Chain is now used almost exclusively by validators and parachain operators.\n  * Account balances were migrated from the Relay Chain to Asset Hub on October 7, 2025, on Kusama and on November 4, 2025, for Polkadot.\n  * Staking and governance are now alive on Asset Hub and are no longer available on the Relay Chain.\n  * The existential deposit in DOT is lower on Asset Hub than on the Relay Chain, and on Asset Hub there are additional sufficient assets (check section below) that can keep an account alive.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-what-is-asset-hub", "url": "https://developer.polkadot.com/wiki/learn/how-to/what-is-asset-hub/#how-to-use-asset-hub", "page_title": "What is Asset Hub and How Do I Use It?", "index": 1, "depth": 3, "title": "How to use Asset Hub", "anchor": "how-to-use-asset-hub", "start_char": 2510, "end_char": 3005, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2f7fd40812ae87d4f90f6d8171677ab6acf20ce5193d0afe4d8934a77661a5f2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How to use Asset Hub\n\nMany of the features available on Asset Hub can already be accessed through the usual platforms and wallets. You can still transfer balances, stake your funds, participate in Polkadot OpenGov, create new assets, or manage your NFTs just as before.\n\nMost wallets in the ecosystem automatically connect to the correct network to perform each action, so you don't need to change how you interact with Polkadot. Simply continue using your preferred wallet or tool.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-what-is-asset-hub", "url": "https://developer.polkadot.com/wiki/learn/how-to/what-is-asset-hub/#smart-contracts-on-asset-hub", "page_title": "What is Asset Hub and How Do I Use It?", "index": 2, "depth": 3, "title": "Smart contracts on Asset Hub", "anchor": "smart-contracts-on-asset-hub", "start_char": 3005, "end_char": 3907, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2f7fd40812ae87d4f90f6d8171677ab6acf20ce5193d0afe4d8934a77661a5f2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Smart contracts on Asset Hub\n\nStarting with runtime version [2.0.4 on Kusama](https://github.com/polkadot-fellows/runtimes/releases/tag/v2.0.4) and [2.0.5 on Polkadot](https://github.com/polkadot-fellows/runtimes/releases/tag/v2.0.5), Asset Hub gained support for smart contract deployment, expanding its role beyond asset issuance and transfers.\n\nWith this upgrade, Polkadot Hub enables developers to deploy smart contracts while continuing to use familiar Ethereum tooling, workflows, and programming languages, making it easy to bring existing applications and development practices into the Polkadot ecosystem without switching stacks.\n\nObtain more information about smart contracts on Polkadot in the documentation:\n\n  * [Polkadot Hub: Smart Contracts on Polkadot](../learn-smart-contracts.md)\n  * Polkadot Docs: [Smart Contracts on Polkadot Hub](../../../smart-contracts/overview.md)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-what-is-asset-hub", "url": "https://developer.polkadot.com/wiki/learn/how-to/what-is-asset-hub/#sufficient-and-non-sufficient-assets-in-asset-hub", "page_title": "What is Asset Hub and How Do I Use It?", "index": 3, "depth": 3, "title": "Sufficient and non-sufficient assets in Asset Hub", "anchor": "sufficient-and-non-sufficient-assets-in-asset-hub", "start_char": 3907, "end_char": 6118, "estimated_token_count": 476, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2f7fd40812ae87d4f90f6d8171677ab6acf20ce5193d0afe4d8934a77661a5f2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Sufficient and non-sufficient assets in Asset Hub\n\nThere are two types of assets on Asset Hub: sufficient and non-sufficient.\n\nTo hold a non-sufficient asset in an account, the account needs to exist on-chain, which means it needs to have a balance in the native asset at least as much as the [Existential Deposit (ED)](existential-deposit.md). This means **0.01 DOT**  on Polkadot Asset Hub and **0.000003333 KSM** on Kusama Asset Hub. These existential deposits are smaller than those on the Relay Chains.\n\nSo, to send a non-sufficient asset, you need to ensure that the recipient account has at least the ED. A sufficient asset doesn't require the account to have any balance in the native token to be received.\n\nHowever, each asset (either sufficient or non-sufficient) has its own minimum balance that an account must hold.\n\nCurrently, the sufficient tokens and foreign assets (native assets on other networks) in Polkadot Asset Hub are:\n\n  * USDC (asset ID: 1337)\n  * USDT (asset ID: 1984)\n  * ETH (foreign asset transferred via Snowbridge)\n  * WETH (foreign asset transferred via Snowbridge)\n  * KSM (foreign asset transferred via Polkadot <> Kusama bridge)\n  * USDC (foreign asset transferred via Snowbridge)\n  * USDT (foreign asset transferred via Snowbridge)\n\nSufficient tokens and foreign assets in Kusama Asset Hub are:\n\n  * USDT (asset ID: 1984)\n  * RMRK (asset ID: 8)\n  * ETH (foreign asset transferred via Snowbridge)\n  * WETH (foreign asset transferred via Snowbridge)\n  * DOT (foreign asset transferred via Polkadot <> Kusama bridge)\n  * USDC (foreign asset transferred via Snowbridge)\n  * USDT (foreign asset transferred via Snowbridge)\n\n!!! warning \"ATTENTION\"\n\n    Anyone can create and name an asset on Asset Hub, which means many assets may share familiar names. However, that doesn't guarantee they're the real or official versions. To avoid scams, always verify the asset's unique ID before accepting or paying for it. For instance, the legitimate Tether USDT on Asset Hub has the ID 1984, anything else is fake USDT.\n\n    If you don't know what the asset ID is for the token you're interested in, **contact the issuer** of the token and find out, before accepting any tokens.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-where-to-store-dot", "url": "https://developer.polkadot.com/wiki/learn/how-to/where-to-store-dot/#treasury-funded-wallets", "page_title": "Where to Store DOT — Polkadot Wallet Options", "index": 0, "depth": 3, "title": "Treasury Funded Wallets", "anchor": "treasury-funded-wallets", "start_char": 802, "end_char": 3394, "estimated_token_count": 761, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d290ee3099008f05b4d126b37ca82ecbd88557efa3eea38be5ecc02754e3e63b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Treasury Funded Wallets\n\nThere are several wallets developed by teams that have received funding by the community from Polkadot or Kusama's Treasury. These wallets provide a convenient way of interacting with Polkadot's applications on a daily basis, thanks to their user-friendly UI/UX. Below is a list of some of these wallets, available on various devices and operating systems.\n\n!!! tip \"GOOD TO KNOW\"\n\n    These third-party wallets are all non-custodial and have been funded by the community through either the Polkadot or Kusama treasury. All of them are highly reputable and can offer assistance to their users on their respective official sites.\n\n| Wallet | Platform | Staking / Nomination Pools | NFTs | Ledger | Governance |\n|---|---|---|---|---|---|\n| [Nova Wallet](https://novawallet.io/) | [iOS](https://apps.apple.com/app/nova-polkadot-kusama-wallet/id1597119355), [Android](https://play.google.com/store/apps/details?id=io.novafoundation.nova.market) | ✓ / ✓ | ✓ | ✓ | ✓ |\n| [SubWallet](https://subwallet.app/) | [Brave, Chrome, Edge,](https://chrome.google.com/webstore/detail/subwallet-polkadot-extens/onhogfjeacnfoofkfgppdlbmlmnplgbn) [Firefox](https://addons.mozilla.org/en-US/firefox/addon/subwallet/), [iOS](https://apps.apple.com/us/app/subwallet-polkadot-wallet/id1633050285), [Android](https://play.google.com/store/apps/details?id=app.subwallet.mobile) | ✓ / ✓ | ✓ | ✓ | – |\n| [Talisman](https://talisman.xyz/) | [Brave, Chrome, Edge,](https://chrome.google.com/webstore/detail/talisman-polkadot-and-eth/fijngjgcjhjmmpcmkeiomlglpeiijkld) [Firefox](https://addons.mozilla.org/en-US/firefox/addon/talisman-wallet-extension/) | – / ✓ | ✓ | ✓ | – |\n| [Enkrypt](https://www.enkrypt.com/) | [Brave](https://chrome.google.com/webstore/detail/enkrypt/kkpllkodjeloidieedojogacfhpaihoh), [Chrome](https://chrome.google.com/webstore/detail/enkrypt/kkpllkodjeloidieedojogacfhpaihoh), [Edge](https://microsoftedge.microsoft.com/addons/detail/gfenajajnjjmmdojhdjmnngomkhlnfjl), [Firefox](https://addons.mozilla.org/en-US/firefox/addon/enkrypt/), [Opera](https://addons.opera.com/en/extensions/details/enkrypt/), [Safari](https://apps.apple.com/app/enkrypt-web3-wallet/id1640164309) | – / – | ✓ | ✓ | – |\n| [PolkaGate](http://polkagate.xyz/) | [Brave, Chrome,](https://chrome.google.com/webstore/detail/polkagate-the-gateway-to/ginchbkmljhldofnbjabmeophlhdldgp) [Firefox](https://addons.mozilla.org/en-US/firefox/addon/polkagate/), [Edge](https://microsoftedge.microsoft.com/addons/detail/polkagate-the-gateway-to/eakellaeidmgcpifaofebhpcjienkajp) | ✓ / ✓ | – | ✓ | ✓ |\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-where-to-store-dot", "url": "https://developer.polkadot.com/wiki/learn/how-to/where-to-store-dot/#cold-storage-wallets-offline", "page_title": "Where to Store DOT — Polkadot Wallet Options", "index": 1, "depth": 3, "title": "Cold Storage Wallets (offline)", "anchor": "cold-storage-wallets-offline", "start_char": 3394, "end_char": 4296, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d290ee3099008f05b4d126b37ca82ecbd88557efa3eea38be5ecc02754e3e63b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cold Storage Wallets (offline)\n\nHardware wallets offer the capability to store your account offline while still enabling you to access and use your Polkadot account at your convenience. Some of these hardware wallets are listed below.\n\n#### **Polkadot Vault**\n\nYou can install [Polkadot Vault](https://www.parity.io/signer/) (rebranded from Parity Signer) on an old smartphone reset to factory defaults, which you'll keep in airplane mode. This way, you can turn your old phone into a cold storage wallet.\n\n#### **Ledger**\n\nAnother secure option is the [Ledger wallet](https://support.ledger.com/hc/en-us/articles/360016289919) which supports Polkadot. You can use it natively with [Ledger Live](../../general/ledger.md#using-ledger-live) or connect it to many of the wallets mentioned in this article and directly to the [Staking Dashboard](../../general/dashboards/staking-dashboard.md).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-where-to-store-dot", "url": "https://developer.polkadot.com/wiki/learn/how-to/where-to-store-dot/#third-party-wallets", "page_title": "Where to Store DOT — Polkadot Wallet Options", "index": 2, "depth": 3, "title": "Third-Party Wallets", "anchor": "third-party-wallets", "start_char": 4296, "end_char": 4729, "estimated_token_count": 107, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d290ee3099008f05b4d126b37ca82ecbd88557efa3eea38be5ecc02754e3e63b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Third-Party Wallets\n\nNumerous third-party wallets have been built by the community or funded in other ways. You can find a list of them on community websites like [Dotinsights](https://dotinsights.subwallet.app/projects/). Open-source projects are also listed in the [Open Source](../../general/build-open-source.md) page.\n\nMost of them are user-friendly and have their own documentation and support teams ready to help.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-where-to-store-dot", "url": "https://developer.polkadot.com/wiki/learn/how-to/where-to-store-dot/#wallets-for-developers-and-power-users", "page_title": "Where to Store DOT — Polkadot Wallet Options", "index": 3, "depth": 3, "title": "Wallets for developers and power users", "anchor": "wallets-for-developers-and-power-users", "start_char": 4729, "end_char": 6441, "estimated_token_count": 356, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d290ee3099008f05b4d126b37ca82ecbd88557efa3eea38be5ecc02754e3e63b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Wallets for developers and power users\n\nThe following wallets have been developed by Parity. There are many useful articles on the wiki to help you use and address issues with these wallets.\n\n!!! tip \"GOOD TO KNOW\"\n\n    These wallets are mostly created with developers and advanced users in mind, and although they provide advanced functionality, they might not be very user-friendly. For a more user-friendly experience, you can use one of the many wallets developed by other teams, [listed ](where-to-store-dot.md#treasury-funded-wallets)above.\n\n#### Polkadot Developer Signer\n\nThe [Polkadot Developer Signer](create-polkadot-account.md) is an account manager and will work in all Chromium-based browsers (Chrome, Brave, Edge) and Firefox. It's recommended to store your accounts in the extension and not on the Polkadot Developer Interface directly.\n\nBecause the extension only manages your keys and allows you to sign transactions, it needs to interact with a UI to show information about your accounts (like their balance) and to make transactions with them. It can be the Polkadot Developer Interface (below) or any compatible Web 3.0 app in the Polkadot ecosystem. With the Polkadot Developer Signer, you can connect your accounts to most of them.\n\n#### Polkadot Developer Interface (user interface)\n\nThe [Polkadot Developer Interface](create-account.md) web wallet contains advanced features designed for developers and power users, such as multi-sig accounts and switching signature schemes. It supports the full functionality that Substrate chains have to offer.\n\n#### Subkey (needs technical knowledge)\n\n[Subkey](create-account-subkey.md) is a command-line utility meant for advanced users.\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-why-cant-i-transfer-dot", "url": "https://developer.polkadot.com/wiki/learn/how-to/why-cant-i-transfer-dot/#most-common-errors-when-transferring-dot", "page_title": "Why Can't I Transfer My DOT?", "index": 0, "depth": 3, "title": "Most common errors when transferring DOT", "anchor": "most-common-errors-when-transferring-dot", "start_char": 395, "end_char": 3060, "estimated_token_count": 567, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:15d5dddce5d2b75ec4aec571dd9002c89cf2b86c931265435ca7b7aa2eeb1609", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Most common errors when transferring DOT\n\nYour account can have different types of balances, more specifically, transferable, frozen, and reserved. Only the transferable balance can be sent out of your account. Your frozen and reserved balance can't be moved. But it can be made transferable if or when the locks are removed or the reasons for the reserves cease to exist. To learn more about the different types of balance, please check [this article](../learn-account-balances.md), and to learn how to remove locks and make your balance transferable, please watch the video at the end of the article.\n\nIf transferring funds resulted in a failed extrinsic, these are the most common errors and how to solve them:\n\n  * **NotExpendable** : Withdrawing these funds would cause an unwanted loss from your account. If you intend to send all your funds to the destination, use an extrinsic like 'transfer_all' or 'transfer_allow_death'.\n\n  * **Frozen** : The funds you're trying to send are currently locked by another process, such as staking, voting, or similar activities. Please remove the lock and try again.\n\nAnother possibility is that you're trying to empty your account of an asset that holds the [existential deposit](existential-deposit.md), while other non-sufficient assets remain. These assets would be destroyed if they aren't transferred first.\n\n  * **BelowMinimum** : The account can't exist with the amount you're trying to send. This usually happens when you attempt to send less than the [existential deposit](existential-deposit.md) to an empty account. You must send an amount exceeding the network's existential deposit, or ensure the destination account is already active.\n\n  * **FundsUnavailable** : The amount you're trying to send exceeds your transferable balance. Keep in mind that transaction fees are deducted from your remaining balance. If you want to send your full balance, use an extrinsic like 'transfer_all' that accounts for fees.\n\n\n\n* * *\n\nThe following video dives a little deeper into the various locks that can exist on your balance and how to remove them to make your balance transferable again:\n\n!!! warning \"This video predates the Asset Hub Migration\"\n\n    The walkthrough below was recorded before the [Asset Hub Migration](asset-hub-migration.md). Account balances are now held on the Polkadot Hub, so the interface shown may differ from what you see today. The explanation of locks and how to remove them still applies — see [Account Balances](../learn-account-balances.md) for the current details.\n\n[Learn How You Can Free Funds - Deep Dive into Polkadot's Locks](https://www.youtube.com/watch?v=LHgY7ds_bZ0)\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-withdraw-usdt-from-exchanges", "url": "https://developer.polkadot.com/wiki/learn/how-to/withdraw-usdt-from-exchanges/#how-to-withdraw-usdt-from-bitfinex", "page_title": "How to Withdraw USDT from Exchanges on Asset Hub", "index": 0, "depth": 3, "title": "How to withdraw USDT from Bitfinex", "anchor": "how-to-withdraw-usdt-from-bitfinex", "start_char": 467, "end_char": 1950, "estimated_token_count": 387, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:73f694dcaa5956d4580f6328a1bb0a5179a067cea03f4443e38a86fc49c6ca38", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to withdraw USDT from Bitfinex\n\nBitfinex offers USDT withdrawals on Polkadot Asset Hub.\n\n1\\. First, log in to your Bitfinex account.\n\n2\\. Click on \"Wallet\" on the top right and select \"Withdraw\":\n\n![](../../assets/how-to/65012234022.png)\n\n3\\. From the \"New withdrawal\" panel, select \"Tether tokens\":\n\n![](../../assets/how-to/65018147994.png)\n\n4\\. On the new screen that opens up:\n\n  * Ensure that \"Tether USDt\" is selected as \"Currency\"\n  * Select one of your wallets (Exchange, Margin, or Funding) where you have USDt balance\n  * Choose \"Tether(USD) on Polkadot\" as the \"Transport protocol.\"\n  * Then, type the amount you wish to withdraw and click on \"Continue\":\n\n![](../../assets/how-to/65018148031.png)\n\n5\\. Copy your Polkadot Asset Hub address from your wallet (remember that it's the same as your Polkadot address) and paste it into the address field. **Double-check** that it's the correct account address:\n\n![](../../assets/how-to/65018148194.png)\n\n6\\. Acknowledge that you've read and understood the conditions, and then click the \"Request Withdrawal\" button.\n\n7\\. After you go through Bitfinex's security checks, your withdrawal will be processed in a few minutes, and you'll see your USDT in your Polkadot Asset Hub account.\n\n!!! tip \"GOOD TO KNOW\"\n\n    Check the balance of your Asset Hub address from one of the suitable block explorers listed in the article \"[What Block Explorers Can I Use for the Polkadot and Kusama Ecosystems?](block-explorers.md)\"\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-how-to-withdraw-usdt-from-exchanges", "url": "https://developer.polkadot.com/wiki/learn/how-to/withdraw-usdt-from-exchanges/#how-to-withdraw-usdt-from-binance", "page_title": "How to Withdraw USDT from Exchanges on Asset Hub", "index": 1, "depth": 3, "title": "How to withdraw USDT from Binance", "anchor": "how-to-withdraw-usdt-from-binance", "start_char": 1950, "end_char": 3614, "estimated_token_count": 389, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:73f694dcaa5956d4580f6328a1bb0a5179a067cea03f4443e38a86fc49c6ca38", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### How to withdraw USDT from Binance\n\nCurrently, Binance only offers withdrawals on Polkadot Asset Hub.\n\n1\\. Login into your Binance account.\n\n2\\. From the top section, select \"Withdraw Crypto.\"\n\n3\\. Select \"USDT TetherUS\" on the new screen as the coin to withdraw:\n\n![](../../assets/how-to/65018148324.png)\n\n4\\. Now, from the \"Send to\" section, select the Polkadot Asset Hub network from the withdrawal network drop-down menu (it may still appear as \"Statemint (Polkadot)\").\n\n!!! danger \"READ THIS FIRST!\"\n\n    Most wallets that support Polkadot now support Asset Hub. However, some wallets may support only DOT on Asset Hub and not other assets such as USDT.\n\n    Before sending any funds, please make sure the destination wallet supports USDT on Polkadot Asset Hub to avoid potential issues.\n\n5\\. Copy your Polkadot Asset Hub address from your wallet (remember it's the same as your Polkadot address) and paste it into the address field. **Double-check** that it's the correct account address.\n\n!!! tip \"GOOD TO KNOW\"\n\n    If you paste a valid Polkadot address in the address field, Binance will automatically select the correct network.\n\n6\\. Check that everything is correct and type the amount you want to withdraw from your desired Binance wallet:\n\n![](../../assets/how-to/65018148689.png)\n\n7\\. Click on \"Withdraw\" and that's it. Your withdrawal should be processed by Binance and your funds will reach your address in a few minutes.\n\n* * *\n\nIn this article, you learned how to withdraw Tether (USDT) from an exchange account. If you want to send USDT tokens from your Asset Hub account to another account, check out [this article](transfer-usdt.md).\n\n* * *"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT-KSM-bridge/#polkadot-and-kusama-bridge-relayers", "page_title": "Polkadot <> Kusama Bridge", "index": 0, "depth": 2, "title": "Polkadot and Kusama Bridge Relayers", "anchor": "polkadot-and-kusama-bridge-relayers", "start_char": 872, "end_char": 1238, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bbbc8932b95a172f5596e3fb8a6f67e04acf58607d6845a677786f1e867e3f89", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot and Kusama Bridge Relayers\n\nThe job of the relayers is to relay Kusama/Polkadot GRANDPA justifications to the bridge hubs on one\nside to the other. They also relay finalized Kusama Bridge Hub and Polkadot Bridge Hub block\nheaders. They operate only when messages are queued at the bridge hubs. When there are no messages\nqueued, the relayers stay idle."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT-KSM-bridge/#run-a-polkadot-and-kusama-bridge-relayer", "page_title": "Polkadot <> Kusama Bridge", "index": 1, "depth": 3, "title": "Run a Polkadot and Kusama Bridge Relayer", "anchor": "run-a-polkadot-and-kusama-bridge-relayer", "start_char": 1238, "end_char": 1668, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bbbc8932b95a172f5596e3fb8a6f67e04acf58607d6845a677786f1e867e3f89", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Run a Polkadot and Kusama Bridge Relayer\n\nAnyone can start running a relayer for the Polkadot < > Kusama Bridge. For instructions, check\n[the relayer docs on Polkadot-SDK repository](https://github.com/paritytech/polkadot-sdk/blob/master/bridges/docs/running-relayer.md).\nOf course, running relayer has costs involved. Apart from paying for the CPU and network, the\nrelayer pays for transactions at both sides of the bridge."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT-KSM-bridge/#relayer-rewards", "page_title": "Polkadot <> Kusama Bridge", "index": 2, "depth": 3, "title": "Relayer Rewards", "anchor": "relayer-rewards", "start_char": 1668, "end_char": 4080, "estimated_token_count": 481, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bbbc8932b95a172f5596e3fb8a6f67e04acf58607d6845a677786f1e867e3f89", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Relayer Rewards\n\n!!!caution \"Relayer Incentive Mechanism - Work in Progress\"\n    The initial bridge design supports any number of relayers, but there's no guaranteed reward for each\n    and every relayer submitting valid bridge transactions. Also, these rewards are distributed from the\n    accounts controlled by the respective network's governance. Hence, any delays in replenishing\n    the funds on these accounts will result in not receiving any rewards.\n\nRewards paid to relayer has two parts - static and dynamic. The static part of the reward is set\nthrough the on-chain governance. It requires the relayer to deliver a preset number of valid\nmessages to earn a preset number of DOT or KSM. The other reward part is dynamic, which involves\ndelivering an XCM message from one BridgeHub to another. The relayer needs to submit transactions on\nboth the bridge hubs, where each transaction has its cost, which can be:\n\n- dynamic, because message size can change and/or fee factor of the target chain may change.\n- significant, because the bridge transactions can be of arbitrary size.\n\nThe relayers are compensated for the cost of submitting valid, minimal and useful bridge-related\ntransactions. Valid here means that the transaction doesn't fail. Minimal means that all data within\ntransaction call is actually required for the transaction to succeed. Useful means that all supplied\ndata in transaction is new and yet unknown to the target chain.\n\nIt is always the sending chain that pays for rewards for the relayers. The sending chain\npays at both ends of the bridge from its sovereign accounts on each Bridge Hub. For\nexample Polkadot Asset Hub (PAH) → Kusama Asset Hub (KAH) transfer will involve\nrewards from PAH's sovereign account on Polkadot Bridge Hub (PBH) and rewards from PAH's\nsovereign account on Kusama Bridge Hub (KBH). It is the responsibility of Polkadot OpenGov to\nreplenish the funds of PAH's sovereign account on both the bridge hubs (PBH and KBH). Similarly, KAH\n→ PAH transfer is rewarded by KAH's sovereign accounts on PBH and KBH, which have to be replenished\nthrough Kusama OpenGov.\n\nFor more information on relayer rewards, check the\n[relayers compensation scheme section](https://github.com/paritytech/polkadot-sdk/blob/master/bridges/docs/running-relayer.md#a-brief-introduction-into-relayers-and-our-compensations-scheme)\non the relayer docs on the Polkadot-SDK repository."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT/#the-planck-unit", "page_title": "DOT Token", "index": 0, "depth": 2, "title": "The Planck Unit", "anchor": "the-planck-unit", "start_char": 1789, "end_char": 3296, "estimated_token_count": 476, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7645b0cfbbe3358220ec62a539cdbff9980264480382ea0ac21bd3e52e664c27", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## The Planck Unit\n\nThe smallest unit of account balance on Polkadot SDK-based blockchains is Planck, named after the [Planck Length](https://en.wikipedia.org/wiki/Planck_length). DOT equals 10<sup>10</sup> Planck, while Kusama's KSM equals 10<sup>12</sup> Planck.\n\n=== \"Polkadot\"\n    | Unit            | Decimal Places | Conversion to Planck   | Conversion to DOT |\n    | --------------- | -------------- | ---------------------- | ----------------- |\n    | Planck          | 0              | 1 Planck               | 0.0000000001 DOT  |\n    | Microdot (uDOT) | 4              | 10<sup>4</sup> Planck  | 0.0000010000 DOT  |\n    | Millidot (mDOT) | 7              | 10<sup>7</sup> Planck  | 0.0010000000 DOT  |\n    | Dot (DOT)       | 10             | 10<sup>10</sup> Planck | 1.0000000000 DOT  |\n    | Million (MDOT)  | 16             | 10<sup>16</sup> Planck | 1,000,000.00 DOT  |\n\n=== \"Kusama\"\n    | Unit            | Decimal Places | Conversion to Planck   | Conversion to KSM  |\n    | --------------- | -------------- | ---------------------- | ------------------ |\n    | Planck          | 0              | 1 Planck               | 0.000000000001 KSM |\n    | Point           | 3              | 10<sup>3</sup> Planck  | 0.000000001000 KSM |\n    | MicroKSM (uKSM) | 6              | 10<sup>6</sup> Planck  | 0.000001000000 KSM |\n    | MilliKSM (mKSM) | 9              | 10<sup>9</sup> Planck  | 0.001000000000 KSM |\n    | KSM             | 12             | 10<sup>12</sup> Planck | 1.000000000000 KSM |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT/#dot-inflation", "page_title": "DOT Token", "index": 1, "depth": 2, "title": "DOT Inflation", "anchor": "dot-inflation", "start_char": 3296, "end_char": 3314, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7645b0cfbbe3358220ec62a539cdbff9980264480382ea0ac21bd3e52e664c27", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## DOT Inflation"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT/#total-supply", "page_title": "DOT Token", "index": 2, "depth": 3, "title": "Total supply", "anchor": "total-supply", "start_char": 3314, "end_char": 6087, "estimated_token_count": 676, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7645b0cfbbe3358220ec62a539cdbff9980264480382ea0ac21bd3e52e664c27", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Total supply\n\nThe current total supply is approximately **1.6 billion DOT**, with a **maximum supply capped at 2.1 billion DOT**. You can check the latest value on the [Subscan token supply dashboard](https://assethub-polkadot.subscan.io/tools/charts?type=token_supply), the [Developer Interface Explorer](https://polkadot.js.org/apps/#/explorer), or on [CoinGecko](https://www.coingecko.com/en/coins/polkadot) / [CoinMarketCap](https://coinmarketcap.com/currencies/polkadot-new/).\n\nNew DOT is minted to reward validators and nominators who secure the network through staking, and to fund the [Polkadot Treasury](./learn-polkadot-opengov-treasury.md). The issuance model has evolved through OpenGov: [Referendum 1710](https://polkadot.subsquare.io/referenda/1710) (implemented January 2026) introduced a **capped, stepped schedule** in which inflation steps down every two years — 13.14% of the remaining gap to the 2.1 billion DOT cap every two years, with the first step on 14 March 2026 — so it declines as the circulating supply approaches the cap.\n\n!!! info\n    The fixed-rate figure and 25-year projection described below reflect Polkadot's earlier inflation model, prior to the [Referendum 1710](https://polkadot.subsquare.io/referenda/1710) stepped schedule above.\n\nDOT is an inflationary token, with\n[**fixed annual expansion of the token supply of 120,000,000 DOT**](https://github.com/polkadot-fellows/runtimes/pull/471),\nof which 15% goes to the [treasury](./learn-polkadot-opengov-treasury.md) and 85% to\n[stakers](./learn-staking.md).\n\nIt is essential to understand that the primary objective of inflation is to incentivize network\nparticipants through\n[Nominated Proof of Stake (NPoS)](./learn-consensus.md#nominated-proof-of-stake) and to grow the\nnetwork through funding the on-chain treasury. The token inflation rate can be updated through\n[on-chain governance](./learn-polkadot-opengov.md) based on thorough tokenomics research.\n\nBelow is a 25-year prediction of DOT gross annual inflation (red line) and DOT total issuance (blue\nline), assuming the current fixed inflation rate.\n\n![inflation](../assets/dot-inflation.png)\n\nThe total issuance takes into account the gross DOT inflation and thus does not consider tokens that\nare burned.\n\nNet DOT inflation depends on [treasury burns](./learn-polkadot-opengov-treasury.md) and\n[coretime sales](./learn-agile-coretime.md#agile-coretime-implementation) that are variables and\nthus cannot be predicted. Net inflation can be defined as follows:\n\n```\n\nNet Inflation = Gross fixed inflation - burned supply (treasury + coretime sales)\n\n```\n\nWhere `Gross fixed inflation` is the annual inflation of 120M DOT and the `burned supply` is the\nannual burn supply due to treasury burns and coretime sale burns."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT/#dot-and-ksm-claims", "page_title": "DOT Token", "index": 3, "depth": 2, "title": "DOT and KSM Claims", "anchor": "dot-and-ksm-claims", "start_char": 6087, "end_char": 6291, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7645b0cfbbe3358220ec62a539cdbff9980264480382ea0ac21bd3e52e664c27", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## DOT and KSM Claims\n\nDOT and KSM are not freely distributed. Obtain them via the [claim process](../learn/learn-guides-claims.md), [Treasury](./learn-polkadot-opengov-treasury.md), or the open market."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-dot", "url": "https://developer.polkadot.com/wiki/learn/learn-DOT/#obtaining-testnet-tokens", "page_title": "DOT Token", "index": 4, "depth": 2, "title": "Obtaining Testnet Tokens", "anchor": "obtaining-testnet-tokens", "start_char": 6291, "end_char": 8390, "estimated_token_count": 650, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7645b0cfbbe3358220ec62a539cdbff9980264480382ea0ac21bd3e52e664c27", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Obtaining Testnet Tokens\n\nTestnet tokens allow experimentation on Polkadot's features. Obtain testnet tokens [on the official faucet](https://faucet.polkadot.io/). For faucet issues, use the [support chat](https://matrix.to/#/#faucets-support:matrix.org) or [create an issue](https://github.com/paritytech/polkadot-testnet-faucet/issues/new/choose).\n\n=== \"Paseo\"\n\n    Paseo mirrors Polkadot's runtime. Obtain PAS tokens [here](https://faucet.polkadot.io/) or via `!drip <PASEO_ADDRESS>` in the [Matrix chatroom](https://matrix.to/#/#paseo_faucet:matrix.org).\n\n    | Unit            | Decimal Places | Conversion to Planck   | Conversion to PAS |\n    | --------------- | -------------- | ---------------------- | ----------------- |\n    | Planck          | 0              | 1 Planck               | 0.0000000001 PAS  |\n    | Microdot (uPAS) | 4              | 10<sup>4</sup> Planck  | 0.0000010000 PAS  |\n    | Millidot (mPAS) | 7              | 10<sup>7</sup> Planck  | 0.0010000000 PAS  |\n    | Dot (PAS)       | 10             | 10<sup>10</sup> Planck | 1.0000000000 PAS  |\n    | Million (MPAS)  | 16             | 10<sup>16</sup> Planck | 1,000,000.00 PAS  |\n\n=== \"Westend\"\n\n    Westend is Polkadot's testnet. Obtain WND tokens via the [faucet](https://faucet.polkadot.io/westend) or `!drip <WESTEND_ADDRESS>` in the [Matrix chatroom](https://matrix.to/#/#westend_faucet:matrix.org). Validators can also earn WND. Watch the [video guide](https://www.youtube.com/watch?v=0ji0ccZyb3k).\n\n    | Unit            | Decimal Places | Conversion to Planck   | Conversion to WND  |\n    | --------------- | -------------- | ---------------------- | ------------------ |\n    | Planck          | 0              | 1 Planck               | 0.000000000001 WND |\n    | Point           | 3              | 10<sup>3</sup> Planck  | 0.000000001000 WND |\n    | MicroWND (uWND) | 6              | 10<sup>6</sup> Planck  | 0.000001000000 WND |\n    | MilliWND (mWND) | 9              | 10<sup>9</sup> Planck  | 0.001000000000 WND |\n    | WND             | 12             | 10<sup>12</sup> Planck | 1.000000000000 WND |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-abstraction", "url": "https://developer.polkadot.com/wiki/learn/learn-account-abstraction/#your-keys-your-responsibility", "page_title": "Polkadot Account Abstraction", "index": 0, "depth": 2, "title": "Your Keys, Your Responsibility", "anchor": "your-keys-your-responsibility", "start_char": 1, "end_char": 844, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0d850080c7692247213522dfd634fced921b4fa793a2253fc08ffa84226757d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Your Keys, Your Responsibility\n\nAccount abstraction addresses the challenges of managing cryptographic keys representing accounts on\nblockchains. Accounts on blockchains represent entities, from an individual's identity to an\ninstitution. In [Web3](../general/web3-and-polkadot.md), you digitally sign any transaction or, more\ngenerally, any message using your private key. Data is recorded on a public ledger (usually\nblockchain-based) whose multiple copies of it are stored in computers participating in a P2P\nnetwork.\n\nWhile the account’s private keys grant users control and ownership, losing them results in losing\naccess to digital assets and fragmentation of your digital identity since you will need to create a\nnew account with a new set of keys. This poses a hurdle for both users and developers regarding\nsecurity and adoption."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-abstraction", "url": "https://developer.polkadot.com/wiki/learn/learn-account-abstraction/#definition-of-account-abstraction", "page_title": "Polkadot Account Abstraction", "index": 1, "depth": 2, "title": "Definition of Account Abstraction", "anchor": "definition-of-account-abstraction", "start_char": 844, "end_char": 1989, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0d850080c7692247213522dfd634fced921b4fa793a2253fc08ffa84226757d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Definition of Account Abstraction\n\nThe concept of account _abstraction_ was first mentioned via Ethereum's\n[EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) focused on allowing users to flexibly program\nmore security and better user experiences into their accounts. The idea also aims to separate the\nuser experience from the private key, enabling a piece of code to dictate account behavior. This\nallows for increased flexibility of accounts that originally were not engineered to be flexible and\ndecreased chances of key mismanagement.\n\nUsers are still responsible for their keys, but through account abstraction, they can take\nprecautions to ensure they do not end up losing their accounts.\n\nAccount abstraction introduces a layer of on-chain logic that controls an account, typically in the\nform of a smart contract, that completely avoids the need for consensus-layer protocol changes.\nWithout a smart contract, abstracting accounts would require changes in the core architecture of the\nprotocol.\n\nPolkadot's generic codebase makes the concept of an account natively flexible and abstract without\nthe direct need for smart contracts."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-abstraction", "url": "https://developer.polkadot.com/wiki/learn/learn-account-abstraction/#origin-abstraction-in-polkadot", "page_title": "Polkadot Account Abstraction", "index": 2, "depth": 2, "title": "Origin Abstraction in Polkadot", "anchor": "origin-abstraction-in-polkadot", "start_char": 1989, "end_char": 5253, "estimated_token_count": 661, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0d850080c7692247213522dfd634fced921b4fa793a2253fc08ffa84226757d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Origin Abstraction in Polkadot\n\nAdopting a generic design is crucial in scaling [Web3](../general/web3-and-polkadot.md)\ntechnologies. Abstraction and generalization of protocols are essential to improving user experience\nand security in blockchain adoption.\n\nWhen users interact with a blockchain they call _dispatchable_ functions to do something. Because\nthose functions are called from the outside of the blockchain interface, in Polkadot's terms any\naction that involves a dispatchable function is an [extrinsic](./learn-transactions.md). Extrinsics\nare calls coming from the _outside_ of the blockchain interface that (if successfully executed)\ninvoke some changes in the _inside_ of the blockchain's state. An extrinsic is always directed to a\nspecific function within a particular [pallet](../general/glossary.md#pallet).\n\nFor example, the `balances.transferKeepAlive` extrinsic is directed to the `transferKeepAlive`\nfunction within the `balances` pallet. If successful, the execution of that function will transfer\nfunds between two accounts, changing the balances of those accounts and thus the chain state (as\naccounts hold some state within the blockchain).\n\nIn [Substrate](../general/glossary.md#substrate)'s FRAME, functions are not necessarily called by\naccounts. Functions can be called by any origin, where origins are caller-personas associated with\nprivilege levels. For example, the Polkadot [OpenGov](./learn-polkadot-opengov.md) has different\norigins with different privileges, such as allocating treasury funds, cancelling a referendum, etc.\nNeither of those origins is subservient to the concept of an account or assume anything about state\nor associated data. Custom origins can be created while designing your chain using the Substrate\n(which is part of the [Polkadot SDK](https://github.com/paritytech/polkadot-sdk)).\n\nThe figure below shows Polkadot's origin abstraction. Accounts happen to be just one variant (or\ncorner case) of Substrate's FRAME possible origins, the `frame_system::RawOrigin::Signed`. OpenGov\norigins function in a way that, if conditions (approval and support) are met and a proposal passes,\nthe appropriate\n[origin is then associated with the scheduled call](https://github.com/paritytech/polkadot-sdk/blob/1835c091c42456e8df3ecbf0a94b7b88c395f623/substrate/frame/referenda/src/lib.rs#L884).\nThose origins are caller-personas that do not have any entity behind them, and do not hold any state\non chain.\n\n![origin-abstraction](../assets/origin-abstraction.png)\n\nIn Substrate, the concept of account is completely deprioritized. Substrate itself remains\nindifferent to an account's balance and nonce. While FRAME can support their presence, it\nfundamentally does not need to rely on them.\n\nThe [Cross-Consensus Messaging (XCM)](./learn-xcm.md) format can take advantage of origin\nabstraction for cross-consensus communications by specifying the context for a particular message.\nOrigins in this case imply the authority under which a message is being sent (and thereby,\nexecuted).\n\nOn a lower level, the XCM format also provides a much powerful origin abstraction that allows\ncalling personas that are so abstract to not necessarily have direct representation on the local\nchain within its FRAME system origin."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-abstraction", "url": "https://developer.polkadot.com/wiki/learn/learn-account-abstraction/#protocol-level-account-abstraction", "page_title": "Polkadot Account Abstraction", "index": 3, "depth": 3, "title": "Protocol-level Account Abstraction", "anchor": "protocol-level-account-abstraction", "start_char": 5253, "end_char": 7118, "estimated_token_count": 395, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0d850080c7692247213522dfd634fced921b4fa793a2253fc08ffa84226757d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Protocol-level Account Abstraction\n\nWhile the [Substrate FRAME system](../../reference/parachains/index.md#frame) does not have\na single pallet (module) for complete account abstraction, it incorporates various pallets that\ncollectively achieve similar functionalities. Polkadot's native account abstraction functionalities\ninclude:\n\n- [Multi-signature accounts](./learn-account-multisig.md) to control an account using different ones\n- [Proxy accounts](./learn-proxies.md) for role-based representation, and ownership representation\n  through [pure proxies](./learn-proxies.md)\n- [Derivative accounts](./learn-account-advanced.md#derivation-paths) for using the same _parent_\n  private key on multiple _children_ accounts\n- Account recovery mechanisms such as social recovery to help regain access to your key using\n  trusted third-party accounts\n- [Batching functionality](./learn-guides-transfers.md#batch-transfers-with-the-polkadot-developer-interface) to\n  submit multiple calls in one single transaction\n- Payments with non-native tokens\n\nAll the above can be used together, meaning that, for example, you can create a multi-signature\naccount of pure proxies to keep the same multi-signature account when signatories change. A more\ncomplex combination to build a hot wallet can be found in this\n[blog post](https://www.parity.io/blog/building-a-hot-wallet-with-substrate-primitives/).\n\nAdditionally, developers have the flexibility to design their own rules for abstraction.\n\nIn the Substrate FRAME system, accounts are represented by Accounts IDs. Such unique identifiers can\nbe any 32-byte number and are not limited to just a public key (with a corresponding private key).\nFor example, multi-signature accounts do not have a private key, and their Account ID is built with\nhashed information from signatories’ public keys and the multisig threshold."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-abstraction", "url": "https://developer.polkadot.com/wiki/learn/learn-account-abstraction/#smart-contract-level-account-abstraction", "page_title": "Polkadot Account Abstraction", "index": 4, "depth": 3, "title": "Smart-contract Level Account Abstraction", "anchor": "smart-contract-level-account-abstraction", "start_char": 7118, "end_char": 7345, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0d850080c7692247213522dfd634fced921b4fa793a2253fc08ffa84226757d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Smart-contract Level Account Abstraction\n\nAccount abstraction can be implemented in parachains also with traditional smart-contracts for\nexample using the [ink!](../../smart-contracts/overview.md) smart contract language."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-abstraction", "url": "https://developer.polkadot.com/wiki/learn/learn-account-abstraction/#further-readings", "page_title": "Polkadot Account Abstraction", "index": 5, "depth": 2, "title": "Further Readings", "anchor": "further-readings", "start_char": 7345, "end_char": 7892, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a0d850080c7692247213522dfd634fced921b4fa793a2253fc08ffa84226757d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Further Readings\n\n- [Hackernoon Article](https://hackernoon.com/abstracting-away-account-abstraction-on-polkadot) by\n  [Bader Youssef](../general/contributors.md#bader-youssef) - \"Abstracting Away Account Abstraction\n  on Polkadot\"\n- [Parity Blog Post](https://www.parity.io/blog/building-a-hot-wallet-with-substrate-primitives/) by\n  Joe Petrowski - \"Building a Hot Wallet with Substrate Primitives\"\n- [FRAME Origin - Polkadot-SDK Docs](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/frame_origin/index.html)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#address-format", "page_title": "Advanced Polkadot Accounts", "index": 0, "depth": 2, "title": "Address Format", "anchor": "address-format", "start_char": 1, "end_char": 1703, "estimated_token_count": 394, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Address Format\n\nThe address format used in Substrate-based chains is SS58. SS58 is a modification of Base-58-check\nfrom Bitcoin with some minor changes. Notably, the format contains an _address type_ prefix that\nidentifies an address belonging to a specific network.\n\nFor example:\n\n- Polkadot addresses **always start with** the number **1**.\n- Kusama addresses always start with a capital letter, such as **C, D, E, F, G, H, J**.\n- Generic Substrate addresses **always start with** the number **5**.\n\nThese prefixes, including how to validate addresses, are embedded in the Substrate SS58 format.\nNever use regular expressions for address validation.\n\nIt's important to understand that different network formats are **merely other representations of\nthe same public key in a private-public keypair** generated by an address generation tool. As a\nresult, the addresses across Substrate-based chains are compatible if the format is converted\ncorrectly.\n\nAs of Runtime 28, the default [address format](./learn-account-advanced.md#address-format) is the [`MultiAddress`](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/primitives/runtime/src/multiaddress.rs)\ntype.\n\nThis `enum` is a multi-format address wrapper for on-chain accounts and allows us to describe\nPolkadot's default address format to represent many different address types. This includes **20\nbyte**, **32 byte**, and **arbitrary raw byte** variants. It also enhances the original\n[`indices`](learn-account-advanced.md#indices) lookup.\n\n!!!info\n    Many wallets allow you to convert between formats. Stand-alone tools exist as well; you can find them in the [address conversion tools](#address-conversion-tools) section."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#using-the-same-account-across-chains", "page_title": "Advanced Polkadot Accounts", "index": 1, "depth": 3, "title": "Using the Same Account Across Chains", "anchor": "using-the-same-account-across-chains", "start_char": 1703, "end_char": 2812, "estimated_token_count": 207, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Using the Same Account Across Chains\n\nBecause every network format is only a different representation of the same public key, a single\naccount can be used on most Substrate-based chains, including Polkadot, Kusama, and their parachains\n(a few chains are exceptions). Only the address representation changes from one chain to the next;\nthe underlying key pair and the account's visual identicon remain constant across networks, which is\na reliable way to confirm that two differently-formatted addresses belong to the same account.\n\nReusing one account across chains means fewer mnemonic phrases and backup files to safeguard, and it\ncan be necessary to manage assets such as crowdloan rewards, which are delivered to the account that\nparticipated. The trade-off is that a single account becomes a single point of failure: if its\nmnemonic is compromised, funds on _every_ chain are at risk. The shifting address format per network\ncan also cause confusion, particularly when a wallet displays the generic Substrate format (starting\nwith `5`) while an interface shows each chain's network-specific format."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#for-the-curious-how-prefixes-work", "page_title": "Advanced Polkadot Accounts", "index": 2, "depth": 3, "title": "For the Curious: How Prefixes Work", "anchor": "for-the-curious-how-prefixes-work", "start_char": 2812, "end_char": 4726, "estimated_token_count": 389, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### For the Curious: How Prefixes Work\n\nThe [SS58 registry](https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json) states\nthat:\n\n- Polkadot has an address type of `00000000b` (`0` in decimal).\n- Kusama (Polkadot Canary) has an address type of `00000010b` (`2` in decimal).\n- Generic Substrate has `00101010b` as the address type (`42` in decimal).\n\nBecause the `Base58-check` alphabet has no number 0, the lowest value is indeed 1. So `00000000b` is\n1 in Base58-check. If we try to\n[decode](https://www.better-converter.com/Encoders-Decoders/Base58Check-to-Hexadecimal-Decoder) a\nPolkadot address like `1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg`, the result is\n`000aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b29d7`. The first byte is `00`,\nwhich is indeed `00000000` in binary and `0` in decimal and thus matches the address type of\nPolkadot.\n\nLet's take a look at Substrate addresses. If we decode\n`5CK8D1sKNwF473wbuBP6NuhQfPaWUetNsWUNAAzVwTfxqjfr`, we get\n`2a0aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b77e5`. The first byte is `2a`\nwhich when\n[converted from hex to decimal](https://www.rapidtables.com/convert/number/hex-to-decimal.html)\nis 42. 42 is `00101010` in binary, just as the SS58 document states.\n\nFinally, let's look at Kusama addresses. Decoding `CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp`\ngives us `020aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b0985` with the first\nbyte being `02`, just as specified. If we try a Kusama address that starts with a completely\ndifferent letter, like `J4iggBtsWsb61RemU2TDWDXTNHqHNfBSAkGvVZBtn1AJV1a`, we still get `02` as the\nfirst byte: `02f2d606a67f58fa0b3ad2b556195a0ef905676efd4e3ec62f8fa1b8461355f1142509`. It seems\ncounterintuitive that some addresses always have the same prefix and others like Kusama can vary\nwildly, but it's just a quirk of Base58-check encoding."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#address-conversion-tools", "page_title": "Advanced Polkadot Accounts", "index": 3, "depth": 2, "title": "Address Conversion Tools", "anchor": "address-conversion-tools", "start_char": 4726, "end_char": 5012, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Address Conversion Tools\n\nYou can use the tools below to convert any SS58 address for any network for use on different\nnetworks\n\n- [handy subscan tool](https://polkadot.subscan.io/tools/format_transform)\n- [simple address converter](https://polkadot-address-convertor.netlify.app/)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#how-to-verify-a-public-keys-associated-address", "page_title": "Advanced Polkadot Accounts", "index": 4, "depth": 3, "title": "How to Verify a Public Key's Associated Address", "anchor": "how-to-verify-a-public-keys-associated-address", "start_char": 5012, "end_char": 9573, "estimated_token_count": 840, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How to Verify a Public Key's Associated Address\n\nYou can verify your public key's associated address through a series of inspection steps, where the\nkey is a base-16 (hexadecimal) address.\n\n#### Using Subkey to Retrieve Public Key from SS58 Address\n\nThis is to showcase that the **SS58 address is based on the public key (aka \"Account ID\")**\n\nThe Subkey Tool's The\n[Inspecting Keys](../../reference/parachains/accounts.md#using-subkey)\nsection explains how to use the `inspect` command to recalculate your key pair's public key and\naddress.\n\nStart by inspecting your account's Polkadot address by running the inspect command against your\naccount's address:\n\n```bash\n$ subkey inspect 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n\nPublic Key URI `1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F` is account:\n  Network ID/version: polkadot\n  Public key (hex):   0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n  Account ID:         0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n  SS58 Address:       1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n```\n\nTake note of the hexadecimal string for \"Public key (hex)\". This is your account's public key.\n\nRunning the `inspect` command on your public key along with the `--public` parameter the SS58\naddress for the default network (substrate) is returned.\n\n```bash\n$ subkey inspect --public 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n\nNetwork ID/version: substrate\n  Public key (hex):   0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n  Account ID:         0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n  Public key (SS58):  5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n  SS58 Address:       5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n```\n\nUsing the `--network` flag, you can define the network that you would like to inspect, where the\nSS58 address will be based on that network. Now, running the `inspect` command with\n`--network polkadot` return your original Polkadot address, thus verifying the public key.\n\n```bash\n$ subkey inspect --network polkadot 5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n\nPublic Key URI `5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp` is account:\n  Network ID/version: polkadot\n  Public key (hex):   0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n  Account ID:         0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n  Public key (SS58):  1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n  SS58 Address:       1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n```\n\nYou will notice that the Subkey Tool recognizes the correct address network and returns the\nassociated public key. The public key is returned as a hexadecimal string (i.e. prefixed with\n**\"0x\"**). **For both SS58 addresses, the same public key is returned.**\n\n#### Address Verification\n\n##### Consider the following example:\n\n![19](../assets/accounts/pubkey-1.png)\n\nIf you are comfortable enough to distinguish between each account parameter, you can prefix the\npublic-key string with **\"0x\"** on your own:\n\nFrom:\n`Pay DOTs to the Polkadot account:192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce`,\nwe prefix the address by \"0x\" ->\n`0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce`.\n\nUsing the [handy subscan tool](https://polkadot.subscan.io/tools/format_transform), you can verify\nboth address associations to your public key. Copy your public key into the \"Input Account or Public\nKey\" textbox and click \"Transform\" at the bottom. On the right-hand side, the addresses for Polkadot\nand Substrate that are returned based on your public key should match the ones you inspected.\n\n![20](../assets/accounts/pubkey-2.png)\n\n!!!note\n    You may have to scroll down to the bottom of the menu to find the Substrate address based on the menu listings. You will notice that many networks that also use the same Substrate address.\n\nYou can verify your public key verification by recalling that Polkadot addresses start with a '1',\nwhereas Substrate addresses generally start with a '5' (Kusama addresses start with a capital\nletter). See [Addresses](learn-account-advanced.md#address-format) for more details.\n\nFurthermore, the [Utility Scripts](https://github.com/w3f/utility-scripts) can be referenced for how\nthe verification is performed:\n[pubkeyToAddress.js](https://github.com/w3f/utility-scripts/blob/master/src/misc/pubkeyToAddress.js)\ndemonstrates how a single public key interprets a Polkadot, Substrate, or Kusama address."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#portability", "page_title": "Advanced Polkadot Accounts", "index": 5, "depth": 2, "title": "Portability", "anchor": "portability", "start_char": 9573, "end_char": 12034, "estimated_token_count": 559, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Portability\n\nPortability is the ability to use a mnemonic phrase or seed across multiple wallets.\n\nMost wallets generate a mnemonic phrase for users to back up their wallets and generate a private\nkey from the mnemonic. Not all wallets use the same algorithm to convert from mnemonic phrase to\nprivate key, which affects the ability to use the same mnemonic phrase in multiple wallets. Wallets\nthat use different measures will arrive at a different set of addresses from the exact mnemonic\nphrase.\n\n!!!danger \"Not all wallets use the same algorithm to convert from mnemonic phrase to private key\"\n    [Subkey](../../reference/parachains/accounts.md#using-subkey) and Polkadot-JS based wallets use the BIP39 dictionary for mnemonic generation, but use the entropy byte array to generate the private key, while full BIP39 wallets (like Ledger) use 2048 rounds of PBKDF2 on the mnemonic. The same mnemonic may generate different private keys on other wallets due to the various cryptographic algorithms used. See [Substrate BIP39 Repo](https://github.com/paritytech/substrate-bip39) for more information.\n\nPortability depends on several factors:\n\n- Derivation path\n- Mnemonic format\n- Seed derivation\n- Signature scheme\n\nTo use the exact mnemonic across multiple wallets, ensure they follow compatible methods for\ngenerating keys and signing messages. If you are still looking for understandable documentation,\ncontact the project maintainers.\n\n|                       | Mnemonic Format | Derivation Path | Seed Derivation |      Signature Support      |\n| :-------------------- | :-------------: | :-------------: | :-------------: | :-------------------------: |\n| Polkadot Developer Signer |    Standard     |  User-Defined   |      BIP32      |           sr25519           |\n| Polkadot-JS Apps      |   Standard\\*    |  User-Defined   |      BIP32      | sr25519, ed25519, secp256k  |\n| Ledger                |      BIP39      |  BIP44&dagger;  |  BIP32&Dagger;  |        ed25519&sect;        |\n| Subkey                |   Standard\\*    |  User-Defined   |      BIP32      | sr25519, ed25519, secp256k1 |\n\n\\* Ed25519 keys have [limited compatibility](https://github.com/paritytech/substrate-bip39) with\nBIP39.\n\n&dagger; [BIP44 Registry](https://github.com/satoshilabs/slips/blob/master/slip-0044.md)\n\n&Dagger; Ed25519 and BIP32 based on\n[Khovratovich](https://github.com/LedgerHQ/orakolo/blob/master/papers/Ed25519_BIP%20Final.pdf)\n\n&sect; Sr25519 planned"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#derivation-paths", "page_title": "Advanced Polkadot Accounts", "index": 6, "depth": 2, "title": "Derivation Paths", "anchor": "derivation-paths", "start_char": 12034, "end_char": 12296, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Derivation Paths\n\nIf you want to create and manage several accounts on the network using the same seed, you can use\nderivation paths. We can think of the derived accounts as child accounts of the root account created\nusing the original mnemonic seed phrase."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#soft-and-hard-derivation", "page_title": "Advanced Polkadot Accounts", "index": 7, "depth": 3, "title": "Soft and Hard Derivation", "anchor": "soft-and-hard-derivation", "start_char": 12296, "end_char": 15320, "estimated_token_count": 672, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Soft and Hard Derivation\n\nA soft derivation allows someone to potentially \"go backward” to figure out the initial account's\nprivate key if they know the derived account's private key. It is also possible to determine that\ndifferent accounts generated from the same seed are linked to that seed. A hard derivation path does\nnot allow either of these - even if you know a derived private key, it's not feasible to figure out\nthe private key of the root address, and it's impossible to prove that the first account is linked\nwith the second. These derivation methods have their use cases, given that the private keys for all\nthe derived accounts are fully secure. Unless you have a specific need for a soft derivation, it is\nrecommended to generate the account using a hard derivation path.\n\nMany Polkadot key generation tools support hard and soft derivation. For instance, if you intend to\ncreate an account on Polkadot, you can derive a **hard key** child account using\n**//** after the mnemonic phrase.\n\n```\n'caution juice atom organ advance problem want pledge someone senior holiday very//0'\n```\n\nand a **soft key** child account using **/** after the mnemonic phrase\n\n```\n'caution juice atom organ advance problem want pledge someone senior holiday very/0'\n```\n\nIf you want to create another account using the Polkadot chain using the same seed, you can change\nthe number at the end of the string above. For example, `/1`, `/2`, and `/3` will create different\nderived accounts.\n\nYou can use any letters or numbers in the derivation path as long as they make sense to you; they do\nnot have to follow any specific pattern. You may combine multiple derivations in your path, as well.\nFor instance, `//bill//account//1` and `//john/polkadot/initial` are both valid. To recreate a\nderived account, you must know both the seed and the derivation path, so you should either use a\nwell-defined sequence (e.g. //0, //1, //2...) or be sure to write down any derivation paths you use.\n\nSee the [Subkey documentation](../../reference/parachains/accounts.md#using-subkey) for\ndetails and examples of derivation path formats. The Polkadot-JS Apps and Extension and Parity\nSigner support custom derivation paths using the same syntax as Subkey.\n\nSome wallets will automatically add derivation paths to the end of the generated mnemonic phrase.\nThis will generate separate seeds for different paths, allowing separate signing keys with the same\nmnemonic, e.g. `<mnemonic phrase>//polkadot` and `<mnemonic phrase>//kusama`. Although you may\ncorrectly save the mnemonic phrase, using it in another wallet will generate the same addresses only\nif both wallets use the same derivation paths.\n\nPolkadot and Kusama both have paths registered in the\n[BIP44 registry](https://github.com/satoshilabs/slips/blob/master/slip-0044.md).\n\n!!!warning\n    You must have the _parent_ private key and the derivation path to arrive at the key for an address. Only use custom derivation paths if you are comfortable with your knowledge of this topic."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#password-derivation", "page_title": "Advanced Polkadot Accounts", "index": 8, "depth": 3, "title": "Password Derivation", "anchor": "password-derivation", "start_char": 15320, "end_char": 16535, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Password Derivation\n\nThere is an additional type of derivation called password derivation. On Polkadot you can derive a\n**password key** account using **///** after the mnemonic phrase\n\n```\n'caution juice atom organ advance problem want pledge someone senior holiday very///0'\n```\n\nIn this type of derivation, if the mnemonic phrase leaks, accounts cannot be derived without the\ninitial password. In fact, for soft- and hard-derived accounts, if someone knows the mnemonic phrase\nand the derivation path, they will have access to your account. For password-derived accounts, the\npassword is applied on the derivation path. You can know the mnemonic phrase and the derivation\npath, but without the password, it is impossible to access the account. In mathematical terms, if we\nhave a `written derivation path` and a `password`, we can calculate the `real derivation path` as\n`f(written derivation path, password)`, where `f` is a function. We can then calculate the\n`account key pair` using `f(seed, real derivation path)`. Unlike hard and soft derivations that can\nbe mixed, only a single password should be specified per derivation.\n\n!!!info\n    Password-derived account are as secure as the chosen password."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#account-derivation-on-ledgergeneralledgermd-live", "page_title": "Advanced Polkadot Accounts", "index": 9, "depth": 3, "title": "Account Derivation on [Ledger](../general/ledger.md) Live", "anchor": "account-derivation-on-ledgergeneralledgermd-live", "start_char": 16535, "end_char": 17269, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account Derivation on [Ledger](../general/ledger.md) Live\n\nLedger Live will only show the main account with BIP44 path 44'/354'/0'/0'/0'. This means that if\nyou created a derived account with a derivation path 44'/354'/0'/0'/1' on a wallet or extension, it\nwill not be displayed on the Ledger Live App. Consequently, it is not possible to transact with\nderived accounts using the Ledger Live App, but it is possible to do so using Polkadot-JS. Check\n[the accounts page](../learn/learn-accounts.md) for more information about derived accounts and\nderivation paths.\n\nNote that you cannot import Kusama Ledger accounts in Ledger Live. To see Kusama account balances,\nyou must import your ledger account into a non-custodial wallet."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#account-derivation-on-subkeycreating-accounts-with-subkey-and-polkadot-vaultgeneralpolkadot-vaultmd", "page_title": "Advanced Polkadot Accounts", "index": 10, "depth": 3, "title": "Account Derivation on [Subkey](#creating-accounts-with-subkey) and [Polkadot Vault](../general/polkadot-vault.md)", "anchor": "account-derivation-on-subkeycreating-accounts-with-subkey-and-polkadot-vaultgeneralpolkadot-vaultmd", "start_char": 17269, "end_char": 19174, "estimated_token_count": 489, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account Derivation on [Subkey](#creating-accounts-with-subkey) and [Polkadot Vault](../general/polkadot-vault.md)\n\nThe Subkey tool and Polkadot Vault App use the following Polkadot Standard Hard Derivation scheme:\n\n- `//network` as the primary account for `network`, named according to `network`'s named chain\n  specification\n  - `//network//0`, `//network//1`, ... as the secondary high-security accounts for `network`\n\nFor example, the Vault app will generate a new account from a `SEED PHRASE`, and for each network\nwill create a derived child account from that seed. For the default networks Polkadot, Kusama and\nWestend the derivation path will be:\n\n- `SEED PHRASE//polkadot` for Polkadot, with `SEED PHRASE//polkadot//0` as the first secondary\n  high-security account\n- `SEED PHRASE//kusama` for Kusama, with `SEED PHRASE//kusama//0` as the first secondary\n  high-security account\n- `SEED PHRASE//westend` for Westend, with `SEED PHRASE//westend//0` as the first secondary\n  high-security account\n\nAdditionally, although it is not strictly necessary, users can adopt the following good practice\nscheme:\n\n- `//network//pub` as the primary high-security public account for `network` (the one the user is\n  happy to be associated with their \"real\" ID)\n  - `//network//pub//0`, `//network//pub//0`, ... as the secondary high-security public accounts for\n    `network`\n- `//network//hot` as the primary low-security account for `network` (the one whose secret key the\n  user exports from the Vault app to carry on an internet-connected device)\n  - `//network//hot//0`, `//network//hot//1`, ... as the secondary low-security accounts for\n    `network`\n\n!!!info\n    For more information about account derivation best practices, see [this post](https://forum.polkadot.network/t/polkadot-standards-proposal-psp-to-define-hierarchical-deterministic-hd-key-derivation-paths/2941/2) on the Polkadot Forum."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#system-accounts", "page_title": "Advanced Polkadot Accounts", "index": 11, "depth": 2, "title": "System Accounts", "anchor": "system-accounts", "start_char": 19174, "end_char": 20722, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## System Accounts\n\nAs the word suggests, system accounts are used by the system. They are used, for example, for the\ntreasury, crowdloans, and nomination pools. From the point of view of the runtime, these accounts\nare like any other account on-chain. These special system accounts are just public keys, with the\nprivate key being unknown (and unattainable). So, that means that only the pallet itself can\ninteract with this account. These accounts can never issue a signed\n[extrinsic](./learn-transactions.md) since they do not have a private key.\n\nExplore the main system accounts below.\n\n=== \"Polkadot\"\n\n    Treasury account address - `13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB`\n\n=== \"Kusama\"\n\n    Treasury account address - `F3opxRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29`\n\nYou can view the existing system accounts on\n[Subscan](https://polkadot.subscan.io/account_list?role=module).\n\nLet us take a look at how system accounts are generated under the hood. For instance, to generate\nthe treasury account, the raw bytes of the strings \"modl\" and \"py/trsry\" are combined to create the\n`AccountID`. For more information, check the post on Substrate StackExchange on\n[Treasury accounts](https://substrate.stackexchange.com/questions/536/how-do-treasury-accounts-compare-to-end-user-accounts-in-frame).\nSimilarly, to generate the crowdloan account, the raw bytes of the strings \"modl\" and \"py/cfund\"\nalong with the fund index are combined to create the `AccountID`. Similar logic applies to\nnomination pool and parachain accounts as well."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#indices", "page_title": "Advanced Polkadot Accounts", "index": 12, "depth": 2, "title": "Indices", "anchor": "indices", "start_char": 20722, "end_char": 22580, "estimated_token_count": 417, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Indices\n\nPolkadot addresses can have indices. An index is like a short and easy-to-remember version of an\naddress. Claiming an index requires [a deposit](../general/chain-state-values.md)\nreleased when the index is cleared. Any index can be claimed if it is not taken by someone else.\n\nBut what if an account gets reaped, as explained above? In that case, the index is emptied. In other\nwords, the slot frees up again, making it available for anyone to claim. It is possible to _freeze_\nan index and permanently assign it to an address. **This action consumes a deposit, and the index\nwill be permanently bound to the address with no option to release it.**\n\n!!!note \"Lookup Account Index on-chain\"\n    When someone shares their account index, their actual account address on-chain can be looked up through Polkadot-JS Apps UI > Developer > Chain state > Storage and selecting state query on indices pallet for the account corresponding to the index.\n\nHere is an example snapshot that shows how to lookup the corresponding account address of the\naccount index 1988 on\n[Westend network (Polkadot Test Network)](../../smart-contracts/connect.md#westend),\nusing Polkadot-JS Apps UI. The output shows the account address, deposit amount, and a boolean flag\nindicating whether this is claimed permanently.\n\n![query account index](../assets/accounts/query-index.png)\n\nSubmit a `claim` extrinsic to the `indices` pallet to register an index. The easiest way to do this\nis via Polkadot Developer Interface through the _Developer -> Extrinsics_ menu:\n\n![Indices extrinsics](../assets/accounts/index.png)\n\nTo find available indices to claim on Polkadot or Kusama,\n[this helper tool may come in handy](https://www.shawntabrizi.com/substrate-js-utilities/indices/).\n\nFor keeping the index permanently, you can follow up with a `freeze` extrinsic as mentioned above."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#creating-accounts-with-subkey", "page_title": "Advanced Polkadot Accounts", "index": 13, "depth": 2, "title": "Creating Accounts with Subkey", "anchor": "creating-accounts-with-subkey", "start_char": 22580, "end_char": 23315, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating Accounts with Subkey\n\n[Subkey](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/bin/utils/subkey) is\nrecommended for technically advanced users comfortable with the command line and compiling Rust\ncode. Subkey lets you generate keys on any device that can compile the code. Subkey may also be\nuseful for automated account generation using an air-gapped device. It is not recommended for\ngeneral users. Follow the instructions in the\n[Subkey documentation](../../reference/parachains/accounts.md#using-subkey).\n\n!!!info\n    For guidelines about how to create an account using Subkey, see [**this video tutorial**](https://youtu.be/SWfE_EwxgIU) and visit [**this article**](how-to/create-account-subkey.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#using-ens-with-dotksm-accounts", "page_title": "Advanced Polkadot Accounts", "index": 14, "depth": 2, "title": "Using ENS with DOT/KSM accounts", "anchor": "using-ens-with-dotksm-accounts", "start_char": 23315, "end_char": 25142, "estimated_token_count": 423, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Using ENS with DOT/KSM accounts\n\nENS (Ethereum Name Service) is a distributed and open system of smart contracts on the Ethereum\nblockchain which allows users to claim domain names like `bruno.eth`.\n\nThe ENS is equivalent to a DNS (Domain Name System) domain. Instead, it offers a decentralized and\nsecure way to translate text via smart contracts. Supporting wallets can then allow senders to input\nENS domains instead of long and unwieldy addresses. This prevents phishing, fraud, and typos and\nadds a layer of usability to the regular wallet user experience.\n\n!!!note\n    You will need an ENS name and an Ethereum account with some ether to follow along with this guide. To register an ENS name, visit the [ENS App](https://app.ens.domains) or any number of subdomain registrars like [Nameth](https://nameth.io). Note that if you're using an older ENS name, you should make sure you're using the [new resolver](https://medium.com/the-ethereum-name-service/ens-registry-migration-is-over-now-what-a-few-things-to-know-fb05f921872a). Visiting the ENS App will warn you about this. You will also need some way to use your Ethereum address - following this guide on a personal computer is recommended. Wallets like [Frame](https://frame.sh/) and [Metamask](https://metamask.io) are safe and will make interacting with the Ethereum blockchain through your browser very easy.\n\nDespite living on the Ethereum blockchain, the ENS system has multi-chain support. In this guide,\nyou'll go through the process of adding a KSM and DOT address to ENS. We cover both KSM and DOT to\nshow two different approaches.\n\n!!!note\n    DOT can currently only be added using the Resolver method. KSM can be added through both methods are described below.\n\nThis guide is also available in video format [on YouTube](https://youtu.be/XKjZk-5_mQc)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#adding-via-the-ui", "page_title": "Advanced Polkadot Accounts", "index": 15, "depth": 3, "title": "Adding via the UI", "anchor": "adding-via-the-ui", "start_char": 25142, "end_char": 26100, "estimated_token_count": 261, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Adding via the UI\n\nThe [ENS App](https://app.ens.domains) allows an ENS domain owner to inspect all records bound to\nthe domain, and to add new ones.\n\n![bruno.eth domain name in the ENS application](../assets/ens/01-min.png)\n\nIn the example above, the domain `bruno.eth` has an Ethereum and a Bitcoin address attached. Let's\nattach a KSM account. First, click the `[+]` icon in the Records tab.\n\n![The plus icon in the records tab](../assets/ens/02-min.png)\n\nThen, pick \"Other Addresses\", \"KSM\", and input the Kusama address:\n\n![Inputs needed to register a KSM address](../assets/ens/03-min.png)\n\nAfter clicking Save, your Ethereum wallet will ask you to confirm a transaction. Once processed, the\nrecord will show up on the domain's page:\n\n![KSM address now visible in bruno.eth records](../assets/ens/04-min.png)\n\nThe exact process applies to adding your DOT address.\n\nOnce the transaction is confirmed, your address will be bound to your ENS domain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#wallet-support", "page_title": "Advanced Polkadot Accounts", "index": 16, "depth": 3, "title": "Wallet Support", "anchor": "wallet-support", "start_char": 26100, "end_char": 26311, "estimated_token_count": 48, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Wallet Support\n\nThere is no wallet support for ENS names for either KSM or DOT at this time, but the crypto\naccounting and portfolio application [Rotki](https://rotki.com/) does support KSM ENS resolution."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#relevant-links", "page_title": "Advanced Polkadot Accounts", "index": 17, "depth": 3, "title": "Relevant links", "anchor": "relevant-links", "start_char": 26311, "end_char": 26756, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Relevant links\n\n- [ENS docs](https://docs.ens.domains/)\n- [ENS Multi-chain announcement](https://medium.com/the-ethereum-name-service/ens-launches-multi-coin-support-15-wallets-to-integrate-92518ab20599)\n- [Address encoder](https://github.com/ensdomains/address-encoder)\n- [Namehash calculator](https://swolfeyes.github.io/ethereum-namehash-calculator/)\n- [Address to pubkey converter](https://www.shawntabrizi.com/substrate-js-utilities/)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another", "page_title": "Advanced Polkadot Accounts", "index": 18, "depth": 2, "title": "Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another", "anchor": "transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another", "start_char": 26756, "end_char": 28388, "estimated_token_count": 395, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another\n\n!!!caution\n    This will overwrite existing accounts with the same pubkey on your new computer. This generally should not make a difference (since it can still access the same account), but it might if you have e.g. an account that was stored externally in the extension on the old computer but was created directly in the browser on the new one.\n\nThis has been tested on Brave and Chrome, but not other browsers.\n\n1. Go to Polkadot-JS Apps\n2. Go to JavaScript console on the browser (Available in Developer Tools)\n3. Type in the command:\n\n```\nJSON.stringify(localStorage)\n```\n\n4. Copy and paste the returned string to a text editor and save the file.\n5. Check that the string you pasted begins and ends with a tick mark ('). If not, add one to the\n   beginning and end.\n6. Save and send that file with the copied string to the new computer.\n7. On the new computer, go to Polkadot-JS Apps\n8. Open the JavaScript console on the browser (Available in Developer Tools)\n9. Set a variable raw equal to the string from the text file\n\n```\nraw = ... copy-pasted json from original computer ...\n```\n\n10. Run the following code on the console:\n\n```\naccounts = JSON.parse(raw);\nfor (var key in accounts) {\n    if (accounts.hasOwnProperty(key)) {\n        val = JSON.stringify(accounts[key]).replace(/\\\\/g,'').slice(1,-1);\n        console.log(key + \" -> \" + val);\n        localStorage.setItem(key, val);\n    }\n}\n```\n\n11. Refresh Polkadot-JS App browser and check the Accounts and Addresses pages. All of your accounts\n    and addresses should now be available."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-account-advanced/#how-to-guides", "page_title": "Advanced Polkadot Accounts", "index": 19, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 28388, "end_char": 28562, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:17787c89e66e0665728a526d516099c89d6c9e334ae643944abad08d159cf5c4", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [How to Create an Account in Subkey](how-to/create-account-subkey.md)\n- [How to Restrict Your Account to One Network](how-to/restrict-account-network.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-balances", "url": "https://developer.polkadot.com/wiki/learn/learn-account-balances/#consumer-and-provider-references", "page_title": "Account Balances", "index": 0, "depth": 3, "title": "Consumer and Provider References", "anchor": "consumer-and-provider-references", "start_char": 3368, "end_char": 5121, "estimated_token_count": 367, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fba18cabe243d58307c2ed1931ae4a1f930d83e4565dbff4e0fdee9d64a6a29", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Consumer and Provider References\n\nIn Polkadot and Substrate-based chains, each account must maintain a minimum free balance called the Existential Deposit (ED) to remain alive. An account cannot be reaped from the state while it has a reserved balance, or in general,\nany [consumer and provider reference](./learn-guides-accounts.md#query-account-data-in-polkadot-js).\nThose references determine if an account can be reaped, usually because other pallets depend on the\nexistence of such an account. For example, the existential deposit adds a provider reference simply\nbecause the account exists, while a proxy account adds a consumer reference (the proxy existence\ndepends on the proxied account; the proxy is the consumer). \n\nIf an account’s free balance falls below this threshold and has no providers or consumers, it is reaped, meaning all its data is deleted to conserve state space. However, the ED rules are more nuanced than they may appear:\n\n- Reserved balances do not count as spendable, but they do add a provider reference to the account.\n- If an account has any provider references (e.g., via reserved balance or staking), it will not be reaped even if its free balance drops below the ED. In such cases, the ED is not untouchable: the free balance can be entirely spent, and the account will remain alive. In other words, the account is \"dusted\", which happens when its free balance drops below ED. Then the \"dust\" is deleted, but the account can still be alive, for example, because it has a provider reference.\n- Conversely, if an account has consumers (such as active locks or dependencies) but only one or zero providers, then the ED must be preserved, or the account may be reaped once the last consumer or provider is removed."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-balances", "url": "https://developer.polkadot.com/wiki/learn/learn-account-balances/#example-of-account-balance-types", "page_title": "Account Balances", "index": 1, "depth": 2, "title": "Example of Account Balance Types", "anchor": "example-of-account-balance-types", "start_char": 5121, "end_char": 8956, "estimated_token_count": 925, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fba18cabe243d58307c2ed1931ae4a1f930d83e4565dbff4e0fdee9d64a6a29", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Example of Account Balance Types\n\nBelow is an in-depth example of how an account balance composition changes depending on user actions\n**once [the _fungible_ trait](https://paritytech.github.io/polkadot-sdk/master/frame_support/traits/tokens/fungible/index.html) is implemented by all Substrate pallets**. Let’s take, for example, an account with 100 DOT.\n\n```\nFree: 100 DOT\nFrozen (locked): 0 DOT\nReserved (held): 0 DOT\nSpendable: 99 DOT\nUntouchable: 1 DOT (ED)\n```\n\n![balance-example-1](../assets/balance-example-1.png)\n\nThe untouchable balance is part of the free balance that cannot be spent due to ED or freezes. In this case, the existential deposit of 1 DOT is untouchable (meaning you can’t touch it if the\naccount can’t or shouldn’t get reaped). The untouchable balance can also be defined as the frozen balance in excess of the reserved balance (see [here](https://github.com/paritytech/polkadot-sdk/issues/1833#issuecomment-1805764506) for a visual aid). \n\nIf 60 DOT from the account is staked, we get the following balance structure:\n\n```\nFree: 40 DOT\nFrozen (locked) : 0 DOT\nReserved (held): 60 DOT\nSpendable: 39 DOT (Free - ED)\nUntouchable: 1 DOT (ED)\n```\n\n![balance-example-2](../assets/balance-example-2.png)\n\nThe spendable balance would be 39 DOT (which would also include fees for future transactions from\nthis account). Because the existential deposit is\npart of the untouchable balance, the user can use all the spendable balance (there is no need to\nkeep 1 DOT as spendable).\n\n\nIf the account creates a proxy, it will use the reserved balance as follows:\n\n```\nFree: 20 DOT\nFrozen (locked) : 0 DOT\nReserved (held): 80 DOT\nSpendable: 19 DOT (Free - ED)\nUntouchable: 1 DOT (ED)\n```\n\n![balance-example-3](../assets/balance-example-3.png)\n\nThe reserved balance for the proxy deposit increases the total held balance to 80 DOT while the free balance decreases to 20 DOT.\n\nIf the account votes for a governance proposal with 20 DOT, the situation would be as follows:\n\n```\nFree: 20 DOT\nFrozen (locked): 20 DOT\nReserved (held): 80 DOT\nSpendable: 19 DOT (Free - ED)\nUntouchable: 1 DOT (ED)\n```\n\n![balance-example-4](../assets/balance-example-4.png)\n\nNote how, through the fungible trait, the system uses the reserved balance. Freezes are\nimposed on the total balance, overlapping with the reserved balance and themselves (see below). The free and reserved portions remain 20 DOT and 80 DOT, respectively. We also have 20 DOT as a frozen balance because of the governance vote. The untouchable balance remains 1 DOT, defined as the frozen balance in excess of any reserves (in this case, frozen < reserved, so only the ED is untouchable).\n\nIf the account votes on another governance proposal with 85 DOT (assuming the previous proposal is still ongoing or that it ended on the winning side with a lock), the frozen balance will increase to 85 DOT and the untouchable balance to 6 DOT, using the already frozen 20 DOT plus an additional 60 DOT from the reserved balance and 5 DOT from the free balance, in excess of the reserved balance.\n\n\n```\nFree: 20 DOT\nFrozen (locked): 85 DOT\nReserved (held): 80 DOT\nSpendable: 15 DOT (Free - untouchable)\nUntouchable: 5 DOT (frozen in excess of reserved, and ED overlays with frozen but not reserved)\n```\n\n![balance-example-5](../assets/balance-example-5.png)\n\nThis update uses the fungible trait to allow the use of the reserved balance for on-chain activity like voting in governance and vesting. Note that\n[reserves are slashable](https://github.com/paritytech/substrate/pull/12951), and the pallet\n[migrations](https://github.com/paritytech/polkadot-sdk/issues/226) need to take that into account.\nThis means that freezes should account for hold being slashed (for example, your stash account\nbalance getting reduced because your governance deposit for a proposal was slashed)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-balances", "url": "https://developer.polkadot.com/wiki/learn/learn-account-balances/#locks", "page_title": "Account Balances", "index": 2, "depth": 2, "title": "Locks", "anchor": "locks", "start_char": 8956, "end_char": 10768, "estimated_token_count": 417, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fba18cabe243d58307c2ed1931ae4a1f930d83e4565dbff4e0fdee9d64a6a29", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Locks\n\nLocks are abstractions over an account's free balance, preventing it from being spent. Several locks\ncan overlap on the same account balance instead of being stacked on top of one another. Locks are\nautomatically added to accounts when the account participates in activities on-chain (voting, etc.), but these are not customizable.\n\nLocks are accounted for within the `frozen` balance of the account. This is the balance that can be\n`free` but not transferable, and locked in\n[governance](./learn-polkadot-opengov.md) and [vesting](./learn-transactions.md#vested-transfers).\n\nLocks overlap (in both amount and duration), and the general rule is that:\n\n- If you have multiple locks of different amounts of tokens, the biggest lock decides the total\n  amount of locked tokens\n- If you have multiple locks of the same amount of tokens, the lock with the longest duration\n  decides when those tokens can be unlocked\n\nLet's take, for example, 80 DOT as a `frozen` balance. These 80 DOT are currently used in vesting\nand governance as follows:\n\n- 80 DOT vesting that become fully vested in 28 days\n- 24 DOT OpenGov 1x conviction (referendum just ended, winning side) -> lock 7 days\n- 4 DOT OpenGov 6x conviction (referendum just ended, winning side) -> lock 224 days\n\n![locks-example-1](../assets/locks-example-1.png)\n\nThe 1 DOT ED is the existential deposit. The locked amount is 80 DOT (not 108 DOT). But those 80 DOT\nwill be available for unlock at different times. You will first need to remove the governance lock\non the 24 DOT after 7 days, then remove the vesting lock for the 80 DOT after 28 days, and finally,\nafter 224 days, you will be able to remove the second governance lock.\n\n![locks-example-2](../assets/locks-example-2.png)\n\nAfter 224 days, all 80 DOT (- ED) will be free and transferable."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-balances", "url": "https://developer.polkadot.com/wiki/learn/learn-account-balances/#edge-case-for-locks", "page_title": "Account Balances", "index": 3, "depth": 3, "title": "Edge Case for Locks", "anchor": "edge-case-for-locks", "start_char": 10768, "end_char": 11348, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fba18cabe243d58307c2ed1931ae4a1f930d83e4565dbff4e0fdee9d64a6a29", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Edge Case for Locks\n\nThe longest period and the largest amount are considered if you use different convictions while you\nhave ongoing locks.\n\nFollowing the previous example, if you:\n\n- Undelegate a 1x conviction delegation of 24 DOT, you will get a 7-day lock on 24 DOT\n- Delegate 4 DOT with 6x conviction\n- Undelegate again before the 1x conviction lock is removed\n\nYou will get a 6x conviction for 24 DOT! See\n[here](https://substrate.stackexchange.com/questions/5067/delegating-and-undelegating-during-the-lock-period-extends-it-for-the-initial-am)\nfor more information."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-balances", "url": "https://developer.polkadot.com/wiki/learn/learn-account-balances/#how-to-guides", "page_title": "Account Balances", "index": 4, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 11348, "end_char": 11434, "estimated_token_count": 26, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2fba18cabe243d58307c2ed1931ae4a1f930d83e4565dbff4e0fdee9d64a6a29", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [What is the Existential Deposit?](how-to/existential-deposit.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-account-multisig", "url": "https://developer.polkadot.com/wiki/learn/learn-account-multisig/#how-to-guides", "page_title": "Multi-Signature Accounts", "index": 0, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 2295, "end_char": 2393, "estimated_token_count": 30, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c2ea3b3880c640e22aca49541d386485d6dc1fa00c1cd46a8da279434f87535a", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [How to Create and Use a Multisig Account](how-to/create-multisig-account.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-accounts/#account-address", "page_title": "Polkadot Accounts", "index": 0, "depth": 2, "title": "Account Address", "anchor": "account-address", "start_char": 608, "end_char": 1206, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1842586c8b7398495e4c43829fa652e92dce2fc505b71e1dd18364b8a3ea0019", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Account Address\n\nAn address is the public part of an account. The private part is the key used to access this\naddress. The public and private parts together make up an account. You can think of the public\naddress of your account, like your mailbox and the private key like the key to open that mailbox.\nAnybody can send mail to your mailbox, but only you can access it as only you have access to its\nkey. In the context of accounts, anybody can send tokens to your public address, but only you can\ntransact with them using your private key. That is why you should keep your private key secret."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-accounts/#mnemonic-seed-phrase", "page_title": "Polkadot Accounts", "index": 1, "depth": 3, "title": "Mnemonic Seed Phrase", "anchor": "mnemonic-seed-phrase", "start_char": 1206, "end_char": 2490, "estimated_token_count": 283, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1842586c8b7398495e4c43829fa652e92dce2fc505b71e1dd18364b8a3ea0019", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Mnemonic Seed Phrase\n\nA user's account requires a private key that can sign on to one of the\n[supported curves and signature schemes](./learn-cryptography.md#session-keys). Without a\nprivate key, an account cannot sign anything. In Polkadot, there are some exceptions of accounts\nthat do not have known private keys (i.e. keyless accounts). Such accounts are\n[multi-signature accounts](./learn-account-multisig.md),\n[pure proxies](./learn-proxies-pure.md), and\n[system accounts](./learn-account-advanced.md#system-accounts) that are not discussed here and are\nmeant for an advanced audience.\n\nA typical 12-word mnemonic seed phrase is shown below.\n\n```\n'caution juice atom organ advance problem want pledge someone senior holiday very'\n```\n\nIts corresponding _private/public keypair_ is also shown.\n\n```\nSecret seed (Private key): 0x056a6a4e203766ffbea3146967ef25e9daf677b14dc6f6ed8919b1983c9bebbc\nPublic key (SS58): 5F3sa2TJAWMqDhXG6jhV4N8ko9SxwGy8TpaNS1repo5EYjQX\n```\n\nPolkadot default address format is the `MultiAddress` type. This means the same mnemonic phrase will\ngenerate public keys for different parachains. For more information, see the\n[Address Format](./learn-account-advanced.md#address-format) section on the\n[Advanced Account](./learn-account-advanced.md) page."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-accounts/#account-generation", "page_title": "Polkadot Accounts", "index": 2, "depth": 3, "title": "Account Generation", "anchor": "account-generation", "start_char": 2490, "end_char": 4086, "estimated_token_count": 349, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1842586c8b7398495e4c43829fa652e92dce2fc505b71e1dd18364b8a3ea0019", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Account Generation\n\nUsually, there are two ways of generating a mnemonic seed:\n\n- On a \"hot\" device, i.e. a device that is connected to the internet\n- On a \"cold\" device, i.e. a device that is not (and ideally will never be) connected to the\n  internet\n\nHot wallets are susceptible to a wide range of attacks, so it is recommended to use cold wallets\nwhen dealing with non-trivial amounts of funds.\n\nGenerating a mnemonic seed on a browser extension or a mobile application will create a hot key or\nhot wallet. Create your Polkadot accounts with a secure and user-friendly wallet listed on the\n[wallet options page](how-to/where-to-store-dot.md).\n\nCold keys are generated on special devices such as those provided by [Ledger](../general/ledger.md).\nAdditionally, you can generate your account using the [Polkadot Vault](../general/polkadot-vault.md)\nmobile app (you need a dedicated air-gapped Android or iOS-compatible smartphone that you are\ncomfortable using only for Polkadot Vault), or a dedicated hardware implementation of Polkadot Vault\nsuch as [the Kampela Signer](https://www.kampe.la/).\n\nUsually, browser extensions and mobile devices have options to securely import accounts from cold\nwallets. Note that the private keys of those accounts will remain on the cold wallet, meaning that\nyou will always need the device to sign any transaction. Exceptions exist where you can generate hot\nwallet based [proxy accounts](./learn-proxies.md) and sign on behalf of a cold wallet account\nwithout connecting the cold device. This is practical, especially for transactions made frequently."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-accounts/#backing-up-accounts", "page_title": "Polkadot Accounts", "index": 3, "depth": 3, "title": "Backing Up Accounts", "anchor": "backing-up-accounts", "start_char": 4086, "end_char": 4478, "estimated_token_count": 81, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1842586c8b7398495e4c43829fa652e92dce2fc505b71e1dd18364b8a3ea0019", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Backing Up Accounts\n\nDepending on what software you use to access your account, there are various ways to back up and\nrestore your account. It is a good idea to back your information up and keep it secure. In general,\nas long as you know how you created your account and have the mnemonic seed phrase or the JSON\nbackup file (and password) stored securely, you can restore your account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-accounts/#unified-address-format", "page_title": "Polkadot Accounts", "index": 4, "depth": 3, "title": "Unified Address Format", "anchor": "unified-address-format", "start_char": 4478, "end_char": 7047, "estimated_token_count": 493, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1842586c8b7398495e4c43829fa652e92dce2fc505b71e1dd18364b8a3ea0019", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Unified Address Format\n\nPolkadot's address format allows it to\n[map your Polkadot address into multiple ones of different parachains](./learn-account-advanced.md#address-format).\nThis has been a major UX problem in onboarding new users. A unified address format across parachains\nwithin the Polkadot ecosystem aims to deliver a **simpler, more consistent user experience** while\nreducing errors.\n\nBelow is an example of the Hydration parachain.\n\n- Legacy Format: `7LMa9HR4MgV3Ae8t632XcJJSPBaEFou4RDRXQzeVE6BrpYCk`\n\n- New format: `13m1rnJf9MPFKwef2Vc2pXYffcZhoGEGXxXFew8X4Dj96FcA`\n\nFrom a UI perspective, your Polkadot address will be the same on any parachain. The main benefits of\nthe unified address format include the following:\n\n- Simplified User Experience: A single address format reduces complexity, making Polkadot more\n  accessible.\n- Consistency Across Ecosystem: No more dealing with multiple formats for different parachains.\n- Improved Ecosystem Usability: A unified experience enhances the overall robustness and usability\n  of the Polkadot network.\n\n!!!info Exchanges and Legacy Formats\n    Some exchanges may require the legacy format for deposits or withdrawals during the transition.\n    Parachain upgrades are happening progressively, and exchanges may take time to fully integrate the\n    new format.\n\n    To assist, a feature for copying legacy addresses is being implemented to ensure a seamless experience during this interim period.\n\n!!!info \"Why an address may start with `5` or a capital letter instead of `1`\"\n    Each network has its own address representation of the _same_ public key: Polkadot addresses start\n    with `1`, Kusama addresses start with a capital letter, and the generic Substrate format starts\n    with `5` ([SS58 prefix](./learn-account-advanced.md#for-the-curious-how-prefixes-work) `42`). An\n    address shown starting with `5` or a capital letter is therefore still valid and points to the same\n    account; only the format differs. This commonly happens when a wallet displays the generic Substrate\n    format while an interface shows the network-specific one. Most wallets and interfaces let you choose\n    which format to display - for example, in the [Polkadot Developer Interface](./learn-guides-accounts.md) the\n    address prefix can be set to match the connected network from the Settings page. See the\n    [Address Format](./learn-account-advanced.md#address-format) and\n    [address conversion tools](./learn-account-advanced.md#address-conversion-tools) sections for how to\n    convert between formats."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-accounts/#existential-deposit-and-reaping", "page_title": "Polkadot Accounts", "index": 5, "depth": 2, "title": "Existential Deposit and Reaping", "anchor": "existential-deposit-and-reaping", "start_char": 7047, "end_char": 9346, "estimated_token_count": 491, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1842586c8b7398495e4c43829fa652e92dce2fc505b71e1dd18364b8a3ea0019", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Existential Deposit and Reaping\n\n!!!info\n    Visit [**this page**](how-to/existential-deposit.md) for more information about existential deposit.\n\nWhen you generate an account (address), you only generate a _key_ that lets you access it. The\naccount does not exist yet on-chain. For that, it needs the\n[existential deposit](../general/chain-state-values.md).\n\nHaving an account go below the existential deposit causes that account to be _reaped_. The account\nwill be wiped from the blockchain's state to conserve space, along with any funds in that address.\nYou do not lose access to the reaped address - as long as you have your private key or recovery\nphrase, you can still use the address - but it needs a top-up of another existential deposit to be\nable to interact with the chain.\n\nTransaction fees cannot cause an account to be reaped. Since fees are deducted from the account\nbefore any other transaction logic, accounts with balances _equal to_ the existential deposit cannot\nconstruct a valid transaction. Additional funds will need to be added to cover the transaction fees.\n\n!!!info \"The existential deposit can be different on parachains\"\n    Having an Existential Deposit (ED) on a Polkadot account does not guarantee the liveness of the same account on its parachains. Parachains typically define ED for an account in their native tokens but can also configure it with tokens that are deemed sufficient. \n\nHere's another way to think about existential deposits. Ever notice those `Thumbs.db` files on\nWindows or `.DS_Store` files on Mac? Those are junk; they serve no specific purpose other than\nmaking previews a bit faster. If a folder is empty saved for such a file, you can remove the folder\nto clear the junk off your hard drive. That does not mean you will lose access to this folder\nforever - you can always recreate it. You have the _key_, after all - you're the computer's owner.\nIt just means you want to keep your computer clean until you maybe need this folder again and\nrecreate it. Your address is like this folder - it gets removed from the chain when nothing is in it\nbut gets put back when it has the existential deposit.\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about accounts](./learn-guides-accounts.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-accounts/#how-to-guides", "page_title": "Polkadot Accounts", "index": 6, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 9346, "end_char": 10519, "estimated_token_count": 376, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1842586c8b7398495e4c43829fa652e92dce2fc505b71e1dd18364b8a3ea0019", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [How to Create a Vanity Address](how-to/create-vanity-address.md)\n- [How to Export Your JSON Backup File](how-to/export-json-backup.md)\n- [How to Store Your Mnemonic Phrase & Backup Safely](how-to/store-mnemonic-safely.md)\n- [How to Restore Your Account (Developer Signer)](how-to/restore-account-signer.md)\n- [How to Create an Account](how-to/create-account.md)\n- [How to Receive DOT to My Account](how-to/receive-dot.md)\n- [How to Restore Your Account](how-to/restore-account.md)\n- [My Mnemonic Phrase Is Invalid](how-to/mnemonic-invalid.md)\n- [My Password Is Not Working](how-to/password-not-working.md)\n- [How to Change the Style of Your DOT Icon](how-to/change-dot-icon-style.md)\n- [The Difference Between Accounts and Address Book](how-to/accounts-vs-address-book.md)\n- [How to Create a Polkadot Account](how-to/create-polkadot-account.md)\n- [How to View Your Mnemonic Phrase (Developer Signer)](how-to/view-mnemonic-signer.md)\n- [How Can I Find and Copy My Address](how-to/find-copy-address.md)\n- [I Can't Find My Account on the Polkadot Network](how-to/cant-find-account.md)\n- [The 'Unable to Retrieve Key Pair' Error](how-to/error-key-pair.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#introduction-to-agile-coretime", "page_title": "Agile Coretime (Scheduling)", "index": 0, "depth": 2, "title": "Introduction to Agile Coretime", "anchor": "introduction-to-agile-coretime", "start_char": 1311, "end_char": 3188, "estimated_token_count": 390, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Introduction to Agile Coretime\n\nIn Polkadot 1.0, the only way for a parachain to be secured by Polkadot was to rent a lease through\nan auction, which guaranteed parachain block validation for up-to two\nyears. This involved locking significant amount of DOT, leading to a high barrier of entry for small\nand medium scale blockchain projects. The parachains produced blocks at a regular interval of 12\nseconds, irrespective of the network activity. This led to inefficient resource allocation and\nmisplaced economic incentives while producing almost empty blocks under lighter traffic and being\nunable to accommodate heavier traffic when it exceeded block limits. Agile Coretime resolves all of\nthese drawbacks.\n\nThe figure below shows the core usage for Polkadot 1.0, where the horizontal axis is time, and each\nrow represents a core. Colors show different parachains, each using one core (i.e., one parachain,\none core).\n\n![core-usage-dumb](../assets/core-usage-dumb.png)\n\nAgile Coretime allows for the purchase of [coretime](#coretime) in “bulk” with an allocation for one\nmonth. Heavy duty parachains which need to author a block every 12 seconds (or every 6s through\n[Asynchronous Backing](./learn-async-backing.md)), can seamlessly “renew” the [core](#core) each\nmonth. Coretime renewal orders take precedence over new orders and provide protection against price\nfluctuations, allowing parachains to plan their project budget and costs more effectively.\n\nThe purchased coretime can also be split up and sold in parts, down to a single block per month,\nallowing for secondary markets to thrive and improve the allocation efficiency of coretime.\nFurthermore, Agile Coretime offers [on-demand coretime](#on-demand-coretime) functionality that\nenables the authoring of a parachain block on-demand.\n\n![core-usage-agile-rangeSplit](../assets/core-usage-agile-rangeSplit.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#agile-coretime-terminology", "page_title": "Agile Coretime (Scheduling)", "index": 1, "depth": 2, "title": "Agile Coretime Terminology", "anchor": "agile-coretime-terminology", "start_char": 3188, "end_char": 3219, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Agile Coretime Terminology"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#core", "page_title": "Agile Coretime (Scheduling)", "index": 2, "depth": 3, "title": "Core", "anchor": "core", "start_char": 3219, "end_char": 3434, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Core\n\nThe term \"Core\" captures the virtual abstraction of computational resources provided by the relay\nchain to secure the blocks of a parachain, which involves a randomized set of the relay chain\nvalidators."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#coretime", "page_title": "Agile Coretime (Scheduling)", "index": 3, "depth": 3, "title": "Coretime", "anchor": "coretime", "start_char": 3434, "end_char": 3522, "estimated_token_count": 18, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Coretime\n\nThe time allocated for utilizing a core, measured in relay chain blocks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#bulk-coretime", "page_title": "Agile Coretime (Scheduling)", "index": 4, "depth": 3, "title": "Bulk Coretime", "anchor": "bulk-coretime", "start_char": 3522, "end_char": 3702, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Bulk Coretime\n\nA fixed duration of continuous coretime represented by an NFT that can be split, shared, or resold.\nCurrently, the duration of bulk coretime is set to 28 days."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#region", "page_title": "Agile Coretime (Scheduling)", "index": 5, "depth": 3, "title": "Region", "anchor": "region", "start_char": 3702, "end_char": 3768, "estimated_token_count": 14, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Region\n\nThe NFT representing a single unit of bulk coretime."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#on-demand-coretime", "page_title": "Agile Coretime (Scheduling)", "index": 6, "depth": 3, "title": "On-demand Coretime", "anchor": "on-demand-coretime", "start_char": 3768, "end_char": 4266, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### On-demand Coretime\n\nPreviously known as instantaneous coretime, the on-demand coretime refers to coretime acquired\nthrough bidding in near real-time for the validation of a single parachain block on one of the cores\nreserved specifically for on-demand orders.\n\n!!!info \"Parathreads are renamed to on-demand parachains\"\n    On-demand parachains (previously called parathreads) are parachains that buy on-demand coretime and use it to access the relay chain through the on-demand coretime pool."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#on-demand-coretime-pool", "page_title": "Agile Coretime (Scheduling)", "index": 7, "depth": 3, "title": "On-demand Coretime Pool", "anchor": "on-demand-coretime-pool", "start_char": 4266, "end_char": 4462, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### On-demand Coretime Pool\n\nSet of cores that are available on-demand. Cores reserved through bulk coretime could also be made\navailable in the on-demand coretime pool, in parts or in entirety."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#coretime-chain", "page_title": "Agile Coretime (Scheduling)", "index": 8, "depth": 3, "title": "Coretime Chain", "anchor": "coretime-chain", "start_char": 4462, "end_char": 4722, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Coretime Chain\n\nA system parachain that is responsible for the sale, manipulation of bulk coretime and eventually\nthe purchase of on-demand coretime credits. It is also responsible for scheduling the respective\ncores on the relay chain to the parachains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#timeslice", "page_title": "Agile Coretime (Scheduling)", "index": 9, "depth": 3, "title": "Timeslice", "anchor": "timeslice", "start_char": 4722, "end_char": 5062, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Timeslice\n\nA timeslice represents the granularity the Coretime Chain schedules cores on the relay chain. The\nCoretime Chain announces a schedule for each core, comprising the next 80 relay chain blocks in\nadvance. 5,040 timeslices corresponds to the region length of 28 days (which is the initial\nconfiguration set for bulk coretime)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#task", "page_title": "Agile Coretime (Scheduling)", "index": 10, "depth": 3, "title": "Task", "anchor": "task", "start_char": 5062, "end_char": 5202, "estimated_token_count": 30, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Task\n\nThe term \"Task\" captures the abstraction of utility of the core. Tasks on the cores are not just\nlimited to securing parachains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#agile-coretime-implementation", "page_title": "Agile Coretime (Scheduling)", "index": 11, "depth": 2, "title": "Agile Coretime Implementation", "anchor": "agile-coretime-implementation", "start_char": 5202, "end_char": 5758, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Agile Coretime Implementation\n\nCoretime is managed through the\n[broker pallet](https://github.com/paritytech/polkadot-sdk/blob/eefd5fe4499515da66d088505093f75b5aa22550/substrate/frame/broker/src/lib.rs)\nwhich is deployed on the Coretime Chain. In theory, the Polkadot relay chain can support around a\nhundred cores seamlessly and can support over a few hundred cores through optimizations. Preliminary\ntests ran successfully with 80 cores with 12-second block times.\n[**Coretime revenue sales are burned**](https://hub.regionx.tech/?network=polkadot)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#coretime-sales", "page_title": "Agile Coretime (Scheduling)", "index": 12, "depth": 3, "title": "Coretime Sales", "anchor": "coretime-sales", "start_char": 5758, "end_char": 6645, "estimated_token_count": 194, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Coretime Sales\n\nSales on the Coretime Chain are of `timeslice` length. These sales are divided into two main\nperiods: the Renewal period and the Sale period.\n\n![coretime-sale-timeline](../assets/coretime/Coretime-Sale-Timeline.png)\n\n- Renewal periods are of `interlude_length` blocks long, and it’s where bulk coretime can be\n  renewed.\n- Sale periods are as well divided into two periods: a Price Discovery period and a Fixed Price\n  period. After the Renewal period, a new `start_price` will be set by the Coretime Chain and a\n  dutch auction of `leadin_length` blocks will start, putting downward pressure on price to find\n  the right equilibrium. This process will set the `regular_price` which will be the one offered at\n  the Fixed Price period.\n\nThis discussion on initial coretime pricing can be viewed\n[here](https://forum.polkadot.network/t/initial-coretime-pricing/5187)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#splitting-and-interlacing", "page_title": "Agile Coretime (Scheduling)", "index": 13, "depth": 3, "title": "Splitting and Interlacing", "anchor": "splitting-and-interlacing", "start_char": 6645, "end_char": 7221, "estimated_token_count": 111, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Splitting and Interlacing\n\nSplitting and interlacing are actions that can be performed within a region. Performing either of\nthese actions makes you lose the right to a price-capped renewal.\n\n- **Splitting**: the action of dividing a region into several regions with different start and end\n  timeslices.\n- **Interlacing:** the action of dividing a region into the execution of different tasks for each\n  block of a timeslice. The result regions will have the same start and end timeslice as the parent\n  region, but different tasks will be executed at different blocks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#elastic-scaling", "page_title": "Agile Coretime (Scheduling)", "index": 14, "depth": 3, "title": "Elastic Scaling", "anchor": "elastic-scaling", "start_char": 7221, "end_char": 7702, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Elastic Scaling\n\nWith elastic scaling (still under development) projects can scale seamlessly and without being\nlimited to previously allocated resources. Elastic scaling is the process of getting multiple cores\nfor one task. This allows parachains to include more blocks per unit time (relay chain-side), and\nproduce more blocks per unit time (async backing on the parachain side). Elastic scaling can be\npaired with on-demand coretime to increase your bandwidth seamlessly."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#agile-coretime-faq", "page_title": "Agile Coretime (Scheduling)", "index": 15, "depth": 2, "title": "Agile Coretime FAQ", "anchor": "agile-coretime-faq", "start_char": 7702, "end_char": 7725, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Agile Coretime FAQ"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#roadmap", "page_title": "Agile Coretime (Scheduling)", "index": 16, "depth": 3, "title": "Roadmap", "anchor": "roadmap", "start_char": 7725, "end_char": 9234, "estimated_token_count": 341, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Roadmap\n\n#### Where can we track Agile Coretime Progress\n\nAgile Coretime project logistics can be tracked on the\n[Parachains Team GitHub Dashboard](https://github.com/orgs/paritytech/projects/119/views/20)\n\n#### Is all of RFC-1 coming at once or in parts?\n\nNo, with the initial Kusama launch, the following features mentioned in\n[RFC-1](https://polkadot-fellows.github.io/RFCs/approved/0001-agile-coretime.html) are rolled out:\n\n- The purchase of bulk coretime and placement of on-demand orders\n- Renewing leases\n- Splitting and interlacing regions\n\nThese features are still under development and will be rolled out in later releases:\n\n- Getting rewards for adding your region to the on-demand pool\n- Credits for on-demand coretime (currently you are able to buy with native tokens of relay chain)\n\n#### What is currently being developed in the ecosystem to support Agile Coretime?\n\nThere are several ecosystem projects in the making, such as the secondary markets for coretime,\n[Lastic](https://www.lastic.xyz/), and [RegionX](https://hub.regionx.tech/).\n\nAlways do your own research. If you feel your project should be listed on the Wiki, please follow\nthe [contributor's guide](../general/contributing.md).\n\n#### Will all the current leaseholder parachains migrate and when?\n\nThey will migrate when the runtime upgrade with Agile Coretime is performed on the relay chain. Any\nparachains with existing lease periods will be automatically credited bulk coretime for the\nremainder of their lease period."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#product", "page_title": "Agile Coretime (Scheduling)", "index": 17, "depth": 3, "title": "Product", "anchor": "product", "start_char": 9234, "end_char": 10692, "estimated_token_count": 319, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Product\n\n#### Where will coretime be maintained?\n\nCoretime will be managed by the broker pallet which is deployed on the Coretime Chain.\n\n#### Is the Broker Chain the same as the Coretime Chain?\n\nYes, the broker pallet runs on the Coretime Chain.\n\n#### Can cores be shared at the same time?\n\nCurrently not. Cores can be shared, but only in time. For example, you get a core at block X,\nanother one gets it at block Y. This may change in future.\n\n#### What limits are there to the number of cores?\n\nSuccessful tests were made with around 80 cores and 12-second block times for parachains. A single\ntest validator set is able to validate 80 blockchains simultaneously. In theory a single relay chain\nshould be able to support a few hundred cores. Optimizations to get closer to this theoretical limit\nwill be developed and deployed continuously.\n\nOnce that theoretical limit is reached, ideas for further scaling are already on the table. The goal\nis not to scale by [lowering security guarantees](https://www.youtube.com/watch?v=O9QZveTdW5I)\n(similarly to optimistic rollups) but to optimize and improve allocation efficiency (by making\nbetter use of the existing cores).\n\n#### Is there a UI for the Coretime Chain?\n\nTeams in the ecosystem are working on a UI. RegionX has released [RegionX Hub](https://hub.regionx.tech/). Without the UI, this would be automated from the parachains’\nruntimes or manually with Coretime Chain extrinsics via Polkadot-JS."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#coretime-pricing-and-purchasing", "page_title": "Agile Coretime (Scheduling)", "index": 18, "depth": 3, "title": "Coretime Pricing and Purchasing", "anchor": "coretime-pricing-and-purchasing", "start_char": 10692, "end_char": 16336, "estimated_token_count": 1202, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Coretime Pricing and Purchasing\n\n#### How is the price for bulk coretime calculated?\n\nThe pricing for bulk coretime depends on factors from several sources:\n\n1. The first source is the implementation directly in the pallet, which is not exposed as a\n   configuration\n2. The second source is configurable in the runtime of the Coretime Chain\n3. Configurable parameters, such as the starting sales price, ideal bulk ration and the number of\n   cores offered per sale, which are set through governance\n4. Market forces, such as the demand and perceived true market price of a core - the impact of which\n   can be increased or decreased through the configuration set by governance\n\nA more detailed description of the elements that have an influence on the bulk coretime price can be\nfound [here](https://hackmd.io/@seadanda/Sk9pLYm3a).\n\nAfter a\n[thorough analysis](https://forum.polkadot.network/t/initial-coretime-pricing/5187/7?u=joyce) it was\ndecided to open a governance proposal for an initial price ~5 KSM. The price will be set with the\n“start sales” call, which will go through governance after runtime upgrade. Keep an eye on the post\nto be informed and decide with us upon the initial price for Agile Coretime on KSM. The price for\nPolkadot is still under discussion.\n\n#### How do sale periods work on the Coretime Chain?\n\n![coretime-sale-timeline](../assets/coretime/Coretime-Sale-Timeline.png)\n\nSales on the Coretime Chain are of region length. These sales are divided into two main periods: the\nRenewal period and the Sale period.\n\n- Renewal periods are of the length of the interlude, which is defined as a number of blocks in the\n  broker pallet configuration, and it’s where bulk coretime can be renewed.\n- Sale periods are as well divided into two periods: a Price Discovery period and a Fixed Price\n  period. After the Renewal period, a new start price will be set by the Coretime Chain and a dutch\n  auction of lead-in length blocks will start, putting downward pressure on price to find the right\n  equilibrium. This process will set the base price which will be the one offered at the Fixed Price\n  period.\n\n#### How does the pricing mechanism for on-demand coretime work?\n\nThere will be a minimum price configured, the rest is based on demand via a price function: the\nlonger the queue, the higher the price.\n\n#### Do I need to pay a deposit to register for coretime?\n\nAll newly registered parachains must\n[place a deposit](https://github.com/paritytech/polkadot-sdk/pull/3020) equivalent to the cost of\nregistering the maximum size of runtime (business logic) code. After a successful registration,\nparachains are allowed to be assigned to regions. The runtime of these parachains can then be\nupgraded without any additional costs. The maximum size is pre-defined and equal to everyone on the\nnetwork. This way, every registration will cost the same independent of the size of the registered\nruntime code (Wasm blob).\n\n[RFC-44](https://github.com/polkadot-fellows/RFCs/pull/44) is proposing a new rent-based\nregistration price model, which will become an alternative (if it gets approved).\n\n#### How does the price change over time?\n\nOn-demand coretime will always be subject to market conditions. The price of bulk coretime changes\nbased on the outcome of the previous sale. Factors such as the number of cores sold, the target\n(from the ideal bulk ratio) and the number of cores offered in the sale are used in combination with\nthe price for which the last core was sold. Bulk renewals are capped within a percentage of the\nprevious purchase price. The algorithm that is used is implemented in each runtime and can differ\nbetween chains.\n\nThe bulk price in Kusama might vary between a 50% decrease in case no cores were sold in the\nprevious sales and can increase by 5x depending on the number of cores sold and when they sell.\nThese numbers represent extreme cases though.\n\n#### Can the renewal price be different per taskID (Parachain)? Or will each sale cycle have a fix renewal price?\n\nIt is in general different per task if they hit their caps.\n\nWith the current configuration on Kusama, if the price is going up, every renewal pays a maximum of\n3% more than they paid for the sale before. That keeps going back to the sale cycle they first\nbought their coretime (or the sale cycle they renewed their lease). And because people buy in\ndifferent sale cycles, or even at different times in each sale cycle, their prices can be wildly\ndifferent from one another. There’s a special case for leaseholders at the end of their lease. They\npay the base price in the sale in which they expire.\n\nThe story is different if the prices are decreasing, since the caps are irrelevant. If it drops far\nenough it could mean that all parachains renew at the same price.\n\n#### If purchased in bulk, do you then have “one core” or “one bucket of coretime” that you can use in your own time? Or is there a specific slot?\n\nYou have a specific core for the duration of four weeks, and have the ability to split the region\nup. Splitting or interlacing the region makes you lose the right to a price-capped renewal.\n\n#### What happens to purchased coretime if I don't use it?\n\nUnused coretime can't be carried over. If the coretime within the time allocation (timeslice) is not\nused, then it is lost. If previously purchased coretime is no longer needed, it be sold on secondary\nmarkets.\n\n#### Can I buy coretime in advance and start using it when I'm ready?\n\nCoretime can be purchased up to 28 days in advance. Later, “futures” markets to hedge against price\nfluctuations could be a possible solution to increase predictability further."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#concepts", "page_title": "Agile Coretime (Scheduling)", "index": 19, "depth": 3, "title": "Concepts", "anchor": "concepts", "start_char": 16336, "end_char": 16776, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Concepts\n\n#### Is it “on-demand coretime” or “Instantaneous coretime”?\n\nIt was decided to stick with the term \"on-demand\".\n\n#### What's the correct spelling and its usage?\n\nOther than Agile Coretime and the Coretime Chain, do not capitalize coretime or blockspace.\n\n#### What’s the connection between blockspace and coretime?\n\n(Secure) blockspace is the resource Polkadot provides, which is measured in and allocated through\ncoretime."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#value-proposition", "page_title": "Agile Coretime (Scheduling)", "index": 20, "depth": 3, "title": "Value Proposition", "anchor": "value-proposition", "start_char": 16776, "end_char": 19987, "estimated_token_count": 591, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Value Proposition\n\n#### What are the benefits of Agile Coretime, and how do the on-demand and bulk models suit different customers?\n\n- On a high level, Agile Coretime brings a new era of scaling to Web3 with optimal resource\n  allocation across the entire network.\n- The on-demand model democratizes blockchain access by opening the door to everyone building a\n  custom, sovereign Web3 application; the bulk model brings a new level of cost-predictability for\n  teams and projects.\n\nSpecific benefits for decision makers and developers:\n\n- Agile Coretime brings efficient utilization of resources, enabling scale and agility for better\n  UX, without compromising security or decentralisation.\n- More flexible economic models for every stage of growth enable builders to innovate without\n  boundaries.\n- Developers benefit from streamlined development through simplified resource management, as well as\n  from a consistent development environment through flexible and predictable cost modelling over\n  time.\n- On-demand coretime removes barriers to entry: spin up your proof of concept quickly with full\n  access to Polkadot’s entire ecosystem.\n- Cost effectiveness: Remove inefficiencies by buying coretime on-demand only, or sell access to\n  coretime on secondary marketplaces.\n- With elastic scaling (not supported yet) projects can scale seamlessly and without being limited\n  to previously allocated resources. Elastic scaling is the process of getting multiple cores for\n  one task. This allows parachains to include more blocks per unit time (relay chain-side), and\n  produce more blocks per unit time (async backing on the parachain side). With elastic scaling, add\n  on-demand coretime to increase your bandwidth seamlessly.\n- Bulk coretime enables strategic resource planning: secure bulk coretime at a fixed price to\n  prevent spiking fees during high demand. This helps you future-proof your projects. Bulk coretime\n  provides a solid foundation for your long-term business plans, allowing for sustainable growth.\n\n#### What makes the coretime model on Polkadot competitive?\n\nThe on-demand option removes barriers to entry and enables builders to start and innovate quickly.\nCombined with the bulk model, builders also mitigate risks of spiking fees during times of high\ndemand.\n\nHowever, as compared to running on an L1 or a scaling solution, builders still have the benefits of\nrunning on a purpose-made parachain, which is more efficient and thus cheaper than running a smart\ncontract on a generic L1. In addition, you are connected to and secured by the entire Polkadot\nnetwork.\n\nPolkadot thus offers all the benefits of building high-performing, purpose-made, and composable\nappchains, combined with the most flexible economics.\n\n#### How close do we get to Web2 scale for Web3?\n\nAgile Coretime mainly improves allocation efficiency. With\n[elastic scaling](https://github.com/paritytech/polkadot-sdk/issues/1829), we take a big step\ntowards enabling Web2 scale in Web3 by reducing parachain block production below 6 seconds.\nTheoretically, parachains will be able to produce blocks very fast and the limitations will lie on\nthe relay chain side’s cores and how many cores a parachain uses."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-agile-coretime", "url": "https://developer.polkadot.com/wiki/learn/learn-agile-coretime/#implementation", "page_title": "Agile Coretime (Scheduling)", "index": 21, "depth": 3, "title": "Implementation", "anchor": "implementation", "start_char": 19987, "end_char": 27116, "estimated_token_count": 1519, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5233d325a794796289fde83593c7b1f016305c6b67133366b3df20628d609b54", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Implementation\n\n!!!caution \"Unable to use multiple cores!\"\n    The coretime chain does not prohibit ordering multiple cores and assigning them to the same parachain. However, elastic scaling is still in the works **so don't do this, you will not be able to use those cores.**\n\n#### What do I need to do for my parachain to continue working in the switch to coretime?\n\nCurrent parachain slots will be converted to legacy leases automatically in the runtime upgrade\nthrough a migration, with no intervention needed. The lease will grant your parachain a core until\nthe end of the region in which its slot would have expired.\n\n#### When does the last auction take place?\n\nAuctions took place until the launch of Agile Coretime with Polkadot runtime upgrade on the 19th of\nSeptember 2024. Ongoing auctions were canceled and existing active leases of previous auctions were\nmigrated to Agile Coretime. In case you had a lease secured, you automatically got corresponding\ncoretime, with renewal right.\n\n_Note: if your team secured a lease with a new paraID, please\n[read the question about swapping](#will-i-be-able-to-still-swap-my-lease-with-another-project)._\n\n#### When and how can I renew my legacy lease?\n\nThe `slots.leases` are migrated to `leases` in the broker pallet with an expiry `timeslice` that\ncorresponds to your original expiry block. When the lease expires, the parachain has a core until\nthe end of the sales period that it expired in. After that, the `interlude` period starts. In that\nsale period you can renew your bulk coretime by calling `renew` on the lease's core. The price will\nbe charged and will be equal to the market price of a bulk core in that sale.\n\nFor more details, check out our\n[technical guide](https://polkadot-public.notion.site/Implementation-reference-Coretime-from-Trappist-c930796e8c884011adb1fa24ef22f77c?pvs=4).\n\n#### Will all leases be migrated to Agile Coretime?\n\nIf your team has a lease secured by the time Agile Coretime launches, they will also have a lease on\nAgile Coretime and the right for renewal when the lease expires. If the lease of your project would\nonly start _after_ Agile Coretime launch (not yet active at launch time), the lease will be\ncancelled and your locked KSM refunded. You will need to purchase and assign coretime.\n\n_Note: Your lease will also be canceled and refunded, in case it is not continuous, as leases with\n“holes” are not supported by Agile Coretime._\n\n#### Will I be able to still swap my lease with another project?\n\nUnfortunately you won’t be able for the current Kusama release, and it’s advisable to avoid doing it\non Polkadot too, as swapping is not something that will exist with Agile Coretime. Yet to ensure a\nsmooth migration, we’re implementing a solution for Polkadot. Once we release Agile Coretime on\nPolkadot, you should be able to call the\n[swap extrinsic](https://github.com/paritytech/polkadot-sdk/issues/3552) to swap your lease with\nanother project and the change will be reflected on Agile Coretime as well.\n\n#### My lease is about to end, what do I need to do?\n\nIf your lease is about to expire, your core is added to the allowed renewals and you are able to\nrenew your core for a fixed percentage increase before the rest of the market is able to bid on it.\nPlease, make sure to renew your lease within the period defined by the broker chain to avoid\ndowntime for your chain and potentially losing your fixed renewal cost.\n\n#### Can any account renew coretime on behalf of a parachain or does this need to be from the parachain sovereign account?\n\nYes, any account with enough funds can renew it for any given parachain on a core which qualifies\nfor renewal.\n\n#### How is the coretime price determined in practice?\n\nThe starting price is initially configured by a referendum. In subsequent sales, it depends on the\nnumber of cores which were sold vs those which were for sale. If the ideal ratio was sold (the ratio\nis configured by referendum, too) then the price remains the same. If fewer cores than the ideal\nwere sold, then the price decreases. If more cores are sold than ideal, then the price increases. In\nthis way the price is sensitive to market conditions, the initial configuration, and the number of\ncores offered in the sales.\n\n#### How is coretime measured and allocated technically?\n\nThe Coretime Chain is a proposed new system parachain within the Polkadot network that is\nresponsible for the management of coretime. It is designed to handle the allocation of bulk coretime\nand track ownership of coretime as non-fungible assets (NFTs). The Coretime Chain provides\ninformation to the relay chain regarding the number of cores available, the tasks running on each\ncore, and accounting information for on-demand coretime credit. Additionally, it processes renewals\nand allows for various manipulations of bulk coretime, such as transfers, partitioning, interlacing,\nassignment to tasks, and pooling for on-demand coretime.\n\n#### Why are sales of on-demand coretime happening on the relay chain?\n\nIn the beginning, sales are executed on the relay chain, but they could move to the Coretime Chain.\nLatency is the only drawback: at low demand, the buyer would receive the coretime instantly when via\nthe relay chain, but there’ll be a delay when executed on the Coretime Chain. At times of high\ndemand, there will be a queue anyway and this delay matters less.\n\n#### What's the best way for on-demand tasks (previously known as on-demand parachains) to regularly send extrinsics to the relay chain for allowing a block to be validate?\n\nA ready-to-use automated and decentralized method for ordering on-demand coretime is\ncurrently [being implemented](https://github.com/paritytech/polkadot-sdk/issues/1487). Some teams\nalready implemented a simplified [variant](https://github.com/Magport/Magnet/issues/4). What works\nin any case is ordering on-demand coretime \"by hand\", by sending the `placeOrderKeepAlive` extrinsic\nof the `onDemandAssignmentProvider`, via polkadot js for example. You can find an easy step-by-step\nguide\n[here](https://forum.polkadot.network/t/parachain-consensus-updates-coretime-asynchronous-backing-scalability/4396/8?u=kianenigma).\n\n#### How many cores will be configured for on-demand coretime?\n\nWe will certainly start with one core on Kusama and one on Polkadot, and then see if this is\nsufficient initially.\n\n#### What happens if my chain runs out of coretime?\n\nYour chain won’t be able to validate further blocks and will halt.\n\n#### What does splitting and interlacing mean?\n\nSplitting and interlacing are actions anyone can make within its own region. Performing any of these\nwill result in a new region with new characteristics, and will make the owner of the original region\nunable to renew it.\n\n- **Splitting**: the action of dividing a region into several regions with different start and end\n  timeslices.\n- **Interlacing:** the action of dividing a region into the execution of different tasks for each\n  block of a timeslice. The result regions will have the same start and end timeslice as the parent\n  region, but different tasks will be executed at different blocks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#relay-chain", "page_title": "Architecture", "index": 0, "depth": 2, "title": "Relay Chain", "anchor": "relay-chain", "start_char": 1, "end_char": 737, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Relay Chain\n\nThe relay chain is the central chain of Polkadot. All validators are staked on the relay chain in DOT and validate for the relay chain. The relay chain has deliberately minimal functionality — its primary purpose is to facilitate block production, core scheduling, data availability, and provide shared security to the rest of the network. Its main responsibility is to coordinate the system as a whole, including parachains.\n\nOther specific work is delegated to parachains, which have their own domain-specific implementations and features.\n\n> **Note:** The relay chain does not support user-facing functionalities — accounts, balance transfers, staking, and more have been migrated to Asset Hub, a system parachain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#parachainlearn-parachainsmd-slots", "page_title": "Architecture", "index": 1, "depth": 2, "title": "[Parachain](learn-parachains.md) Slots", "anchor": "parachainlearn-parachainsmd-slots", "start_char": 737, "end_char": 2420, "estimated_token_count": 327, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## [Parachain](learn-parachains.md) Slots\n\nThe relay chain can support a number of execution cores, like cores on a computer's processor (a\nmodern laptop's processor may have eight cores, for example). Each one of these cores can run one\nprocess at a time. The relay chain allows these cores using two subscription models: parachains and\non-demand parachains. Parachains have a dedicated core for their chain and are like a process that\nruns constantly. On-demand parachains share (not simultaneously) cores amongst a group, and are thus\nmore like processes that need to be woken up and run less frequently (similarly to concurrency in\nmodern computers).\n\nMost of the computation that happens across the network as a whole will be delegated to specific\nparachain implementations that handle various use cases. The relay chain places no constraints over\nwhat parachains can do besides that they must be able to generate a proof that can be validated by\nthe validators assigned to the parachain. This proof verifies the state transition of the parachain.\nSome parachains may be specific to a particular application, others may focus on specific features\nlike smart contracts, privacy, or scalability &mdash; still, others might be experimental\narchitectures that are not necessarily blockchain in nature.\n\nThe relay chain provides many ways to secure a core for a parachain for a particular length of time.\nOn-demand parachains share cores (not simultaneously) with other parachains. Both regular and\non-demand parachains have the same API and need to buy time on a core with DOT via\n[coretime](./learn-agile-coretime.md). Parachains can switch between being on-demand and permanent."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#shared-securitylearn-parachainsmd", "page_title": "Architecture", "index": 2, "depth": 3, "title": "[Shared Security](learn-parachains.md)", "anchor": "shared-securitylearn-parachainsmd", "start_char": 2420, "end_char": 3140, "estimated_token_count": 141, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### [Shared Security](learn-parachains.md)\n\nParachains connected to the relay chain all share in the security of the relay chain. Polkadot has a\nshared state between the relay chain and all of the connected parachains. If the relay chain must\nrevert for any reason, then all of the parachains would also revert. This is to ensure that the\nvalidity of the entire system can persist and no individual part is corruptible.\n\nThe shared state ensures that the trust assumptions when using parachains are only those of the\nrelay chain validator set and no other. Since the validator set on the relay chain is expected to be\nsecure with a large amount of stake put up to back it, parachains should benefit from this security."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#interoperability", "page_title": "Architecture", "index": 3, "depth": 2, "title": "Interoperability", "anchor": "interoperability", "start_char": 3140, "end_char": 3161, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interoperability"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#xcmlearn-xcmmd", "page_title": "Architecture", "index": 4, "depth": 3, "title": "[XCM](learn-xcm.md)", "anchor": "xcmlearn-xcmmd", "start_char": 3161, "end_char": 3751, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### [XCM](learn-xcm.md)\n\nXCM, short for cross-consensus message, is a format and not a protocol. The format does not assume\nanything about the receiver or senders consensus mechanism, it only cares about the format in which\nthe messages must be structured in. The XCM format is how parachains will be able to communicate\nwith one another. Different from XCMP, which is short for cross-chain messaging protocol, XCM is\nwhat gets delivered, and XCMP is the delivery mechanism. The best way to learn more about XCM is by\nreading the [specification](https://github.com/paritytech/xcm-format)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#bridgeslearn-bridgesmd", "page_title": "Architecture", "index": 5, "depth": 3, "title": "[Bridges](learn-bridges.md)", "anchor": "bridgeslearn-bridgesmd", "start_char": 3751, "end_char": 4422, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### [Bridges](learn-bridges.md)\n\nA blockchain [bridge](../general/glossary.md#bridge) is a connection that allows for arbitrary data\nto transfer from one network to another. These chains are interoperable through the bridge but can\nexist as standalone chains with different protocols, rules, and governance models. In Polkadot,\nbridges connect to the relay chain and are secured through the consensus mechanism, maintained by\n[collators](#collators).\n\nPolkadot uses bridges to bridge the future of Web 3.0, as bridges are fundamental to Polkadot's\ninteroperable architecture by acting as a secure and robust communication channel for chains in\nisolation.\n\n# Main Actors"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#validators", "page_title": "Architecture", "index": 6, "depth": 2, "title": "Validators", "anchor": "validators", "start_char": 4422, "end_char": 5084, "estimated_token_count": 128, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Validators\n\n[Validators](../general/glossary.md#validator), if elected to the validator set, produce blocks on\nthe relay chain. They also accept proofs of valid state transition from collators and receive\nstaking rewards in return.\n\nValidators are required to keep enough parachain blocks available for later use in their local\nstorage. Those blocks are retrievable by peers who lack that information, so that they can reliably\nconfirm the issued validity statements about parachain blocks. The\n[Availability & Validity](https://spec.polkadot.network/#chapter-anv) (AnV) protocol consists of\nmultiple steps for successfully upholding those responsibilities."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#nominators", "page_title": "Architecture", "index": 7, "depth": 2, "title": "Nominators", "anchor": "nominators", "start_char": 5084, "end_char": 5388, "estimated_token_count": 61, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Nominators\n\n[Nominators](../general/glossary.md#nominator) bond their stake to particular validators in order to\nhelp them get into the active validator set and thus produce blocks for the chain. In return,\nnominators are generally rewarded with a portion of the staking rewards from that validator."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-architecture", "url": "https://developer.polkadot.com/wiki/learn/learn-architecture/#collators", "page_title": "Architecture", "index": 8, "depth": 2, "title": "Collators", "anchor": "collators", "start_char": 5388, "end_char": 5838, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:570cbee8bb7776de6d1eadf694335cae76fd6dfa35e6016ef474687c2154ece0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Collators\n\n[Collators](../general/glossary.md#collator) are full nodes on both a parachain and the relay chain.\nThey collect parachain transactions and produce state transition proofs for the validators on the\nrelay chain. They can also send and receive messages from other parachains using XCMP.\n\nParachain blocks themselves are produced by collators, whereas the relay chain validators only\nverify their validity (and later, their availability)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-asset-conversion-assethub", "url": "https://developer.polkadot.com/wiki/learn/learn-asset-conversion-assethub/#fee-payment-in-any-asset-wallets", "page_title": "Asset Conversion on AssetHub", "index": 0, "depth": 2, "title": "Fee Payment in Any Asset - Wallets", "anchor": "fee-payment-in-any-asset-wallets", "start_char": 2171, "end_char": 3160, "estimated_token_count": 194, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5fd736984c7be7cde7d4e9f5b49fe3449387787094f957f5e6a8173566c20dfa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fee Payment in Any Asset - Wallets\n\nWithout Asset Conversion pallet, only DOT and\n[sufficient assets](./learn-assets.md#sufficient-assets) can be used for paying transaction fees.\nWith the Asset Conversion pallet deployed, Wallets can enable users to pay transaction fees through\nany arbitrary asset made available in pools with either DOT or sufficient assets. More specifically,\nthis functionality is enabled through\n[Asset Conversion Transaction Payment Pallet](https://github.com/paritytech/polkadot-sdk/tree/cdc8d197e6d487ef54f7e16767b5c1ab041c8b10/substrate/frame/transaction-payment/asset-conversion-tx-payment),\nallowing runtimes that include it to pay for transactions in assets other than the native token of\nthe chain.\n\n!!!caution \"Handling Pools with Low Liquidity\"\n    The wallets and UIs should ensure that the user is prompted with the necessary warnings, such that they do not accidentally spend all of their funds to perform a swap on a pool with no or low liquidity."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-asset-conversion-assethub", "url": "https://developer.polkadot.com/wiki/learn/learn-asset-conversion-assethub/#fee-payment-in-any-asset-parachains", "page_title": "Asset Conversion on AssetHub", "index": 1, "depth": 2, "title": "Fee Payment in Any Asset - Parachains", "anchor": "fee-payment-in-any-asset-parachains", "start_char": 3160, "end_char": 3299, "estimated_token_count": 27, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5fd736984c7be7cde7d4e9f5b49fe3449387787094f957f5e6a8173566c20dfa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fee Payment in Any Asset - Parachains\n\nParachains can pay for their XCM execution fees in any asset with a liquidity pool on AssetHub."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-asset-conversion-assethub", "url": "https://developer.polkadot.com/wiki/learn/learn-asset-conversion-assethub/#creation-of-pools-with-foreign-assets-parachains", "page_title": "Asset Conversion on AssetHub", "index": 2, "depth": 2, "title": "Creation of Pools with Foreign Assets - Parachains", "anchor": "creation-of-pools-with-foreign-assets-parachains", "start_char": 3299, "end_char": 4772, "estimated_token_count": 260, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5fd736984c7be7cde7d4e9f5b49fe3449387787094f957f5e6a8173566c20dfa", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Creation of Pools with Foreign Assets - Parachains\n\nAssets pallet uses XCM MultiLocations to represent assets, and their corresponding origins to\ncontrol them.\n\nOne of the pain points of integrating parachain tokens natively on wallets and exchanges is that\nthey require running individual parachain infrastructure like full nodes to process deposits, and\nrequire additional code to handle withdrawals because they need to be able to construct and\nbroadcast transactions on each parachain. These parachains could use different balances pallets or\norder them differently. When Polkadot hosts hundreds of parachains (and possibly thousands of\nthreads), this becomes a huge burden in terms of network support. This is in contrast to adding\nsupport for an additional ERC20 token; the marginal effort is very small since an Ethereum node\nalready serves all the data they need.\n\nWith support for these assets on Asset Hub, exchanges/custodians could monitor one chain for\ndeposits (applications and UIs would need to give the option to transfer to Asset Hub). For\nwithdrawals, users could choose to withdraw to their address on Asset Hub. There are two user\nexperience bonuses here:\n\n- The exchange/custodian only needs to transact on one parachain and can access every other without\n  any infrastructure lift.\n- For the user, they never actually need to “see” AssetHub. It’s entirely abstracted away behind\n  either the parachain wallet/application or the exchange/custodian."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#sufficient-assets", "page_title": "Asset Hub Overview", "index": 0, "depth": 2, "title": "Sufficient Assets", "anchor": "sufficient-assets", "start_char": 1533, "end_char": 2825, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Sufficient Assets\n\nA sufficient asset on Asset Hub can allow for an account to exist on-chain even though it does not\nhave any account balance in the native asset. Any registered asset on the Asset Hub can be made\n_sufficient_ through governance on the relay chain. A balance of a non-sufficient asset can only\nexist on accounts that are on-chain (i.e., accounts having the\n[existential deposit](./learn-accounts.md#existential-deposit-and-reaping) of a sufficient asset).\nThat is, a user could not keep an account on-chain by transferring a non-sufficient asset to it; the\naccount must already be on-chain by having more than the existential deposit in native asset (or a\nsufficient asset).\n\nAssets deemed _sufficient_ can instantiate accounts on the Asset Hub and pay for transaction fees\nwithout the need for the native token (DOT or KSM). An example would be USDT on the Polkadot Asset\nHub. If an account holds 0.7 USDT, it would exist on the Polkadot Asset Hub system parachain without\nthe need to hold DOT.\n\n!!!warning \"Transfers of Non-sufficient assets\"\n    Before transferring a non-sufficient asset, ensure the receiver account has enough funds to cover the existential deposit and transaction fees for future transfers. Please do so to ensure the asset transfer is successful."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#asset-conversion", "page_title": "Asset Hub Overview", "index": 1, "depth": 2, "title": "Asset Conversion", "anchor": "asset-conversion", "start_char": 2825, "end_char": 3428, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Asset Conversion\n\n[An asset conversion pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_asset_conversion/index.html)\nis deployed on AssetHub with Uniswap V2-style functionality. It implements a simple AMM (automated\nmarket maker), which employs a mathematical formula to determine the price of a token based on its\nratio within the liquidity pool.\n\nThis pallet enables fees to be paid in any asset that has corresponding liquidity (in DOT/KSM) on\nAssetHub. Learn more about asset conversion on AssetHub,\n[including guides on how to use it here.](./learn-asset-conversion-assethub.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#create-and-manage-assets", "page_title": "Asset Hub Overview", "index": 2, "depth": 2, "title": "Create and Manage Assets", "anchor": "create-and-manage-assets", "start_char": 3428, "end_char": 5832, "estimated_token_count": 552, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Create and Manage Assets\n\n!!!info \"Walk-through video tutorial about creating assets\"\n    See [this technical explainer video](https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=63) to learn how to create fungible assets on the Asset Hub.\n\nAnyone on the network can create assets on the Asset Hub as long as they can reserve the\n[required deposits](../general/chain-state-values.md). The network reserves the\ndeposit on creation. The creator also must specify a unique `AssetId`, an integer of type `u32`, to\nidentify the asset. The `AssetId` should be the canonical identifier for an asset, as the chain does\nnot enforce the uniqueness of metadata like \"name\" and \"symbol\". The creator must also specify a\nminimum balance, preventing accounts from having dust balances.\n\n!!!info \"Advanced How-to Guides\"\n    See [this page](./learn-guides-assets-create.md) to learn more about creating assets using the Asset Hub.\n\nAsset classes and instances can have associated metadata. The metadata is an array of data that the\nclass owner can add on-chain, for example, a link to an IPFS hash or other off-chain hosting\nservice. The [Uniques pallet](./learn-nft-pallets.md#uniques-pallet) also supports setting key/value\npairs as attributes to a class or instance.\n\nAn asset class has several privileged roles. The asset creator automatically takes on all privileged\nroles but can reassign them after creation. These roles are:\n\n- The **owner** can set the accounts responsible for the other three roles and set asset metadata\n  (e.g. name, symbol, decimals).\n- The **issuer** can mint and burn tokens to/from their chosen addresses.\n- The **admin** can make force transfers as well as unfreeze accounts of the asset class.\n- The **freezer** can freeze assets on target addresses or the entire asset class.\n\nAlways refer to the [**reference documentation**](https://crates.parity.io/pallet_assets/index.html)\nfor certainty on privileged roles.\n\nAn asset's details contain one field not accessible to its owner or admin team,\n[asset sufficiency](#sufficient-assets).\n\n!!!info \"Transaction Fees on Polkadot Developer Interface\"\n    Polkadot Developer Interface [doesn't support the functionality to pay with a sufficient asset yet](https://github.com/polkadot-js/apps/issues/7812). When using Polkadot Developer Interface, transaction fee needs to be paid using the native asset (DOT or KSM)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#fungible-assets", "page_title": "Asset Hub Overview", "index": 3, "depth": 2, "title": "Fungible Assets", "anchor": "fungible-assets", "start_char": 5832, "end_char": 6313, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fungible Assets\n\nFungible assets are interchangeable, i.e. one unit is equivalent to any other unit to claim the\nunderlying item. The Asset Hub represents fungible assets in the Assets pallet. This pallet presents\na similar interface for those familiar with the ERC20 standard. However, the logic is encoded\ndirectly in the chain's runtime. As such, operations are not gas-metered but benchmarked upon every\nrelease, leading to efficient execution and stable transaction fees."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#transferring-asset-balances", "page_title": "Asset Hub Overview", "index": 4, "depth": 3, "title": "Transferring Asset Balances", "anchor": "transferring-asset-balances", "start_char": 6313, "end_char": 7451, "estimated_token_count": 245, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transferring Asset Balances\n\n!!!info \"Walk-through video tutorial about transferring assets\"\n    See [this technical explainer video](https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=326) to learn how to transfer assets on the Asset Hub.\n\nFor Ledger users see [this video tutorial](https://youtu.be/j0O-KziV9iw) to learn how to use the\nStatemine Ledger app and what its current limitations are.\n\nUsers have a simple interface, namely the ability to transfer asset balances to other accounts\non-chain. As mentioned before, if the asset is not _sufficient_, then the destination account must\nalready exist for the transfer to succeed.\n\nThe chain also contains a `transfer_keep_alive` function, similar to that of the Balances pallet,\nthat will fail if execution kills the sending account.\n\nThe Asset Hub also sweeps dust balances into transfers. For example, if an asset has a minimum\nbalance of 10 and an account has a balance of 25, then an attempt to transfer 20 units would\ntransfer all 25.\n\n!!!info\n    See [this article](how-to/transfer-usdt.md) to learn more about transferring assets using the Asset Hub."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#destroying-an-asset", "page_title": "Asset Hub Overview", "index": 5, "depth": 3, "title": "Destroying an Asset", "anchor": "destroying-an-asset", "start_char": 7451, "end_char": 8648, "estimated_token_count": 248, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Destroying an Asset\n\n!!!info \"Walk-through video tutorial about destroying assets\"\n    See [this technical explainer video](https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=422) to learn how to destroy assets on the Asset Hub.\n\nTo destroy an asset, go to the Polkadot Developer Interface on the Asset Hub > Developer > Extrinsics. If you\ncreated an asset without minting any unit, you could call `assets.startDestroy` and then the\n`assets.finishDestroy` extrinsics specifying the asset id you want to destroy. If you created an\nasset and minted some units, follow the steps below:\n\n- `assets.freezeAsset` will freeze all assets on all accounts holding that asset id. Those accounts\n  will no longer be able to transfer that asset.\n- `assets.startDestroy` will start the destroying process.\n- `assets.destroyApprovals` will destroy all approvals related to that asset id (if there are any\n  approvals).\n- `assets.destroyAccounts` will destroy all accounts related to that asset id. All asset units will\n  be removed from those accounts.\n- `assets.finishDestroy` will finish the destroying process. The asset id will be removed and\n  available for another fungible token."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#application-development", "page_title": "Asset Hub Overview", "index": 6, "depth": 3, "title": "Application Development", "anchor": "application-development", "start_char": 8648, "end_char": 8938, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Application Development\n\nThe Asset Hub provides an `approve_transfer`, `transfer_approved`, and `cancel_approval` interface.\nApplication developers can use this interface so that users can authorize the application to\neffectuate transfers up to a given amount on behalf of an account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#cross-chain-accounting", "page_title": "Asset Hub Overview", "index": 7, "depth": 3, "title": "Cross-Chain Accounting", "anchor": "cross-chain-accounting", "start_char": 8938, "end_char": 9996, "estimated_token_count": 219, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cross-Chain Accounting\n\nThe Asset Hub uses a reserve-backed system to manage asset transfers to other parachains. It tracks\nhow much of each asset has gone to each parachain and will not accept more from a particular\nparachain.\n\nAs a result of this, asset owners can use the Asset Hub to track information like the total issuance\nof their asset in the entire network, as parachain balances would be included in the reserve-backed\ntable. Likewise, for the minting and burning of tokens, an asset's team can perform all operations\non the Asset Hub and propagate any minted tokens to other parachains in the network.\n\nParachains that want to send assets to other parachains should do so via instructions to the Asset\nHub so that the reserve-backed table stays up to date. This is particularly important for DOT transfers, where Asset Hub serves as the canonical reserve location. For more info, see the \"Moving Assets between\nChains in XCM\" section of the\n[article on the XCM format](https://polkadot.network/blog/xcm-the-cross-consensus-message-format/)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#non-fungible-assets", "page_title": "Asset Hub Overview", "index": 8, "depth": 2, "title": "Non-Fungible Assets", "anchor": "non-fungible-assets", "start_char": 9996, "end_char": 10485, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Non-Fungible Assets\n\nUnlike fungible assets, the particular instance of a [non-fungible asset (NFT)](./learn-nft.md) has\na separate meaning from another instance of the same class. The Asset Hub represents NFTs in the\n[Uniques and NFTs pallets](./learn-nft-pallets.md).\n\nSimilar to the Assets pallet, this functionality is encoded into the chain. Operations are\nbenchmarked before each release instead of any runtime metering, ensuring efficient execution and\nstable transaction fees."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#transferring-nfts", "page_title": "Asset Hub Overview", "index": 9, "depth": 3, "title": "Transferring NFTs", "anchor": "transferring-nfts", "start_char": 10485, "end_char": 10778, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Transferring NFTs\n\nUsers can transfer their NFTs to other accounts. The chain also provides an `approve_transfer`,\n`transfer_approved` and `cancel_approval` interfaces that application developers can use to allow\nusers to authorize an application to transfer an instance on their behalf."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#advanced-techniques", "page_title": "Asset Hub Overview", "index": 10, "depth": 2, "title": "Advanced Techniques", "anchor": "advanced-techniques", "start_char": 10778, "end_char": 11531, "estimated_token_count": 192, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Advanced Techniques\n\nMany asset creators on other networks use smart contracts to control privileged functions like\nminting and burning. Although the Asset Hub does not have a smart contract interface, it contains\nthe [Multisig](https://crates.parity.io/pallet_multisig/index.html),\n[Proxy](https://crates.parity.io/pallet_proxy/index.html), and\n[Utility](https://crates.parity.io/pallet_utility/index.html) pallets, which will meet most account\nmanagement needs.\n\nFor example, if a team wants sign-off from two groups to perform a privileged operation, it could\ncreate a 2-of-2 [**multisig**](./learn-account-multisig.md) from two\n[**pure proxies**](./learn-proxies-pure.md), and then set members from\neach group as proxies to those two accounts."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-assets", "url": "https://developer.polkadot.com/wiki/learn/learn-assets/#how-to-guides", "page_title": "Asset Hub Overview", "index": 11, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 11531, "end_char": 11861, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ef2b67006a3438c99a8aa0b13381ce6d9942c705e384b732225434c361539948", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [Asset Hub Migration — What You Must Know](how-to/asset-hub-migration.md)\n- [What is Asset Hub and How Do I Use It?](how-to/what-is-asset-hub.md)\n- [How to Transfer Tether (USDT) on Polkadot](how-to/transfer-usdt.md)\n- [How to Withdraw USDT from Exchanges on Asset Hub](how-to/withdraw-usdt-from-exchanges.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#synchronous-backing", "page_title": "Asynchronous Backing (Pipelining)", "index": 0, "depth": 2, "title": "Synchronous Backing", "anchor": "synchronous-backing", "start_char": 3066, "end_char": 5902, "estimated_token_count": 609, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Synchronous Backing\n\nBefore diving into asynchronous backing, it is important to understand what synchronous backing is\nand its main limitations. In synchronous backing, parablock generation is tightly coupled to the\nrelay chain's progression:\n\n1. A new parablock can be produced after including the previous one (i.e., every 12 seconds).\n2. Context to build the next parablock is drawn from the latest included parablock ancestor\n3. The relay parent must be the latest relay chain block.\n\nBecause of (1) parablocks can be generated every other relay chain block (i.e., every 12 seconds).\nBecause of (2) generation of parablock `P` can only start when `P - 1` is included (there is no\npipelining). Because of (3) execution time can take maximum 0.5 seconds as parablock `P` is rushing\nto be backed in the next 5.5 seconds (2 seconds needed for backing and the rest for gossiping).\nEvery parablock is backed in 6 seconds (one relay chain block) and included in the next 6 seconds\n(next relay chain block). The time from generation to inclusion is 12 seconds. This limits the\namount of data a collator can add to each parablock.\n\nParablock generation will choose the most recently received relay block as a relay parent, although\nwith an imperfect network that may differ from the true most recent relay block. So, in general, if\nrelay block `R` is the relay parent of parablock `P`, then `P` could be backed in `R + 1` and\nincluded in `R + 2`.\n\n![sync-backing](../assets/sync-backing.png)\n\nFrom left to right, parablock P1 is anchored to the relay parent R0 (showed with an `x`), backed\ninto the relay chain block R1, and included in R2. After including P1, collators can start\ngenerating P2 that must be anchored to the relay parent R2. Note that R2 will be the relay parent of\nP2 if R2 is included on the relay chain and gossiped to the collator producing P2.\n\n!!!info \"Every collator also runs an attached relay chain full node\"\n    The attached relay node receives relay blocks via gossip. Then, the relay node talks to the parachain node through the `CollationGeneration` subsystem. R2 is gossiped to the relay full node attached to the collator producing P2. Then, `CollationGeneration` passes information about R2 to the collator node. Finally, relay parent information from R2 informs the generation of candidate P2.\n\nBecause P2 is rushing to be backed in 6 seconds into R3, validators have only 0.5 seconds for\nexecution. Backing groups will take approximately 2 seconds to back it and some extra time for\ngossiping it (the whole process from collation to backing lasts 6 seconds). P2 is included in R4,\nwhich could be used as a relay parent for P3 (not shown). After 24 seconds P1 and P2 are included in\nthe relay chain. Note how collators can start new parablocks every 12 seconds but only have 0.5\nseconds for execution."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#asynchronous-backing", "page_title": "Asynchronous Backing (Pipelining)", "index": 1, "depth": 2, "title": "Asynchronous Backing", "anchor": "asynchronous-backing", "start_char": 5902, "end_char": 6393, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Asynchronous Backing\n\n!!!warning \"Disclaimer: Performance Measurements\"\n    Due to asynchronous backing not being fully implemented in a running production network, each performance metric is not thoroughly tested nor guaranteed until proper benchmarking has occurred.\n\n![sync-vs-async-backing](../assets/sync-vs-async-backing.png)\n\nIn asynchronous backing, parablocks (P) are included every 6 seconds, and backing (B) and inclusion\n(I) can happen within the same relay chain block (R)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#synchronous-vs-asynchronous-backing", "page_title": "Asynchronous Backing (Pipelining)", "index": 2, "depth": 3, "title": "Synchronous vs. Asynchronous Backing", "anchor": "synchronous-vs-asynchronous-backing", "start_char": 6393, "end_char": 10811, "estimated_token_count": 775, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Synchronous vs. Asynchronous Backing\n\nBelow is a table showing the main differences between synchronous and asynchronous backing.\n\n|                                            |                           Sync Backing                            |                                                                                  Async Backing                                                                                  |                   Async Backing Advantage                    |\n| :----------------------------------------- | :---------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------: |\n| **Parablocks included every**              |                            12 seconds                             |                                                                                    6 seconds                                                                                    |            2x more throughput or 2x less latency             |\n| **Parablock's maximum execution time**     |                            0.5 seconds                            |                                                                                    2 seconds                                                                                    |                 4x more data in a parablock                  |\n| **Relay parent**                           |                  Is the latest relay chain block                  |                                                                 Is not necessarily the latest relay chain block                                                                 | Collators can submit parablocks to backing groups in advance |\n| **Collators can build on**                 | The most recent ancestor included in the latest relay chain block | An ancestor included in a relay chain block (not necessarily the latest), with augmented information from the latest ancestor in the [unincluded segment](#unincluded-segments) |      Collators can start building parablocks in advance      |\n| **Number of unincluded parablocks**        |                             Only one                              |                                                           One, or more than one (depends on configuration parameters)                                                           |               More efficiency and scalability                |\n| **Unincluded parablocks**                  |                       Cannot be re-proposed                       |                                                      Can be re-proposed if not successfully included in the first attempt                                                       |            Decrease wastage of unused blockspace             |\n| **Parablock's Backing-to-inclusion time**  |                            12 seconds                             |                                                                                   12 seconds                                                                                    |                          No change                           |\n| **Parablock's Inclusion-to-finality time** |                            30 seconds                             |                                                                                   30 seconds                                                                                    |                          No change                           |\n\nIn synchronous backing, collators generate parablocks using context entirely pulled from the relay\nchain. While in asynchronous backing, collators use additional context from the\n[unincluded segment](#unincluded-segments). Parablocks are included every 6 seconds because backing\nof parablock `N + 1` and inclusion of parablock `N` can happen on the same relay chain bock\n(pipelining). However, as for synchronous backing, a parablock takes 12 seconds to get backed and\nincluded, and from inclusion to finality there is an additional 30-second time window.\n\nBecause the throughput is increased by 2x and parachains have 4x more execution time, asynchronous\nbacking is expected to deliver 8x more blockspace to parachains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#sync-backing-as-a-special-case-of-async-backing", "page_title": "Asynchronous Backing (Pipelining)", "index": 3, "depth": 3, "title": "Sync Backing as a special case of Async Backing", "anchor": "sync-backing-as-a-special-case-of-async-backing", "start_char": 10811, "end_char": 11849, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sync Backing as a special case of Async Backing\n\nTwo parameters of asynchronous backing can be controlled by\n[Governance](./learn-polkadot-opengov.md):\n\n- [`max_candidate_depth`](https://github.com/paritytech/polkadot-sdk/blob/f204e3264f945c33b4cea18a49f7232c180b07c5/polkadot/primitives/src/vstaging/mod.rs#L49):\n  the number of parachain blocks a collator can produce that are not yet included in the relay\n  chain.\n\n- [`allowed_ancestry_len`](https://github.com/paritytech/polkadot-sdk/blob/f204e3264f945c33b4cea18a49f7232c180b07c5/polkadot/primitives/src/vstaging/mod.rs#L54):\n  the oldest relay chain parent a parachain block can be built on top of.\n\nValues of zero for both correspond to synchronous backing: `max_candidate_depth = 0` means there can\nbe only one unincluded parablock at all times, and `allowed_ancestry_len = 0` means a parablock can\nbe built only on the latest relay parent for that parachain. Initial values will be set to 3 (4\nunincluded parablocks at all times) and 2 (relay parent can be the third last)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#async-backing-diagram", "page_title": "Asynchronous Backing (Pipelining)", "index": 4, "depth": 3, "title": "Async Backing Diagram", "anchor": "async-backing-diagram", "start_char": 11849, "end_char": 14991, "estimated_token_count": 672, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Async Backing Diagram\n\n![async-backing](../assets/async-backing.png)\n\nThe diagram assumes:\n\n- `max_candidate_depth = 2`, meaning that there can be a maximum of three unincluded parablocks at\n  all times\n- `allowed_ancestry_len = 1`, meaning parablocks can be anchored to the last or second-last relay\n  parent (i.e., collators can start preparing parablocks 6 seconds in advance)\n\nFrom left to right, parablock P1 is backed into the relay chain block R1 and included in R2. While\nP1 undergoes backing, collators can already generate P2, which will have R0 as a relay parent\n(showed with an `x`). Note how R0 can also be relay parent for P1 as long as in the unincluded\nsegment there is a maximum of three unincluded parablocks. Parablock P2 can be backed in R2 (the\nsame relay block where P1 is included) and included in R3. Collators can now use up to two seconds\nfor execution. And so on, P3 can be generated while backing groups check P2, and P4 can be built\nwhile P3 undergoing backing. In 24 seconds, P1 to P3 are included in the relay chain.\n\nNote how there are always three unincluded parablocks at all times, i.e. compared to synchronous\nbacking there can be multiple unincluded parablocks (i.e. pipelining). For example, when P1 is\nundergoing inclusion, P2 and P3 are undergoing backing. Collators were able to generate multiple\nunincluded parablocks because on their end they have the [unincluded segment](#unincluded-segments),\na local storage of not-included parablock ancestors that they can use to fetch information to build\nnew parablocks. On the relay chain side, [perspective parachains](#prospective-parachains) repeats\nthe work each unincluded segment does in tracking candidates (as validators cannot trust the record\nkept on parachains).\n\nThe 6-second relay chain block delay includes a backing execution timeout (2 seconds) and some time\nfor network latency (the time it takes to gossip messages across the entire network). The limit\ncollators have to generate parablocks is how long it takes to back it (i.e., 2 seconds). Collation\ngeneration conservatively always gives itself the same time limits. If there is extra time for\ncollation generation and backing (i.e., more than 2s + 6s), then all that extra time is allocated to\nbacking (see figure). This could result in backable blocks waiting their turn at the end of the\nbacking step for a few extra seconds until a core frees up to back that block as of the next relay\nblock or some later relay block. Note a core is occupied after backing and before inclusion.\n\nThe 2-second execution time is thus a limiter, not a system limitation. If parablock generation\ntakes >2 seconds, the unincluded segment will shrink (less unincluded parablocks), while if it takes\n< 2 seconds, the segment will grow (more unincluded parablocks that will need to be backed and\nincluded). Such flexibility from the parachain side will be possible when, on the relay chain side,\nthere will be elastic scaling (i.e.,\n[agile core usage](../general/polkadot-direction.md#agile-core-usage) and\n[coretime allocation](../general/polkadot-v2.md#polkadot-20-core-usage-and-functionalities))."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#terminology", "page_title": "Asynchronous Backing (Pipelining)", "index": 5, "depth": 2, "title": "Terminology", "anchor": "terminology", "start_char": 14991, "end_char": 15007, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Terminology"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#candidate-receipt", "page_title": "Asynchronous Backing (Pipelining)", "index": 6, "depth": 3, "title": "Candidate Receipt", "anchor": "candidate-receipt", "start_char": 15007, "end_char": 15474, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Candidate Receipt\n\nSaying that a parablock has been included in a relay chain parent does not mean the entire parablock\nis in the relay chain block. Instead, **candidate receipt** consisting of the hash of the parablock,\nstate roots, and ID info is placed on the parent block on the relay chain. The relay chain does not\naccess the entire state of a parachain but only the values that changed during that block and the\nmerkelized hashes of the unchanged values."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#unincluded-segments", "page_title": "Asynchronous Backing (Pipelining)", "index": 7, "depth": 3, "title": "Unincluded Segments", "anchor": "unincluded-segments", "start_char": 15474, "end_char": 16545, "estimated_token_count": 186, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Unincluded Segments\n\nUnincluded segments are chains of candidate parablocks that have yet to be included in the relay\nchain, i.e. they can contain parablocks at any stage pre-inclusion. An unincluded segment may thus\ninclude candidates that are seconded, backable, or backed. Every parablock candidate recorded in the\nunincluded segment is immediately advertised to validators to begin the backing process.\n\nThe backing process occurs on the relay chain, whereas unincluded segments live in the runtimes of\nparachain collators. The core functionality that asynchronous backing brings is the ability to build\non these unincluded segments of block ancestors rather than building only on ancestors included in\nthe relay chain state.\n\nThe purpose of each unincluded segment is twofold:\n\n- Make each parachain aware of when and at what depth it can build blocks that won't be rejected by\n  the relay chain\n- Provide critical context necessary to build parablocks with parent blocks that have yet to be\n  included. The unincluded segment is all about building parablocks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#prospective-parachains", "page_title": "Asynchronous Backing (Pipelining)", "index": 8, "depth": 3, "title": "Prospective Parachains", "anchor": "prospective-parachains", "start_char": 16545, "end_char": 18946, "estimated_token_count": 443, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Prospective Parachains\n\nThe purpose of\n[prospective parachains](https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html)\nis twofold:\n\n- Keep track of parablocks that have been submitted to backers but have yet to be included. This\n  includes tracking the full unincluded ancestry of each parablock, without which it wouldn't be\n  possible to verify their legitimacy.\n\n- Look up and provide candidates which are children of the most recently included parablock for each\n  parachain. These are taken as inputs to the availability process. Prospective parachains is all\n  about tracking, storing, and providing candidates to the availability/inclusion step.\n\nProspective parachains essentially repeats the work each [unincluded segment](#unincluded-segments)\ndoes in tracking candidates. Validators cannot simply trust the availability or validity of records\nkept on parachains. Prospective parachains is the relay chain's record of all parablock candidates\nundergoing the backing and inclusion process. It is the authoritative gatekeeper for parablock\nvalidity. Whereas the unincluded segment is a local record that allows parachains to produce blocks\nthat comply with the rules prospective parachains later enforces.\n\nThe unincluded segment lives in the parachain runtime, so it doesn't know or care about forks/other\nparachains. Prospective parachains lives in the relay chain client. So it has to simultaneously keep\ntrack of candidates from all forks of all parachains. It is as if you folded the unincluded segments\nfrom every fork of every parachain into one giant data structure. When you fold unincluded segments\nrepresenting different chain forks together, they create a tree structure. Hence the term\n[**fragment tree**](https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html#fragment-trees).\n\nA single unincluded segment tells a collator whether it can build on top of one fork of one\nparachain. Prospective parachains tells a validator whether it should accept blocks built on top of\nany fork from any parachain.\n\nA parablock stops being a prospective parablock when it is included on chain. At that point\nprospective parachains does not have to care about it anymore. Alternatively, a parablock's relay\nparent can get too old before that parablock is included, in which case prospective parachains can\nthrow away the candidate."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-async-backing", "url": "https://developer.polkadot.com/wiki/learn/learn-async-backing/#learn-more", "page_title": "Asynchronous Backing (Pipelining)", "index": 9, "depth": 2, "title": "Learn More", "anchor": "learn-more", "start_char": 18946, "end_char": 19764, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:513e6500bdf3b40f471932a30d0aae9a0a5b01fe865ec64422c842f4902bcaa5", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Learn More\n\nThe information provided here is subject to change; keep up to date using the following resources:\n\n- [Polkadot Roadmap Roundup](https://polkadot.network/blog/polkadot-roadmap-roundup) - Article by\n  Rob Habermeier, Polkadot founder, details the plans for Polkadot for 2023.\n- [Asynchronous Backing Spec & Tracking Issue](https://github.com/paritytech/polkadot/issues/3779) -\n  The implementation tracking issue for asynchronous backing\n- [Prospective Parachains Subsystem - The Polkadot Parachain Host Implementers' Guide](https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html)\n- Polkadot Blog Post -\n  [Asynchronous Backing: Elevating Polkadot's Performance and Scale](https://www.polkadot.network/blog/elevating-polkadots-performance-and-scale-with-asynchronous-backing)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#trustless-bridges", "page_title": "Blockchain Bridges", "index": 0, "depth": 2, "title": "Trustless Bridges", "anchor": "trustless-bridges", "start_char": 1713, "end_char": 2516, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Trustless Bridges\n\nA two-way trustless bridge between chains A and B can be viewed as two one-way bridges (A → B and B\n→ A). Hence, the design of a two-way bridge can be explained in terms of a one-way bridge with a\nsource and a target chain. Any trustless bridge will have **on-chain and off-chain components**.\n\nTrustlessness means that users do not need to trust particular individuals or organizations; they\nonly need to trust mathematics, code, cryptography, and protocol. An example of a system which\nimplies a high level of trust would be that of a bridge which is controlled via a multi-signature\nscheme, wherein you must trust the cosignatories.\n\nBasic assumptions are always needed in principle when defining a trustless system as a completely\ntrustless setup cannot always be guaranteed."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#on-chain-bridge-components", "page_title": "Blockchain Bridges", "index": 1, "depth": 2, "title": "On-chain Bridge Components", "anchor": "on-chain-bridge-components", "start_char": 2516, "end_char": 4026, "estimated_token_count": 327, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## On-chain Bridge Components\n\nBuilding a trustless bridge can be done through the implementation of the following on-chain\ncomponents (ordered by suggested methodology):\n\n- _Bridge pallets_ - For Substrate-native chains, use a bridge pallet (e.g.\n  [Kusama `<->` Polkadot bridge](./learn-DOT-KSM-bridge.md), since both networks' parachains use\n  Substrate).\n- _Smart contracts_ - If the chain is not on Substrate, you should have smart contracts on the\n  non-Substrate chain to bridge (e.g. [Snowbridge](./learn-snowbridge.md), Ethereum mainnet has a\n  bridge smart contract that initiates Eth transactions based on incoming XCMP messages).\n- _Higher-order protocols_ - If your chain does not support smart contracts (e.g. Bitcoin), you\n  should use [XClaim](https://eprint.iacr.org/2018/643.pdf) or similar protocols to bridge.\n\nOn-chain bridge components are modules (usually pallets or smart contracts) deployed on the chain's\nruntime. Modules that track the finality of the source chain are required to be deployed on the\ntarget chain, while the modules that deal with cross-chain messaging need to be deployed on both\nsource and target chains.\n\nThere are also on-chain components responsible for queuing messages at the source chain and\nreceiving the message proofs at the target chain. The messages are sent through a particular lane,\nwhere they are guaranteed to be received in the same order they are sent. On Bridge Hub, the\nmessages are in XCM format, and an XCM executor is used to dispatch them."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#via-bridge-pallets", "page_title": "Blockchain Bridges", "index": 2, "depth": 3, "title": "via Bridge Pallets", "anchor": "via-bridge-pallets", "start_char": 4026, "end_char": 5115, "estimated_token_count": 224, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### via Bridge Pallets\n\nOperating a bridge between chains that finalize through GRANDPA consensus is straightforward. A\nGRANDPA light client of the source chain built into the target chain's runtime provides a \"source of\ntruth\" about the source chain's finality. For instance,\n[Bridge Hub](./learn-system-chains.md#bridge-hub) runs an on-chain light client of Kusama which uses\nGRANDPA consensus and infers the finality of all the transactions on Kusama and its parachains.\n\nReceiving messages on Polkadot from an external, non-parachain blockchain is possible through a\nSubstrate pallet. The Substrate instance can then be deployed to Polkadot either as a system-level\nparachain (native extension to the core Polkadot software) or as a community-operated parachain.\n\nAn example of a bridge that would strictly use bridge pallets would be\n[the Kusama `<->` Polkadot bridge](./learn-DOT-KSM-bridge.md), since both use parachains based on\nSubstrate.\n\nFor the standalone chains that will not have a parachain bridging module (non-Substrate), it will be\nnecessary to deploy bridge contracts."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#via-smart-contracts", "page_title": "Blockchain Bridges", "index": 3, "depth": 3, "title": "via Smart Contracts", "anchor": "via-smart-contracts", "start_char": 5115, "end_char": 6099, "estimated_token_count": 203, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### via Smart Contracts\n\nGiven the generality of blockchain platforms with Turing-complete smart contract languages, it is\npossible to bridge Polkadot and any other smart-contract-capable blockchain. For instance,\n[Snowbridge](./learn-snowbridge.md) uses the Polkadot Bridge Hub to run an on-chain light client of\nEthereum to infer the finality of transactions on the Ethereum chain. Running a GRANDPA light client\nthrough smart contracts on Ethereum is possible but expensive. Hence,\n[BEEFY consensus layer](./learn-consensus.md#bridging-beefy) sitting on top of GRANDPA enables a\ncost-effective solution for operating a trustless bridge with Ethereum and other protocols.\nTrustless bridges to chains like Cosmos, Avalanche, NEAR, etc., would require custom pallets to be\ndeployed on Bridge Hub.\n\n!!!note\n    To learn more on how Bitcoin and Ethereum can cooperate and collaborate through Polkadot, check out this explainer video [here](https://www.youtube.com/watch?v=rvoFUiOR3cM)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#via-higher-order-protocols", "page_title": "Blockchain Bridges", "index": 4, "depth": 3, "title": "via Higher-Order Protocols", "anchor": "via-higher-order-protocols", "start_char": 6099, "end_char": 7465, "estimated_token_count": 315, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### via Higher-Order Protocols\n\nHigher-order protocols (like [XCLAIM](https://eprint.iacr.org/2018/643.pdf)) can be used to bridge\nbut should only be used when other options are not available. XCLAIM, in particular, requires any\nswappable asset to be backed by a collateral of higher value than the swappable assets, which adds\nadditional overhead.\n\nAn example of a network that would be well-suited for higher-order protocols would be Bitcoin, since\nit does not support smart contracts, and it's not based on Substrate.\n\n#### Bitcoin Bridge (XCLAIM \\<-\\> Substrate \\<-\\> Polkadot)\n\nThe Interlay team has written a [specification](https://spec.interlay.io/) on a Bitcoin bridge that\nis based on the [XCLAIM](https://eprint.iacr.org/2018/643.pdf) design paper. The protocol enables a\ntwo-way bridge between Polkadot and Bitcoin. It allows holders of BTC to issue iBTC in Polkadot and\nholders of iBTC to redeem BTC on the Bitcoin chain.\n\nThe Bitcoin bridge, as documented in the specification, is composed of two logically different\ncomponents:\n\n- The XCLAIM component maintains all accounts that own iBTC.\n- The BTC-Relay verifies the Bitcoin state when a new transaction is submitted.\n\nFor full details on how it works, please refer to the specification.\n\nThere is now a\n[working implementation and mainnet bridge available](https://app.interlay.io/btc?tab=issue)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#offchain-bridge-components", "page_title": "Blockchain Bridges", "index": 5, "depth": 2, "title": "Offchain Bridge Components", "anchor": "offchain-bridge-components", "start_char": 7465, "end_char": 8390, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Offchain Bridge Components\n\nOffchain bridge components are separate processes called relayers. Relayers are connected both to\nthe source chain and target chain nodes. For instance, the task of relayer between chains that run\non GRANDPA consensus is to submit source chain GRANDPA justifications and their corresponding\nheaders to the Bridge GRANDPA Finality Pallet deployed at the target chain. For that, the relayer\nsubscribes to the source chain GRANDPA justifications stream and submits every new justification to\nthe target chain GRANDPA light client.\n\nMessages between chains are relayed through the relayers, which involve messages delivery relay and\ndelivery confirmation relay. For more information on relayers and the Bridge Hub design, read\nthrough the\n[High-level bridge documentation on the Polkadot-SDK repository](https://github.com/paritytech/polkadot-sdk/blob/master/bridges/docs/high-level-overview.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#bridge-comparison", "page_title": "Blockchain Bridges", "index": 6, "depth": 2, "title": "Bridge Comparison", "anchor": "bridge-comparison", "start_char": 8390, "end_char": 15484, "estimated_token_count": 1131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Bridge Comparison\n\n[Snowbridge](./learn-snowbridge.md) and [Hyperbridge](./learn-hyperbridge.md) are two trustless\nbridges that connect Polkadot with other ecosystems. Here below is a main technical comparison\nbetween the two.\n\n!!!danger \"Tokens sent through different bridges are different\"\n    Unless specific logic is implemented, WETH sent through Snowbridge cannot be sent back using Hyperbridge, and _vice versa_. **Sending tokens using different bridges might lead to loss of funds.**\n\n|                                                                                                                       Snowbridge                                                                                                                       |                                                                                                          Hyperbridge                                                                                                          |\n| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |\n|                                                                                                               Ethereum only<sup>1</sup>.                                                                                                               |                                                                                                          Multichain.                                                                                                          |\n|                                               Ethereum light client on [Bridge Hub System Chain](./learn-system-chains.md#bridge-hub)<sup>2</sup> and Polkadot light client on Ethereum smart contract.                                                |                                                                                                        Own parachain.                                                                                                         |\n|                                                                                                              [DOT token](./learn-DOT.md).                                                                                                              |                                                                                                   Hyperbridge native token.                                                                                                   |\n|                                                                                    [Random-sampling BEEFY](./learn-snowbridge.md#random-sampling-beefy) for prover.                                                                                    |                                                                                                    Zero-knowledge Proofs.                                                                                                     |\n|                                                                                                 Simple codebase but complex analysis by the verifier.                                                                                                  |                                                                                    Complex codebase, but simple analysis by the verifier.                                                                                     |\n|                                                                                                     Low-spec hardware for prover, permissionless.                                                                                                      |                                                              High-spec hardware for prover, permissionless but somewhat permissioned due to the ZK-based nature.                                                              |\n|                                                                                                  Possible high-level decentralization for the prover.                                                                                                  | Prover decentralization possible but probably by removing dependency on ZK circuits through BLS ([Boneh–Lynn–Shacham](https://en.wikipedia.org/wiki/BLS_digital_signature)) version of BEEFY and BLS precompiles on Ethereum. |\n| Ethereum > Polkadot: In the range of [tens of minutes](https://app.turtle.cool/). Polkadot > Ethereum: High latency (half an hour) as two epochs are needed on Ethereum to achieve unpredictable randomness to update the Polkadot's state. |                          Ethereum > Polkadot: In the range of 10-20 minutes (to Polkadot, both bridges have the same latency). Polkadot > Ethereum: Low latency, 5-7 minutes on reference hardware.                           |\n|                                      Dependency on external library for BLS signature verification ([Milagro BLS](https://github.com/sigp/milagro_bls), used by Lighthouse, the Rust Ethereum consensus client).                                       |                                                Dependency on external libraries due to ZK-based nature. Such libraries include [PLONK](https://eprint.iacr.org/2019/953.pdf).                                                 |\n|                                                                                                 [XCM](./learn-xcm.md) as a cross-chain message format.                                                                                                 |                                                                   [ISMP](https://docs.hyperbridge.network/protocol/ismp) as a bridge integration protocol.                                                                    |\n|                                                                                                                         Live.                                                                                                                          |                                                                                                             Live.                                                                                                             |\n\n<sup>1</sup> WETH sent through different bridges are different. Unless specific logic is\nimplemented, WETH sent through Snowbridge cannot be sent back using Hyperbridge.<br/><br/>\n\n<sup>2</sup> Because Snowbridge is deployed on a system chain, Snowbridge WETH can be considered as\nthe \"official\" WETH on Polkadot (although this must not be interpreted as a positive sign for\nSnowbridge and negative sign for Hyperbridge).<br/><br/>"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-bridges", "url": "https://developer.polkadot.com/wiki/learn/learn-bridges/#resources", "page_title": "Blockchain Bridges", "index": 7, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 15484, "end_char": 17726, "estimated_token_count": 589, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7c1fd2a71864e24d292657c7d8be92f412d60f270a1ff98db523895b2bee072b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\n- [Snowbridge - a trustless, decentralized bridge between Polkadot and Ethereum](https://docs.snowbridge.network/)\n- [Parity Bridges Common Resources](https://github.com/paritytech/parity-bridges-common)\n- [Substrate/Ethereum Bridge](https://github.com/ChainSafe/ChainBridge) - ChainSafe and Centrifuge\n  were awarded a grant in W3F Grants\n  [Wave 5](https://medium.com/web3foundation/web3-foundation-grants-wave-5-recipients-2205f4fde096)\n  to build a Substrate to Ethereum two-way bridge.\n- [iBTC (Bitcoin \\<-\\> Polkadot Bridge)](https://docs.interlay.io/#//)\n- [EOS Bridge](https://github.com/bifrost-codes/bifrost) - The Bifrost team was awarded a grant in\n  W3F Grants\n  [Wave 5](https://medium.com/web3foundation/web3-foundation-grants-wave-5-recipients-2205f4fde096)\n  to build a bridge to EOS.\n- [Tendermint Bridge](https://github.com/ChorusOne/tendermint-light-client) - ChorusOne was awarded\n  a grant in\n  [Wave 5](https://medium.com/web3foundation/web3-foundation-grants-wave-5-recipients-2205f4fde096)\n  to build a GRANDPA light client in Tendermint.\n- [Interlay BTC Bridge](https://app.interlay.io/btc?tab=issue) - The Interlay team was awarded a\n  grant in W3F grants\n  [Wave 5](https://medium.com/web3foundation/web3-foundation-grants-wave-5-recipients-2205f4fde096)\n  to build a trust-minimized BTC bridge.\n- [ChainX BTC Bridge](https://github.com/chainx-org/ChainX/tree/master/xpallets/gateway/bitcoin) -\n  ChainX has implemented a BTC to Substrate bridge for their parachain.\n- [POA Network](https://poa.network/)\n- [Case study](https://medium.com/giveth/ethereum-dapp-scaling-poa-network-acee8a51e772) of POA\n  Network's implementation of Parity's bridge chain solution.\n- [Edgeth Bridge](https://github.com/hicommonwealth/edgeth_bridge/) - a bridge from Ethereum to\n  Edgeware chain (a Substrate-based chain) is now defunct and not maintained, but it is a good\n  example.\n- [XCLAIM](https://eprint.iacr.org/2018/643.pdf) - XCLAIM is a framework for achieving trustless and\n  efficient cross-chain exchanges using cryptocurrency-backed assets.\n- [Celer cBridge](https://github.com/celer-network/cBridge-contracts) - a bridge to transfer assets\n  from Ethereum & Binance Smart Chain to the Astar Polkadot EVM."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collator", "url": "https://developer.polkadot.com/wiki/learn/learn-collator/#collators-role", "page_title": "Collators in Polkadot", "index": 0, "depth": 2, "title": "Collators' Role", "anchor": "collators-role", "start_char": 207, "end_char": 227, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ac2389a12aabc319f52a4bd7bd83306fd31f3c67967ff4405718b4eeb3e2addc", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Collators' Role"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collator", "url": "https://developer.polkadot.com/wiki/learn/learn-collator/#rollup-maintainers", "page_title": "Collators in Polkadot", "index": 1, "depth": 3, "title": "Rollup Maintainers", "anchor": "rollup-maintainers", "start_char": 227, "end_char": 1244, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ac2389a12aabc319f52a4bd7bd83306fd31f3c67967ff4405718b4eeb3e2addc", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Rollup Maintainers\n\nCollators maintain rollup chains (parachains) by collecting user transactions and producing state transition proofs for Polkadot's validators. In other words, collators aggregate transactions into parachain block candidates and produce state transition\nproofs (Proof-of-Validity, PoV) for validators.\n\nCollators maintain a full node for the relay chain and a full node for their particular parachain, meaning they retain all necessary information to author new parablocks and execute transactions like miners do on PoW blockchains. Under normal circumstances, they\nwill collate and execute transactions to create an unsealed block and provide it with a PoV to one or more validators on a Polkadot core.\n\nCollators are similar to validators on any other blockchain. Still, they do not need to provide security guarantees because the relay chain provides those as a service via [the ELVES protocol](https://eprint.iacr.org/2024/961). If a parachain block is invalid, validators will reject it."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collator", "url": "https://developer.polkadot.com/wiki/learn/learn-collator/#rollup-liveness-and-censorship", "page_title": "Collators in Polkadot", "index": 2, "depth": 3, "title": "Rollup Liveness and Censorship", "anchor": "rollup-liveness-and-censorship", "start_char": 1244, "end_char": 1849, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ac2389a12aabc319f52a4bd7bd83306fd31f3c67967ff4405718b4eeb3e2addc", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Rollup Liveness and Censorship\n\nRollup safety (i.e., the insurance that invalid transactions are not included on the rollup) is achieved through validators on the relay chain implementing the ELVES protocol. But the onus of liveness (i.e., new blocks are eventually produced) and censorship resistance on the rollup is the responsibility of the collators. Hence, a sufficiently [decentralised collator](../general/web3-and-polkadot.md#decentralization) set ensures liveness and mitigates censorship resistance. Theoretically, a single honest collator can ensure liveness but with reduced throughput."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collator", "url": "https://developer.polkadot.com/wiki/learn/learn-collator/#cross-consensus-messaging", "page_title": "Collators in Polkadot", "index": 3, "depth": 3, "title": "Cross-consensus Messaging", "anchor": "cross-consensus-messaging", "start_char": 1849, "end_char": 2143, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ac2389a12aabc319f52a4bd7bd83306fd31f3c67967ff4405718b4eeb3e2addc", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Cross-consensus Messaging\n\nCollators are a key element of the [XCM (Cross-Consensus Message Passing Format)](learn-xcm.md). By\nbeing full nodes of the relay chain, they are all aware of each other as peers. This makes it\npossible for them to send messages from parachain A to parachain B."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collator", "url": "https://developer.polkadot.com/wiki/learn/learn-collator/#collators-in-the-wild", "page_title": "Collators in Polkadot", "index": 4, "depth": 2, "title": "Collators in the Wild", "anchor": "collators-in-the-wild", "start_char": 2143, "end_char": 2830, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ac2389a12aabc319f52a4bd7bd83306fd31f3c67967ff4405718b4eeb3e2addc", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Collators in the Wild\n\nBlockchains built using Substrate cannot hook onto the relay chain independently. The\nParity team built the\n[Cumulus library](https://github.com/paritytech/polkadot-sdk/tree/master/cumulus/) to address this.\nCollators are being used on the [Paseo](../../parachains/customize-runtime/pallet-development/pallet-testing.md) testnet,\nand you can learn more about how they are used with Cumulus via the\n[Cumulus](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/cumulus/index.html)\nRust documentation. More information can be found under the\n[Cumulus section](../../reference/parachains/index.md#cumulus) on the build parachain page."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collator", "url": "https://developer.polkadot.com/wiki/learn/learn-collator/#guides-and-tools", "page_title": "Collators in Polkadot", "index": 5, "depth": 2, "title": "Guides and Tools", "anchor": "guides-and-tools", "start_char": 2830, "end_char": 3044, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:ac2389a12aabc319f52a4bd7bd83306fd31f3c67967ff4405718b4eeb3e2addc", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Guides and Tools\n\n- [Tutorial covering Cumulus and Collators](../../parachains/testing/run-a-parachain-network.md)\n- [Paseo testnet guide](../../parachains/customize-runtime/pallet-development/pallet-testing.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collectives", "url": "https://developer.polkadot.com/wiki/learn/learn-collectives/#setting-up-a-collective", "page_title": "Collectives", "index": 0, "depth": 3, "title": "Setting Up a Collective", "anchor": "setting-up-a-collective", "start_char": 233, "end_char": 1486, "estimated_token_count": 232, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c0b2c3a55d8bddf4ae5dca2b47b4d9c8067fcb01787bddaf16e3cb4e24ca5b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Setting Up a Collective\n\nTo set up a collective, stakeholders define its purpose, governance structure, and operational parameters. These parameters include member promotion/demotion periods, offboarding timeouts, and minimum promotion periods, ensuring flexibility while maintaining operational consistency.\n\nOnce these matters are decided, a new instance of the collective pallet is added to the runtime with the desired parameters in place. A collective may need multiple pallets to implement all of its desired functionalities; for example, [the Polkadot Technical Fellowship](./learn-polkadot-technical-fellowship.md) has the following implementations in the runtime for its specific logic:\n\n- **Ranked Collectives**: A membership pallet which allows members to use their voting power for referenda within the collective.\n   \n- **Core Fellowship**: A pallet containing specific logic regarding salary, member activity, promotion, and demotion specific to the Technical Fellowship.\n   \nFor more information on the pallets used, refer to the [implementation file in the runtime.](https://github.com/polkadot-fellows/runtimes/blob/ba0bfd6caf7d0df80166f1151e9f86b68ec4dbed/system-parachains/collectives/collectives-polkadot/src/fellowship/mod.rs)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collectives", "url": "https://developer.polkadot.com/wiki/learn/learn-collectives/#collective-parameters", "page_title": "Collectives", "index": 1, "depth": 3, "title": "Collective Parameters", "anchor": "collective-parameters", "start_char": 1486, "end_char": 1860, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c0b2c3a55d8bddf4ae5dca2b47b4d9c8067fcb01787bddaf16e3cb4e24ca5b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Collective Parameters\n\nKey parameters for collectives include:\n\n- **Demotion Period**: The time required to demote a member.\n- **Minimum Promotion Period**: The minimum duration before a member can be promoted.\n- **Offboard Timeout**: The time allowed for offboarding a member.\n\nThese parameters, and more, can be tailored to meet the specific needs of the collective."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collectives", "url": "https://developer.polkadot.com/wiki/learn/learn-collectives/#submitting-evidence", "page_title": "Collectives", "index": 2, "depth": 3, "title": "Submitting Evidence", "anchor": "submitting-evidence", "start_char": 1860, "end_char": 2236, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c0b2c3a55d8bddf4ae5dca2b47b4d9c8067fcb01787bddaf16e3cb4e24ca5b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Submitting Evidence\n\nCollectives may require evidence submission from their members to retain their rank. Guidelines for submitting evidence are defined by the collective and ensure transparency and accountability. \n\nFor an example of this mechanism, see the [Evaluations](https://github.com/polkadot-fellows/Evaluations) repository for the Polkadot Technical Fellowship"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-collectives", "url": "https://developer.polkadot.com/wiki/learn/learn-collectives/#funding-and-salaries", "page_title": "Collectives", "index": 3, "depth": 3, "title": "Funding and Salaries", "anchor": "funding-and-salaries", "start_char": 2236, "end_char": 2509, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6c0b2c3a55d8bddf4ae5dca2b47b4d9c8067fcb01787bddaf16e3cb4e24ca5b2", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Funding and Salaries\n\nCollectives can manage [sub-treasuries](./learn-polkadot-opengov-treasury.md#sub-treasuries) to fund their operations and allocate salaries to members. This allows them to operate independently while contributing to the broader Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#high-level-comparison", "page_title": "Polkadot vs. Ethereum", "index": 0, "depth": 2, "title": "High-Level Comparison", "anchor": "high-level-comparison", "start_char": 885, "end_char": 2577, "estimated_token_count": 349, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## High-Level Comparison\n\nBoth protocols have fundamentally different goals:\n\n- Ethereum is a general-purpose blockchain based on the Ethereum Virtual Machine (EVM). Ethereum is\n  not specialized nor optimized for any particular application. Instead, its primary focus is the\n  Ethereum Virtual Machine for executing smart contracts. Ethereum achieves scalability via\n  [**rollups**](./learn-comparisons-rollups.md#rollup-comparison), that are secondary protocols that utilize Ethereum\n  as a settlement layer.\n\n- Polkadot is a multi-chain protocol that provides shared security and secure interoperability for\n  each of its **parachains**. Each parachain (also called an \"appchain\" in this context) is\n  specialized towards a specific focus and optimized towards that goal. Parachains must abide by the\n  [Parachains Protocol](./learn-parachains-protocol.md).\n\nAlthough Polkadot's primary\npurpose is to validate the protocols that operate under it, it also supports smart contract deployments. Additionally, several parachains provide\n[smart contract functionality](../../smart-contracts/overview.md).\nParachains on Polkadot can even run an EVM for executing smart contracts written in Solidity using\n[Frontier, an Ethereum compatibility layer for Substrate](https://github.com/polkadot-evm/frontier).\n\n> As a general summary, one could also say that Polkadot **coordinates** and **validates**\n> sub-protocols that follow the [Parachains Protocol](./learn-parachains-protocol.md) (which are\n> akin to an optimistic-style rollup). In contrast, Ethereum coordinates inputs and outputs for the\n> EVM. On Polkadot, any sub-protocol can have its own logic so long as it compiles to WebAssembly."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#scalability-approaches", "page_title": "Polkadot vs. Ethereum", "index": 1, "depth": 2, "title": "Scalability Approaches", "anchor": "scalability-approaches", "start_char": 2577, "end_char": 3914, "estimated_token_count": 259, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Scalability Approaches\n\nEthereum favors a _rollup-centric_ approach for scaling transaction throughput.\n[**Danksharding**](https://ethereum.org/en/roadmap/danksharding/) is how Ethereum plans to better\naccommodate and facilitate rollup activity by providing better utilities, such as data availability\nvia [Proto-Danksharding](https://ethereum.org/roadmap/danksharding), for rollups to record state to\nEthereum.\n\nDanksharding will allow for much more space to be utilized per block on Ethereum, where blobs of\ndata will be verifiable for an amount of time before being pruned from the network. This approach\nwill enable data availability at layer one and further enable layer two protocols on Ethereum to\nflourish more readily.\n\nIn contrast, the relay chain requires parachains to register themselves in accordance with the\n[Parachains Protocol](./learn-parachains-protocol.md). Once registered, the relay chain validates\nthe state transitions of each parachain as per their parachain validation function (PVF).\n[Data availability](./learn-parachains-protocol.md#availability-and-unavailability-phase) is an\nintegral part of validating the parachain state. This approach enables parallelized interactions\nbetween parachains. They can trust that each sub-protocol's respective state is valid, as Polkadot\ncollectively validated them."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#rollups-vs-parachain-creation", "page_title": "Polkadot vs. Ethereum", "index": 2, "depth": 3, "title": "Rollups vs. Parachain Creation", "anchor": "rollups-vs-parachain-creation", "start_char": 3914, "end_char": 4818, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Rollups vs. Parachain Creation\n\nEthereum primarily focuses on optimizing itself for rollups; Polkadot's parachains protocol allows\nvalidation to occur on the protocol level without needing a layer two solution.\n\n!!!info \"Rollup vs. Parachain Comparison\"\n    For a more in-depth comparison of parachains versus rollups, take a look at the [rollup comparison page](./learn-comparisons-rollups.md#rollup-comparison).\n\nEach parachain hosts its own core logic, called a **runtime** (sometimes called a **state transition\nfunction**). Polkadot uses WebAssembly ([Wasm](https://webassembly.org/)) as a \"meta-protocol\".\n\nParachains have the option of using [cross-consensus messaging (XCM)](./learn-xcm.md) to communicate\nwith one another and facilitate inter-chain reactions. It is also possible to utilize XCM on\nEthereum as it is merely a format for describing state transitions on a particular network."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#architectural-differences-polkadot-and-ethereum", "page_title": "Polkadot vs. Ethereum", "index": 3, "depth": 2, "title": "Architectural Differences: Polkadot and Ethereum", "anchor": "architectural-differences-polkadot-and-ethereum", "start_char": 4818, "end_char": 5700, "estimated_token_count": 173, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Architectural Differences: Polkadot and Ethereum\n\nAs previously mentioned, Ethereum is a **general-purpose** virtual machine that can run sandboxed\nprograms are written in Solidity, whereas Polkadot is a meta-protocol for other parachains to\nconnect and interact with each other.\n\nEthereum operates as a single, homogeneous chain. Each Ethereum node is divided into two layers: the\n**consensus** and **execution** layers. Each layer handles the block validation information, peer\ndiscovery, and Proof-of-Stake of the Ethereum client.\n\nPolkadot's primary component is the **relay chain**, which hosts heterogeneous **parachains**. The\nrelay chain aggregates information from each parachain, where validators agree upon consensus and\nfinality. One can see Polkadot as a series of **runtimes**, which are state transition functions\nused to describe parachains and Polkadot itself."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#forks-upgrades-and-governance", "page_title": "Polkadot vs. Ethereum", "index": 4, "depth": 3, "title": "Forks, Upgrades, and Governance", "anchor": "forks-upgrades-and-governance", "start_char": 5700, "end_char": 6901, "estimated_token_count": 222, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Forks, Upgrades, and Governance\n\nEthereum's governance is done off-chain, where various stakeholders come to a consensus through some\nmedium other than the protocol itself. Upgrades on Ethereum will follow the standard hard fork\nprocedure, coordinating the community and validators to upgrade their nodes to implement protocol\nchanges.\n\nPolkadot uses on-chain [governance, called OpenGov](./learn-polkadot-opengov.md), to facilitate\nruntime upgrades. The stakeholders of Polkadot vote on these upgrades, and if successful, the\nupgrade is enacted automatically in the blocks to come. Polkadot validator operators only upgrade\ntheir nodes when the client itself gets updated.\n\nBecause of this mechanism, the relay chain can enact upgrades using the Wasm meta-protocol _without_\na hard fork. As the WebAssembly runtime for Polkadot (and all of its subsequent parachains) are\nstored on-chain, this involves simply replacing the runtime with a new WebAssembly blob once\ngovernance allowed the upgrade to be enacted.\n\nAnything within the state transition function, the transaction queue, or off-chain workers can be\nupgraded without forking the chain, as these are all part of the WebAssembly runtime."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#block-production-finalization", "page_title": "Polkadot vs. Ethereum", "index": 5, "depth": 3, "title": "Block Production & Finalization", "anchor": "block-production-finalization", "start_char": 6901, "end_char": 9423, "estimated_token_count": 520, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Block Production & Finalization\n\nBoth Ethereum and Polkadot use hybrid consensus models where **block production** and **finality**\nare decoupled.\n\nFor finalization, Ethereum utilizes [Casper FFG](https://ethereum.org/glossary#casper-ffg), which\nworks with [LMD-GHOST](https://ethereum.org/glossary#lmd-ghost) as the fork choice rule for\nfinalization.\n\nPolkadot utilizes [GRANDPA](./learn-consensus.md#finality-gadget-grandpa) for finalization. Rather\nthan decide on a block-by-block basis, GRANDPA can finalize _chains_ of blocks. Both finalization\nmechanisms are both\n[GHOST](https://www.geeksforgeeks.org/what-is-ghost-protocol-for-ethereum/)-based and can both\nfinalize batches of blocks in one round.\n\nFor block production, both protocols use slot-based protocols that randomly assign validators to a\nslot and provide a fork choice rule for unfinalized blocks. Polkadot uses\n[BABE](./learn-consensus.md#block-production-babe) for block production. BABE includes two\nmechanisms for selecting block producers, one of which is a fallback in case the first fails, which\nallows for chain liveness. BABE produces unfinalized blocks on top of the chain already finalized by\nGRANDPA.\n\nThere are two main differences between Ethereum and Polkadot consensus:\n\n1.  Polkadot finality protocol, GRANDPA, finalizes batches of blocks based on\n    [availability and validity checks](./learn-parachains-protocol.md#availability-and-unavailability-phase)\n    that happen as the proposed chain grows. The time to finality varies with the number of checks\n    that need to be performed (and invalidity reports, which cause extra checks). The expected time\n    to finality is 30 seconds.\n\n2.  Ethereum typically has many validators per round (called an\n    [epoch](https://ethereum.org/en/glossary/#epoch) on Ethereum) to provide strong validity\n    guarantees while Polkadot can provide stronger guarantees with fewer validators per round.\n    Polkadot achieves this by making validators distribute an\n    [erasure coding](./learn-parachains-protocol.md#erasure-codes) to all validators in the system,\n    such that anyone - not only the round's validators - can reconstruct a parachain's block and\n    test its validity. This data availability is a core part of Polkadot - ensuring state is valid\n    for its state transitions. The random parachain-validator assignments and secondary checks are\n    performed by randomly selected validators, making it less likely for the small set of validators\n    on each parachain to collude."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#staking-mechanics-ethereum-pos-vs-polkadot-npos", "page_title": "Polkadot vs. Ethereum", "index": 6, "depth": 3, "title": "Staking Mechanics: Ethereum PoS vs. Polkadot NPoS", "anchor": "staking-mechanics-ethereum-pos-vs-polkadot-npos", "start_char": 9423, "end_char": 10157, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Staking Mechanics: Ethereum PoS vs. Polkadot NPoS\n\nPolkadot uses [Nominated Proof of Stake (NPoS)](./learn-phragmen.md) to select validators from a\nsmaller set, letting smaller holders nominate validators to run the network while claiming the\nsystem's rewards without running a node. Polkadot needs about five validators for each parachain in\nthe network. For more information, see the [staking page](./learn-staking.md).\n\nEthereum is a Proof of Stake (PoS) network that requires 32 ETH to stake for each validator\ninstance. Validators run a primary Beacon Chain node and multiple validator clients - one for each\n32 ETH. These validators get assigned to \"committees,\" randomly selected groups to validate blocks\nin the network."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#interoperability-and-message-passing", "page_title": "Polkadot vs. Ethereum", "index": 7, "depth": 3, "title": "Interoperability and Message Passing", "anchor": "interoperability-and-message-passing", "start_char": 10157, "end_char": 11767, "estimated_token_count": 335, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Interoperability and Message Passing\n\nPolkadot uses [Cross-Consensus Messaging (XCM)](./learn-xcm.md) for parachains to send arbitrary\nmessages to each other. Parachains open connections with each other and can send messages via their\nestablished channels. Given that [collators](./learn-collator.md) communicate directly to the relay\nchain, they will be connected and can relay messages from parachain A to parachain B if needed\nthrough these message passing channels (see:\n[HRMP, VMP, and other message passing mechanisms for XCM](./learn-xcm-transport.md)).\n\nMessages do not pass through the relay chain. Only validity proofs and channel operations do (open,\nclose, etc.). This enhances scalability by keeping data on the edges of the system.\n\nCurrently, Ethereum rollups can communicate using\n[shared sequencers](https://medium.com/@richardchen_81235/intro-to-shared-sequencing-1622d1fd51c9),\nwhich provides a common ground of interoperability between layer two solutions.\n\nPolkadot plans to have the concept of\n[**Accords**](../general/polkadot-direction.md#xcm-and-accords) are opt-in treaties for different\nprotocols to partake in. Accords ensure that logic about interoperability is kept consistent and\ncannot be changed and undermined by participating protocols. This helps ensure that any XCM message\ncan be properly interpreted and executed as needed on the target protocol in a fully trustless\nenvironment.\n\n[SPREE (Shared Protected Runtime Execution Enclaves)](./learn-spree.md) is the mechanism that\nprovides shared logic for cross-consensus messages, and will be used to construct Accords."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#dapp-support-and-development", "page_title": "Polkadot vs. Ethereum", "index": 8, "depth": 2, "title": "DApp Support and Development", "anchor": "dapp-support-and-development", "start_char": 11767, "end_char": 12846, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## DApp Support and Development\n\nEthereum supports smart contract development using Solidity. These contracts are immutable, and\ncannot be changed once published on-chain.\n\nPolkadot supports smart contracts through parachains, usually using the\n[ink! smart contract language](https://use.ink/), but also Solidity through Frontier-enabled\nparachains. On Ethereum, smart contracts can call each other; however, they are fixed on-chain to\nthe domain of Ethereum. On Polkadot, smart contracts can call each other in the same parachain _and_\nacross parachains.\n\nOn Polkadot, developers have the option of either using smart contracts, calling extrinsics from\npallets that modify the chain's state in some particular way or merely use Polkadot's RPC to\ndirectly retrieve and act on-chain information. DApps on Polkadot are often composed of these\nmultiple components working together to modify, retrieve, and watch state changes live as they\nhappen.\n\nFor a more comprehensive list of how to build on Polkadot, be sure to check the\n[Build Section](../../index.md) on the main website."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparison-ethereum", "url": "https://developer.polkadot.com/wiki/learn/learn-comparison-ethereum/#conclusion", "page_title": "Polkadot vs. Ethereum", "index": 9, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 12846, "end_char": 13866, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:50768382e05e044824169bc755e12efa74b929c51a49cd0d030d9a46a0f2d695", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Conclusion\n\nEthereum and Polkadot both use a sharded model. Danksharding plans to utilize a rollup-centric\napproach by focusing on data availability. The Polkadot ecosystem is secured by a main chain, called\nthe \"relay chain,\" which in turn manages cores and allows tasks, such as parachains, to be run on\ntop of those cores and messages to be sent between them.\n\nThe primary differences between the two protocols are:\n\n- Ethereum processes EVM-compatible state transitions, whether through rollups or on the mainnet\n  itself, while Polkadot allows its parachains to have an abstract state transition function\n  implementation.\n- Governance processes in Ethereum are planned to be off-chain and thus require coordination for a\n  hard fork to enact governance decisions. In contrast, in Polkadot the decisions are on-chain and\n  enacted autonomously via forkless upgrades.\n- Validator selection mechanisms differ as Polkadot can provide strong availability and validity\n  guarantees with fewer validators per protocol."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#architecture", "page_title": "Polkadot vs. Avalanche", "index": 0, "depth": 2, "title": "Architecture", "anchor": "architecture", "start_char": 710, "end_char": 1339, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Architecture\n\nAvalanche's architecture separates responsibilities into three chains, enabling distinct roles for validators, transactions, and smart contract execution. The X-chain uses a DAG (Directed Acyclic Graph) structure, which is non-linear, while Polkadot uses a linear chain structure similar to Bitcoin and Ethereum.\n\n![avalanche-network](../assets/comparisons/avalanche/avalanche-network.png)\n\nImage source: [Avalanche docs](https://docs.avax.network/).\n\nSmart contracts in Polkadot are implemented on [parachains](../../smart-contracts/overview.md). Avalanche's Primary Network is divided into three blockchains:"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#p-chain-platform", "page_title": "Polkadot vs. Avalanche", "index": 1, "depth": 3, "title": "P-chain (Platform)", "anchor": "p-chain-platform", "start_char": 1339, "end_char": 1570, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### P-chain (Platform)\n\n- Maintains the validator set and secures the network.\n- Supports staking operations and Avalanche L1s.\n- Uses Delegated Proof-of-Stake (DPoS), allowing token holders to delegate their stake to validators."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#x-chain-exchange", "page_title": "Polkadot vs. Avalanche", "index": 2, "depth": 3, "title": "X-chain (Exchange)", "anchor": "x-chain-exchange", "start_char": 1570, "end_char": 1775, "estimated_token_count": 42, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### X-chain (Exchange)\n\n- Handles the transaction layer using a UTXO model (similar to Bitcoin).\n- Implements a DAG structure for fast transaction processing.\n- Does not support smart contract execution."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#c-chain-contracts", "page_title": "Polkadot vs. Avalanche", "index": 3, "depth": 3, "title": "C-chain (Contracts)", "anchor": "c-chain-contracts", "start_char": 1775, "end_char": 1995, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### C-chain (Contracts)\n\n- Supports EVM-compatible smart contracts.\n- Runs the Coreth VM, a fork of go-ethereum with Avalanche-specific networking and consensus.\n- Focuses on high activity for smart contract execution."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#subnets", "page_title": "Polkadot vs. Avalanche", "index": 4, "depth": 3, "title": "Subnets", "anchor": "subnets", "start_char": 1995, "end_char": 3576, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Subnets\n\nAvalanche defines a subnet as a dynamic set of validators achieving consensus on a set of blockchains. In Polkadot's terminology, subnets are comparable to parachains (rollups) utilizing available compute on the Polkadot relay chain. Subnets allow validators to validate specific runtimes, offering flexibility in transaction fee models, tokenomics, and custom rules. Validators can validate one or more subnets, forming subsets of the overall validator set.\n\n#### Virtual Machines\n\nAvalanche uses virtual machines (VMs) as blueprints for defining blockchain behavior, including state transitions, transaction rules, and API interfaces. Developers can use the same VM to create multiple independent blockchains with identical rules.\n\nAvalanche allows developers to build custom VMs for advanced use cases. These VMs can be implemented in any programming language and communicate with Avalanche using a language-agnostic RPC protocol. However, developers can also use prebuilt runtimes, such as Subnet-EVM for quick deployment of Solidity-based blockchains.\n\nIn contrast, Polkadot developers use the Polkadot SDK to build customized blockchain runtimes. Polkadot SDK compiles runtimes to Wasm, which the relay chain uses to verify state changes from parachains or rollups. Polkadot does not have a native smart contract layer; instead, EVM and Wasm smart contract capabilities are implemented on parachains.\n\nThis distinction highlights Avalanche's focus on VM-based blockchain customization and Polkadot's emphasis on shared security and modular runtime development."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#consensus", "page_title": "Polkadot vs. Avalanche", "index": 5, "depth": 2, "title": "Consensus", "anchor": "consensus", "start_char": 3576, "end_char": 4482, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus\n\n![avalanche-consensus-protocols](../assets/comparisons/avalanche/avalanche-consensus-protocols.png)\n\nImage source:\n[gyuho.dev](https://gyuho.dev/nakamoto-bitcoin-vs-snow-avalanche-consensus.html#snow-family-protocols).\n\nAvalanche Consensus combines features of classical and Nakamoto consensus to achieve throughput, finality, and energy efficiency. It uses repeated sub-sampled voting to ensure scalability and robustness.\n\nPolkadot employs deterministic finality and shared security through its relay chain. Polkadot uses a synchronous hybrid model with [BABE](learn-consensus.md#block-production-babe) for block production and [GRANDPA](learn-consensus.md#finality-gadget-grandpa) for deterministic finality. Polkadot validators agree on entire chains rather than individual blocks, ensuring robust finality. These two mechanisms ensure the network maintains its robustness and liveness."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#snowball-algorithm", "page_title": "Polkadot vs. Avalanche", "index": 6, "depth": 3, "title": "Snowball Algorithm", "anchor": "snowball-algorithm", "start_char": 4482, "end_char": 5133, "estimated_token_count": 150, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Snowball Algorithm\n\nThe Snowball algorithm is a core component of Avalanche Consensus. It ensures consensus through iterative sampling and preference updates:\n\n- **Parameters:**\n  - `k`: Sample size (e.g., 20 validators).\n  - `α`: Quorum size (e.g., 14 validators).\n  - `β`: Decision threshold (e.g., 20 consecutive rounds).\n- **Process:**\n  - Nodes query `k` validators and adopt the majority preference if it meets the quorum size `α`.\n  - This process repeats until the same preference is confirmed for `β` consecutive rounds.\n\nThe algorithm ensures scalability, as the number of consensus messages remains constant even as the network grows."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#dag-directed-acyclic-graph", "page_title": "Polkadot vs. Avalanche", "index": 7, "depth": 3, "title": "DAG (Directed Acyclic Graph)", "anchor": "dag-directed-acyclic-graph", "start_char": 5133, "end_char": 5432, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### DAG (Directed Acyclic Graph)\n\nAvalanche uses a DAG structure for partial ordering of transactions. Each transaction is represented as a vertex, with edges pointing to parent transactions. This structure allows for high throughput and efficient conflict resolution using the Snowball algorithm."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#staking-mechanics", "page_title": "Polkadot vs. Avalanche", "index": 8, "depth": 2, "title": "Staking Mechanics", "anchor": "staking-mechanics", "start_char": 5432, "end_char": 6344, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking Mechanics\n\nAvalanche uses a Delegated Proof-of-Stake (DPoS) mechanism without [slashing](./learn-offenses.md). Key staking details include:\n\n- **Validator Requirements:** A minimum of 2,500 AVAX is required to become a validator.\n- **Delegator Requirements:** A minimum of 25 AVAX is required to delegate stake.\n- **Staking Period:** Validators and delegators can stake for a minimum of two weeks and a maximum of one year. After this period, re-staking is required.\n- **Rewards:** Validators earn rewards based on uptime and correctness. Delegators share rewards with their chosen validators.\n\nIn Polkadot, staking requirements are dynamic and depend on network conditions. The minimum stake for validators and nominators varies based on the total staked amount in the network. Polkadot also employs slashing to penalize misbehavior. For more details, refer to the [staking page](learn-staking.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#message-passing", "page_title": "Polkadot vs. Avalanche", "index": 9, "depth": 2, "title": "Message Passing", "anchor": "message-passing", "start_char": 6344, "end_char": 7102, "estimated_token_count": 162, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Message Passing\n\nAvalanche has introduced [Avalanche Interchain Messaging (ICM)](https://build.avax.network/docs/cross-chain/avalanche-warp-messaging/overview), a native protocol for secure and trustless cross-chain communication. Key features include:\n\n- **Interoperability:** Enables subnets to exchange messages using cryptographic proofs.\n- **Limitations:** ICM is restricted to subnets within the Avalanche ecosystem and does not extend to external blockchains.\n\nPolkadot, by contrast, uses [XCM](learn-xcm.md) and [XCMP](learn-xcm-transport.md#xcmp-cross-chain-message-passing) for native, trustless cross-chain communication. XCM supports composability across parachains and extends beyond Polkadot's ecosystem, enabling broader interoperability."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#governance", "page_title": "Polkadot vs. Avalanche", "index": 10, "depth": 2, "title": "Governance", "anchor": "governance", "start_char": 7102, "end_char": 8779, "estimated_token_count": 333, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Governance\n\nAccording to its whitepaper, Avalanche plans to have an on-chain governance mechanism. It currently\ndoes not have an on-chain or off-chain system in production. Its governance system will limited to\nupdating only a few key protocol parameters which include:\n\n- **Staking amount:** This value defines the minimal stake required to be placed as bond before\n  participating in the system.\n- **Minimum staking time for a node:** The minimal amount of time required for a node to stake into\n  the system.\n- **Maximum staking time for a node:** The maximal amount of time a node can stake.\n- **Minting rate:** Reward rate function, also referred to as minting rate, determines the reward a\n  participant can claim as a function of their staking amount given some number of x publicly\n  disclosed nodes under its ownership, over a period of t consecutive _minimal staking time_\n  timeframes, such that t*minimal staking time* ≤ _maximum staking time_.\n- **Transaction fee amount:** The fee structure, which is a set of governable fees parameters that\n  specify costs to various transactions.\n\nLimiting the governance functionality is a design choice to increase predictability and safety.\n\nPolkadot's governance ([OpenGov](learn-polkadot-opengov.md)) mechanism has been in production from the very beginning and was used to\nslowly release functionality and decentralize the initial network. Polkadot governance can set parameters for various network parameters, but it can also upgrade itself using governance by allowing stakeholders to vote on referenda.\n\nThis notion of [runtime upgrades](learn-runtime-upgrades.md) via protocol makes Polkadot a **meta-protocol**."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#upgrades", "page_title": "Polkadot vs. Avalanche", "index": 11, "depth": 2, "title": "Upgrades", "anchor": "upgrades", "start_char": 8779, "end_char": 9203, "estimated_token_count": 73, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Upgrades\n\nAvalanche upgrades are managed by Ava Labs and require coordination among validators for implementation. Each validator in a subnet must apply the same upgrade, making the process manual and collaborative.\n\nPolkadot employs [forkless runtime upgrades](learn-runtime-upgrades.md) through on-chain governance. Parachain upgrades are automated and do not require validator coordination, streamlining the process."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#conclusion", "page_title": "Polkadot vs. Avalanche", "index": 12, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 9203, "end_char": 9907, "estimated_token_count": 122, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Conclusion\n\nAvalanche focuses on providing a customizable environment for blockchain developers, enabling the creation of independent blockchains via subnets. However, subnets do not share the security of Avalanche's primary network. Polkadot emphasizes shared security and interoperability through its relay chain, parachains, and [beyond](./learn-bridges.md). \n\nPolkadot's features, such as XCM for trustless messaging and forkless upgrades, are already in production, while Avalanche is still developing similar capabilities. Polkadot's governance mechanism, OpenGov, also enables for decentralized decision making when it comes to the direction and technical aspects of the Polkadot relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-avalanche", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-avalanche/#references", "page_title": "Polkadot vs. Avalanche", "index": 13, "depth": 2, "title": "References", "anchor": "references", "start_char": 9907, "end_char": 10671, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a5a85149759f05ea86dfc656d65940e2c629b9fe7e3645573519db41efd0e357", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## References\n\n1. [The Avalanche Platform Whitepaper](https://assets.website-files.com/5d80307810123f5ffbb34d6e/6008d7bbf8b10d1eb01e7e16_Avalanche%20Platform%20Whitepaper.pdf)\n2. [The Avalanche Consensus Whitepaper](https://assets.website-files.com/5d80307810123f5ffbb34d6e/6009805681b416f34dcae012_Avalanche%20Consensus%20Whitepaper.pdf)\n3. [The AVAX Token Dynamics Paper](https://assets.website-files.com/5d80307810123f5ffbb34d6e/6008d7bc56430d6b8792b8d1_Avalanche%20Native%20Token%20Dynamics.pdf)\n4. [Nakomoto vs Snow consensus](https://gyuho.dev/nakamoto-bitcoin-vs-snow-avalanche-consensus.html#what-is-snow-consensus)\n5. [Avalanche Consensus](https://docs.avax.network/protocol/avalanche-consensus)\n6. [Avalanche L1s](https://docs.avax.network/avalanche-l1s)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#model", "page_title": "Polkadot vs. Cosmos", "index": 0, "depth": 2, "title": "Model", "anchor": "model", "start_char": 319, "end_char": 1895, "estimated_token_count": 324, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Model\n\nPolkadot uses a sharded model where each shard in the protocol has an abstract state transition\nfunction (STF). Polkadot uses WebAssembly (Wasm) as a \"meta-protocol\". A shard's STF can be abstract\nas long as the validators on Polkadot can execute it within a Wasm environment.\n\nThe shards of Polkadot are called \"[parachains](learn-parachains.md)\". Every time a parachain wants\nto make a state transition, it submits a block (batch of state transitions) along with a state proof\nthat Polkadot validators can independently verify. These blocks are finalized for the parachains\nwhen they are finalized by Polkadot's relay chain, the main chain of the system. As such, all\nparachains share state with the entire system, meaning that a chain re-organization of a single\nparachain would require a re-organization of all parachains and the relay chain.\n\nCosmos employs horizontal scalability using\n[app-chains](https://www.alchemy.com/overviews/what-is-an-appchain). The Cosmos Network consists of\n100+ IBC connected chains, including the Cosmos Hub, Osmosis, Celestia, dYdX v4 chain, Injective,\netc. Each chain is responsible for securing the chain with a sufficiently staked and decentralized\nvalidator set. But chains also have the option to leverage shared security from the Cosmos Hub.\nCosmos chains send cross-chain messages using the Inter-Blockchain Communication protocol. As chains\ndo not share state, a re-organization of one chain would not re-organize other chains, meaning each\nmessage is trust-bound by the recipient's trust in the security of the sender."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#architecture", "page_title": "Polkadot vs. Cosmos", "index": 1, "depth": 2, "title": "Architecture", "anchor": "architecture", "start_char": 1895, "end_char": 1912, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Architecture"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#polkadot", "page_title": "Polkadot vs. Cosmos", "index": 2, "depth": 3, "title": "Polkadot", "anchor": "polkadot", "start_char": 1912, "end_char": 3011, "estimated_token_count": 230, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot\n\nPolkadot has a relay chain acting as the main chain of the system. All validators in Polkadot are on\nthe relay chain. Parachains have collators who construct and propose parachain blocks to validators.\nCollators do not have any security responsibilities and, thus, do not require a robust incentive\nsystem. Collators can submit a single parachain block for every relay chain block every 6 seconds.\nOnce a parachain submits a block, validators perform a series of\n[availability and validity checks](./learn-parachains-protocol.md#availability-and-validity-anv-protocol)\nbefore committing it to the final chain.\n\nParachains can access the relay chain through cores. Relay chain cores are limited, but parachain\ncan decide to purchase coretime in-bulk (and reserve an entire core) or on-demand (and interlace a\ncore with another chain) and executing on a pay-as-you-go basis, only paying to execute a block when\nthey need to.\n\nTo interact with chains that want to use their finalization process (e.g., Bitcoin), Polkadot has\n[bridges](learn-bridges.md) that offer two-way compatibility."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#cosmos", "page_title": "Polkadot vs. Cosmos", "index": 3, "depth": 3, "title": "Cosmos", "anchor": "cosmos", "start_char": 3011, "end_char": 3516, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Cosmos\n\nCosmos is a network of blockchains built using [CometBFT](https://cometbft.com/) as the consensus\nengine, [Cosmos SDK](https://docs.cosmos.network/) as the VM, and [IBC](https://ibcprotocol.dev/)\nwhich allows chains to interoperate with one another.\n\nIBC leverages light clients that can keep track of the consensus of a counterparty chain. For\nexample, when chains A and B want to talk to one another, chain A uses its light client of B to\nverify messages sent from chain B, and vice versa."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#consensus", "page_title": "Polkadot vs. Cosmos", "index": 4, "depth": 2, "title": "Consensus", "anchor": "consensus", "start_char": 3516, "end_char": 5116, "estimated_token_count": 295, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Consensus\n\nPolkadot uses a hybrid [consensus](learn-consensus.md) protocol with two sub-protocols: BABE and\nGRANDPA. BABE (Blind Assignment for Blockchain Extension) uses a verifiable random function (VRF) to\nassign slots to validators and a fallback round-robin pattern to guarantee that each slot has an\nauthor. GRANDPA (GHOST-based Recursive Ancestor Deriving Prefix Agreement) votes on chains, rather\nthan individual blocks. Together, BABE can author candidate blocks to extend the finalized chain and\nGRANDPA can finalize them in batches (up to millions of blocks at a time).\n\nThis isolation of tasks provides several benefits. First, it represents a reduction in transport\ncomplexity for both block production and finalization. BABE has linear complexity, making it easy to\nscale to thousands of block producers with low networking overhead. GRANDPA has quadratic\ncomplexity, but has an advantage in terms of the latency. It is capable of finalizing multiple\nblocks in one batch.\n\nSecond, having the capacity to extend the chain with unfinalized blocks allows for liveness of the\nnetwork and the validators to perform extensive availability and validity checks to ensure that no\ninvalid state transitions make their way into the final chain.\n\nCosmos chains use Tendermint consensus, a round-robin protocol that provides instant finality. Block\nproduction and finalization are on the same path of the algorithm, meaning it produces and finalizes\none block at a time. Because it is a PBFT-based algorithm (like GRANDPA), it has quadratic\ncomplexity, designed to finalize one block at a time."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#staking-mechanics", "page_title": "Polkadot vs. Cosmos", "index": 5, "depth": 2, "title": "Staking Mechanics", "anchor": "staking-mechanics", "start_char": 5116, "end_char": 6989, "estimated_token_count": 373, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking Mechanics\n\nPolkadot uses [Nominated Proof of Stake (NPoS)](learn-staking.md) to select validators using the\n[sequential Phragmén algorithm](learn-phragmen.md). The validator set size is set by governance\n(1_000 validators planned) and stakers who do not want to run validator infrastructure can nominate\nup to 16 validators. Phragmén's algorithm selects the optimal allocation of stake, where optimal is\nbased on having the most evenly staked set.\n\nAll validators in Polkadot have the same weight in the consensus protocols. That is, to reach\ngreater than 2/3 of support for a chain, more than 2/3 of the _validators_ must commit to it, rather\nthan 2/3 of the _stake._ Likewise, validator rewards are tied to their activity, primarily block\nproduction and finality justifications, not their amount of stake. This creates an incentive to\nnominate validators with lower stakes, as they will earn higher returns on their staked tokens.\n\nThe Cosmos Hub uses Bonded Proof of Stake (a variant of Delegated PoS) to elect validators. Stakers\nmust bond funds and submit a delegate transaction for each validator they would like to delegate to\nwith the number of tokens to delegate. The Cosmos Hub plans to support up to 300 validators.\n\nConsensus voting and rewards are both stake-based in Cosmos. In the case of consensus voting, more\nthan 2/3 of the _stake_ must commit, rather than 2/3 of the _validators._ Likewise, a validator with\n10% of the total stake will earn 10% of the rewards.\n\nFinally, in Cosmos, if a staker does not vote in a governance referendum, the validators assume\ntheir voting power. Because of this, many validators in Cosmos have zero commission in order to\nacquire more control over the protocol. In Polkadot, governance and staking are completely disjoint;\nnominating a validator does not assign any governance voting rights to the validator."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#message-passing", "page_title": "Polkadot vs. Cosmos", "index": 6, "depth": 2, "title": "Message Passing", "anchor": "message-passing", "start_char": 6989, "end_char": 8708, "estimated_token_count": 369, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Message Passing\n\nPolkadot uses [Cross-Consensus Message Passing Format (XCM)](learn-xcm.md) for parachains to send\narbitrary messages to each other. Parachains open connections with each other and can send messages\nvia their established channels. [Collators](learn-collator.md) are full nodes of parachains and full\nnodes of the relay chain, so collator nodes are a key component of message passing. Messages do not\npass through the relay chain, only proofs of post and channel operations (open, close, etc.) go into\nthe relay chain. This enhances scalability by keeping data on the edges of the system.\n\nIn the case of a chain re-organization, messages can be rolled back to the point of the\nre-organization based on the proofs of post in the relay chain. The shared state amongst parachains\nmeans that messages are free from trust bounds; they all operate in the same context.\n\nPolkadot has an additional protocol called [SPREE](learn-spree.md) that provides shared logic for\ncross-chain messages. Messages sent with SPREE carry additional guarantees about provenance and\ninterpretation by the receiving chain.\n\nCosmos uses a light client-based cross-chain protocol called\n[Inter-Blockchain Communication (IBC)](https://www.ibcprotocol.dev/) for arbitrary message-passing.\nIn the current design, IBC chains create 1:1\n[Connections](https://ibc.cosmos.network/main/ibc/overview#connections) with each other, over which\n[Channels](https://ibc.cosmos.network/main/ibc/overview#channels) can be established. IBC data\npackets are sent between application modules on different chains over these channels. In the case of\nIBC, as chains do not share state, receiving chains must trust the security of a message's origin."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#governance", "page_title": "Polkadot vs. Cosmos", "index": 7, "depth": 2, "title": "Governance", "anchor": "governance", "start_char": 8708, "end_char": 9486, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Governance\n\nPolkadot has [OpenGov](learn-polkadot-opengov.md) framewok with several trackss to pass proposals as\npublic referenda, where the majority of tokens can always control the outcome. Referenda can contain\na variety of proposals, including fund allocation from an on-chain\n[Treasury](./learn-polkadot-opengov-treasury.md). Decisions get enacted on-chain and are binding and\nautonomous.\n\nCosmos uses coin-vote signaling to pass referenda. The actual enactment of governance decisions is\ncarried out via a protocol fork, much like other blockchains. All token holders can vote, however,\nif a delegator abstains from a vote then the validator they delegate to assume their voting power.\nValidators in Polkadot do not receive any voting power based on their nominators."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#upgrades", "page_title": "Polkadot vs. Cosmos", "index": 8, "depth": 2, "title": "Upgrades", "anchor": "upgrades", "start_char": 9486, "end_char": 9843, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Upgrades\n\nUsing the Wasm meta-protocol, Polkadot can enact chain upgrades and successful proposals without a\nhard fork. Anything that is within the STF, the transaction queue, or off-chain workers can be\nupgraded without forking the chain.\n\nAs Cosmos is not based on a meta-protocol, it must enact upgrades and proposals via a normal forking\nmechanism."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#development-framework", "page_title": "Polkadot vs. Cosmos", "index": 9, "depth": 2, "title": "Development Framework", "anchor": "development-framework", "start_char": 9843, "end_char": 11139, "estimated_token_count": 273, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Development Framework\n\nBoth Cosmos and Polkadot are designed such that each chain has its STF and both provide support for\nsmart contracts in both Wasm and the Ethereum Virtual Machine (EVM). Polkadot provides an\nahead-of-time Wasm compiler as well as an interpreter (Wasmi) for execution, while Cosmos only\nexecutes smart contracts in an interpreter.\n\nCosmos chains can be developed using the Cosmos SDK, written in Go. The Cosmos SDK contains about 10\nmodules (e.g. staking, governance, etc.) that can be included in a chain's STF. The SDK builds on\ntop of Tendermint.\n\nThe primary development framework for parachains is [Substrate](../../reference/parachains/index.md#substrate), written in\nRust. Substrate comes with FRAME, a set of about 40 modules (called \"pallets\") to use in a chain's\nSTF. Beyond simply using the pallets, Substrate adds a further layer of abstraction that allows\ndevelopers to compose FRAME's pallets by adding custom modules and configuring the parameters and\ninitial storage values for the chain.\n\n!!!note \"Polkadot can support an STF written in any language\"\n        So long as it compiles to its meta-protocol Wasm. Likewise, it could still use the Substrate client (database, RPC, networking, etc.); it only needs to implement the primitives at the interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-cosmos", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-cosmos/#conclusion", "page_title": "Polkadot vs. Cosmos", "index": 10, "depth": 2, "title": "Conclusion", "anchor": "conclusion", "start_char": 11139, "end_char": 12017, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:3e9de899ff5f8ea9e1bcb557073e30f1075c58bb15c523f3c9267ab38878bf36", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Conclusion\n\nPolkadot was designed on the principle that scalability and interoperability require shared\nvalidation logic to create a trust-free environment. As more blockchains are developed, their\nsecurity must be cooperative, not competitive. Therefore, Polkadot provides the shared validation\nlogic and security processes across chains so that they can interact knowing that their\ninterlocutors execute within the same security context.\n\nThe Cosmos network uses an Internet-like unstructured network that uses IBC to connect chains with\nindependent security guarantees, meaning that when data is sent from one chain to another, the\nreceiving chain must trust the sending chain. Thus, each blockchain in the Cosmos network has its\nindependent security mechanisms. Chains also have the option to share security with the Cosmos Hub\nand thereby leverage its economic security."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-kusama", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-kusama/#cost-and-speed", "page_title": "Polkadot vs. Kusama", "index": 0, "depth": 2, "title": "Cost and Speed", "anchor": "cost-and-speed", "start_char": 522, "end_char": 1291, "estimated_token_count": 138, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:713c32811ba52964cfc7d159aa70e77210f413c6aff380429e9f70910da08746", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Cost and Speed\n\nTeams wishing to run a parachain are required to bond tokens as security. The bonding requirement on\nKusama is lower than on Polkadot, making it the more affordable development environment.\n\nAnother key technical difference between Polkadot and Kusama is that Kusama has modified governance\nparameters that allow for faster upgrades. Kusama is up to four times faster than Polkadot. This\ndoes not mean that the Kusama blockchain itself is faster, in the sense of faster block times or\ntransaction throughput (these are the same on both networks), but that there's a shorter amount of\ntime between governance events such as proposing new referenda, voting, and enacting approved\nupgrades. This allows Kusama to adapt and evolve faster than Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-kusama", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-kusama/#canary-network", "page_title": "Polkadot vs. Kusama", "index": 1, "depth": 2, "title": "Canary Network", "anchor": "canary-network", "start_char": 1291, "end_char": 3763, "estimated_token_count": 477, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:713c32811ba52964cfc7d159aa70e77210f413c6aff380429e9f70910da08746", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Canary Network\n\nThe initial use case for Kusama was as a pre-production environment, a “canary network”.\n\nCanary is a type of bird: back in the day, coal miners would put canaries into coal mines as a way\nto measure the amount of toxic gases in the tunnels. Similarly, canary testing is a way to validate\nsoftware by releasing software to a limited number of users, or perhaps, an isolated environment -\nwithout hurting a wide range of users.\n\nReleases made onto Kusama can be thought of as\n[Canary Releases](https://martinfowler.com/bliki/CanaryRelease.html). These releases are usually\nstaged. In Kusama's early days, the network won't just be used for parachain candidates to innovate\nand test changes, but a proof of concept for Polkadot's sharded model.\n\nKusama is not simply a testnet, the blockchain is fully functional with attached economic value, and\nown governance. The future of Kusama is in the hands of its participants. In a typical blockchain\ndevelopment pipeline, Kusama would sit in between a \"testnet\" and a \"mainnet\":\n\n!!!info Testnet --> Kusama --> Polkadot\n\nAs you can imagine, building on Kusama first allows teams to test things out in a live, fully\ndecentralized, and community-controlled network with real-world conditions and lower stakes in the\nevent of problems or bugs than on Polkadot.\n\nMany projects will maintain parachains on both networks, experimenting and testing new technologies\nand features on Kusama before deploying them to Polkadot. Some teams will decide just to stay on\nKusama, which is likely to be a place where we see some exciting experimentation with new\ntechnologies going forward. Projects that require high-throughput but don’t necessarily require\nbank-like security, such as some gaming, social networking, and content distribution applications,\nare particularly good candidates for this use case.\n\nKusama may also prove to be the perfect environment for ambitious experiments with new ideas and\ninnovations in areas like governance, incentives, monetary policy, and DAOs (decentralized\nautonomous organizations). Future upgrades to the Polkadot runtime will also likely be deployed to\nKusama before Polkadot mainnet. This way, not only will we be able to see how these new technologies\nand features will perform under real-world conditions before bringing them to Polkadot, but teams\nwho have deployed to both networks will also get an advanced look at how their own technology will\nperform under those upgrades."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-kusama", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-kusama/#going-forward", "page_title": "Polkadot vs. Kusama", "index": 2, "depth": 2, "title": "Going Forward", "anchor": "going-forward", "start_char": 3763, "end_char": 4207, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:713c32811ba52964cfc7d159aa70e77210f413c6aff380429e9f70910da08746", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Going Forward\n\nUltimately, Kusama and Polkadot are independent, standalone networks with their own\ncommunities, their own governance, and their own complementary use cases, though they will continue\nto maintain a close relationship, with many teams likely deploying applications to both networks.\nWeb3 Foundation remains committed to both networks going forward, providing crucial support and\nguidance to teams building for the ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-kusama", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-kusama/#how-to-guides", "page_title": "Polkadot vs. Kusama", "index": 3, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 4207, "end_char": 4304, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:713c32811ba52964cfc7d159aa70e77210f413c6aff380429e9f70910da08746", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [Polkadot and Kusama — What's the Difference?](how-to/polkadot-vs-kusama.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#rollup-comparison", "page_title": "Rollups and Interoperability Comparison", "index": 0, "depth": 2, "title": "Rollup Comparison", "anchor": "rollup-comparison", "start_char": 1, "end_char": 1676, "estimated_token_count": 322, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Rollup Comparison\n\n**Rollups** are an L2 scaling solution. At the most basic level, a rollup L2 solution is responsible\nfor \"rolling up\" transactions by batching them before publishing them to the L1 chain, usually\nthrough a network of **sequencers**. In theory, separate entities could assume the role of\nsequencing transactions and publishing them. In practice, they are the same machine, but this will\nlikely change as rollups decentralize more. This mechanism could include thousands of transactions\nin a single rollup.\n\n!!!info \"Layer Two Definition\"\n    Layer two (L2) networks are a key approach to blockchain scalability, off-loading the majority of computation from layer one (L1) networks. These solutions leverage the security of L1 to create an additional layer that is faster, reduces fees, and addresses platform-specific challenges. L2 solutions also focus on utilizing L1 blockspace efficiently and cost-effectively.\n\nBy adopting modular designs and re-using functionality, L2 networks enable the deployment of\nscalable rollups for various virtual machine environments, including Ethereum Virtual Machine (EVM),\nSolana Virtual Machine (SVM) and [Move-based](https://move-language.github.io/move/) systems. These\nrollups settle back to Ethereum, ensuring a robust and secure foundation for diverse blockchain\necosystems.\n\nIn this section, we explore the main differences in rollup technology between:\n\n- Zero-knowledge rollups,\n- Optimistic rollups, and\n- Polkadot rollups (i.e., parachains).\n\nBefore diving into the differences between these rollup technologies, it is crucial to understand\nthe difference between non-interactive and interactive methods."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#fraud-proofs-vs-validity-proofs", "page_title": "Rollups and Interoperability Comparison", "index": 1, "depth": 3, "title": "Fraud Proofs vs. Validity Proofs", "anchor": "fraud-proofs-vs-validity-proofs", "start_char": 1676, "end_char": 6236, "estimated_token_count": 968, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fraud Proofs vs. Validity Proofs\n\nIn the context of rollups, **interactive** and **non-interactive** methods are commonly used to\ndescribe how the validity of transactions or state changes is established between the rollup layer\nand the main blockchain (L1). These terms correspond closely to the mechanisms of **fraud proofs**\nand **validity proofs**, which are the standard terminology.\n\nAn **interactive method** (associated with fraud proofs) involves a back-and-forth process to\nvalidate transactions. A \"prover\" submits transaction data or state changes to L1, assuming it is\nvalid. A challenge mechanism is triggered if a dispute arises, requiring participants to provide\nevidence (fraud proofs) to demonstrate invalidity. This process ensures correctness but introduces\nlatency due to dispute resolution periods, which can vary depending on the implementation. For\nexample, optimistic rollups often have challenge periods of several hours or even up to seven days.\n\nA **non-interactive method** (associated with validity proofs) relies on cryptographic mechanisms,\nsuch as SNARKs or STARKs, to validate transactions upfront. These proofs are generated off-chain and\nsubmitted to L1 for verification without requiring dispute resolution. While these methods offer\npotential near-instant finality on the rollup itself, it is ultimately limited by L1's finality (unless it is a sovereign rollup, in which case it would vary). In practice, delays are sometimes intentionally introduced as\nsafeguards. For instance, zkSync rollups may take up to a day to finalize transactions, not due to\ntechnical limitations but as a precautionary measure while the technology matures and secures\nhigh-value assets.\n\nBelow is a comparison of the two mechanisms:\n\n| **Aspect**         | **Fraud Proofs (Interactive)**                                                                                                                                  | **Validity Proofs (Non-Interactive)**                                                                                                                                              |\n| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Mechanism**      | Challenge-based system where disputes are resolved interactively.                                                                                               | Cryptographic proofs validate all transactions upfront, eliminating disputes.                                                                                                      |\n| **Latency**        | Time to finality depends on challenge periods. Optimistic rollups often take hours or even days to finalize. Polkadot rollups reduce this to around 30 minutes. | Near-instant finality in theory. In practice, systems like zkSync can take up to a day to finalize, often due to artificial safeguards rather than inherent technical limitations. |\n| **Security Basis** | Crypto-economic incentives and participant monitoring ensure validity.                                                                                          | Cryptographic guarantees ensure correctness upfront, reducing the need for external monitoring.                                                                                    |\n| **Complexity**     | Simpler to implement but requires active monitoring and challenge resolution.                                                                                   | Computationally intensive and complex to build, especially for ZK systems.                                                                                                         |\n| **Use Cases**      | Suitable for applications needing broad compatibility with existing systems and tolerating some latency for finality.                                           | Ideal for high-security applications or scenarios where upfront validation and fast finality are critical.                                                                 |\n\nBoth approaches address different trade-offs between scalability, security, latency, and\nimplementation complexity. Future innovations may blur the lines between these mechanisms, enabling\nhybrid approaches such as non-interactive dispute systems."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#zero-knowledge-rollups", "page_title": "Rollups and Interoperability Comparison", "index": 2, "depth": 3, "title": "Zero-knowledge Rollups", "anchor": "zero-knowledge-rollups", "start_char": 6236, "end_char": 7964, "estimated_token_count": 305, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Zero-knowledge Rollups\n\nZero-knowledge rollups (commonly referred to as ZK rollups) are a non-interactive method that\nutilizes cryptographic proofs, often in the form of SNARKs, to compute the validity of a particular\nset of state changes. While the industry has adopted the term \"ZK rollups,\" it is worth noting that\nmany implementations do not strictly involve zero-knowledge properties, as the proofs do not\nnecessarily conceal information. These rollups are better described simply as SNARK-based rollups,\nbut the term \"ZK rollups\" remains widely used.\n\nIn contrast to [optimistic rollups](#optimistic-rollups), which rely on fraud proofs and interactive\nchallenge mechanisms, ZK rollups rely entirely on cryptographic validation, with SNARKs providing\nupfront proof of correctness. This approach allows ZK rollups to achieve significantly faster\nfinalization, as the validity proof ensures that all state transitions are correct without requiring\na challenge period.\n\nHowever, ZK rollups face performance challenges due to the computational complexity involved in\nproof generation and the difficulty of implementing these proofs in resource-constrained\nenvironments. This complexity also makes achieving Turing completeness more challenging, which can\nlimit their generalizability in terms of blockspace usage. Despite these challenges, ZK rollups are\nbecoming increasingly viable for specialized applications. For example,\n[Hyperbridge](./learn-bridges.md#bridge-comparison) is a SNARK-based rollup on Polkadot that acts as\na scalable, trustless bridge. It produces a single proof for multiple blockchains, which can be\ninstantly verified on Polkadot, demonstrating the potential of these rollups in niche use cases."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#optimistic-rollups", "page_title": "Rollups and Interoperability Comparison", "index": 3, "depth": 3, "title": "Optimistic Rollups", "anchor": "optimistic-rollups", "start_char": 7964, "end_char": 8800, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Optimistic Rollups\n\nOptimistic rollups are an interactive scaling method for L1 blockchains. They assume\n_optimistically_ that every proposed transaction is valid by default.\n\nIn the case of mitigating potentially invalid transactions, optimistic rollups introduce a\n_challenge period_ during which participants may challenge a suspect rollup. A fraud-proving scheme\ncan be in place to allow for several _fraud proofs_ to be submitted. Those proofs could make the\nrollup valid or invalid. State changes may be disputed, resolved, or included during the challenge\nperiod if no challenge is presented (and the required proofs are in place).\n\nOptimistic rollups are often used in the Ethereum ecosystem. [Optimism](https://www.optimism.io/)\nand [Arbitrium](https://bridge.arbitrum.io/) are an example of optimistic EVM-based rollups."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#polkadot-rollups", "page_title": "Rollups and Interoperability Comparison", "index": 4, "depth": 3, "title": "Polkadot Rollups", "anchor": "polkadot-rollups", "start_char": 8800, "end_char": 11009, "estimated_token_count": 400, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Polkadot Rollups\n\nPolkadot Rollups work similarly to optimistic rollups. They are an interactive method with fraud\nproof mechanism. Like optimistic rollups and zk rollups are secured by Ethereum, Polkadot rollups\nare secured by the Polkadot relay chain. The checking and fraud-proof mechanics are natively\nimplemented in Polkadot. [Collators](./learn-collator.md) are in principle similar to sequencers, as\nthey pass data with a proof-of-validity (PoV) function for liveness and communication with the Relay\nChain.\n\nAdditionally, Polkadot operates as a _stateless client_ of its rollups, meaning the Relay Chain does\nnot maintain the entire state of each parachain. Instead, it verifies state transitions using PoV\nblocks submitted by collators. This is analogous to _block witnesses_ in the Ethereum ecosystem,\nwhich proves transaction validity without requiring full state storage. This design ensures\nscalability by delegating state maintenance to rollups while enabling secure validation through\ncryptographic proofs.\n\nPolkadot rollups have the following main differences compared to optimistic rollups:\n\n- Polkadot implements rollup functionality at the native level (i.e., without using L2 scaling\n  solutions), allowing for shared security and scalability for each rollup through the\n  [Parachains Protocol](./learn-parachains-protocol.md). Polkadot handles data coordination from\n  parachains into an aggregated, representative state, similar to L2 rollups.\n- If optimistic rollups are based on the assumption that all transactions are valid, **Polkadot\n  rollups are \"cynical\" and always check the validity of transactions using a subset of the\n  validators**. In case of disputes, an escalation effect involving more validators is triggered,\n  and dispute resolution will end with the malicious actor being [slashed](./learn-offenses.md).\n- Polkadot has multiple virtual cores that are made possible thanks to the Parachain Protocol, which\n  allows execution sharding. Rollups access Polkadot by reserving time on those cores via\n  [coretime](./learn-agile-coretime.md).\n\nA more detailed comparison of Polkadot rollups with optimistic and zk rollups can be found in the\ncomparison table below."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#rollup-comparison-table", "page_title": "Rollups and Interoperability Comparison", "index": 5, "depth": 3, "title": "Rollup Comparison Table", "anchor": "rollup-comparison-table", "start_char": 11009, "end_char": 26860, "estimated_token_count": 2175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Rollup Comparison Table\n\nHere below there is a comparison table summarizing the main differences between Polkadot, ZK, and\nOptimistic rollups. An in-depth comparison between different types of optimistic and ZK rollups can\nbe found on [l2beat](https://l2beat.com/scaling/summary).\n\n| **Feature**                  | **ZK Rollups**                                                                                                                                                                                                                                                     | **Optimistic Rollups**                                                                                                                                                                   | **Polkadot Parachains/Rollups**                                                                                                                                                                                                                                                                                                                     |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Finality**                 | Because the proof is immediately available, finality is only constrained by L1's finality (for example, ~13 minutes for Ethereum).                                                                                                                                                                 | Delayed finality (a week) due to fraud-proof mechanisms.                                                                                                                                 | Fast finality (under 1 minute) via relay chain consensus.                                                                                                                                                                                                                                                                                           |\n| **Security Model**           | Relies on cryptographic validity proofs, ensuring high security and no reliance on game-theoretic assumptions.                                                                                                                                                     | Relies on economic incentives and a challenge period to catch fraud. Optimistic assumption makes it less secure than ZK Rollups.                                                         | \"Cynical\" model, where every transaction is checked by a subset of validators, with escalation and slashing in case of disputes.                                                                                                                                                                                                                    |\n| **Scalability**              | Limited scalability as they are a single state machine and are only as scalable as the prover machine and computation requirement. Many zk-rollups disable cryptographic precompiles on the mainnet as a result of the immense computational requirement for them. | High, with parallelization, but limited by gas costs on L1 chains like Ethereum.                                                                                                         | Inherently scalable through native execution sharding and parachains operating in parallel. [Pipelining](./learn-async-backing.md) and [core scheduling](./learn-agile-coretime.md) increase throughput and scalability for the single rollup. Execution sharding is enabled by multiple virtual cores using [coretime](./learn-agile-coretime.md). |\n| **Interoperability**         | Limited interoperability<sup>1</sup>, often restricted to compatible L1s.                                                                                                                                                                                          | Limited interoperability<sup>1</sup>, often confined to the parent blockchain ecosystem. See the [comparison about interoperability](#interoperability-comparison) for more information. | Native interoperability through [XCM](./learn-xcm.md), allowing seamless communication between parachains having different logic. [Trustless bridges](./learn-bridges.md) can connect Polkadot to other blockchains.                                                                                                                                |\n| **State Transition Logic**   | General-purpose but constrained by zk-circuit implementation complexity.                                                                                                                                                                                           | Can support state transitions beyond EVM compatibility by interpreting other virtual machine (VM) logic within the EVM environment<sup>2</sup>.                                          | Each parachain can define its unique state transition function (STF), which is compiled to Wasm and validated per Parachain Protocol rules.                                                                                                                                                                                                         |\n| **Development Complexity**   | Complex due to the mathematics of zero-knowledge proofs.                                                                                                                                                                                                           | Moderate complexity, requiring fraud-proof implementation.                                                                                                                               | Moderate to high complexity; parachain runtimes must be written in Wasm-compatible languages but can define custom logic and governance. Parachain maintenance can be an overhead.                                                                                                                                                                  |\n| **Data Availability**        | Data availability requirements posted by the optimistic and ZK rollups are the same.                                                                                                                                                                               | Data availability requirements posted by the optimistic and ZK rollups are the same.                                                                                                     | Built-in data availability with validators ensuring distributed state storage and reconstruction in case of disputes.                                                                                                                                                                                                                               |\n| **Cost Efficiency**          | High efficiency but expensive prover computation.                                                                                                                                                                                                                  | More cost-effective but susceptible to congestion during high usage.                                                                                                                     | Cost-effective as parachains are independently scalable and not tied to L1 gas fees.                                                                                                                                                                                                                                                                |\n| **Governance Upgrades**      | Subject to parent chain governance.                                                                                                                                                                                                                                | Governed by parent L1 network governance.                                                                                                                                                | Forkless upgrades are supported through Polkadot’s native governance mechanisms.                                                                                                                                                                                                                                                                    |\n| **Fraud/Validity Proofs**    | Non-interactive validity proofs, ensuring correctness off-chain.                                                                                                                                                                                                   | Fraud proofs requiring active challenges during the dispute window.                                                                                                                      | Continuous validity checks by validators with dispute escalation effects, ending in slashing malicious actors.                                                                                                                                                                                                                                      |\n| **Applications**             | Ideal for high-security use cases like financial transactions and privacy-preserving applications.                                                                                                                                                                 | Suitable for general-purpose dApps with moderate security needs.                                                                                                                         | Fully-fledged state machines capable of defining governance, logic, and custom runtime environments, ideal for diverse blockchain apps.                                                                                                                                                                                                             |\n| **Escape Hatch**<sup>3</sup> | No built-in escape hatch; relies on zk circuits functioning correctly.                                                                                                                                                                                             | Can include an escape hatch to withdraw funds if sequencers fail.                                                                                                                        | No native escape mechanism; funds could be trapped if parachain collators fail.                                                                                                                                                                                                                                                                     |\n| **Permissioning**            | Typically relies on permissioned sequencers.                                                                                                                                                                                                                       | Sequencers can be permissioned or partially permissionless.                                                                                                                              | Parachains support permissioned and permissionless collator sets, providing flexibility for private or public use cases.                                                                                                                                                                                                                            |\n| **Shared Security**          | Relies on the parent chain's security guarantees, leveraging zk-proofs.                                                                                                                                                                                            | Security shared with the L1 via fraud-proof mechanisms.                                                                                                                                  | Security shared with the Relay Chain via Parachian Protocol.                                                                                                                                                                                                                                                                                        |\n| **Sharding**                 | Only data sharding. Execution sharding does not apply to Ethereum ZK rollups.                                                                                                                                                                                      | Only data sharding. Execution sharding does not apply to Ethereum Optimistic rollups.                                                                                                    | Data sharding and execution sharding enabled through the Parachain Protocol, leveraging multiple virtual cores and reserving coretime for rollup operations.                                                                                                                                                                                        |\n\n<sup>1</sup>There are efforts to allow native interoperability within rollup hubs, e.g., there will\nbe \"better\" interoperability within the OP Stack ecosystem than independent L2s.\n\n<sup>2</sup>Optimistic rollups rely on Ethereum's EVM (Ethereum Virtual Machine) for their\nfraud-proof mechanisms and dispute resolution. However, rather than natively executing L2 opcodes,\nthe EVM interprets the logic of the rollup's virtual machine.\n\n!!!info \"Opcodes\"\n    An opcode (short for operation code) is the fundamental instruction used by a virtual machine to perform specific operations. In the context of the EVM, opcodes define low-level commands that execute computations, manage storage, and interact with smart contracts. Rollups process their opcodes, which the EVM interprets during dispute resolution and other operations.\n\nWhile optimistic rollups often support EVM-compatible state transitions for seamless integration\nwith Ethereum and its ecosystem, they are not inherently restricted to EVM logic. Developers could\nimplement interpretation logic for other virtual machines, such as Wasm or custom environments,\nenabling optimistic rollups to support diverse computational frameworks. This flexibility expands\ntheir potential beyond traditional EVM-based boundaries, contrasting with the perception that they\nare strictly tied to Ethereum’s computational model.\n\n<sup>3</sup>An escape hatch is a method by which users of a rollup can recover digital assets or\nprogram state from a rollup when the operators (sequencers) are offline."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#interoperability-comparison", "page_title": "Rollups and Interoperability Comparison", "index": 6, "depth": 2, "title": "Interoperability Comparison", "anchor": "interoperability-comparison", "start_char": 26860, "end_char": 34259, "estimated_token_count": 1191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Interoperability Comparison\n\nIn this section, we explore the main differences in interoperability between Polkadot,\n[Optimism Superchain Ecosystem](https://docs.optimism.io/stack/explainer) and\n[Chainlink CCIP (Cross-chain Interoperability Protocol)](https://chain.link/cross-chain).\n\n| Feature                     | Polkadot XCM                                                                                                                                                                                                                                                 | Optimism Superchain Interoperability                                                    | Chainlink CCIP                                                                                 |\n| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |\n| **Architecture**            | Direct communication between parachains within the Polkadot ecosystem using a unified relay chain.                                                                                                                                                           | Cross-rollup interoperability built on Ethereum, extending rollups’ compatibility.      | Universal standard enabling cross-chain communication for any blockchain network.              |\n| **Scope**                   | Limited to parachains and relay chains in the Polkadot/Kusama ecosystem.                                                                                                                                                                                     | Focused on rollups in Ethereum Layer 2 (e.g., Optimism, Base).                          | Blockchain-agnostic, supporting public and private chains.                                     |\n| **Consensus Dependency**    | Relies on Polkadot's shared relay chain consensus.                                                                                                                                                                                                           | Depends on Ethereum Layer 1 for security and sequencer trust within Superchain rollups. | Independent of any specific chain’s consensus, it uses an oracle network for secure messaging. |\n| **Interoperability Model**  | Messages are trustlessly passed between parachains using XCMP and HRMP channels.                                                                                                                                                                             | Rollups communicate through the Superchain’s sequencer infrastructure.                  | Relies on Chainlink decentralized oracles to transmit data securely across chains.             |\n| **Scalability**             | High scalability within the ecosystem; limited by relay chain capacity.                                                                                                                                                                                      | Limited by Ethereum throughput and Superchain architecture.                             | Scalable; offloads cross-chain messaging to oracle networks.                                   |\n| **Security Model**          | Secured by Polkadot's relay validators and stake.                                                                                                                                                                                                            | Secured by Ethereum’s base layer and rollup-specific fraud or validity proofs.          | Security ensured by Chainlink oracles and cryptographic proofs.                                |\n| **Ease of Integration**     | Requires Substrate-based parachains and compliance with Polkadot protocols.                                                                                                                                                                                  | Requires rollups to align with Optimism’s OP stack architecture.                        | Blockchain-agnostic, integrates with any chain using CCIP libraries.                           |\n| **Interoperability Speed**  | Near-instant, as Polkadot’s shared relay chain validates interactions.                                                                                                                                                                                       | Relatively slower due to dependency on Layer 1 Ethereum finality and rollup delays.     | Fast, as it relies on Chainlink oracle nodes for data transmission.                            |\n| **Use Cases**               | Native token transfers, contract execution (though Polkadot allows smart contract execution through XCM, it is almost impossible to use trustlessly in practice, as only straightforward calls can be passed without read access), and shared staking pools. | Bridging assets and state between rollups.                                              | Cross-chain DeFi, gaming, enterprise blockchain communication.                                 |\n| **Prone to Centralization** | Low; while Polkadot's design enforces decentralization, it allows the decentralization of collators but does not mandate it, as there are chains with teams operating all collators.                                                                         | Optimism does not currently give a choice; sequencers must be centralized.              | Depends on the decentralization level of Chainlink's oracle network.                           |\n| **Current Deployment**      | Actively deployed in Polkadot and Kusama ecosystems.                                                                                                                                                                                                         | Early stage; foundational elements are live, expanding with OP stack rollups.           | Widely adopted across multiple chains in both testnet and mainnet.                             |\n| **Key Strengths**           | Seamless, low-latency native communication within the ecosystem.                                                                                                                                                                                             | Interoperability focused on Ethereum scalability and Layer 2 adoption.                  | Universal, chain-agnostic standard with flexible use cases.                                    |\n| **Limitations**             | Limited to Polkadot-compatible parachains.                                                                                                                                                                                                                   | Restricted to Ethereum and rollups using OP stack.                                      | It depends on the oracle network security and adoption rate.                                   |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-comparisons-rollups", "url": "https://developer.polkadot.com/wiki/learn/learn-comparisons-rollups/#other-comparisons", "page_title": "Rollups and Interoperability Comparison", "index": 7, "depth": 2, "title": "Other Comparisons", "anchor": "other-comparisons", "start_char": 34259, "end_char": 34625, "estimated_token_count": 114, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:de97d7264a44ca7ff6a3361288bc06e93b6405b41d2575a53cf82c56d9dbc78b", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Other Comparisons\n\n<div class=\"grid cards\" markdown>\n\n- **[Kusama](./learn-comparisons-kusama.md)** - Comparison with Kusama.\n- **[Ethereum](./learn-comparison-ethereum.md)** - Comparison with Ethereum.\n- **[Cosmos](./learn-comparisons-cosmos.md)** - Comparison with Cosmos.\n- **[Avalanche](./learn-comparisons-avalanche.md)** - Comparison with Avalanche.\n\n</div>"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#nominated-proof-of-stake", "page_title": "Polkadot's Consensus Protocols", "index": 0, "depth": 2, "title": "Nominated Proof of Stake", "anchor": "nominated-proof-of-stake", "start_char": 966, "end_char": 1572, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Nominated Proof of Stake\n\nPolkadot uses NPoS (Nominated Proof-of-Stake) as its mechanism for selecting the validator set. It\nis designed with the roles of [**validators**](./learn-validator.md) and\n[**nominators**](./learn-nominator.md), to maximize chain security. Actors who are interested in\nmaintaining the network can run a validator node.\n\nValidators assume the role of producing new blocks, validating parachain blocks, and guaranteeing\nfinality. Nominators can choose to backselect validators with their stake. Nominators can approve\ncandidates that they trust and back them with their tokens."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#hybrid-consensus", "page_title": "Polkadot's Consensus Protocols", "index": 1, "depth": 2, "title": "Hybrid Consensus", "anchor": "hybrid-consensus", "start_char": 1572, "end_char": 2685, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Hybrid Consensus\n\nPolkadot uses a _hybrid consensus_ composed by the finality gadget\n([GRANDPA](#finality-gadget-grandpa)) and the block production mechanism\n([BABE](#block-production-babe)).\n\nThis is a way of getting the benefits of **probabilistic finality** (the ability always to produce\nnew blocks) and **provable finality** (having a universal agreement on the canonical chain with no\nchance for reversion). It also avoids the corresponding drawbacks of each mechanism (the chance of\nunknowingly following the wrong fork in probabilistic finality, and a chance for \"stalling\" - not\nbeing able to produce new blocks - in provable finality). The combination of these two mechanisms\nallows for blocks to be rapidly produced, and the slower finality mechanism to run in a separate\nprocess to finalize blocks without risking slower transaction processing or stalling.\n\nHybrid consensus has been proposed in the past. Notably, it was proposed (now defunct) as a step in\nEthereum's transition to proof of stake in [EIP 1011](https://eips.ethereum.org/EIPS/eip-1011), which\nspecified [Casper FFG](#casper-ffg)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#block-production-babe", "page_title": "Polkadot's Consensus Protocols", "index": 2, "depth": 2, "title": "Block Production: BABE", "anchor": "block-production-babe", "start_char": 2685, "end_char": 4270, "estimated_token_count": 320, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Block Production: BABE\n\nBABE (Blind Assignment for Blockchain Extension) is the block production mechanism that runs between\nthe validator nodes and determines the authors of new blocks. BABE is comparable as an algorithm to\n[Ouroboros Praos](https://eprint.iacr.org/2017/573.pdf), with some key differences in chain\nselection rule and slot time adjustments. BABE assigns block production slots to validators\naccording to stake and using the relay chain's\n[randomness cycle](./learn-cryptography.md#randomness). The chain’s runtime is required to provide\nthe BABE authority list and randomness to the host via a consensus message in the header of the\nfirst block of each epoch.\n\nBABE execution happens in sequential non-overlapping phases known as epochs. Each epoch is divided\ninto a predefined number of slots. All slots in each epoch are sequentially indexed starting from 0\n(slot number). At the beginning of each epoch, the BABE node needs to run the\n[Block-Production-Lottery algorithm](https://spec.polkadot.network/#algo-block-production-lottery)\nto find out in which slots it should produce a block and gossip to the other block producers.\n\nValidators participate in a lottery for every slot, which will inform whether or not they are the\nblock producer candidate for that slot. Slots are discrete units of time of approximately 6 seconds\nin length. Because the mechanism of allocating slots to validators is based on a randomized design,\nmultiple validators could be candidates for the same slot. Other times, a slot could be empty,\nresulting in inconsistent block time."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#multiple-validators-per-slot", "page_title": "Polkadot's Consensus Protocols", "index": 3, "depth": 3, "title": "Multiple Validators per Slot", "anchor": "multiple-validators-per-slot", "start_char": 4270, "end_char": 4732, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Multiple Validators per Slot\n\nWhen multiple validators are block producer candidates in a given slot, all will produce a block and\nbroadcast it to the network. At that point, it's a race. The validator whose block reaches most of\nthe network first wins. Depending on network topology and latency, both chains will continue to\nbuild in some capacity until finalization kicks in and amputates a fork. See\n[Fork Choice](#fork-choice) below for how that works."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#no-validators-in-slot", "page_title": "Polkadot's Consensus Protocols", "index": 4, "depth": 3, "title": "No Validators in Slot", "anchor": "no-validators-in-slot", "start_char": 4732, "end_char": 5526, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### No Validators in Slot\n\nWhen no validators have rolled low enough in the randomness lottery to qualify for block production,\na slot can remain seemingly blockless. Polkadot protocol runs a\n[secondary validator selection algorithm](https://spec.polkadot.network/sect-block-production#defn-babe-secondary-slots)\nin the background. The validators selected through this predictable algorithm always produce blocks.\nThese _secondary_ blocks are ignored if the same slot has a primary block produced from a\n[VRF-selected](./learn-cryptography.md#randomness) validator. Thus, a slot can have either a\n_primary_ or a _secondary_ block, and no slots are ever skipped.\n\nFor more details on BABE, please see the\n[BABE paper](https://research.web3.foundation/Polkadot/protocols/block-production/Babe)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#finality-gadget-grandpa", "page_title": "Polkadot's Consensus Protocols", "index": 5, "depth": 2, "title": "Finality Gadget: GRANDPA", "anchor": "finality-gadget-grandpa", "start_char": 5526, "end_char": 6816, "estimated_token_count": 264, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Finality Gadget: GRANDPA\n\nGRANDPA (GHOST-based Recursive ANcestor Deriving Prefix Agreement) is the finality gadget that is\nimplemented for the relay chain.\n\nThe Polkadot Host uses the GRANDPA Finality protocol to finalize blocks. Finality is obtained by\nconsecutive rounds of voting by the validator nodes. Validators execute the GRANDPA finality process\nin parallel to Block Production as an independent service.\n\nIt works in a partially synchronous network model as long as 2/3 of nodes are honest and can cope\nwith 1/5 Byzantine nodes in an asynchronous setting.\n\nA notable distinction is that GRANDPA reaches agreements on chains rather than blocks, greatly\nspeeding up the finalization process, even after long-term network partitioning or other networking\nfailures.\n\nIn other words, as soon as more than 2/3 of validators attest to a chain containing a particular\nblock, all blocks leading up to that one are finalized at once.\n\n!!!info \"GRANDPA description and implementation\"\n    Please refer to [the GRANDPA paper](https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf) for a full description of the protocol. GRANDPA is implemented as a [module of the Substrate Frame System](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/grandpa/src/lib.rs)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#probabilistic-vs-provable-finality", "page_title": "Polkadot's Consensus Protocols", "index": 6, "depth": 3, "title": "Probabilistic vs. Provable Finality", "anchor": "probabilistic-vs-provable-finality", "start_char": 6816, "end_char": 8113, "estimated_token_count": 254, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Probabilistic vs. Provable Finality\n\nA pure Nakamoto consensus blockchain that runs PoW is only able to achieve the notion of\n_probabilistic finality_ and reach _eventual consensus_. Probabilistic finality means that under\nsome assumptions about the network and participants, if we see a few blocks building on a given\nblock, we can estimate the probability that it is final. Eventual consensus means that at some point\nin the future, all nodes will agree on the truthfulness of one set of data. This eventual consensus\nmay take a long time, and will not be able to determine how long it will take ahead of time.\nHowever, finality gadgets such as GRANDPA (GHOST-based Recursive ANcestor Deriving Prefix Agreement)\nor Ethereum's Casper FFG (the Friendly Finality Gadget) are designed to give stronger and quicker\nguarantees on the finality of blocks - specifically, that they can never be reverted after some\nprocess of Byzantine agreements has taken place. The notion of irreversible consensus is known as\n_provable finality._\n\nIn the [GRANDPA paper](https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf), it is phrased\nin this way:\n\n!!!note\n    We say an Oracle A in a protocol is _eventually consistent_ if it returns the same value to all participants after some unspecified time."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#fork-choice", "page_title": "Polkadot's Consensus Protocols", "index": 7, "depth": 2, "title": "Fork Choice", "anchor": "fork-choice", "start_char": 8113, "end_char": 8823, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Fork Choice\n\nBringing BABE and GRANDPA together, the fork choice of the relay chain becomes clear. BABE must\nalways build on the chain that GRANDPA has finalized. BABE provides probabilistic finality when\nthere are forks after the finalized head by building on the chain with the most primary blocks.\n\n![Best chain choice](../assets/best_chain.png)\n\nIn the above image, the black blocks are finalized, and the yellow blocks are not. Blocks marked\nwith a \"1\" are primary blocks; those marked with a \"2\" are secondary blocks. Even though the topmost\nchain is the longest chain on the latest finalized block, it does not qualify because it has fewer\nprimaries at the time of evaluation than the one below it."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#comparisons", "page_title": "Polkadot's Consensus Protocols", "index": 8, "depth": 2, "title": "Comparisons", "anchor": "comparisons", "start_char": 8823, "end_char": 8839, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Comparisons"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#nakamoto-consensus", "page_title": "Polkadot's Consensus Protocols", "index": 9, "depth": 3, "title": "Nakamoto Consensus", "anchor": "nakamoto-consensus", "start_char": 8839, "end_char": 9805, "estimated_token_count": 176, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Nakamoto Consensus\n\nNakamoto consensus consists of the longest chain rule using proof of work as its Sybil resistance\nmechanism and leader election.\n\nNakamoto consensus only gives us probabilistic finality. Probabilistic finality states that a block\nin the past is only as safe as the number of confirmations it has, or the number of blocks that have\nbeen built on top of it. As more blocks are built on top of a specific block in a Proof of Work\nchain, more computational work has been expended behind this particular chain. However, it does not\nguarantee that the chain containing the block will always remain the agreed-upon chain since an\nactor with unlimited resources could potentially build a competing chain and expend enough\ncomputational resources to create a chain that did not contain a specific block. In such a\nsituation, the longest chain rule employed in Bitcoin and other proof of work chains would move to\nthis new chain as the canonical one."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#pbft-tendermint", "page_title": "Polkadot's Consensus Protocols", "index": 10, "depth": 3, "title": "PBFT / Tendermint", "anchor": "pbft-tendermint", "start_char": 9805, "end_char": 9936, "estimated_token_count": 30, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### PBFT / Tendermint\n\nPlease see the [relevant section](learn-comparisons-cosmos.md#consensus) in the Cosmos comparison\narticle."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#casper-ffg", "page_title": "Polkadot's Consensus Protocols", "index": 11, "depth": 3, "title": "Casper FFG", "anchor": "casper-ffg", "start_char": 9936, "end_char": 10229, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Casper FFG\n\nThe two main differences between GRANDPA and Casper FFG are:\n\n- in GRANDPA, different voters can cast votes simultaneously for blocks at different heights\n- GRANDPA only depends on finalized blocks to affect the fork-choice rule of the underlying block\n  production mechanism"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#bridging-beefy", "page_title": "Polkadot's Consensus Protocols", "index": 12, "depth": 2, "title": "Bridging: BEEFY", "anchor": "bridging-beefy", "start_char": 10229, "end_char": 11720, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Bridging: BEEFY\n\nThe BEEFY (Bridge Efficiency Enabling Finality Yielder) is a secondary protocol to GRANDPA to\nsupport efficient bridging between relay chains (Polkadot and Kusama) and remote, segregated\nblockchains, such as Ethereum, which were not built with the Polkadot native interoperability in\nmind. The protocol allows participants of the remote network to efficiently verify finality proofs\ncreated by validators on the relay chain, i.e. clients in the Ethereum network can verify that the\nPolkadot network is at a specific state.\n\nStoring all the information necessary to verify the state of the remote chain, such as the block\nheaders, is too expensive. In BEEFY, all honest validators sign on a GRANDPA finalized block. This\nreduces the efforts on the light client side, as tracking forks, GRANDPA justifications, etc., is no\nlonger necessary. Moreover, BEEFY utilizes Merkle Mountain Ranges (MMR) as an efficient data\nstructure for storing and transmitting block headers and signatures to light clients and the ECDSA\nsignature schemes (more efficiently verifiable on EVM). Light clients now only have to check if the\nblock has a super-majority of BEEFY votes by validators.\n\nOverall, BEEFY addresses the limitations of GRANDPA finality for bridges to chains like Ethereum by\nproviding a more lightweight and efficient finality solution.\n\nFor additional implementation details about BEEFY, see\n[the Polkadot Specification](https://spec.polkadot.network/#sect-grandpa-beefy)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-consensus", "url": "https://developer.polkadot.com/wiki/learn/learn-consensus/#resources", "page_title": "Polkadot's Consensus Protocols", "index": 13, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 11720, "end_char": 12799, "estimated_token_count": 258, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e491c4302b438ee88f40699d35b57d67cf516f8c17f2733342f8b211d1ba16bc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\n- [BABE paper](https://research.web3.foundation/Polkadot/protocols/block-production/Babe) - The\n  academic description of the BABE protocol.\n- [GRANDPA paper](https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf) - The academic\n  description of the GRANDPA finality gadget. Contains formal proofs of the algorithm.\n- [Rust implementation](https://github.com/paritytech/finality-grandpa) - The reference\n  implementation and the accompanying\n  [Substrate pallet](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/grandpa/src/lib.rs).\n- [Block Production and Finalization in Polkadot](https://www.crowdcast.io/e/polkadot-block-production) -\n  An explanation of how BABE and GRANDPA work together to produce and finalize blocks on Kusama with\n  Bill Laboon.\n- [Block Production and Finalization in Polkadot: Understanding the BABE and GRANDPA Protocols](https://www.youtube.com/watch?v=1CuTSluL7v4&t=4s) -\n  An academic talk by Bill Laboon, given at MIT Cryptoeconomic Systems 2020, describing Polkadot's\n  hybrid consensus model in-depth."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#hashing-algorithm", "page_title": "Cryptography on Polkadot", "index": 0, "depth": 2, "title": "Hashing Algorithm", "anchor": "hashing-algorithm", "start_char": 404, "end_char": 667, "estimated_token_count": 66, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Hashing Algorithm\n\nThe hashing algorithm used in Polkadot is\n[Blake2b](<https://en.wikipedia.org/wiki/BLAKE_(hash_function)>). Blake2 is considered to be a very fast cryptographic hash function that is also used in the cryptocurrency [Zcash](https://z.cash)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#keypairs-and-signing", "page_title": "Cryptography on Polkadot", "index": 1, "depth": 2, "title": "Keypairs and Signing", "anchor": "keypairs-and-signing", "start_char": 667, "end_char": 1676, "estimated_token_count": 224, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Keypairs and Signing\n\nPolkadot uses Schnorrkel/Ristretto x25519 (\"sr25519\") as its key derivation and signing algorithm.\n\nSr25519 is based on the same underlying [Curve25519](https://en.wikipedia.org/wiki/Curve25519) as\nits EdDSA counterpart, [Ed25519](https://en.wikipedia.org/wiki/EdDSA#Ed25519). However, it uses\nSchnorr signatures instead of the EdDSA scheme. Schnorr signatures bring some noticeable benefits\nover the ECDSA/EdDSA schemes. For one, it is more efficient and still retains the same feature set\nand security assumptions. Additionally, it allows for native multisignature through\n[signature aggregation](https://bitcoincore.org/en/2017/03/23/schnorr-signature-aggregation/).\n\nThe names Schnorrkel and Ristretto come from the two Rust libraries that implement this scheme, the\n[Schnorrkel](https://github.com/w3f/schnorrkel) library for Schnorr signatures and the\n[Ristretto](https://ristretto.group/ristretto.html) library that makes it possible to use cofactor-8\ncurves like Curve25519."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#keys", "page_title": "Cryptography on Polkadot", "index": 2, "depth": 2, "title": "Keys", "anchor": "keys", "start_char": 1676, "end_char": 1833, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Keys\n\nPublic and private keys are an important aspect of most crypto-systems and an essential component\nthat enables blockchains like Polkadot to exist."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#account-keys", "page_title": "Cryptography on Polkadot", "index": 3, "depth": 3, "title": "Account Keys", "anchor": "account-keys", "start_char": 1833, "end_char": 2485, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Account Keys\n\nAccount keys are keys that are meant to control funds. They can be either:\n\n- The vanilla `ed25519` implementation using Schnorr signatures.\n- The Schnorrkel/Ristretto `sr25519` variant using Schnorr signatures.\n- ECDSA signatures on secp256k1\n\nThere are no differences in security between `ed25519` and `sr25519` for simple signatures. We\nexpect `ed25519` to be much better supported by commercial HSMs for the foreseeable future. At the\nsame time, `sr25519` makes implementing more complex protocols safer. In particular, `sr25519` comes\nwith safer version of many protocols like HDKD common in the Bitcoin and Ethereum ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#stash-and-staking-proxy-keys", "page_title": "Cryptography on Polkadot", "index": 4, "depth": 3, "title": "Stash and Staking Proxy Keys", "anchor": "stash-and-staking-proxy-keys", "start_char": 2485, "end_char": 4637, "estimated_token_count": 445, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Stash and Staking Proxy Keys\n\nWhen we talk about stash and staking proxy keys, we usually talk about them in the context of\nrunning a validator or nominating, but they are useful concepts for all users to know. Both keys are\ntypes of account keys. They are distinguished by their intended use, not by an underlying\ncryptographic difference. All the info mentioned in the parent section applies to these keys. When\ncreating new staking proxy or stash keys, all cryptography supported by account keys are an\navailable option.\n\nThe staking proxy key is a semi-online key that will be in the direct control of a user, and used to\nsubmit manual extrinsics. For validators or nominators, this means that the proxy key will be used\nto start or stop validating or nominating. Proxy keys should hold some native tokens to pay for\nfees, but they should not be used to hold huge amounts or life savings. Since they will be exposed\nto the internet with relative frequency, they should be treated carefully and occasionally replaced\nwith new ones.\n\nThe stash key is a key that will, in most cases, be a cold wallet, existing on a piece of paper in a\nsafe or protected by layers of hardware security. It should rarely, if ever, be exposed to the\ninternet or used to submit extrinsics. The stash key is intended to hold a large amount of funds. It\nshould be thought of as a saving's account at a bank, which ideally is only ever touched in urgent\nconditions. Or, perhaps a more apt metaphor is to think of it as buried treasure, hidden on some\nrandom island and only known by the pirate who originally hid it.\n\nSince the stash key is kept offline, it must be set to have its funds bonded to a particular staking\nproxy. For non-spending actions, the staking proxy has the funds of the stash behind it. For\nexample, in nominating, staking, or voting, the proxy can indicate its preference with the weight of\nthe stash. It will never be able to actually move or claim the funds in the stash key. However, if\nsomeone does obtain your proxy key, they could use it for [slashable behavior](./learn-offenses.md),\nso you should still protect it and change it regularly."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#session-keys", "page_title": "Cryptography on Polkadot", "index": 5, "depth": 3, "title": "Session Keys", "anchor": "session-keys", "start_char": 4637, "end_char": 5557, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Session Keys\n\nSession keys are hot keys that must be kept online by a validator to perform network operations.\nSession keys are typically generated in the client, although they don't have to be. They are _not_\nmeant to control funds and should only be used for their intended purpose. They can be changed\nregularly; your staking proxy only need to create a certificate by signing a session public key and\nbroadcast this certificate via an extrinsic.\n\nPolkadot uses six session keys:\n\n- Authority Discovery: sr25519\n- BABE: sr25519\n- BEEFY: ecdsa\n- GRANDPA: ed25519\n- Parachain Assignment: sr25519\n- Parachain Validator: ed25519\n\nBABE requires keys suitable for use in a [Verifiable Random Function](#vrf) as well as for digital\nsignatures. Sr25519 keys have both capabilities and so are used for BABE.\n\nIn the future, we plan to use a BLS key for GRANDPA because it allows for more efficient signature\naggregation."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#faq-about-keys", "page_title": "Cryptography on Polkadot", "index": 6, "depth": 3, "title": "FAQ about Keys", "anchor": "faq-about-keys", "start_char": 5557, "end_char": 10219, "estimated_token_count": 903, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### FAQ about Keys\n\n#### Why was `ed25519` selected over `secp256k1`?\n\nThe original key derivation cryptography that was implemented for Polkadot and Substrate chains was\n`ed25519`, which is a Schnorr signature algorithm implemented over the Edward's Curve 25519 (so\nnamed due to the parameters of the curve equation).\n\nMost cryptocurrencies, including Bitcoin and Ethereum, currently use ECDSA signatures on the\nsecp256k1 curve. This curve is considered much more secure than NIST curves, which\n[have possible backdoors from the NSA](#appendix-a-on-the-security-of-curves). The Curve25519 is\nconsidered possibly _even more_ secure than this one and allows for easier implementation of Schnorr\nsignatures. A recent patent expiration on it has made it the preferred choice for use in Polkadot.\n\nThe choice of using Schnorr signatures over using ECDSA is not so cut and dried. Jeff Burdges (a\nWeb3 researcher) provides additional details on the decision in this\n[research post](https://research.web3.foundation/Polkadot/security/keys) on the topic:\n\n!!!info \"Choosing Schnorr signatures over ECDSA signatures\"\n    There is one sacrifice we make by choosing Schnorr signatures over ECDSA signatures for account keys: Both require 64 bytes, but only ECDSA signatures communicate their public key. There are obsolete Schnorr variants that support recovering the public key from a signature, but they break important functionality like hierarchical deterministic key derivation. In consequence, Schnorr signatures often take an extra 32 bytes for the public key.\n\nBut ultimately the benefits of using Schnorr signatures outweigh the tradeoffs, and future\noptimizations may resolve the inefficiencies pointed out in the quote above.\n\n#### What is `sr25519` and where did it come from?\n\nSome context: The Schnorr signatures over the Twisted Edward's Curve25519 are considered secure,\nhowever Ed25519 has not been completely devoid of its bugs. Most notably,\n[Monero and all other CryptoNote currencies](https://www.getmonero.org/2017/05/17/disclosure-of-a-major-bug-in-cryptonote-based-currencies.html)\nwere vulnerable to a double spend exploit that could have potentially led to undetected, infinite\ninflation.\n\nThese exploits were due to one peculiarity in Ed25519, which is known as its cofactor of 8. The\ncofactor of a curve is an esoteric detail that could have dire consequences for the security of\nimplementation of more complex protocols.\n\nConveniently, [Mike Hamburg's Decaf paper](https://www.shiftleft.org/papers/decaf/index.xhtml)\nprovides a possible path forward to solving this potential bug. Decaf is basically a way to take\nTwisted Edward's Curves cofactor and mathematically change it with little cost to performance and\ngains to security.\n\nThe Decaf paper approach by the [Ristretto Group](https://ristretto.group/) was extended and\nimplemented in Rust to include cofactor-8 curves like the Curve25519 and makes Schnorr signatures\nover the Edward's curve more secure.\n\nWeb3 Foundation has implemented a Schnorr signature library using the more secure Ristretto\ncompression over the Curve25519 in the [Schnorrkel](https://github.com/w3f/schnorrkel) repository.\nSchnorrkel implements related protocols on top of this curve compression such as HDKD, MuSig, and a\nverifiable random function (VRF). It also includes various minor improvements such as the hashing\nscheme STROBE that can theoretically process huge amounts of data with only one call across the Wasm\nboundary.\n\nThe implementation of Schnorr signatures that is used in Polkadot and implements the Schnorrkel\nprotocols over the Ristretto compression of the Curve25519 is known as **sr25519**.\n\n#### Are BLS signatures used in Polkadot?\n\nNot yet, but they will be. BLS signatures allow more efficient signature aggregation. Because\nGRANDPA validators are usually signing the same thing (e.g. a block), it makes sense to aggregate\nthem, which can allow for other protocol optimizations.\n\n!!!info \"From the BLS library's README\"\n    Boneh-Lynn-Shacham (BLS) signatures have slow signing, very slow verification, require slow and much less secure pairing friendly curves, and tend towards dangerous malleability. Yet, BLS permits a diverse array of signature aggregation options far beyond any other known signature scheme, which makes BLS a preferred scheme for voting in consensus algorithms and for threshold signatures.\n\nEven though Schnorr signatures allow for signature aggregation, BLS signatures are much more\nefficient in some fashions. For this reason it will be one of the session keys that will be used by\nvalidators on the Polkadot network and critical to the GRANDPA finality gadget."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#randomness", "page_title": "Cryptography on Polkadot", "index": 7, "depth": 2, "title": "Randomness", "anchor": "randomness", "start_char": 10219, "end_char": 11482, "estimated_token_count": 268, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Randomness\n\nRandomness in Proof of Stake blockchains is important for a fair and unpredictable distribution of\nvalidator responsibilities. Computers are bad at random numbers because they are deterministic\ndevices (the same input always produces the same output). What people usually call random numbers on\na computer (such as in a gaming application), are _pseudo-random_ - that is, they depend on a\nsufficiently random _seed_ provided by the user or another type of _oracle_, like a\n[weather station for atmospheric noise](https://www.random.org/randomness/), your\n[heart rate](https://mdpi.altmetric.com/details/47574324), or even\n[lava lamps](https://en.wikipedia.org/wiki/Lavarand), from which it can generate a series of\nseemingly-random numbers. But given the same seed, the same sequence will always be generated.\n\nThough, these inputs will vary based on time and space, and it would be impossible to get the same\nresult into all the nodes of a particular blockchain around the world. If nodes get different inputs\non which to build blocks, forks happen. Real-world entropy is not suitable for use as a seed for\nblockchain randomness.\n\nThere are two main approaches to blockchain randomness in production today: `RANDAO` and `VRF`.\nPolkadot uses VRF."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#vrf", "page_title": "Cryptography on Polkadot", "index": 8, "depth": 3, "title": "VRF", "anchor": "vrf", "start_char": 11482, "end_char": 14005, "estimated_token_count": 553, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### VRF\n\nA verifiable random function (VRF) is a mathematical operation that takes some input and produces a\nrandom number along with a proof of authenticity that this random number was generated by the\nsubmitter. The proof can be verified by any challenger to ensure the random number generation is\nvalid.\n\nThe VRF used in Polkadot is roughly the same as the one used in Ouroboros Praos. Ouroboros\nrandomness is secure for block production and works well for [BABE](learn-consensus.md#block-production-babe). Where\nthey differ is that Polkadot's VRF does not depend on a central clock (the problem becomes - whose\ncentral clock?), rather, it depends on its own past results to determine present and future results,\nand it uses slot numbers as a clock emulator, estimating time.\n\n#### Here's how it works in detail:\n\nSlots are discrete units of time six seconds in length. Each slot can contain a block, but may not.\nSlots make up [epochs](../general/glossary.md#epoch) - on Polkadot, 2400 slots make one epoch,\nwhich makes epochs four hours long.\n\nIn every slot, each validator \"rolls a die\". They execute a function (the VRF) that takes as input\nthe following:\n\n- **The \"secret key\",** a key specifically made for these die rolls.\n- **An epoch randomness value,** which is the hash of VRF values from the blocks in the epoch before\n  last (N-2), so past randomness affects the current pending randomness (N).\n- **The slot number.**\n\n![VRF_babe](../assets/VRF_babe.png)\n\nThe output is two values: a `RESULT` (the random value) and a `PROOF` (a proof that the random value\nwas generated correctly).\n\nThe `RESULT` is then compared to a _threshold_ defined in the implementation of the protocol\n(specifically, in the Polkadot Host). If the value is less than the threshold, then the validator\nwho rolled this number is a viable block production candidate for that slot. The validator then\nattempts to create a block and submits this block into the network along with the previously\nobtained `PROOF` and `RESULT`. Under VRF, every validator rolls a number for themselves, checks it\nagainst a threshold, and produces a block if the random roll is under that threshold.\n\nThe astute reader will notice that due to the way this works, some slots may have no validators as\nblock producer candidates because all validator candidates rolled too high and missed the threshold.\nWe clarify how we resolve this issue and make sure that Polkadot block times remain near\nconstant-time in the wiki page on [consensus](learn-consensus.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#randao", "page_title": "Cryptography on Polkadot", "index": 9, "depth": 3, "title": "RANDAO", "anchor": "randao", "start_char": 14005, "end_char": 14532, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### RANDAO\n\nAn alternative method for getting randomness on-chain is the\n[RANDAO](https://github.com/randao/randao) method from Ethereum. RANDAO requires each validator to\nprepare by performing many thousands of hashes on some seed. Validators then publish the final hash\nduring a round and the random number is derived from every participant's entry into the game. As\nlong as one honest validator participates, the randomness is considered secure (non-economically\nviable to attack). RANDAO is optionally augmented with VDF."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#vdfs", "page_title": "Cryptography on Polkadot", "index": 10, "depth": 3, "title": "VDFs", "anchor": "vdfs", "start_char": 14532, "end_char": 15314, "estimated_token_count": 146, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### VDFs\n\n[Verifiable Delay Functions](https://vdfresearch.org/) are computations that take a prescribed\nduration of time to complete, even on parallel computers. They produce unique output that can be\nindependently and efficiently verified in a public setting. By feeding the result of RANDAO into a\nVDF, a delay is introduced that renders any attacker's attempt at influencing the current randomness\nobsolete.\n\nVDFs will likely be implemented through ASIC devices that need to be run separately from the other\ntypes of nodes. Although only one is enough to keep the system secure, and they will be open source\nand distributed at nearly no charge, running them is neither cheap nor incentivized, producing\nunnecessary friction for users of the blockchains opting for this method."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#resources", "page_title": "Cryptography on Polkadot", "index": 11, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 15314, "end_char": 16317, "estimated_token_count": 239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\n- [Key discovery attack on BIP32-Ed25519](https://web.archive.org/web/20210513183118/https://forum.w3f.community/t/key-recovery-attack-on-bip32-ed25519/44) -\n  Archive of forum post detailing a potential attack on BIP32-Ed25519. A motivation for transition\n  to the sr25519 variant.\n- [Account signatures and keys in Polkadot](https://research.web3.foundation/Polkadot/security/keys) -\n  Research post by Web3 researcher Jeff Burdges.\n- [Are Schnorr signatures quantum computer resistant?](https://bitcoin.stackexchange.com/questions/57965/are-schnorr-signatures-quantum-computer-resistant/57977#57977)\n- [Polkadot's research on blockchain randomness and sortition](https://research.web3.foundation/Polkadot/protocols/block-production) -\n  contains reasoning for choices made along with proofs\n- [Discussion on Randomness used in Polkadot](https://github.com/use-ink/ink/issues/57) - W3F\n  researchers discuss the randomness in Polkadot and when it is usable and under which assumptions."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-cryptography", "url": "https://developer.polkadot.com/wiki/learn/learn-cryptography/#appendix-a-on-the-security-of-curves", "page_title": "Cryptography on Polkadot", "index": 12, "depth": 2, "title": "Appendix A: On the security of curves", "anchor": "appendix-a-on-the-security-of-curves", "start_char": 16317, "end_char": 17830, "estimated_token_count": 314, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9103e34fed20fedb9ad90714fa4d6a15366d1a65cc5b7ce885cdc5b9ad6d0b3e", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Appendix A: On the security of curves\n\n!!!note \"From the [Introduction of Curve25519](https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt#n10) into `libssl`\"\n    The reason is the following: During summer of 2013, revelations from ex- consultant at [the] NSA Edward Snowden gave proof that [the] NSA willingly inserts backdoors into software, hardware components and published standards. While it is still believed that the mathematics behind ECC (Elliptic-curve cryptography) are still sound and solid, some people (including Bruce Schneier [SCHNEIER]), showed their lack of confidence in NIST-published curves such as nistp256, nistp384, nistp521, for which constant parameters (including the generator point) are defined without explanation. It is also believed that [the] NSA had a word to say in their definition. These curves are not the most secure or fastest possible for their key sizes [DJB], and researchers think it is possible that NSA have ways of cracking NIST curves. It is also interesting to note that SSH belongs to the list of protocols the NSA claims to be able to eavesdrop. Having a secure replacement would make passive attacks much harder if such a backdoor exists.\n    \n    However an alternative exists in the form of Curve25519. This algorithm has been proposed in 2006 by\n    DJB [Curve25519]. Its main strengths are its speed, its constant-time run time (and resistance against side-channel attacks), and its lack of nebulous hard-coded constants."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-elastic-scaling", "url": "https://developer.polkadot.com/wiki/learn/learn-elastic-scaling/#elastic-scaling-benefits", "page_title": "Parallel Computation (Elastic Scaling)", "index": 0, "depth": 2, "title": "Elastic Scaling Benefits", "anchor": "elastic-scaling-benefits", "start_char": 3801, "end_char": 6120, "estimated_token_count": 408, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4c8d53bdbc0b581e2354067cecc71267c2b0d83e292271c75e7100ae6837c108", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Elastic Scaling Benefits\n\n- **Higher throughput**: Parachains can utilize multiple cores simultaneously, enabling much faster transaction processing. Previously, parachains were limited to one block per Relay Chain block. They can handle much greater capacity with elastic scaling, significantly increasing overall performance.\n\n- **Latency**: Elastic scaling reduces latency significantly, enabling faster block production and processing. For example, parachains on Kusama can reduce latency to 2 seconds with three cores today and potentially achieve 500ms latency with 12 cores in 2025, ensuring quicker response times for real-time applications.\n\n- **Cost efficiency for applications**: Applications only pay for the resources they use, saving money and reducing upfront costs. Coretime can be purchased dynamically - by the block, hour, or month. This is perfect for apps with bursts in activity, like online auctions or sudden social media surges.\n\n- **Flexible scaling for new applications**: Elastic scaling allows applications to start small with On-Demand Coretime and scale up seamlessly beyond one core when demand grows. This prevents over-allocation (wasting money on unused resources) or under-allocation (causing performance issues), both common in traditional setups.\n\n- **Resource optimization**: Parachains can load-balance their core usage by leasing additional cores when demand increases and releasing them when activity subsides. Secondary markets for coretime also ensure that unused resources are reallocated efficiently, optimizing overall system performance.\n\n- **Improved user experience**: End-users enjoy smooth and reliable performance, even during peak traffic. Applications no longer face the risk of slowing down or freezing when demand spikes, ensuring a consistent, high-quality experience.\n\nElastic scaling increases the throughput of a parachain. Polkadot’s approach to scaling has traditionally been to scale via multiple parachains, called “horizontal scaling” or “horizontal sharding” through cross-consensus messaging (XCM). However, setting up and parallelizing processes over multiple parachains and opening channels via XCM takes time and effort. With elastic scaling, projects can benefit from higher throughput before parallelizing processes over multiple parachains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-elastic-scaling", "url": "https://developer.polkadot.com/wiki/learn/learn-elastic-scaling/#elastic-scaling-use-cases", "page_title": "Parallel Computation (Elastic Scaling)", "index": 1, "depth": 2, "title": "Elastic Scaling Use Cases", "anchor": "elastic-scaling-use-cases", "start_char": 6120, "end_char": 7511, "estimated_token_count": 261, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4c8d53bdbc0b581e2354067cecc71267c2b0d83e292271c75e7100ae6837c108", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Elastic Scaling Use Cases\n\n- **\"Bursty” applications**: Many applications experience sporadic spikes in activity rather than constant demand, e.g., Gaming, DeFi, Auctions, Messaging, Social Media, etc. With elastic scaling, these applications can acquire additional coretime during peak usage and release it during off-peak hours, optimizing performance while reducing costs.\n\n- **Growing applications & startups**: Startups and new projects often face unpredictable user growth. Elastic scaling allows them to start with minimal resources (e.g., a single core) and scale seamlessly as user demand increases before scaling horizontally, thus preventing overcommitting resources upfront. This ensures applications can grow efficiently while maintaining performance and cost-effectiveness.\n\n- **Large-scale IoT applications**: IoT systems require massive scalability to process data from millions of devices. Elastic scaling enables parachains to process high transaction volumes cost-effectively, while Polkadot’s model ensures the privacy and security needed in IoT environments.\n\n- **Real-time applications**: Some applications require low latency and real-time performance (e.g., gaming, payments / financial services, or data feeds). These benefit from elastic scaling’s ability to reduce latency down to 2s. This ensures smooth and reliable performance during high-demand scenarios."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-elastic-scaling", "url": "https://developer.polkadot.com/wiki/learn/learn-elastic-scaling/#elastic-scaling-roadmap", "page_title": "Parallel Computation (Elastic Scaling)", "index": 2, "depth": 2, "title": "Elastic Scaling Roadmap", "anchor": "elastic-scaling-roadmap", "start_char": 7511, "end_char": 8186, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4c8d53bdbc0b581e2354067cecc71267c2b0d83e292271c75e7100ae6837c108", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Elastic Scaling Roadmap\n\nThe [elastic scaling implementation](https://github.com/paritytech/polkadot-sdk/issues/1829) will be\nrolled out in multiple phases. In the first phase, elastic scaling is set to work on parachains with\na trusted/permissioned collator set. With this restriction, it is possible to launch elastic scaling\nwithout changing the candidate receipt. After successfully implementing the first phase, changes can\nbe made to the candidate receipt so the collator set can be untrusted/permissionless again. The\nfinal phase will feature full integration with the Cumulus framework, enabling parachains to be\nconfigured to access multiple cores continuously."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-elastic-scaling", "url": "https://developer.polkadot.com/wiki/learn/learn-elastic-scaling/#technical-considerations", "page_title": "Parallel Computation (Elastic Scaling)", "index": 3, "depth": 2, "title": "Technical Considerations", "anchor": "technical-considerations", "start_char": 8186, "end_char": 8693, "estimated_token_count": 98, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4c8d53bdbc0b581e2354067cecc71267c2b0d83e292271c75e7100ae6837c108", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Technical Considerations\n\nAssuming a constant number of cores, from the relay chain side, elastic scaling will not see major\nupgrades as a parachain will use multiple existing cores instead of just one. However, from the\nparachain side, collators must produce more parablocks per unit of time, implying that technical\nspecifications for collators will likely increase.\n\nFor more advanced technical challenges, see the\n[Elastic Scaling GitHub PR](https://github.com/paritytech/polkadot-sdk/issues/1829)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-elastic-scaling", "url": "https://developer.polkadot.com/wiki/learn/learn-elastic-scaling/#elastic-scaling-faq", "page_title": "Parallel Computation (Elastic Scaling)", "index": 4, "depth": 2, "title": "Elastic Scaling FAQ", "anchor": "elastic-scaling-faq", "start_char": 8693, "end_char": 9363, "estimated_token_count": 161, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4c8d53bdbc0b581e2354067cecc71267c2b0d83e292271c75e7100ae6837c108", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Elastic Scaling FAQ\n\n- Is there a maximum number of cores per rollup? There is no maximum number of cores per rollup defined. However, it depends on your goals. If you wish to achieve 500ms blocks, you can do that with 12 cores. But it will not be efficient; you can only use a fraction (up to 25%) of the reference CPU time. For max TPS, there is a limitation of three cores.\n\n- Can multiple cores be reserved in bulk? Yes, you can do a batch call to acquire multiple cores. For more info, see [the coretime FAQ](./learn-agile-coretime.md#agile-coretime-faq).\n\n- Are some cores reserved only for elastic scaling? No, and you can combine bulk with on-demand coretime."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-DOT-KSM-bridge/#transfer-dot-to-kusama-asset-hub", "page_title": "Polkadot-JS DOT and KSM Bridge Guides", "index": 0, "depth": 2, "title": "Transfer DOT to Kusama Asset Hub", "anchor": "transfer-dot-to-kusama-asset-hub", "start_char": 627, "end_char": 3379, "estimated_token_count": 612, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4c488d8bd346dd13d39ca90e3f32b4c8bfe307f45f0c045c0076441683f9a2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transfer DOT to Kusama Asset Hub\n\nThis tutorial shows how to transfer DOT on Polkadot Asset Hub to Kusama Asset Hub. The first step is\nto ensure that your account on Polkadot Asset Hub has enough DOT to cover the XCM transfer fee and\nthe bridge fee (which is around 2 DOT). The next step is to craft an XCM message to be sent from\nPolkadot Asset Hub.\n\n[BagPipes (formerly called xcmsend)](https://xcmsend.com/#/builder) is an opensource application\nthat lets you create workflows in a drag and drop style interface in order to build execution flows\nof cross chain assets transfers using XCM. Check [Bagpipes docs](https://docs.bagpipes.io/) for more\ninformation on how to create workflows for crafting XCM transfers. The snapshot below shows a\nworkflow on BagPipes that is designed to send 3 DOT from an account Polkadot Asset Hub to Kusama\nAsset Hub.\n\n![BagPipes Snapshot DOT Transfer](../assets/bridge-hub/PAH-to-KAH-DOT-transfer.png)\n\nThis workflow crafts an XCM transfer as shown below.\n\n```\n{\n  \"isSigned\": false,\n  \"method\": {\n    \"args\": {\n      \"dest\": {\n        \"V3\": {\n          \"parents\": \"2\",\n          \"interior\": {\n            \"X2\": [\n              {\n                \"GlobalConsensus\": \"Kusama\"\n              },\n              {\n                \"Parachain\": \"1,000\"\n              }\n            ]\n          }\n        }\n      },\n      \"beneficiary\": {\n        \"V3\": {\n          \"parents\": \"0\",\n          \"interior\": {\n            \"X1\": {\n              \"AccountId32\": {\n                \"network\": null,\n                \"id\": \"this has to be the intended address\"\n              }\n            }\n          }\n        }\n      },\n      \"assets\": {\n        \"V3\": [\n          {\n            \"id\": {\n              \"Concrete\": {\n                \"parents\": \"1\",\n                \"interior\": \"Here\"\n              }\n            },\n            \"fun\": {\n              \"Fungible\": \"30,000,000,000\"\n            }\n          }\n        ]\n      },\n      \"fee_asset_item\": \"0\",\n      \"weight_limit\": \"Unlimited\"\n    },\n    \"method\": \"limitedReserveTransferAssets\",\n    \"section\": \"polkadotXcm\"\n  }\n}\n```\n\nOnce this [extrinsic](https://assethub-polkadot.subscan.io/extrinsic/6028374-2) is signed and\nsubmitted, it is broadcast to Polkadot Asset Hub nodes. As this is a reserve asset transfer, the DOT\nis transferred to the destination's sovereign account on Polkadot Asset Hub and\n[DOT is issued](https://assethub-kusama.subscan.io/extrinsic/6758392-0?event=6758392-1) as a foreign\nasset and deposited onto the destination account on Kusama Asset Hub. The foreign asset balances of\nany account on Kusama Asset Hub can be queried on-chain through the `foreignAssets`pallet as shown\nbelow.\n\n![DOT Balance Kusama Asset Hub](../assets/bridge-hub/KAH-DOT-Balance.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-DOT-KSM-bridge/#transfer-dot-from-kusama-asset-hub-to-polkadot-asset-hub", "page_title": "Polkadot-JS DOT and KSM Bridge Guides", "index": 1, "depth": 2, "title": "Transfer DOT from Kusama Asset Hub to Polkadot Asset Hub", "anchor": "transfer-dot-from-kusama-asset-hub-to-polkadot-asset-hub", "start_char": 3379, "end_char": 4690, "estimated_token_count": 258, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4c488d8bd346dd13d39ca90e3f32b4c8bfe307f45f0c045c0076441683f9a2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transfer DOT from Kusama Asset Hub to Polkadot Asset Hub\n\nThis tutorial shows how to transfer DOT on Kusama Asset Hub to Polkadot Asset Hub. The first step is\nto ensure that your account on Kusama Asset Hub has enough KSM to cover the XCM transfer fee and the\nbridge fee (which is around 0.4 KSM). The next step is to craft an XCM message to be sent from\nKusama Asset Hub.\n\nDOT which is registered as a foreign asset on Kusama Asset Hub can be transferred to Polkadot Asset\nHub through an extrinsic like the one below, whose call data is\n[`0x1f0b040202090200a10f04000101009e4e7009937c56d267338762a60ed004293afd40e7c2081847c12cb63c76a818040402010902000700e40b54020000000000`](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-asset-hub-rpc.polkadot.io#/extrinsics/decode/0x1f0b040202090200a10f04000101009e4e7009937c56d267338762a60ed004293afd40e7c2081847c12cb63c76a818040402010902000700e40b54020000000000).\n\n**_If you plan on reusing this extrinsic, ensure that you change the Account ID and the transfer\namount below._**\n\n![DOT transferred out from Kusama Asset Hub](../assets/bridge-hub/KAH-DOT-transfer-PAH.png)\n\nFor reference, this [extrinsic](https://assethub-kusama.subscan.io/extrinsic/7015118-2) is signed\nand submitted successfully, and the destination account on Polkadot Asset Hub received DOT."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-DOT-KSM-bridge/#transfer-ksm-to-polkadot-asset-hub", "page_title": "Polkadot-JS DOT and KSM Bridge Guides", "index": 2, "depth": 2, "title": "Transfer KSM to Polkadot Asset Hub", "anchor": "transfer-ksm-to-polkadot-asset-hub", "start_char": 4690, "end_char": 6218, "estimated_token_count": 350, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4c488d8bd346dd13d39ca90e3f32b4c8bfe307f45f0c045c0076441683f9a2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transfer KSM to Polkadot Asset Hub\n\nThis tutorial shows how to transfer KSM on Kusama Asset Hub to Polkadot Asset Hub. The first step is\nto ensure that your account on Kusama Asset Hub has enough KSM to cover the XCM transfer fee and the\nbridge fee (which is around 0.4 KSM). The next step is to craft an XCM message to be sent from\nKusama Asset Hub.\n\nThe XCM transfer extrinsic shown below can be accessed\n[here.](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-asset-hub-rpc.polkadot.io#/extrinsics/decode/0x1f08030202090200a10f03000101008479c8ea5480acca5a847133cd97a87801b6e698a98f2eab0e8e9d5c51b14a33030400010000070088526a740000000000)\n\n**_If you plan on reusing this extrinsic, ensure that you change the Account ID and the transfer\namount highlighted in the snapshot below._**\n\n![PJS Snapshot KSM Transfer](../assets/bridge-hub/KAH-PAH-KSM-Transfer-PJS-Extrinsic.png)\n\nOnce this [extrinsic](https://assethub-kusama.subscan.io/extrinsic/6761480-2) is signed and\nsubmitted, it is broadcast to Kusama Asset Hub nodes. As this is a reserve asset transfer, the KSM\nis transferred to the sovereign account on Kusama Asset Hub and\n[KSM is issued](https://assethub-polkadot.subscan.io/extrinsic/6031467-0?event=6031467-6) as a\nforeign asset and deposited onto the destination account on Kusama Asset Hub. The foreign asset\nbalances of any account on Kusama Asset Hub can be queried on-chain through the\n`foreignAssets`pallet as shown below.\n\n![KSM Balance on Polkadot Asset Hub](../assets/bridge-hub/PAH-KSM-Balance.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-DOT-KSM-bridge/#transfer-ksm-from-polkadot-asset-hub-to-kusama-asset-hub", "page_title": "Polkadot-JS DOT and KSM Bridge Guides", "index": 3, "depth": 2, "title": "Transfer KSM from Polkadot Asset Hub to Kusama Asset Hub", "anchor": "transfer-ksm-from-polkadot-asset-hub-to-kusama-asset-hub", "start_char": 6218, "end_char": 7420, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4c488d8bd346dd13d39ca90e3f32b4c8bfe307f45f0c045c0076441683f9a2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transfer KSM from Polkadot Asset Hub to Kusama Asset Hub\n\nThis tutorial shows how to transfer KSM on Polkadot Asset Hub to Kusama Asset Hub. The first step is\nto ensure that your account on Polkadot Asset Hub has enough DOT to cover the XCM transfer fee and\nthe bridge fee (which is around 2 DOT). The next step is to craft an XCM message to be sent from\nPolkadot Asset Hub.\n\nKSM which is registered as a foreign asset on Polkadot Asset Hub can be transferred to Kusama Asset\nHub through an extrinsic like the one below, whose call data is\n[`0x1f0b040202090300a10f04000101008479c8ea5480acca5a847133cd97a87801b6e698a98f2eab0e8e9d5c51b14a33040402010903000700a0db215d0000000000`](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/extrinsics/decode/0x1f0b040202090300a10f04000101008479c8ea5480acca5a847133cd97a87801b6e698a98f2eab0e8e9d5c51b14a33040402010903000700a0db215d0000000000)\n\n![KSM transferred out from Polkadot Asset Hub](../assets/bridge-hub/PAH-KSM-Transfer-KAH.png)\n\nFor reference, this [extrinsic](https://assethub-polkadot.subscan.io/extrinsic/6303823-2) was signed\nand submitted successfully, and the destination account on Kusama Asset Hub received KSM."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-DOT-KSM-bridge/#transfer-of-arbitrary-assets-between-polkadot-asset-hub-and-kusama-asset-hub", "page_title": "Polkadot-JS DOT and KSM Bridge Guides", "index": 4, "depth": 2, "title": "Transfer of arbitrary assets between Polkadot Asset Hub and Kusama Asset Hub", "anchor": "transfer-of-arbitrary-assets-between-polkadot-asset-hub-and-kusama-asset-hub", "start_char": 7420, "end_char": 9378, "estimated_token_count": 386, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4c488d8bd346dd13d39ca90e3f32b4c8bfe307f45f0c045c0076441683f9a2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transfer of arbitrary assets between Polkadot Asset Hub and Kusama Asset Hub\n\nThere are several requirements for an arbitrary token to be transferable between Polkadot and Kusama Asset Hub:\n\n- The asset must already be registered on each Asset Hub.\n- The destination account should exist on the destination chain (and hold a sufficient asset).\n- The asset transferred needs to be larger than the minimum balance specified by the asset.\n- The fee asset transferred needs to be larger than the minimum balance specified by the asset. For example, if DOT is\nused as fee asset from Polkadot Asset Hub to Kusama Asset Hub, the excess DOT will be deposited to the beneficiary\non Kusama Asset Hub. However, if the DOT is less that the minimum balance of DOT on Kusama Asset Hub, the transfer \nmight fail.\n- The destination account must hold fewer assets than the maximum number of assets allowed per account.\n\n!!!caution \"Avoid Asset Traps\"\nTo avoid issues on the receiving side for non-sufficient assets, make sure to call [pallet_assets::touch()](https://github.com/paritytech/polkadot-sdk/blob/0ef37c75401b78b61ed35ce27af8b964da27bb3c/substrate/frame/assets/src/lib.rs#L1531) or \n[pallet_assets::touch_other()](https://github.com/paritytech/polkadot-sdk/blob/0ef37c75401b78b61ed35ce27af8b964da27bb3c/substrate/frame/assets/src/lib.rs#L1616) effectively guaranteeing the ability to successfully receive and accept the bridged \nassets in your account on the destination chain. This eliminates issues like your account on destination not existing \nor not having enough ED or having reached the maximum limit of different assets it can hold. Without this sanity step, \nyou risk that the bridged assets will make their way to the destination chain but will not be accepted by your account, \nand instead get trapped in the Asset Trap on the destination chain. Technical users should dry run their transfer on\nthe destination chain to ensure a successful transfer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-dot-ksm-bridge", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-DOT-KSM-bridge/#transfer-of-erc-20-assets-between-polkadot-asset-hub-and-kusama-asset-hub", "page_title": "Polkadot-JS DOT and KSM Bridge Guides", "index": 5, "depth": 3, "title": "Transfer of ERC-20 assets between Polkadot Asset Hub and Kusama Asset Hub", "anchor": "transfer-of-erc-20-assets-between-polkadot-asset-hub-and-kusama-asset-hub", "start_char": 9378, "end_char": 9971, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fc4c488d8bd346dd13d39ca90e3f32b4c8bfe307f45f0c045c0076441683f9a2", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Transfer of ERC-20 assets between Polkadot Asset Hub and Kusama Asset Hub\n\nERC-20 token transfers are supported between Polkadot Asset Hub and Kusama Asset Hub.\n\nUsers can use the [Snowbridge UI](https://app.snowbridge.network/kusama) to transfer ERC-20 tokens from Polkadot Asset \nHub to Kusama Asset Hub and vice versa. The fee asset is the native token of the source chain (DOT from Polkadot Asset \nHub to Kusama Asset Hub and KSM from Kusama Asset Hub to Polkadot Asset Hub). The Snowbridge UI does all the necessary \nchecks and dry runs the transfer to ensure a successful transfer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-multisig", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-multisig/#creating-a-multisig-account", "page_title": "Polkadot-JS Multisig Guides", "index": 0, "depth": 2, "title": "Creating a Multisig Account", "anchor": "creating-a-multisig-account", "start_char": 355, "end_char": 614, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5691a0c1090f7eed60106e966201c9a8e5d5a46fbb8e7079416eed554730a5c6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating a Multisig Account\n\nCheck the \"How to create a multisig account\" section on\n[this page](how-to/create-multisig-account.md).\nWe recommend trying out the tutorial on\n[Westend network](../../smart-contracts/connect.md#westend) - Polkadot's testnet."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-multisig", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-multisig/#multisig-transactions-with-accounts-tab", "page_title": "Polkadot-JS Multisig Guides", "index": 1, "depth": 2, "title": "Multisig Transactions with Accounts Tab", "anchor": "multisig-transactions-with-accounts-tab", "start_char": 614, "end_char": 1179, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5691a0c1090f7eed60106e966201c9a8e5d5a46fbb8e7079416eed554730a5c6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Multisig Transactions with Accounts Tab\n\n!!!info \"Walkthrough Video Tutorial\"\n    See [this video tutorial](https://www.youtube.com/watch?v=-cPiKMslZqI) to learn how to transact with a multisig account using the Accounts Tab in the [Polkadot Developer Interface](https://polkadot.js.org/apps/#/accounts).\n\nYou can create a multisig account directly on the Accounts Tab of the\n[Polkadot Developer Interface](https://polkadot.js.org/apps/#/accounts), and use this account to send funds. See\n[this article](how-to/create-multisig-account.md)\nfor more information."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-multisig", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-multisig/#multisig-transactions-with-extrinsic-tab", "page_title": "Polkadot-JS Multisig Guides", "index": 2, "depth": 2, "title": "Multisig Transactions with Extrinsic Tab", "anchor": "multisig-transactions-with-extrinsic-tab", "start_char": 1179, "end_char": 3186, "estimated_token_count": 481, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5691a0c1090f7eed60106e966201c9a8e5d5a46fbb8e7079416eed554730a5c6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Multisig Transactions with Extrinsic Tab\n\nSee the video tutorial below to learn about multi-signature accounts and how you can transact with\nthem using the Polkadot Developer Interface.\n\n<div className=\"row\">\n<div className=\"col text--center\">\n    <a href=\"https://youtu.be/Qv_nJVcvQr8?t=2109\">\n      <img src=\"https://img.youtube.com/vi/Qv_nJVcvQr8/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://youtu.be/Qv_nJVcvQr8?t=2109\">Transact with Multi-signature Accounts</a>\n    </p>\n  </div>\n</div>\n\nThere are three types of actions you can take with a multisig account:\n\n- Executing a call `asMulti`. This is used to begin or end a multisig transaction.\n- Approving a call `approveAsMulti`. This is used to approve an extrinsic and pass-on to the next\n  signatory (see [example below](#example-using-multisig-accounts) for more information).\n- Cancelling a call `cancelAsMulti`.\n\n!!!info\n    Check out [this page](https://polkadot.js.org/docs/substrate/extrinsics#multisig) for more information about the actions you can take with a multi-signature account.\n\nIn scenarios where only a single approval is needed, a convenience method `as_multi_threshold_1`\nshould be used. This function takes only the other signatories and the raw call as arguments. Note\nthat the Polkadot Developer Interface does not have integration for this call because it is not possible to create\nmultisig accounts with `threshold=1`. If you want to create a multisig with threshold 1, you can use\n[txwrapper-core](https://github.com/paritytech/txwrapper-core), which is developed and supported by\nParity Technologies. There is a detailed\n[multisig example](https://github.com/paritytech/txwrapper-core/tree/main/packages/txwrapper-examples/multisig)\nthat you can try out and change to see how it works.\n\nHowever, in anything but the simple one approval case, you will likely need more than one of the\nsignatories to approve the call before finally executing it."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-multisig", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-multisig/#multisig-call-deposit", "page_title": "Polkadot-JS Multisig Guides", "index": 3, "depth": 3, "title": "Multisig Call Deposit", "anchor": "multisig-call-deposit", "start_char": 3186, "end_char": 4276, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5691a0c1090f7eed60106e966201c9a8e5d5a46fbb8e7079416eed554730a5c6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Multisig Call Deposit\n\nWhen you create a new multi-sig call, you will need to place a\n[deposit](../general/chain-state-values.md). The deposit stays locked until\nthe call is executed. This deposit is to establish an economic cost on the storage space that the\nmultisig call takes up in the chain state and discourage users from creating multisig calls that\nnever get executed. The deposit will be reserved in the call initiator's account.\n\nThe deposit is dependent on the `threshold` parameter and is calculated as follows:\n\n```\nDeposit = depositBase + threshold * depositFactor\n```\n\nWhere [`depositBase`](../general/chain-state-values.md) and\n[`depositFactor`](../general/chain-state-values.md) are chain constants set\nin the runtime code.\n\nThe other signatory accounts should have enough funds to pay for the transaction fees associated\nwith approving the multisig call. The deposit is for the call; that is, other signatories will not\nneed to place additional deposits. Once the multisig call is executed or rejected, the deposit is\nreleased on the account that initiated the call."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-multisig", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-multisig/#example-using-multisig-accounts", "page_title": "Polkadot-JS Multisig Guides", "index": 4, "depth": 3, "title": "Example using Multisig Accounts", "anchor": "example-using-multisig-accounts", "start_char": 4276, "end_char": 7803, "estimated_token_count": 774, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5691a0c1090f7eed60106e966201c9a8e5d5a46fbb8e7079416eed554730a5c6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Example using Multisig Accounts\n\n!!!info \"Walk-through video tutorial\"\n    See [this video tutorial](https://www.youtube.com/watch?v=T0vIuJcTJeQ) to learn how to transact with a multisig account using the Extrinsic Tab in the [Polkadot Developer Interface](https://polkadot.js.org/apps/#/explorer).\n\n![multisig diagram](../assets/multisig-diagram.png)\n\nLet's consider an example of a multisig on Polkadot with a threshold of 2 and 3 signers: Charlie,\nDan, and Eleanor. First, Charlie will create the call on-chain by calling the `multisig.asMulti`\nextrinsic with the raw call, in this case, a balance transfer (`balances.transferKeepAlive`\nextrinsic) from multisig CDE to Frank's account. When doing this, Charlie will have to deposit\n`DepositBase + (2 * DepositFactor) = 20.152 DOT` while he waits for either Dan or Eleanor also to\napprove the balance transfer call using the `multisig.approveAsMulti` or the `multisig.asMulti`\nextrinsics.\n\nIf Dan submits the `multisig.approveAsMulti` extrinsic, he approves Charlie's call but he passes on\nthe final approval to Eleanor. So, although the multisig has threshold 2, in this case all 3/3\nsignatories need to participate in the transaction approval. Eleanor will need to submit a\n`multisig.asMulti` or `multisig.approveAsMulti` extrinsic to transfer funds from CDE to Frank.\n\nAlternatively, Dan or Eleanor can just submit a `multisig.asMulti` extrinsic after Charlie to\ntransfer the funds. In this case, 2/3 signatories will participate in the transaction approval. The\naccounts approving Charlie's call will not need to place the deposit, and Charlie will receive his\ndeposit back once the transfer is successful or canceled. To cancel the transaction, Dan or Eleanor\ncan use the `multisig.cancelAsMulti` extrinsic.\n\nNote that multisigs are **deterministic**, which means that multisig addresses are generated from\nthe addresses of signers and the threshold of the multisig wallet. No matter the order of the\nsignatories' accounts, the multisig will always have the same address because accounts' addresses\nare sorted in ascending order.\n\n!!!note \"Addresses that are provided to the multisig wallet are sorted\"\n    Public keys of signers' wallets are compared byte-for-byte and sorted ascending before being used to generate the multisig address. For example, consider the scenario with three addresses, A, B, and C, starting with `5FUGT`, `5HMfS`, and `5GhKJ`. If we build the ABC multisig with the accounts in that specific order (i.e. first A, then B, and C), the real order of the accounts in the multisig will be ACB. If, in the Extrinsic tab, we initiate a multisig call with C, the order of the other signatories will be first A, then B. If we put first B, then A, the transaction will fail.\n\nThis has some implications when using the Extrinsics tab on the\n[Polkadot Developer Interface](https://polkadot.js.org/apps/#/accounts) to perform multisig transactions. If the\norder of the _other signatories_ is wrong, the transaction will fail. This does not happen if the\nmultisig is executed directly from the Accounts tab (recommended). The Polkadot Developer Interface supports\nmultisig accounts, as documented on the [Account Generation page](./learn-account-multisig.md). You\ncan see our video tutorials for more information about creating multisig accounts and transacting\nwith them using both the [Accounts Tab](https://www.youtube.com/watch?v=-cPiKMslZqI) and the\n[Extrinsic Tab](https://www.youtube.com/watch?v=T0vIuJcTJeQ) in the Polkadot Developer Interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-multisig", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-multisig/#decoding-multisig-call-data", "page_title": "Polkadot-JS Multisig Guides", "index": 5, "depth": 2, "title": "Decoding Multisig Call Data", "anchor": "decoding-multisig-call-data", "start_char": 7803, "end_char": 8085, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5691a0c1090f7eed60106e966201c9a8e5d5a46fbb8e7079416eed554730a5c6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Decoding Multisig Call Data\n\n!!!info\n    Before signing a transaction, it is important to know the exact specifics of what is being signed. Check the [\"How to use a multisig account\"](how-to/create-multisig-account.md) in the support docs on how to decode the multisig call data."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy-pure/#create-and-remove-pure-proxies-with-polkadot-js", "page_title": "Polkadot-JS Pure Proxy Guides", "index": 0, "depth": 2, "title": "Create and Remove Pure Proxies with Polkadot-JS", "anchor": "create-and-remove-pure-proxies-with-polkadot-js", "start_char": 1164, "end_char": 1351, "estimated_token_count": 45, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fdcc6c6ae741c88605c84a917ebae703e862a9ef8cb10795401f25626253c5a1", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Create and Remove Pure Proxies with Polkadot-JS\n\nTo learn how to create and remove a pure proxy with the Polkadot Developer Interface see\n[this article](how-to/create-pure-proxy.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy-pure/#advanced-account-management-with-pure-proxies", "page_title": "Polkadot-JS Pure Proxy Guides", "index": 1, "depth": 2, "title": "Advanced Account Management with Pure Proxies", "anchor": "advanced-account-management-with-pure-proxies", "start_char": 1351, "end_char": 3390, "estimated_token_count": 443, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fdcc6c6ae741c88605c84a917ebae703e862a9ef8cb10795401f25626253c5a1", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Advanced Account Management with Pure Proxies\n\n!!!info \"Walk-through tutorial video of Account Management\"\n    You can see [this video tutorial](https://www.youtube.com/watch?v=YkYApbhU3i0) that goes through the example below. The tutorial requires some familiarity with the Extrinsic Tab of the Polkadot Developer Interface.\n\nLet's take for example 3 accounts belonging to Charlie, Dan and Eleanor working for Company X.\nCharlie holds funds belonging to Company X, but he wants to leave the company and transfer the\neconomic responsibility to Eleanor. Dan is a staking proxy of Charlie.\n\n**Without _Pure_ Proxy**, Charlie must (see _left_ side of the Figure below):\n\n- Remove Dan as a staking proxy, this step requires 1 signature\n- Stop nominating and unbound all funds , this step requires 2 signatures\n- Transfer the funds to Eleanor, this step requires 1 signature\n\nThen Eleanor adds Dan as a staking proxy (1 signature). The whole process requires 5 signatures.\nHere we are presenting a simple example, in fact, with multi-signature accounts and multiple proxies\nthe procedure would be more time-consuming and labor-intensive.\n\n![why pure proxies](../assets/why-anon-proxy.png)\n\n**With _Pure_ Proxy** (see _right_ side of the Figure above), Charlie must add Eleanor as _any_\nproxy of the _pure_ proxy, and remove himself (or Eleanor can remove him). The process requires just\n2 signatures (1 signature to add the new _any_ proxy and 1 signature the remove the old one). The\nfunds remain in the _pure_ proxy, and it is not necessary to stop nominating or unbond funds. Also,\nany proxy relationships with the _pure_ proxy stay in place. Thus, if we use the _pure_ proxy, with\nan increasing number of proxies we will always have to sign twice (not necessarily true in\nmulti-signature accounts). While if we are not using the _pure_ proxy, the more the proxies the more\nsignatures we need to detach them from the old stash and attach them to the new stash (see Figure\nbelow).\n\n![anon vs stash plot](../assets/anon-vs-stash-plot.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy-pure/#pure-proxies-and-multisigs", "page_title": "Polkadot-JS Pure Proxy Guides", "index": 2, "depth": 2, "title": "Pure Proxies and Multisigs", "anchor": "pure-proxies-and-multisigs", "start_char": 3390, "end_char": 3421, "estimated_token_count": 6, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fdcc6c6ae741c88605c84a917ebae703e862a9ef8cb10795401f25626253c5a1", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pure Proxies and Multisigs"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy-pure/#scenario-one-one-pure-proxy-within-a-multisig", "page_title": "Polkadot-JS Pure Proxy Guides", "index": 3, "depth": 3, "title": "Scenario One: One Pure Proxy within a Multisig", "anchor": "scenario-one-one-pure-proxy-within-a-multisig", "start_char": 3421, "end_char": 5340, "estimated_token_count": 424, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fdcc6c6ae741c88605c84a917ebae703e862a9ef8cb10795401f25626253c5a1", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Scenario One: One Pure Proxy within a Multisig\n\n!!!info \"Walk-through tutorial video\"\n    You can see [this video tutorial](https://www.youtube.com/watch?v=iGRoGstB_pQ) that goes through this scenario. The tutorial requires some familiarity with the Extrinsic Tab of the Polkadot Developer Interface.\n\nIt is possible to put a _pure_ proxy within a multisig, and then transactions will be signed by the\n_any_ proxy on behalf of the _pure_ proxy (proxied account). Let's take for example the diagram\nbelow. Alice, Bob and Anon are part of the multisig ABC, a multisig account with threshold 2. P-C is\na _pure_ proxy spawned by Charlie, who now acts as _any_ proxy and thus signs anything on behalf of\nP-C. The _pure_ proxy cannot sign directly because it does not have a private key. So, for example,\nto send funds from the multisig to Dan, Charly needs to submit a `proxy.proxy` extrinsic to P-C,\nwhich in turn will submit a `multisig.asMulti` extrinsic to ABC containing the call data for the\n`balances.transferKeepAlive` extrinsic about the transfer of some funds from ABC to Dan. Alice can\nthen approve the transfer by submitting a `multisig.asMulti` extrinsic also containing the call data\nfor the `balances.transferKeepAlive` extrinsic about the transfer of some funds from ABC to Dan.\n\n![multisig with one anon](../assets/multisig-with-one-anon.png)\n\nIf Charly wants to leave the multisig, a new _any_ proxy can be added to P-C and Charly can be\nremoved (by himself or by the new _any_ proxy). Note that the multisig also contains Bob that in\nthis specific example does not do anything.\n\n!!!note \"Proxy calls\"\n    To use a _pure_ proxy within a multisig you need to use the Extrinsic Tab and generate a `proxy.proxy` extrinsic. If you try to sign a multisig transaction using the _pure_ proxy you will be prompted with a warning. Remember, you cannot sign something directly if you do not have a private key."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy-pure/#scenario-two-multisig-made-of-pure-proxies", "page_title": "Polkadot-JS Pure Proxy Guides", "index": 4, "depth": 3, "title": "Scenario Two: Multisig made of Pure Proxies", "anchor": "scenario-two-multisig-made-of-pure-proxies", "start_char": 5340, "end_char": 6516, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fdcc6c6ae741c88605c84a917ebae703e862a9ef8cb10795401f25626253c5a1", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Scenario Two: Multisig made of Pure Proxies\n\n!!!info \"Walk-through Tutorial Video\"\n    You can see [this video tutorial](https://www.youtube.com/watch?v=F82C3zDNJyk) that goes through this scenario. The tutorial requires some familiarity with the Extrinsic Tab of the Polkadot Developer Interface.\n\nThe diagram below shows a multisig that is made only with _pure_ proxies (P-A, P-B and P-C). In this\nsituation Alice, Bob or Charly can leave the multisig at any time without the requirement of\ncreating a new multisig. If for example, Bob leaves the multisig the procedure will require somebody\nelse to be added as _any_ proxy to P-B, and then Bob can remove himself (or the new _any_ proxy can\nremove Bob).\n\n![multisig with anons](../assets/multisig-with-anons.png)\n\nIn the diagram above, Alice submits the `proxy.proxy` extrinsic to P-A, which in turn submits the\n`multisig.asMulti` extrinsic containing the `balances.transferKeepAlive` extrinsic about the\ntransfer of some tokens from ABC to Dan. Then, Charly does the same to confirm the transaction. Note\nthat Charly will need to pay for some weight, for the computation that is necessary to execute the\ntransaction."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy-pure/#scenario-three-multisig-controlling-a-pure-proxy", "page_title": "Polkadot-JS Pure Proxy Guides", "index": 5, "depth": 3, "title": "Scenario Three: Multisig controlling a Pure Proxy", "anchor": "scenario-three-multisig-controlling-a-pure-proxy", "start_char": 6516, "end_char": 7599, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fdcc6c6ae741c88605c84a917ebae703e862a9ef8cb10795401f25626253c5a1", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Scenario Three: Multisig controlling a Pure Proxy\n\nThis setup is used by the [MultiX](../general/multisig-apps.md#multix-by-chainsafe) tool.\n\nAfter its creation, a multi-signature account creates a pure proxy that becomes the proxied account.\nThe multi-signature account behaves as _any_ proxy of the pure. If signatories of the\nmulti-signature account change, a new multisig can be created, assigned as _any_ proxy of the pure,\nand then the old multisig can be removed as a proxy.\n\n![multisig with pure](../assets/multisig-with-pure.png)\n\nCompared to [Scenario Two](#scenario-two-multisig-made-of-pure-proxies), signatories do not need to\ncreate pure proxies here. Multisig controlling a Pure Proxy is a more practical solution, where the\nsignatories, number of signatories and/or the threshold can be changed, which changes the multisig\naddress but does not impact the pure proxy address. In Scenario Two, if signatories behind the pure\nproxies change, the address of the multisig stays the same. However, changing the number of\nsignatories and threshold would not be possible."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy/#creating-proxy-with-polkadot-js", "page_title": "Polkadot-JS Proxy Guides", "index": 0, "depth": 2, "title": "Creating Proxy with Polkadot-JS", "anchor": "creating-proxy-with-polkadot-js", "start_char": 1945, "end_char": 2078, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2422a3f1832e5822e001dffbf1a432115a4e7e493e6ba788388908ea78ee052e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating Proxy with Polkadot-JS\n\nTo create a proxy account with Polkadot-JS read\n[this article](how-to/create-proxy-account.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy/#removing-proxy-with-polkadot-js", "page_title": "Polkadot-JS Proxy Guides", "index": 1, "depth": 2, "title": "Removing Proxy with Polkadot-JS", "anchor": "removing-proxy-with-polkadot-js", "start_char": 2078, "end_char": 2230, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2422a3f1832e5822e001dffbf1a432115a4e7e493e6ba788388908ea78ee052e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Removing Proxy with Polkadot-JS\n\nRead the section \"Removing Proxies\" on\n[this page](how-to/create-proxy-account.md)\nto learn how to remove proxies."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy/#view-your-proxy-on-polkadot-js", "page_title": "Polkadot-JS Proxy Guides", "index": 2, "depth": 2, "title": "View your Proxy on Polkadot-JS", "anchor": "view-your-proxy-on-polkadot-js", "start_char": 2230, "end_char": 3351, "estimated_token_count": 242, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2422a3f1832e5822e001dffbf1a432115a4e7e493e6ba788388908ea78ee052e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## View your Proxy on Polkadot-JS\n\nTo view your proxy, just go on the _Accounts_ menu in the Polkadot Developer Interface, next to the proxied\naccount you will notice a blue icon. Hover on it, and you will see _Proxy overview_. Click on it and\nyou will be presented with a list of all proxies for that account.\n\n![polkadot_view_proxies](../assets/polkadot_view_proxies.png)\n\nAdditionally, you can head over to the _Chain State_ tab (underneath the _Developer_ menu) on\n[Polkadot-JS Apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/chainstate). If\nyou've created your proxy on a Polkadot account, it is required to change your network accordingly\nusing the top left navigation button. On this page, the proxy pallet should be selected, returning\nthe announcements and proxies functions. The proxies function will allow you to see your created\nproxies for either one account or for all accounts (using the toggle will enable this). Proxy\nannouncements are what time lock proxies do to announce they are going to conduct an action.\n\n![polkadot_view_proxies_dev](../assets/polkadot_view_proxies_dev.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy/#set-up-and-use-of-time-delayed-proxies-with-polkadot-js", "page_title": "Polkadot-JS Proxy Guides", "index": 3, "depth": 2, "title": "Set-up and Use of Time-delayed Proxies with Polkadot-JS", "anchor": "set-up-and-use-of-time-delayed-proxies-with-polkadot-js", "start_char": 3351, "end_char": 5394, "estimated_token_count": 424, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2422a3f1832e5822e001dffbf1a432115a4e7e493e6ba788388908ea78ee052e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Set-up and Use of Time-delayed Proxies with Polkadot-JS\n\n!!!info\n    See [this video tutorial](https://youtu.be/3L7Vu2SX0PE) to learn how you can setup and use time-delayed proxies. The video goes through the example below.\n\nInitially the time time-delayed proxy announces its intended action using the `proxy.announce`\nextrinsic and will wait for the number of blocks defined in the delay time before executing it. The\nproxy will include the hash of the intended function call in the announcement. Within this time\nwindow, the intended action may be canceled by accounts that control the proxy. This can be done by\nthe proxy itself using the `proxy.removeAnnouncement` extrinsic or by the proxied account using the\nthe `proxy.rejectAnnouncement` extrinsic. Now we can use proxies knowing that any malicious actions\ncan be noticed and reverted within a delay period. After the time-delay, the proxy can use the\n`proxy.proxyAnnounced` extrinsic to execute the announced call.\n\nLet's take for example the stash account Eleanor setting Bob as a time-delayed staking proxy. In\nthis way, if Bob submits an extrinsic to change the reward destination, such extrinsic can be\nrejected by Eleanor. This implies that Eleanor monitors Bob, and that within the time-delay she can\nspot the announced extrinsic. Eleanor can check all the proxy call announcements made by her\naccount's proxies on-chain. On Polkadot Developer Interface, go to Developer > Storage > Proxy > Announcements to\ncheck the hashes for the calls made by the proxy accounts and the block height at which they are\nenabled for execution.\n\n![time-delayed proxies](../assets/time-delayed-proxies.png)\n\n!!!info\n    If you try to use `proxy.proxyAnnounced` to execute the call within the time-delay window you will get an error \"Proxy unannounced\" since the announcement will be done after the time delay. Also note that regular `proxy.proxy` calls do not work with time-delayed proxies, you need to announce the call first and then execute the announced call on a separate transaction."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy/#proxy-calls", "page_title": "Polkadot-JS Proxy Guides", "index": 4, "depth": 2, "title": "Proxy calls", "anchor": "proxy-calls", "start_char": 5394, "end_char": 5695, "estimated_token_count": 65, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2422a3f1832e5822e001dffbf1a432115a4e7e493e6ba788388908ea78ee052e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Proxy calls\n\nProxy calls are used by proxies to call proxied accounts. These calls are important for example in\nthe case of _pure_ proxies, as any attempt to sign transactions with a _pure_ proxy will fail. For\nmore details see the [dedicated section about pure proxies](./learn-proxies-pure.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts-proxy", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts-proxy/#nested-proxy-calls", "page_title": "Polkadot-JS Proxy Guides", "index": 5, "depth": 3, "title": "Nested Proxy Calls", "anchor": "nested-proxy-calls", "start_char": 5695, "end_char": 7322, "estimated_token_count": 372, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:2422a3f1832e5822e001dffbf1a432115a4e7e493e6ba788388908ea78ee052e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Nested Proxy Calls\n\nAs the term suggests, nested proxy calls are proxy calls within proxy calls. Such calls are needed\nif there are proxied accounts that are proxies themselves. In the example diagram below, Alice has a\nstash account that has a _staking_ proxy account, P-C. P-C is a _pure_ proxy, a proxied account\noriginally spawned by Charly that is now an _any_ proxy of P-C and signs everything on its behalf.\n\n![nested proxy calls](../assets/nested-proxy-calls.png)\n\nFor example, to bond more funds, Charly needs to submit a `prox.proxy` extrinsic to P-C, which in\nturn submits a `proxy.proxy` extrinsic to Alice including for example a `staking.bondExtra`\nextrinsic, specifying the number of extra tokens that need to be bounded. If Charly wants to leave,\na new account can take his place as any proxy (before Charly leaves!). There is no need to change\nthe staking proxy account. Also, Alice is the only one who can remove P-C as a staking proxy, and\nP-C can only perform staking-related tasks. For example, P-C cannot send funds out from Alice's\naccount.\n\nProxy calls can be done using the Extrinsic Tab in the Polkadot Developer Interface. Nested proxy calls can be\ndone by calling each `proxy.proxy` extrinsic separately, or in some cases by just calling the last\n`proxy.proxy` extrinsic. In the diagram above, submitting the proxy call from P-C to Alice will\nautomatically ask for Charly's signature. Thus one proxy call will trigger the second one because\nCharly's is the only _any_ proxy of P-C, and P-C cannot sign anything. While if we want to use Bob's\naccount we will need to submit all three proxy calls."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#account-address-format", "page_title": "Polkadot-JS Account Guides", "index": 0, "depth": 2, "title": "Account Address Format", "anchor": "account-address-format", "start_char": 357, "end_char": 2298, "estimated_token_count": 408, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Account Address Format\n\nAn account created on Polkadot can also be used on multiple chains in the ecosystem. More\nspecifically, the account of a chain that uses the `*25519` account address format (the latest list\ncan be accessed on the\n[ss58 registry repository](https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json))\nis cross-compatible with all the chains that use the similar format. To switch between the accounts\non different chains, you can follow the guidelines in\n[this article](learn-account-advanced.md).\n[Subscan has a tool](https://assethub-polkadot.subscan.io/tools/format_transform) you can use to convert your\naddress between the different chain formats.\n\n!!!info \"Using the same account on multiple chains - Pros and Cons\"\n    The address format differs from chain to chain, but that difference is only visual. The same private\nkey can be used to sign transactions on behalf of the respective accounts on multiple chains. Using\na single account on multiple chains is convenient, as you do not have to deal with multiple mnemonic\nphrases or private keys. But, if your account gets compromised on one chain, the attacker can gain\nfull access to the accounts on all other chains. This also has implications for the account holder's\nprivacy, as knowing the identity of an account on one chain can expose the account holder's identity\non all the chains. In the Accounts tab, the Polkadot Developer Interface displays a warning message next to each\nAccount you are using on multiple chains and recommends using different Accounts on different chains\n(see below).\n\n![warning multiple chains](../assets/warning-multichain-account.png)\n\nOn Polkadot Developer Signer, you can copy your address by clicking the account's icon while the desired\nchain format is active. E.g. selecting \"Substrate\" as the format will change your address, and\nclicking the colorful icon of your account will copy it in that format."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#polkadot-developer-signer", "page_title": "Polkadot-JS Account Guides", "index": 1, "depth": 2, "title": "Polkadot Developer Signer", "anchor": "polkadot-developer-signer", "start_char": 2298, "end_char": 3515, "estimated_token_count": 306, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Developer Signer\n\n<div className=\"row\">\n  <div className=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=DNU0p5G0Gqc\">\n      <img src=\"https://img.youtube.com/vi/DNU0p5G0Gqc/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=DNU0p5G0Gqc\">Polkadot Developer Signer Tutorial</a>\n    </p>\n  </div>\n</div>\n\n!!!info\n    For guidelines about how to create an account using the Polkadot Extension, see\n[**this video tutorial**](https://youtu.be/DNU0p5G0Gqc) and visit\n[**this article**](how-to/create-polkadot-account.md).\n\nThe Polkadot Developer Signer (the Polkadot Extension) provides a reasonable balance of security\nand usability. It provides a separate local mechanism to generate your address and interact with\nPolkadot.\n\nThis method involves installing the Polkadot Extension and using it as a “virtual vault,\" separate\nfrom your browser, to store your private keys. It also allows the signing of transactions and\nsimilar functionality.\n\nIt is still running on the same computer you use to connect to the internet and thus is less secure\nthan using Parity Signer or other air-gapped approaches."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#account-backup-using-the-polkadot-developer-signer", "page_title": "Polkadot-JS Account Guides", "index": 2, "depth": 3, "title": "Account Backup using the Polkadot Developer Signer", "anchor": "account-backup-using-the-polkadot-developer-signer", "start_char": 3515, "end_char": 3725, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account Backup using the Polkadot Developer Signer\n\nSee [**this video tutorial**](https://youtu.be/DNU0p5G0Gqc) and visit\n[**this page**](how-to/export-json-backup.md)\nto know how to back up your account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#reset-password-using-the-polkadot-developer-signer", "page_title": "Polkadot-JS Account Guides", "index": 3, "depth": 3, "title": "Reset Password using the Polkadot Developer Signer", "anchor": "reset-password-using-the-polkadot-developer-signer", "start_char": 3725, "end_char": 5627, "estimated_token_count": 417, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Reset Password using the Polkadot Developer Signer\n\n!!!info\n    See [**this video tutorial**](https://www.youtube.com/watch?v=DNU0p5G0Gqc&t=280s) to learn how to change the password for an account that has been created on the Polkadot Developer Signer (i.e. an injected account).\n\n!!!warning\n    Before following the instructions below, make sure you have your mnemonic phrase stored in a safe place accessible to you.\n\nLet's say you created `ACCOUNT 1` protected by password `PSW 1`. To reset the password of your\n`ACCOUNT 1` using the browser extension, you must follow the following steps:\n\n- Go to `ACCOUNT 1` on the browser extension and click \"Forget account\". This action will delete the\n  access to your account. Note that your tokens are still in your account on the Polkadot network.\n- On the browser extension click the \"+\" button in the top right corner and select the option\n  \"Import account from pre-existing seed\". After entering the mnemonic phrase, you can choose a new\n  password, `PSW 2`.\n\n!!!info \"JSON files do not allow changing account passwords\"\n    If you add the account to the extension using the option \"Restore account from backup JSON file\", this will allow you to restore access to your account using a JSON file protected by the password `PSW 1`, but does not let you set a new password. Thus, `PSW 1` will become the account password by default.\n\n!!!info \"Accounts on Cold wallets do not need passwords\"\n    For hardware wallets such as [Ledger](https://www.ledger.com/), you may have to set a PIN for accessing the accounts on the device, but you do not need to set a password for every individual account. When you need to make transactions with your account, you are required to sign using your Ledger device. Also, Ledger wallets let you generate multiple accounts for multiple blockchain networks without setting different passwords to access such accounts."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#restore-account-on-the-polkadot-developer-signer", "page_title": "Polkadot-JS Account Guides", "index": 4, "depth": 3, "title": "Restore Account on the Polkadot Developer Signer", "anchor": "restore-account-on-the-polkadot-developer-signer", "start_char": 5627, "end_char": 5882, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Restore Account on the Polkadot Developer Signer\n\n!!!info\n    See [**this video tutorial**](https://youtu.be/9ohp8k4Hz8c) and [**this page**](how-to/restore-account-signer.md) to learn how to restore your account on the Polkadot Developer Interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#polkadot-developer-interface", "page_title": "Polkadot-JS Account Guides", "index": 5, "depth": 2, "title": "Polkadot Developer Interface", "anchor": "polkadot-developer-interface", "start_char": 5882, "end_char": 7056, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot Developer Interface\n\n!!!info\n    For guidelines about how to create an account using Polkadot Developer Interface, see [**this video tutorial**](https://youtu.be/DNU0p5G0Gqc) and visit [**this article**](how-to/create-account.md).\n\n!!!caution\n    If you use this method to create your account and clear your cookies in your browser, your account will be lost forever if you do not [back it up](#restore-account-on-the-polkadot-developer-interface). Make sure you store your seed phrase in a safe place or download the account's JSON file if using the Polkadot Developer Signer. Learn more about account backup and restoration [here](#restore-account-on-the-polkadot-developer-interface).\n\nLocal in-browser account storage is disabled by default on the Polkadot Developer Interface. To create an account\nusing the Polkadot Developer Interface, navigate to settings > account options and click on allow local in-browser\naccount storage in the drop-down menu. Using the Polkadot-JS user interface without a browser\nextension is **not recommended**. It is the least secure way of generating an account. It should\nonly be used if all other methods are not feasible."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#account-backup-using-the-polkadot-developer-interface", "page_title": "Polkadot-JS Account Guides", "index": 6, "depth": 3, "title": "Account Backup using the Polkadot Developer Interface", "anchor": "account-backup-using-the-polkadot-developer-interface", "start_char": 7056, "end_char": 7281, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Account Backup using the Polkadot Developer Interface\n\n!!!info\n    See [**this video tutorial**](https://youtu.be/DNU0p5G0Gqc) and visit [**this page**](how-to/export-json-backup.md) to know how to back up your account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#reset-password-using-the-polkadot-developer-interface", "page_title": "Polkadot-JS Account Guides", "index": 7, "depth": 3, "title": "Reset password using the Polkadot Developer Interface", "anchor": "reset-password-using-the-polkadot-developer-interface", "start_char": 7281, "end_char": 8011, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Reset password using the Polkadot Developer Interface\n\nTo reset the password of an account created with Polkadot-JS Apps UI, you need to go to the\n\"Accounts\" tab, click the icon with three vertical dots on your account and select \"Change this\naccount's password\".\n\nSee [**this video tutorial**](https://youtu.be/DNU0p5G0Gqc?t=261) to learn how to change the\npassword for an account created on the Polkadot Developer Interface (i.e. a non-injected account).\n\n!!!note\n    If you create an account first using Polkadot-JS Apps UI and then add it to the browser extension, you need to follow the [guidelines for the browser extension](#restore-account-on-the-polkadot-developer-signer) to change the password of such an account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#restore-account-on-the-polkadot-developer-interface", "page_title": "Polkadot-JS Account Guides", "index": 8, "depth": 3, "title": "Restore Account on the Polkadot Developer Interface", "anchor": "restore-account-on-the-polkadot-developer-interface", "start_char": 8011, "end_char": 8250, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Restore Account on the Polkadot Developer Interface\n\nSee [**this video tutorial**](https://youtu.be/cBsZqFpBANY) and\n[**this page**](how-to/restore-account.md)\nto learn how to restore your account on the Polkadot Developer Interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#unlocking-locks", "page_title": "Polkadot-JS Account Guides", "index": 9, "depth": 3, "title": "Unlocking Locks", "anchor": "unlocking-locks", "start_char": 8250, "end_char": 9404, "estimated_token_count": 266, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Unlocking Locks\n\n!!!info \"Locks do not stack!\"\n    The biggest lock decides the total amount of locked funds. See [**this walk-through video tutorial**](https://youtu.be/LHgY7ds_bZ0) that will guide you in the process of unlocking funds in the example above.\n\nIn the example, the locked balance is 0.55 KSM because the biggest lock is on democracy and is 0.55\nKSM. As soon as the democracy lock is removed the next biggest lock is on staking 0.5 KSM (bonded\n0.4 KSM + redeemable 0.1 KSM). This means that the locked balance will be 0.5 KSM, and 0.05 KSM will\nbe added to the transferable balance. After redeeming the unbonded 0.1 KSM, the locked balance will\nbe 0.4 KSM, and an additional 0.1 KSM will be added to the transferable balance. Now the biggest\nlock is still the bonded one. This means that even if we remove the vested lock, the locked balance\nwill still be 0.4 KSM and no tokens will be added to the transferable balance. To free those bonded\ntokens we will need to unbond them and wait for the unbonding period to make them redeemable. If we\nremove the proxy the reserved funds will be automatically added to the transferable balance."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#query-account-data-in-polkadot-js", "page_title": "Polkadot-JS Account Guides", "index": 10, "depth": 2, "title": "Query Account Data in Polkadot-JS", "anchor": "query-account-data-in-polkadot-js", "start_char": 9404, "end_char": 11825, "estimated_token_count": 546, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Query Account Data in Polkadot-JS\n\nIn the Polkadot Developer Interface, you can also query account data under\n[Developer > Chain state](https://polkadot.js.org/apps/#/chainstate). Under `selected state query`\nchoose the system pallet followed by `account(AccountId32): FrameSystemAccountInfo`, under `Option`\nchoose an account, and then click on the \"+\" button on the right.\n\n![account_balance_types](../assets/AccountData-struct.png)\n\nAccount information include:\n\n- `nonce`, the number of transactions the account sent.\n- `consumers`, the number of other modules that currently depend on this account's existence. The\n  account cannot be reaped until this is zero.\n- `providers`, the number of other modules that allow this account to exist. The account may not be\n  reaped until this and `sufficients` are both zero.\n- `sufficients`, the number of modules that allow this account to exist for their own purposes. The\n  account may not be reaped until this and `providers` are both zero.\n- `data`, the additional data that belongs to this account. Used to store the balance(s) in a lot of\n  chains.\n\nMore in-depth information about the above data can be found in the\n[substrate code base](https://github.com/paritytech/substrate/blob/2e7fde832b77b242269b136f1c3b6fffef86f9b6/frame/system/src/lib.rs#LL767C1-L781C24).\n\nThe `AccountData` structure defines the balance types in Substrate. The three types of balances\ninclude:\n\n- `free`, is the balance that is free but not necessarily transferable.\n- `reserved`, is the balance that is not free, and it is put on hold for on-chain activity such as staking,\n  deposits for multi-signature calls, setting up proxies and identities, and other actions that hold\n  state on the network.\n- `frozen`, is the amount that is free to use for on-chain activity but is locked in governance, or vesting.\n\nThe **usable** or transferable balance of the account is currently calculated using the formula\nbelow:\n\n```\ntransferable = free - max(frozen - reserved, ED)\n```\n\nWhere ED is the existential deposit. The **total** balance of the account is the sum of `free` and\n`reserved` funds. The `flags` describe extra information about the account.\n\nMore in-depth information about the above data can be found in the\n[balances pallet in the Substrate code base](https://github.com/paritytech/substrate/blob/2e7fde832b77b242269b136f1c3b6fffef86f9b6/frame/balances/src/types.rs#LL95-L114)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#vanity-generator", "page_title": "Polkadot-JS Account Guides", "index": 11, "depth": 2, "title": "Vanity Generator", "anchor": "vanity-generator", "start_char": 11825, "end_char": 12152, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Vanity Generator\n\nThe vanity generator is a tool on [Polkadot Developer Interface](https://polkadot.js.org/apps/#/accounts/vanity)\nthat lets you generate addresses that contain a specific substring. For the tutorial on how to\ncreate an account using Vanity Generator, visit\n[this article](how-to/create-vanity-address.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-accounts", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-accounts/#encryption-enhancement", "page_title": "Polkadot-JS Account Guides", "index": 12, "depth": 2, "title": "Encryption Enhancement", "anchor": "encryption-enhancement", "start_char": 12152, "end_char": 12613, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6d35068d52b6b0b301545a983cf910d088118ea47af15387512335283679ed9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Encryption Enhancement\n\nSome newly generated `JSON` account files cannot be imported (restored) into older wallet software.\nThis is due to an enhanced encryption method, noticeable in a slight delay when\nencrypting/decrypting your wallet. If you cannot load a `JSON` file, please use the latest version\nof the wallet software. If you cannot load it, ensure that the wallet software uses the newest\nversion of the [Polkadot API](https://polkadot.js.org/api/)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-asset-conversion", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-asset-conversion/#create-a-liquidity-pool", "page_title": "Polkadot-JS Asset Conversion Guides", "index": 0, "depth": 2, "title": "Create a Liquidity Pool", "anchor": "create-a-liquidity-pool", "start_char": 854, "end_char": 2266, "estimated_token_count": 357, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72bdd738f8530367fd772e27c1ef5fc8b1fe78f8579a09b2cc7ca8f944e58cdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Create a Liquidity Pool\n\nIf there is no existing liquidity pool for an asset on Asset Hub, the first step is to create a\nliquidity pool. If you are looking for a guide on how to create an asset on Asset Hub, it is\navailable [here.](./learn-guides-assets-create.md)\n\nThe `create_pool` function is used to create an empty liquidity pool along with a new `lp_token`\nasset. This asset's ID is announced in the `Event::PoolCreated` event. After creating a pool,\nliquidity can be added to it via the `Pallet::add_liquidity` function.\n\nFor example, the snapshot below shows how to create liquidity pool with `PAS` tokens and `EDU`\ntokens with the asset ID `149` on Paseo Asset Hub. Creating this extrinsic requires knowledge of\n[XCM Multilocations](https://paritytech.github.io/polkadot-sdk/master/staging_xcm/v3/struct.MultiLocation.html). From the perspective of AssetHub,\nan Asset Hub, the asset with an `AssetId` of `149` has a MultiLocation of\n\n```\n{\n   parents: 0,\n   interior: {\n     X2: [{PalletInstance: 50}, {GeneralIndex: 149}]\n   }\n}\n```\n\nThe PalletInstance of `50` represents the Assets pallet on Asset Hub and the `GeneralIndex` is the\n`AssetId` of the asset.\n\n![Create Liquidity Pool](../assets/asset-hub/Asset-Conversion-Create-Pool.png)\n\nThe `lp_token` ID created for this pool is `24`, and\n[here](https://assethub-rococo.subscan.io/extrinsic/4604922-2?event=4604922-8) is the event for\nreference."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-asset-conversion", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-asset-conversion/#liquidity-provision", "page_title": "Polkadot-JS Asset Conversion Guides", "index": 1, "depth": 2, "title": "Liquidity Provision", "anchor": "liquidity-provision", "start_char": 2266, "end_char": 3435, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72bdd738f8530367fd772e27c1ef5fc8b1fe78f8579a09b2cc7ca8f944e58cdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Liquidity Provision\n\nThe `add_liquidity` function allows users to provide liquidity to a pool composed of two assets. It\nrequires specifying the desired amounts for both assets and minimum acceptable amounts. The function\ncalculates an optimal contribution of assets, which may differ from the desired amounts but will not\nbe less than the specified minimums. Liquidity providers receive liquidity tokens representing their\nshare of the pool.\n\nFor example, the snapshot below shows how to provide liquidity to the pool with `PAS` tokens and\n`EDU` tokens with the asset ID `149` on Paseo Asset Hub. The intention is to provide liquidity of 1\n`PAS` token (`u128` value of `1000000000000` as it has 12 decimals) and 100 `EDU` tokens (`u128`\nvalue of `1000000000000` as it has 10 decimals).\n\n![Provide Liquidity](../assets/asset-hub/Asset-Conversion-Add-Liquidity.png)\n\nAfter successful submission of the extrinsic above, LP tokens are minted to the specified account.\nBelow is the snapshot of the liquidity pool on the\n[DOT ACP UI.](https://github.com/MVPWorkshop/dot-acp-ui)\n\n![Liquidity Pool Example](../assets/asset-hub/Asset-Conversion-Liquidity-Pool-Example.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-asset-conversion", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-asset-conversion/#swap-assets", "page_title": "Polkadot-JS Asset Conversion Guides", "index": 2, "depth": 2, "title": "Swap Assets", "anchor": "swap-assets", "start_char": 3435, "end_char": 3451, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72bdd738f8530367fd772e27c1ef5fc8b1fe78f8579a09b2cc7ca8f944e58cdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Swap Assets"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-asset-conversion", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-asset-conversion/#swap-from-an-exact-amount-of-tokens", "page_title": "Polkadot-JS Asset Conversion Guides", "index": 3, "depth": 3, "title": "Swap from an exact amount of Tokens", "anchor": "swap-from-an-exact-amount-of-tokens", "start_char": 3451, "end_char": 4644, "estimated_token_count": 287, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72bdd738f8530367fd772e27c1ef5fc8b1fe78f8579a09b2cc7ca8f944e58cdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Swap from an exact amount of Tokens\n\nThe `swap_exact_tokens_for_tokens` function allows users to swap a precise amount of one asset for\nanother within a specified liquidity pool, ensuring the user receives at least a minimum expected\namount of the second asset in return. This function aims to provide predictability in trading\noutcomes, allowing users to manage their asset exchanges with confidence regarding the minimum\nreturn.\n\nFor example, the snapshot below shows how to swap `PAS` tokens to `EDU` tokens with the asset ID\n`149` on Paseo Asset Hub. The intention is to swap 0.1 `PAS` tokens (`u128` value of `100000000000`\nas it has 12 decimals) to at least 9 `EDU` tokens (`u128` value of `90000000000` as it has 10\ndecimals).\n\n![Swap Exact Amount](../assets/asset-hub/Asset-Conversion-Swap-Exact-Token.png)\n\nBelow is the snapshot of the liquidity pool on the\n[DOT ACP UI.](https://github.com/MVPWorkshop/dot-acp-ui) after successful submission of the\nextrinsic above. It can be observed that the pool now has 1.1 `ROC` tokens and around 9.06 `EDU`\ntokens are transferred out of it.\n\n![Swap Exact Amount Example](../assets/asset-hub/Asset-Conversion-Swap-Exact-Tokens-Example.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-asset-conversion", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-asset-conversion/#swap-to-an-exact-amount-of-tokens", "page_title": "Polkadot-JS Asset Conversion Guides", "index": 4, "depth": 3, "title": "Swap to an exact amount of Tokens", "anchor": "swap-to-an-exact-amount-of-tokens", "start_char": 4644, "end_char": 5769, "estimated_token_count": 272, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72bdd738f8530367fd772e27c1ef5fc8b1fe78f8579a09b2cc7ca8f944e58cdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Swap to an exact amount of Tokens\n\nOn the other hand, the `swap_tokens_for_exact_tokens` function allows users to trade a flexible\namount of one asset to precisely obtain a specified amount of another asset. It ensures that users\ndo not spend more than a predetermined maximum amount of the initial asset to acquire the exact\ntarget amount of the second asset, providing a way to control the cost of the transaction while\nachieving the desired outcome.\n\nFor example, the snapshot below shows how to swap `EDU` tokens with the asset ID `149` on Paseo\nAsset Hub to `PAS` Tokens. The intention is to swap for obtaining 0.1 `PAS` tokens (`u128` value of\n`100000000000` as it has 12 decimals) for a maximum of 10 `EDU` tokens (`u128` value of\n`100000000000` as it has 10 decimals).\n\n![Swap Exact Amount](../assets/asset-hub/Asset-Conversion-Swap-To-Exact-Tokens.png)\n\nBelow is the snapshot of the liquidity pool on the\n[DOT ACP UI.](https://github.com/MVPWorkshop/dot-acp-ui) after successful submission of the\nextrinsic above.\n\n![Swap to Exact Amount Example](../assets/asset-hub/Asset-Conversion-Swap-To-Exact-Example.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-asset-conversion", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-asset-conversion/#withdraw-provided-liquidity", "page_title": "Polkadot-JS Asset Conversion Guides", "index": 5, "depth": 2, "title": "Withdraw Provided Liquidity", "anchor": "withdraw-provided-liquidity", "start_char": 5769, "end_char": 6996, "estimated_token_count": 268, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:72bdd738f8530367fd772e27c1ef5fc8b1fe78f8579a09b2cc7ca8f944e58cdf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Withdraw Provided Liquidity\n\nThe `remove_liquidity` function allows users to withdraw their provided liquidity from a pool,\nreceiving back the original assets. When calling this function, users specify the amount of\nliquidity tokens (representing their share in the pool) they wish to burn. They also set minimum\nacceptable amounts for the assets they expect to receive back. This mechanism ensures users can\ncontrol the minimum value they receive, protecting against unfavourable price movements during the\nwithdrawal process​.\n\nFor example, the snapshot below shows how to remove liquidity by specifying the number of LP tokens.\nIn exchange of removing around half of the liquidity of the pool, the expectation is that we receive\nat least 0.4 `ROC` tokens (`u128` value of`400000000000` as it has 12 decimals) and 40 `EDU` tokens\n(`u128` value of `400000000000` as it has 10 decimals).\n\n![Remove Liquidity](../assets/asset-hub/Asset-Conversion-Remove-Liquidity.png)\n\nBelow is the snapshot of the liquidity pool on the\n[DOT ACP UI.](https://github.com/MVPWorkshop/dot-acp-ui) after successful submission of the\nextrinsic above.\n\n![Remove Liquidity Example](../assets/asset-hub/Asset-Conversion-Remove-Liquidity-Example.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-assets-create", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-assets-create/#creating-assets-on-the-asset-hub-with-polkadot-js", "page_title": "Polkadot-JS Asset Creation Guides", "index": 0, "depth": 2, "title": "Creating Assets on the Asset Hub with Polkadot-JS", "anchor": "creating-assets-on-the-asset-hub-with-polkadot-js", "start_char": 1101, "end_char": 3792, "estimated_token_count": 634, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e35d5b3003b881f84917ab9691ac6434bec1dfc5c6f3e2640a2a185d3178fec5", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating Assets on the Asset Hub with Polkadot-JS\n\n!!!info\n    Before minting assets on the Asset Hub, we recommend that you try out this tutorial on Westend Asset Hub, which is a system parachain on Westend test network. The WND tokens (Westies) can be teleported from Westend to Westend Asset Hub, are available for free through a [faucet](https://faucet.polkadot.io/).\n\n**The images in the guides below are for Polkadot, but they also apply to Kusama.**\n\nTo create an asset on the Asset Hub, you would need to\n[deposit some funds](../general/chain-state-values.md). Before you create an asset on\nthe Asset Hub, ensure that your Asset Hub account balance is a bit more than the sum of those two\ndeposits, which should seamlessly account for the required deposits and transaction fees. You can\nsend the native token from a relay chain account to a the Asset Hub account using the teleport\nfunctionality. For instructions on teleporting tokens, check this\n[page on Teleports](../learn/learn-teleport.md).\n\nAssuming you have the required balance on your Asset Hub account, the following instructions should\nlet you successfully create an asset on the Asset Hub\n\n- Access the Asset Hub through [Polkadot Developer Interface](https://polkadot.js.org/apps/#/explorer).\n- Check the next available Asset ID. This can be queried on-chain by navigating to Developer > Chain\n  State > Storage and then `assets.nextAssetId()`.\n\n![Query AssetId](../assets/asset-hub/hub-asset-4.png)\n\n- Navigate to Network > Assets.\n\n![Navigate to Assets page](../assets/asset-hub/hub-asset-0.png)\n\n- Click on the create button and you will be presented with a pop-up window. Choose the creator\n  account, name of the asset to be displayed on the Asset Hub, the asset's symbol, number of\n  decimals for the asset, the minimum balance required to hold this asset on an Asset Hub account\n  and the most important field of your asset - the unique asset ID. This has to be the value\n  returned by the `assets.nextAssetId()` query shown earlier. After all the details are entered,\n  click on the next button.\n\n![Add Asset Metadata](../assets/asset-hub/hub-asset-1.png)\n\n- Choose the admin, issuer and the freezer accounts for your asset and click on the create button.\n\n![Asset managing accounts](../assets/asset-hub/hub-asset-2.png)\n\n- Sign and submit the transaction (If you like to verify the transaction details before signing, you\n  can click on the dropdown button pointed by the arrow in the snapshot below).\n\n![Sign asset creating transaction](../assets/asset-hub/hub-asset-3.png)\n\nIf the transaction is successful, you should see the asset and its details displayed in the\nNetwork > Assets page on the Asset Hub."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-bounties", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-bounties/#submit-a-bounty-proposal", "page_title": "Polkadot-JS Bounty Management Guide", "index": 0, "depth": 2, "title": "Submit a Bounty Proposal", "anchor": "submit-a-bounty-proposal", "start_char": 747, "end_char": 2885, "estimated_token_count": 589, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dcdc7b21ddf8fbd4d53cbde6841beedc5ff8851c42f1e4a1c36c540749f42b0c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Submit a Bounty Proposal\n\n!!!info \"Step-by-step written tutorial\"\n    See [this written tutorial](https://scribehow.com/shared/How_to_Submit_a_Bounty_Proposal_on_Polkadotjs_Apps__Ps_zfmNXRbm6PuZaj28JBQ) to learn more about how to submit a bounty proposal.\n\nSee the video tutorial below to learn how you can create a bounty and submit it for approval through\nan OpenGov referendum.\n\n<div className=\"row\">\n<div className=\"col text--center\">\n    <a href=\"https://youtu.be/Qv_nJVcvQr8?t=52\">\n      <img src=\"https://img.youtube.com/vi/Qv_nJVcvQr8/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://youtu.be/Qv_nJVcvQr8?t=52\">Introduction to Bounties</a>\n    </p>\n  </div>\n  <div className=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=8Cft1-8RWmk\">\n      <img src=\"https://img.youtube.com/vi/8Cft1-8RWmk/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=8Cft1-8RWmk\">Submit a Bounty</a>\n    </p>\n  </div>\n</div>\n\nWhen you add a bounty, this will show as \"proposed\" in the main\n[Bounties page](https://polkadot.js.org/apps/#/bounties). Once the community approves your bounty\nproposal as an OpenGov referendum, the bounty will show as \"funded\" at the end of the\n[spending period](../general/glossary.md#spend-period) on the main\n[Bounties page](https://polkadot.js.org/apps/#/bounties). You can then proceed with assigning\ncurators to the bounty.\n\nTo minimize storage on chain in the same way as any proposal, bounties don't contain contextual\ninformation. When a user submits a bounty spending proposal, they will need to find an off-chain\nmedium to explain the proposal, for example a bounty proposal document on\n[Subsquare](https://polkadot.subsquare.io/).\n[This template](https://docs.google.com/document/d/1-IBz_owspV5OcvezWXpksWDQReWowschD0TFuaVKKcU/edit?usp=sharing)\ncan be used to submit all the information needed by OpenGov voters to make an informed decision.\n\nSubmitting a bounty proposal will require a\n[deposit](../general/chain-state-values.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-bounties", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-bounties/#assign-a-curator-to-a-bounty", "page_title": "Polkadot-JS Bounty Management Guide", "index": 1, "depth": 2, "title": "Assign a Curator to a Bounty", "anchor": "assign-a-curator-to-a-bounty", "start_char": 2885, "end_char": 5523, "estimated_token_count": 631, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dcdc7b21ddf8fbd4d53cbde6841beedc5ff8851c42f1e4a1c36c540749f42b0c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Assign a Curator to a Bounty\n\n!!!info \"Step-by-step written tutorial\"\n    See [this written tutorial](https://scribehow.com/shared/How_to_Assign_a_Curator_to_a_Bounty_on_Polkadotjs_Apps__JgK3eSfXQdm_PSvtz8TelQ) to learn more about how to assign a curator to a bounty.\n\nOnce your bounty is shown as \"funded\" on the main\n[Bounties page](https://polkadot.js.org/apps/#/bounties), you can propose a bounty curator. The\nreferendum must be submitted on the same track used for proposing the bounty or a track with a\nhigher spending limit\n([see the code snippet](https://github.com/paritytech/polkadot-sdk/blob/22e90b1c11509f1f13083f1ac6c5f028f54432e7/substrate/frame/bounties/src/lib.rs#L412)).\nFor example, if the bounty was submitted to the Medium Spender Track, the curator must be proposed\nusing the same track or the Big Spender or Treasurer tracks. See the video tutorial below to learn\nhow you can add a curator to a bounty and submit it for approval through an OpenGov referendum.\n\n<div className=\"row\">\n  <div className=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=TM7vk3oP9IA\">\n      <img src=\"https://img.youtube.com/vi/TM7vk3oP9IA/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=TM7vk3oP9IA\">Assign Curator to a Bounty</a>\n    </p>\n  </div>\n</div>\n\nOnce your OpenGov referendum has been approved by the community and served the required\n[spending period](../general/glossary.md#spend-period), the bounty will still show as \"funded\" on\nthe main [Bounties page](https://polkadot.js.org/apps/#/bounties) and await the curator's\nacceptance. The curator must formally accept the curator role by signing a `bounties.acceptCurator`\nextrinsic. More information about when to do this can be found on the main\n[Bounties page](https://polkadot.js.org/apps/#/bounties). Only after the curators claim their\ncandidacy the bounty will show as \"active\" on the main Bounty page.\n\n!!!info \"Curator assignment call must be executed after bounty is funded\"\n    Curator assignment must take place after the bounty has been funded, and approved bounties are funded after a spend period has been completed. A curator assignment referendum cannot be executed during the same spend period when the bounty is funded.\n\nIf your bounty has been awarded but is not funded yet, you need to make sure that the curator\nassignment referendum gets enacted in the subsequent spending period (you can set a delay in\n[Polkadot-JS](./learn-guides-polkadot-opengov.md#submitting-a-proposal) when you submit the proposal\nduring the current spend period)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-bounties", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-bounties/#create-and-award-child-bounties", "page_title": "Polkadot-JS Bounty Management Guide", "index": 2, "depth": 2, "title": "Create and Award Child Bounties", "anchor": "create-and-award-child-bounties", "start_char": 5523, "end_char": 6841, "estimated_token_count": 321, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dcdc7b21ddf8fbd4d53cbde6841beedc5ff8851c42f1e4a1c36c540749f42b0c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Create and Award Child Bounties\n\n!!!info \"Step-by-step written tutorial\"\n    See [this written tutorial](https://scribehow.com/shared/How_to_Create_and_Award_a_Child_Bounty__Q-YFGkYAR3WxMnvYGHiU3Q) to learn more about how to create and award child bounties.\n\n!!!info \"Remember to add contextual information about child bounties\"\n    When you add child bounties, please add contextual information on the governance forum [Subsquare](https://polkadot.subsquare.io/).\n\nSee the video tutorial below to learn how to create a child bounty, assign a curator, and award a\nchild bounty.\n\nThe video will show how to create and award a child bounty using a batch call. We will also include\nproposing and approving curator candidacy for the child bounty. The calls can be executed\nseparately, depending on the process curators consider appropriate for their bounty.\n\n<div className=\"row\">\n  <div className=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=mLpvx0OQoyM\">\n      <img src=\"https://img.youtube.com/vi/mLpvx0OQoyM/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=mLpvx0OQoyM\">Create and Award Child Bounties</a>\n    </p>\n  </div>\n</div>\n\nOnce a child bounty is awarded, awardees can claim the child bounty."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-bounties", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-bounties/#claim-a-child-bounty-reward", "page_title": "Polkadot-JS Bounty Management Guide", "index": 3, "depth": 2, "title": "Claim a Child Bounty Reward", "anchor": "claim-a-child-bounty-reward", "start_char": 6841, "end_char": 8092, "estimated_token_count": 315, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dcdc7b21ddf8fbd4d53cbde6841beedc5ff8851c42f1e4a1c36c540749f42b0c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Claim a Child Bounty Reward\n\n!!!info \"Step-by-step written tutorial\"\n    See [this written tutorial](https://scribehow.com/shared/How_to_claim_a_Child_Bounty_reward_on_Polkadotjs__t3V7NDUjQlus40EUjc-5Kw) to learn more about how to claim a child bounty reward.\n\nThe status of child bounties can be viewed on the\n[Subsquare Bounty page](https://polkadot.subsquare.io/treasury/bounties) under the specific parent\nbounty. A child bounty status can be \"Added\", \"Awarded\", or \"Claimed\". For example, the parent\nbounty 17 refers to the Community Events Bounty, which has many child bounties.\n\nAfter the child bounty has been rewarded, follow the guidelines in the video tutorial below to learn\nhow to claim a child bounty reward. Note that the extrinsic to claim the child bounty reward is\npermissionless, and anyone can initiate the claim on behalf of the beneficiary.\n\n<div className=\"row\">\n  <div className=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=db82aHgy23c\">\n      <img src=\"https://img.youtube.com/vi/db82aHgy23c/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=db82aHgy23c\">Claim Child Bounty Reward</a>\n    </p>\n  </div>\n</div>"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-bounties", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-bounties/#close-child-bounties", "page_title": "Polkadot-JS Bounty Management Guide", "index": 4, "depth": 2, "title": "Close Child Bounties", "anchor": "close-child-bounties", "start_char": 8092, "end_char": 9048, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dcdc7b21ddf8fbd4d53cbde6841beedc5ff8851c42f1e4a1c36c540749f42b0c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Close Child Bounties\n\nChild bounties can be closed without awarding them. To close a child bounty, you must submit a\n`childBounties.closeChild.Bounty` extrinsic, specifying the parent bounty and child bounty IDs. Only\nthe parent bounty curator can sign this transaction, resulting in the child bounty’s curator deposit\nbeing returned.\n\nSee the video tutorial below to learn how to close a child bounty.\n\n<div className=\"row\">\n  <div className=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=Qv_nJVcvQr8&t=2109s\">\n      <img src=\"https://img.youtube.com/vi/Qv_nJVcvQr8/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=Qv_nJVcvQr8&t=2109s\">Close a Child Bounty</a>\n    </p>\n  </div>\n</div>\n\nIf the child bounty curator acts maliciously, the parent bounty curator can submit a\n`childBounties.unassignCurator` that slashes the curator's deposit."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-bounties", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-bounties/#refill-parent-bounties", "page_title": "Polkadot-JS Bounty Management Guide", "index": 5, "depth": 2, "title": "Refill Parent Bounties", "anchor": "refill-parent-bounties", "start_char": 9048, "end_char": 9697, "estimated_token_count": 160, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dcdc7b21ddf8fbd4d53cbde6841beedc5ff8851c42f1e4a1c36c540749f42b0c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Refill Parent Bounties\n\nTo refill a parent bounty,\n[an OpenGov referendum must be submitted](./learn-guides-polkadot-opengov.md#submitting-a-preimage).\n\nThe preimage must contain a `treasury.spendLocal` extrinsic specifying the amount of tokens to be\nsent from the treasury to the receiver's address, in this case the\n[system account](./learn-account-advanced.md#system-accounts) of the\n[parent bounty](./learn-polkadot-opengov-treasury.md#bounties).\n\nTo get the bounty system account of a parent bounty, go to\n[Subsquare](https://polkadot.subsquare.io/treasury/bounties), search for the bounty name, and the\naddress will be shown under Metadata."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-claims", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-claims/#generate-an-account", "page_title": "Polkadot-JS Token Claims Guide", "index": 0, "depth": 2, "title": "Generate an Account", "anchor": "generate-an-account", "start_char": 1044, "end_char": 1469, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:28a618422c0aa7ec83b5a20cdb63a54c411e73720b5791ca88b9d257541dca75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Generate an Account\n\nYou will need to generate an account on the relay chain to claim DOT (or KSM on Kusama). See the\n[available wallets and extensions](https://polkadot.com/ecosystem/) for more information about\nwallets and browser extensions you can use to create an account. In terms of hardware wallet\nsupport, you can use the [Ledger](../general/ledger.md) devices or\n[Polkadot Vault](../general/polkadot-vault.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-claims", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-claims/#claiming-tokens", "page_title": "Polkadot-JS Token Claims Guide", "index": 1, "depth": 2, "title": "Claiming Tokens", "anchor": "claiming-tokens", "start_char": 1469, "end_char": 1617, "estimated_token_count": 40, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:28a618422c0aa7ec83b5a20cdb63a54c411e73720b5791ca88b9d257541dca75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Claiming Tokens\n\nThe Polkadot-JS [Claims app](https://polkadot.js.org/apps/#/claims) will guide you through the\nprocess of claiming the tokens."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-claims", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-claims/#select-accounts", "page_title": "Polkadot-JS Token Claims Guide", "index": 2, "depth": 3, "title": "Select Accounts", "anchor": "select-accounts", "start_char": 1617, "end_char": 2071, "estimated_token_count": 108, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:28a618422c0aa7ec83b5a20cdb63a54c411e73720b5791ca88b9d257541dca75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Select Accounts\n\nSelect the account you would like to claim the tokens into and click the \"Continue\" button to\nproceed. Your screen should look something like this:\n\n![claim select dot account](../assets/claim-select-dot-account.png)\n\n#### Select Account on Ethereum\n\nPaste the Ethereum address with the DOT allocation indicator tokens and click the \"Continue\" button\nto proceed.\n\n![claim select eth account](../assets/claim-select-eth-account.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-claims", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-claims/#sign-message-on-ethereum-claim", "page_title": "Polkadot-JS Token Claims Guide", "index": 3, "depth": 3, "title": "Sign Message on Ethereum & Claim", "anchor": "sign-message-on-ethereum-claim", "start_char": 2071, "end_char": 3487, "estimated_token_count": 334, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:28a618422c0aa7ec83b5a20cdb63a54c411e73720b5791ca88b9d257541dca75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Sign Message on Ethereum & Claim\n\nThe hex-encoded string that follows the sentence \"Pay DOT to the Polkadot account:\" is the\nhex-encoded public key of your Polkadot account, minus the `0x` prefix.\n\n![claim copy msg](../assets/claim-copy-msg.png)\n\nGo to\n[the \"Sign & Verify Message\" tab on the MyCrypto web application](https://app.mycrypto.com/sign-message).\nMyCrypto is good to use if you have stored the key to the Ethereum account holding your DOT\nindicator tokens on a hardware device like a Ledger Nano. It also supports raw private keys,\nmnemonics, and the Polkadot Vault. After unlocking your Ethereum wallet, copy and paste the\noutputted sentence on the Polkadot Developer Interface into the message box on the MyCrypto app. When you click\n\"Sign Message\" you will get a JSON output signature as shown below:\n\n![claim get signature](../assets/claim-get-signature.png)\n\nCopy and paste the JSON output of the signed message from MyCrypto into the input box on the\nPolkadot Developer Interface and click \"Confirm Claim.\"\n\n![claim paste signature](../assets/claim-paste-signature.png)\n\nAt this point, if you are eligible, you will see a success message if everything went right and your\ntokens will now be in the account that you claimed to. Congratulations! You can now participate in\naspects of the network such as [governance](../learn/learn-polkadot-opengov.md) and\n[staking](../learn/learn-staking.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-claims", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-claims/#verifying-your-claim", "page_title": "Polkadot-JS Token Claims Guide", "index": 4, "depth": 3, "title": "Verifying your Claim", "anchor": "verifying-your-claim", "start_char": 3487, "end_char": 3603, "estimated_token_count": 24, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:28a618422c0aa7ec83b5a20cdb63a54c411e73720b5791ca88b9d257541dca75", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Verifying your Claim\n\nAfter you make an on-chain claim, your Your account balance should be updated immediately."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-marketplaces", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-marketplaces/#regionx", "page_title": "Coretime Marketplaces Guide", "index": 0, "depth": 2, "title": "RegionX", "anchor": "regionx", "start_char": 474, "end_char": 822, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbe937e557ab70f24de3ace4109cc2a9155a89fe38f84ccd11a1f971fb40db3c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## RegionX\n\nThe RegionX Hub is a UI developed for users to get an overview of the Agile Coretime system and interact with all its functionality.\n\nRegionX Hub so the UI is dynamic and adapts to different use cases.\n\n![RegionX-User-Specific](../assets/coretime/RegionX-user-specific-dashboards.png)\n\n![RegionX-UI](../assets/coretime/RegionX-UI.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-marketplaces", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-marketplaces/#regionx-hub-overview", "page_title": "Coretime Marketplaces Guide", "index": 1, "depth": 3, "title": "RegionX Hub Overview", "anchor": "regionx-hub-overview", "start_char": 822, "end_char": 1651, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbe937e557ab70f24de3ace4109cc2a9155a89fe38f84ccd11a1f971fb40db3c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### RegionX Hub Overview\n\nRegionX provides a different dashboard for different use cases:\n- [Overview](https://hub.regionx.tech/?dashboard=overview&network=polkadot): The overview dashboard is for anyone who wants an overview of Coretime data and access to most functionalities from a single page.\n- [Deploying a new project](https://hub.regionx.tech/?dashboard=deploying-new-project&network=polkadot): The dashboard is designed to show only the information relevant for teams deploying a new project on Polkadot.\n- [Managing existing project](https://hub.regionx.tech/?dashboard=managing-existing-project&network=polkadot): Once a project is up and running on Polkadot, RegionX Hub provides a dashboard where teams can track their renewal status and compare the cost of renewing their core versus buying a new one in the sale."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-marketplaces", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-marketplaces/#purchasing-cores-on-regionx-hub", "page_title": "Coretime Marketplaces Guide", "index": 2, "depth": 3, "title": "Purchasing Cores on RegionX Hub", "anchor": "purchasing-cores-on-regionx-hub", "start_char": 1651, "end_char": 1962, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbe937e557ab70f24de3ace4109cc2a9155a89fe38f84ccd11a1f971fb40db3c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Purchasing Cores on RegionX Hub\n\nAfter connecting their wallet, the user can track the current sale cycle and attempt to purchase a core.\n\nThis functionality is accessible from the *overview* and *deploying a new project* dashboards.\n\n![RegionX-purchase-core](../assets/coretime/regionx-purchase-core.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-marketplaces", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-marketplaces/#managing-cores-with-regionx", "page_title": "Coretime Marketplaces Guide", "index": 3, "depth": 3, "title": "Managing Cores with RegionX", "anchor": "managing-cores-with-regionx", "start_char": 1962, "end_char": 2290, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbe937e557ab70f24de3ace4109cc2a9155a89fe38f84ccd11a1f971fb40db3c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Managing Cores with RegionX\n\nThe Regions dashboard lists all the cores purchased through the connected wallet account along with\nthe basic information of the respective core. It allows for partitioning, interlacing, transfers,\nand assigning tasks.\n\n![RegionX-regions-dashboard](../assets/coretime/regionx-manage-cores.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-marketplaces", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-marketplaces/#lastic", "page_title": "Coretime Marketplaces Guide", "index": 4, "depth": 2, "title": "Lastic", "anchor": "lastic", "start_char": 2290, "end_char": 2450, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbe937e557ab70f24de3ace4109cc2a9155a89fe38f84ccd11a1f971fb40db3c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Lastic\n\nLastic is a marketplace for buying and selling blockspace. For more information, check\n[Lastic's official documentation](https://docs.lastic.xyz/)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-marketplaces", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-marketplaces/#purchasing-cores-with-lastic", "page_title": "Coretime Marketplaces Guide", "index": 5, "depth": 3, "title": "Purchasing Cores with Lastic", "anchor": "purchasing-cores-with-lastic", "start_char": 2450, "end_char": 2820, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbe937e557ab70f24de3ace4109cc2a9155a89fe38f84ccd11a1f971fb40db3c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Purchasing Cores with Lastic\n\nLastic allows for purchasing core with accounts hosted on wallets like Subwallet, Talisman, Nova\nWallet and Polkadot Developer Signer. Select the account to be used for the coretime purchase and then,\nclick on \"buy core\" button to sign and broadcast the transaction.\n\n![Lastic-purchase-bulk-coretime](../assets/coretime/Lastic-UI.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-marketplaces", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-marketplaces/#managing-cores-with-lastic", "page_title": "Coretime Marketplaces Guide", "index": 6, "depth": 3, "title": "Managing Cores with Lastic", "anchor": "managing-cores-with-lastic", "start_char": 2820, "end_char": 3078, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:cbe937e557ab70f24de3ace4109cc2a9155a89fe38f84ccd11a1f971fb40db3c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Managing Cores with Lastic\n\nLastic enables you to transfer your core to another account, utilize it for a parachain, split it\nup, change block production frequency, or assign it to a task.\n\n![Lastic-manage-core](../assets/coretime/Lastic-manage-core.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-parachains/#reserve-paraid", "page_title": "Agile Coretime for Parachains", "index": 0, "depth": 2, "title": "Reserve ParaID", "anchor": "reserve-paraid", "start_char": 2574, "end_char": 3121, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:268638b419f244bcc5af3ec66ed7f641b584f4e8413ffbb1a70ae087d9632333", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Reserve ParaID\n\nReserving a `ParaID` requires a\n[deposit](../general/chain-state-values.md). The first step is to\nregister a [`ParaID`](../general/glossary.md#paraid) for the parachain. This can be done through\nPolkadot Developer Interface by navigating to\n[Network > Parachains > Parathreads](https://polkadot.js.org/apps/#/parachains/parathreads) and\nclicking on ParaID button. Ensure that you have sufficient tokens to reserve the displayed `ParaID`\nsuccessfully.\n\n![coretime-reserve-paraID](../assets/coretime/coretime-reserve-paraID.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-parachains/#register-parachain-state-and-code", "page_title": "Agile Coretime for Parachains", "index": 1, "depth": 2, "title": "Register Parachain State and Code", "anchor": "register-parachain-state-and-code", "start_char": 3121, "end_char": 4592, "estimated_token_count": 332, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:268638b419f244bcc5af3ec66ed7f641b584f4e8413ffbb1a70ae087d9632333", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Register Parachain State and Code\n\n!!!info \"Deposit requirements for registering a parachain\"\n    Due to the reasons [discussed here](https://github.com/paritytech/polkadot-sdk/pull/2372), instead of the usual per-byte method of charging for storing validation and genesis code upon registration, the cost is fixed to the maximum possible code size (`MAX_CODE_SIZE`), regardless of the actual size.\n\nOn **Kusama**, the deposit required to register a parachain is **~1100 KSM** and an estimated fee of\n**~5 KSM**.\n\nOn **Polkadot**, the deposit required to register a parachain is **~3300 DOT** and an estimated fee\nof **~150 DOT**.\n\nIt is possible to deregister the parachain and withdraw the deposit if the parachain has not\nproduced any blocks. If the parachain produced blocks, then the parachain can only be deregistered\nthrough the relay chain's governance.\n\nThe next step is to register the parachain's genesis wasm and state, which you should have generated\nearlier. Note that for this example, we are using `adder-collator`, but in theory a custom runtime\ncompiled from a\n[template](https://github.com/paritytech/polkadot-sdk/tree/88a2f360238787bf5256cfdd14b40c08f519b38e/templates/parachain)\nwould work as well.\n\n\n\n\n![coretime-register-parathread](../assets/coretime/Register-Parachain.png)\n\nAfter successful registration, the parachain starts onboarding as a parathread. **Note that the parachain id must be the same as the one used in the previous steps**."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-parachains/#run-parachain-collator", "page_title": "Agile Coretime for Parachains", "index": 2, "depth": 2, "title": "Run Parachain Collator", "anchor": "run-parachain-collator", "start_char": 4592, "end_char": 4872, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:268638b419f244bcc5af3ec66ed7f641b584f4e8413ffbb1a70ae087d9632333", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run Parachain Collator\n\nWhile the parachain is onboarding, start syncing the [collator](./learn-collator.md) using the\nfollowing command to rapidly sync with the specified relay chain.\n\n```\n./target/release/adder-collator --parachain-id= $ParaID --chain=paseo --sync warp\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-parachains/#run-a-parachain-with-bulk-coretime", "page_title": "Agile Coretime for Parachains", "index": 3, "depth": 2, "title": "Run a Parachain with Bulk Coretime", "anchor": "run-a-parachain-with-bulk-coretime", "start_char": 4872, "end_char": 5755, "estimated_token_count": 216, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:268638b419f244bcc5af3ec66ed7f641b584f4e8413ffbb1a70ae087d9632333", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run a Parachain with Bulk Coretime\n\n!!!info\n    Note that we have two options: **bulk coretime** and **on-demand coretime**. Bulk coretime is purchased via the `broker` pallet, which is on the respective Coretime system parachain. On-demand coretime is ordered via the `OnDemandAssignment` pallet/module, which is located on the respective relay chain.\n\nYou can purchase bulk coretime on [Coretime chain](./learn-guides-coretime-marketplaces.md) and\nassign the purchased core to the registered `ParaID`. The snapshot below is from\n[Lastic](https://test.lastic.xyz/) interface.\n\n![coretime-bulk-assign-lastic](../assets/coretime/lastic-assign-core.png)\n\nAfter successful assignment of the core, the `adder-collator` logs show new collations at regular\nintervals, gradually incrementing the state by `2`.\n\n![coretime-collation-bulk](../assets/coretime/coretime-collation-bulk.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-parachains/#run-a-parachain-with-on-demand-coretime", "page_title": "Agile Coretime for Parachains", "index": 4, "depth": 2, "title": "Run a Parachain with On-demand Coretime", "anchor": "run-a-parachain-with-on-demand-coretime", "start_char": 5755, "end_char": 7216, "estimated_token_count": 322, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:268638b419f244bcc5af3ec66ed7f641b584f4e8413ffbb1a70ae087d9632333", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Run a Parachain with On-demand Coretime\n\nAfter the collator node is fully synced with the relay chain, navigate to\n[Developer > Extrinsics](https://polkadot.js.org/apps/#/extrinsics) on the relay chain and issue\n`onDemandAssignmentProvider.placeOrderAllowDeath` extrinsic from the account that registered the\n`ParaID` by specifying sufficient `maxAmount`for the transaction to go through successfully.\n\n![coretime-ondemand-assignment](../assets/coretime/coretime-on-demand-assignment.png)\n\n!!!info \n    There are two extrinsics which allow you to place orders for on-demand coretime:\n    - `onDemandAssignmentProvider.placeOrderAllowDeath` will [reap](./learn-accounts.md#existential-deposit-and-reaping) the account once the provided funds run out.\n    - `onDemandAssignmentProvider.placeOrderKeepAlive` includes a check which will **not** reap the account if the provided funds will run out, ensuring the account is kept alive.\n\nWith each successful on-demand extrinsic, the parachain head changes (you may have to zoom out on\nthe browser for parachain head details to show up on Polkadot Developer Interface).\n\n![coretime-ondemand-parahead](../assets/coretime/coretime-on-demand-parahead.png)\n\nThe successful collation can also be verified in the parachain collator logs. It can be noticed that\nwith each parachain block, the state of `adder-collator` is incremented by `2`.\n\n![coretime-new-collation](../assets/coretime/coretime-create-new-collation.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-swap", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-swap/#initiate-swap-from-the-parachain", "page_title": "Polkadot-JS Coretime Lease Swap Guides", "index": 0, "depth": 2, "title": "Initiate Swap from the Parachain", "anchor": "initiate-swap-from-the-parachain", "start_char": 820, "end_char": 2174, "estimated_token_count": 261, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:481f5613731a2971091d7245b1084bc4c58ed0d5c158b21f38a986e1dbee0fdc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Initiate Swap from the Parachain\n\nTo swap from a parachain, an XCM message needs to be sent from the parachain to the relay chain.\nThis XCM message must be a send instruction that wraps the `registrar.swap` extrinsic that needs to\nbe executed on the relay chain.\n\nBelow, you can find an example hex encoded call for Composable Finance, assuming the team is still\noperating under SUDO.\n\n[0x0200290003010003140004000000000700e876481713000000000700e87648170006000700e40b540282380100284603e3070000320d0000140d01000001008d1f](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fcomposable-rpc.dwellir.com#/extrinsics/decode/0x0200290003010003140004000000000700e876481713000000000700e87648170006000700e40b540282380100284603e3070000320d0000140d01000001008d1f)\n\nAs for weights (size and time), we use an overestimate compared with those returned by the Polkadot\nRelay Runtime API.\n\nTo check the exact weights, you can navigate to Polkadot Developer Interface > Developer > Runtime Calls and then\nselect `transactionPaymentCallInfo` and `queryCallInfo` and include the extrinsic being sent in the\n`send` instruction of the XCM message:\n[0x4603e3070000320d0000](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.ibp.network%2Fpolkadot#/extrinsics/decode/0x4603e3070000320d0000)\n\n![TX-payment-API-Lease-Swap](../assets/coretime/tx-payment-api-weights-lease-swap.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-swap", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-swap/#perform-swap-on-the-relay-chain-for-an-unlocked-parachain", "page_title": "Polkadot-JS Coretime Lease Swap Guides", "index": 1, "depth": 2, "title": "Perform Swap on the Relay chain for an unlocked Parachain", "anchor": "perform-swap-on-the-relay-chain-for-an-unlocked-parachain", "start_char": 2174, "end_char": 2691, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:481f5613731a2971091d7245b1084bc4c58ed0d5c158b21f38a986e1dbee0fdc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Perform Swap on the Relay chain for an unlocked Parachain\n\nIn the case a parachain is unlocked, then the manager of the parachain on the relaychain must send\nthe extrinsic directly on the relaychain.\n\nIn the case of paraID 3378 wanting to swap with Composable Finance, the extrinsic to send from its\nmanager account `13B8Tdhi4EuruwzVt3gdcTopXpqbUzmncutiQKKNbd8cpU91` is:\n\n[0x4603320d0000e3070000](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.ibp.network%2Fpolkadot#/extrinsics/decode/0x4603320d0000e3070000)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-swap", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-swap/#coretime-swap-prerequisites", "page_title": "Polkadot-JS Coretime Lease Swap Guides", "index": 2, "depth": 2, "title": "Coretime Swap Prerequisites", "anchor": "coretime-swap-prerequisites", "start_char": 2691, "end_char": 3136, "estimated_token_count": 83, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:481f5613731a2971091d7245b1084bc4c58ed0d5c158b21f38a986e1dbee0fdc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Coretime Swap Prerequisites\n\nWe need to ensure the parachains have a valid cores to execute the swap instruction. This can be\nachieved either by getting a core in bulk from the coretime system chain, or by leveraging the\nonDemand functionality on relay chain. Assuming that teams have a working parachain (with a valid\ncore) and a stalled parachain, the following instructions explain how to get a core `onDemand` for\nthe stalled parachain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-swap", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-swap/#swap-through-an-ondemand-core", "page_title": "Polkadot-JS Coretime Lease Swap Guides", "index": 3, "depth": 3, "title": "Swap through an OnDemand Core", "anchor": "swap-through-an-ondemand-core", "start_char": 3136, "end_char": 3907, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:481f5613731a2971091d7245b1084bc4c58ed0d5c158b21f38a986e1dbee0fdc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Swap through an OnDemand Core\n\nThis functionality exists on the relay chain and allows users to request for 1 block of validation\nof their parachain. In order to place an order for on demand, any account must call the\n`onDemand.placeOrderAllowDeath` extrinsic.\n\n![onDemand-block-production](../assets/coretime/onDemand-block-production.png)\n\nThis extrinsic takes two parameters:\n\n- Amount: the amount the user is willing to pay for the parachain block to be validated by a core.\n  The minimum amount the system allows is 250,000,000 planckDOT (0.025 DOT) and the actual amount is\n  dynamic as it depends on the on-demand block production requests queued.\n\n- paraID: This refers to the `paraID` of the on-demand Parachain whose block must be  \n  validated by a core."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-swap", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-swap/#core-swap-execution-steps", "page_title": "Polkadot-JS Coretime Lease Swap Guides", "index": 4, "depth": 3, "title": "Core Swap Execution Steps", "anchor": "core-swap-execution-steps", "start_char": 3907, "end_char": 5179, "estimated_token_count": 264, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:481f5613731a2971091d7245b1084bc4c58ed0d5c158b21f38a986e1dbee0fdc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Core Swap Execution Steps\n\nIf you are a team with two parachains, one that has a lease with a fresh paraID, and an old one that\ndoesn't have a lease but contains the history of the chain then below is a list of steps to execute\nto swap these leases.\n\nAssumptions\n\n- Your new paraID is unlocked and your old paraID is locked.\n- You have access to the manager account on the relay chain for the new paraID\n- You have your collators running on your old paraID and you can execute upward XCM messages from\n  that parachain.\n- The sovereign account for the locked paraID has enough available funds to execute transactions on\n  the relay chain.\n- The account that owns the unlocked paraID has enough available funds to execute transactions on\n  the relay chain. transactions on the relay chain.\n\nSteps\n\n- Have the collator running for your original paraID.\n- Send the [XCM instruction detailed before](#initiate-swap-from-the-parachain).\n- Get a onDemandCore for your original paraID. Once this gets executed, your XCM message should be\n  dispatched to the relay chain and you should see a pending swap.\n- Use the manager account on your new paraID to send the\n  [swap instruction](#perform-swap-on-the-relay-chain-for-an-unlocked-parachain) directly on the\n  relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-coretime-swap", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-coretime-swap/#coretime-swap-time-for-effect", "page_title": "Polkadot-JS Coretime Lease Swap Guides", "index": 5, "depth": 3, "title": "Coretime Swap - Time for Effect", "anchor": "coretime-swap-time-for-effect", "start_char": 5179, "end_char": 5595, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:481f5613731a2971091d7245b1084bc4c58ed0d5c158b21f38a986e1dbee0fdc", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Coretime Swap - Time for Effect\n\nThe swap of leases is effective immediately, however the Coretime chain communicates the changes of\nthese leases to the relay chain with every new coretime cycle. Thus, the change will come into\neffect in the following coretime cycle. For information on when the new coretime cycle, you can view\nthe [coretime sales](https://coretime-polkadot.subscan.io/coretime_dashboard) page."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#setting-an-identity", "page_title": "Polkadot-JS Identity Guides", "index": 0, "depth": 2, "title": "Setting an Identity", "anchor": "setting-an-identity", "start_char": 1138, "end_char": 1921, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Setting an Identity\n\nUsers can set an identity by registering through default fields such as legal name, display name,\nwebsite, Twitter handle, Riot handle, etc. along with some extra, custom fields for which they would\nlike attestations (see [Judgements](./learn-identity.md#judgements)).\n\n!!!info \"Instructions for setting and clearing Identities\"\n    The procedure to set and clear identities is explained in detail in this article - [How to set and clear an Identity](how-to/set-clear-identity.md)\n\n!!!note The Ledger app on **Nano S** doesn't support the extrinsic for setting identity. As a workaround, create a primary identity with an on-chain account and then using that primary identity, assign a [sub-identity](./learn-identity.md#sub-identities) to the Ledger stash."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#format-caveat", "page_title": "Polkadot-JS Identity Guides", "index": 1, "depth": 3, "title": "Format Caveat", "anchor": "format-caveat", "start_char": 1921, "end_char": 2834, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Format Caveat\n\nPlease note the following caveat: because the fields support different formats, from raw bytes to\nvarious hashes, a UI has no way of telling how to encode a given field it encounters. The\nPolkadot Developer Interface currently encodes the raw bytes it encounters as UTF8 strings, which makes these\nvalues readable on-screen. However, given that there are no restrictions on the values that can be\nplaced into these fields, a different UI may interpret them as, for example, IPFS hashes or encoded\nbitmaps. This means any field stored as raw bytes will become unreadable by that specific UI. As\nfield standards crystallize, things will become easier to use but for now, every custom\nimplementation of displaying user information will likely have to make a conscious decision on the\napproach to take, or support multiple formats and then attempt multiple encodings until the output\nmakes sense."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#request-judgement", "page_title": "Polkadot-JS Identity Guides", "index": 2, "depth": 2, "title": "Request Judgement", "anchor": "request-judgement", "start_char": 2834, "end_char": 4990, "estimated_token_count": 446, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Request Judgement\n\n!!!info \"Instructions for requesting and cancelling Identity judgements\"\n    The procedure to request and cancel identity judgments is explained in detail in this [article](how-to/request-cancel-judgement.md)\n\nTo be judged after submitting your identity information, go to the\n[Extrinsics tab in the Polkadot Developer Interface](https://polkadot.js.org/apps/#/extrinsics) and select the\n`identity` pallet, then `requestJudgement`. For the `reg_index` put the index of the registrar you\nwant to be judged by, and for the `max_fee` put the maximum you're willing to pay for these\nconfirmations.\n\nIf you don't know which registrar to pick, first check the available registrars by going to\n[Chain State tab in the Polkadot Developer Interface](https://polkadot.js.org/apps/#/chainstate) and selecting\n`identity.registrars()` to get the full list.\n\nTo find out how to contact the registrar after the application for judgement or to learn who they\nare, you can check their identity by adding them to your Address Book. Their identity will be\nautomatically loaded.\n\n![Chevdor is registrar #1](../assets/identity/16.jpg)\n\n!!!info \"Requesting judgement through Web3 Foundation Registrar\"\n    If you requested judgement for your on-chain identity through the Web3 Foundation Registrar (i.e. Registrar #0) you will need to complete a few additional tasks.\n\n!!!caution\n    The set identity calls go on-chain. Hence, the contact information is available publicly, for both legitimate entities, like registrars or validators, but also scammers who might impersonate them. The strings in the identity fields are good candidates for homograph attacks, as someone could list a fraudulent website (web3.f0undation instead of web3.foundation for example) and still get verified by the registrar (if the checks are automated)!\n    \n    In a decentralized network, one should be cautious making transactions with accounts solely based on their identity. If an account on-chain claims to be of Web3 Foundation, it is wise to verify its authenticity by checking directly with Web3 Foundation or examining the established history of that account on-chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#clearing-and-killing-an-identity", "page_title": "Polkadot-JS Identity Guides", "index": 3, "depth": 2, "title": "Clearing and Killing an Identity", "anchor": "clearing-and-killing-an-identity", "start_char": 4990, "end_char": 5448, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Clearing and Killing an Identity\n\n!!!info\n    Visit the section \"Clear an Identity\" on [this article](how-to/set-clear-identity.md) for guidelines about clearing identities.\n\n**Clearing:** Users can clear their identity information and have their deposit returned. Clearing\nan identity also clears all sub accounts and returns their deposits.\n\n**Killing:** It is possible to kill an identity that deems erroneous. This results in a slash of the\ndeposit."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#setting-sub-identities", "page_title": "Polkadot-JS Identity Guides", "index": 4, "depth": 2, "title": "Setting Sub-Identities", "anchor": "setting-sub-identities", "start_char": 5448, "end_char": 5671, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Setting Sub-Identities\n\nTo set up sub-identities with Polkadot-JS see the\n[how to set sub-identities](how-to/set-subaccount-identities.md)\narticle and this [video tutorial](https://www.youtube.com/watch?v=0Yh1JYg3ZKU)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#setting-sub-identity-sub-id-for-your-ledger-account", "page_title": "Polkadot-JS Identity Guides", "index": 5, "depth": 3, "title": "Setting Sub-Identity (Sub-ID) for your Ledger Account", "anchor": "setting-sub-identity-sub-id-for-your-ledger-account", "start_char": 5671, "end_char": 6946, "estimated_token_count": 336, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Setting Sub-Identity (Sub-ID) for your Ledger Account\n\nSetting an Identity is not possible on Ledger app yet, but as a workaround, you can\n[set the identity for an on-chain account ](../learn/learn-guides-identity.md#setting-an-identity) and then\nuse it to set a sub-identity to your Ledger account.\n\n- Go to https://polkadot.js.org/apps/#/accounts. Click on the three vertical dots corresponding to\n  the account to which you already set identity. You should see an option to set onchain\n  sub-identities. Click on it.\n\n  ![Add sub-identity in PolkadotJS](../assets/identity/sub-id-1.png)\n\n- In the pop-up window, select your Ledger account from the dropdown and enter text in sub name\n  field. Then, click on set subs button.\n  ![Set sub-identity in PolkadotJS](../assets/identity/sub-id-2.png)\n- Sign and submit the transaction from the parent account with the identity\n\nYou should now see the sub-identity displayed on-chain. You need to be aware that the creation of\nidentities and sub-identities requires\n[deposits](../general/chain-state-values.md). This reserved account balance is\nfreed once you [clear the identities](../learn/learn-guides-identity.md#clearing-and-killing-an-identity)\non the account.\n\n![Sub-identity example](../assets/identity/sub-id-3.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#registrars", "page_title": "Polkadot-JS Identity Guides", "index": 6, "depth": 2, "title": "Registrars", "anchor": "registrars", "start_char": 6946, "end_char": 6961, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Registrars"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-identity/#becoming-a-registrar", "page_title": "Polkadot-JS Identity Guides", "index": 7, "depth": 3, "title": "Becoming a Registrar", "anchor": "becoming-a-registrar", "start_char": 6961, "end_char": 7322, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a51d8cd212d46b46ad2b1d28152d7cbcb7672b3e0cf0b1ce66b8fe0ed2607dd9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Becoming a Registrar\n\nTo become a registrar, submit a pre-image and proposal on\n[OpenGov](../learn/learn-guides-polkadot-opengov.md), then wait for people to vote on it. For best\nresults, write a post about your identity and intentions beforehand, and once the proposal is in the\nqueue ask people to endorse it so that it gets ahead in the referendum queue."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#loading-your-account", "page_title": "Ledger Guides", "index": 0, "depth": 2, "title": "Loading Your Account", "anchor": "loading-your-account", "start_char": 894, "end_char": 1525, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Loading Your Account\n\n!!!info\n    Ledger Live should be off while using Ledger with Polkadot Developer Interface, as it can interfere with normal operation.\n\nYou can import your Ledger account to [Polkadot Extension](https://polkadot.js.org/extension/) or to\nthe [Polkadot Developer Interface](https://polkadot.js.org/apps/#/explorer). For instructions on how to import\nLedger accounts to the Polkadot Extension read through\n[this article](how-to/add-ledger-account-signer.md),\nwhile if you want to import Ledger accounts to the Polkadot Developer Interface, you can consult\n[this other article](how-to/add-ledger-account.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#derivation-paths", "page_title": "Ledger Guides", "index": 1, "depth": 3, "title": "Derivation Paths", "anchor": "derivation-paths", "start_char": 1525, "end_char": 2767, "estimated_token_count": 272, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Derivation Paths\n\nWhen adding a Ledger account using the extension or the UI, you will be asked to select an\n`account type` and an `account index`. The first lets you select an account, while the second lets\nyou pick a derivation path from that account - think of it like a formula from which child accounts\nare generated. When you are creating a Polkadot ledger account for the first time on Ledger Live\nwith name `Polkadot 1`, this can be added to Polkadot-JS using the 0/0 derivation path (i.e. account\ntype = 0 and account index = 0). If you add a second account called `Polkadot 2`, this will\ncorrespond to the 1/0 derivation path, and so on. We thus have multiple parent accounts that can be\nviewed and used in both Ledger Live and Polkadot-JS. Additionally, we can use Polkadot Developer Interface to\ncreate multiple children accounts from each parent account. For example, `Polkadot 1` with 0/0\nderivation path can have child 0/1, 0/2, etc. that can be used within the UI. However, such children\naccounts cannot be used in Ledger Live, as it only scans through the parent accounts. So, remember\nthat the balances on the children accounts cannot be viewed, and you will not be able to transact\nwith those accounts on Ledger Live."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#confirming-the-address-on-your-device", "page_title": "Ledger Guides", "index": 2, "depth": 3, "title": "Confirming the Address on your Device", "anchor": "confirming-the-address-on-your-device", "start_char": 2767, "end_char": 3097, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Confirming the Address on your Device\n\nIf your Ledger account is directly imported into the Polkadot Developer Interface, you can ask the UI to confirm\nthe address on your Ledger device. There are a few methods to check the balance of your Ledger\naccount. Check out\n[this article](learn-account-advanced.md)\nfor information."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#navigating-your-account", "page_title": "Ledger Guides", "index": 3, "depth": 2, "title": "Navigating your Account", "anchor": "navigating-your-account", "start_char": 3097, "end_char": 3484, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Navigating your Account\n\nOnce you have loaded your account on the “Accounts” tab, it should show a row with your Ledger\naccount. Your account’s DOT balance is on the row’s far right. Expanding the balance arrow will show\nyour balance details, such as locks or reserved amounts. For more information about the type of\nbalances, visit the [balances page](./learn-account-balances.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#sending-a-transfer-with-ledger-devices", "page_title": "Ledger Guides", "index": 4, "depth": 2, "title": "Sending a Transfer with Ledger Devices", "anchor": "sending-a-transfer-with-ledger-devices", "start_char": 3484, "end_char": 4497, "estimated_token_count": 245, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Sending a Transfer with Ledger Devices\n\n!!!danger \"Verifying Extrinsics\"\n    Visit the [**dedicated page**](how-to/verify-extrinsic.md#verify-an-extrinsic-using-ledger) and see [**this video tutorial**](https://youtu.be/bxMs-9fBtFk?t=360) tutorial to learn how to verify extrinsics before signing them. The video will also mention potential attacks that can happen while signing transactions.\n\n!!!info \"Signature error message\"\n    If you have already connected your device, but an error message appears before signing a transaction, make sure you have opened the Polkadot Ledger Generic application on your Ledger Nano device. Visit [this page](how-to/ledger-sign-transaction.md) for more information about signing transactions using your ledger.\n\nGeneral instructions to send a transfer can be found on\n[this page](how-to/transfer-funds.md).\nTo sign transactions with your Ledger Nano check\n[this article](how-to/ledger-sign-transaction.md) or\nsee [this video tutorial](https://youtu.be/gbvrHzr4EDY?t=579)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#receiving-a-transfer", "page_title": "Ledger Guides", "index": 5, "depth": 2, "title": "Receiving a Transfer", "anchor": "receiving-a-transfer", "start_char": 4497, "end_char": 5679, "estimated_token_count": 258, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Receiving a Transfer\n\nTo receive a transfer on the accounts stored on your Ledger device, you must provide the sender\n(i.e., the payer) with your address. To do so, follow the instructions on\n[this page](how-to/receive-dot.md).\n\n!!!caution \"Sharing your account address\"\n    Before giving anyone your address, ensure it matches what's on the Ledger by [confirming the address on your device](#confirming-the-address-on-your-device). Some malware will intercept clicks and clipboard requests and can change your copied value in-flight, so being extra vigilant around copy-paste operations makes sense.\n\nThe easiest way to get your address is to click on the account name. This will open a sidebar\nshowing your address and other information, such as on-chain identity. Another method is just\nclicking on your account's avatar icon - this immediately copies your address to the clipboard.\n\n!!!note \"Your Asset Hub address is the same as your relay chain address\"\n    Make sure that you clarify to the sender that you wish to receive your tokens on the Asset Hub parachain, otherwise (if you're receiving DOT or KSM tokens) they could be sent on the Polkadot or Kusama relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#staking", "page_title": "Ledger Guides", "index": 6, "depth": 2, "title": "Staking", "anchor": "staking", "start_char": 5679, "end_char": 5795, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking\n\nFor staking using Ledger devices, follow the instructions on\n[this article](how-to/stake-nominate.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#ledger-developer-release", "page_title": "Ledger Guides", "index": 7, "depth": 2, "title": "Ledger Developer Release", "anchor": "ledger-developer-release", "start_char": 5795, "end_char": 5986, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Ledger Developer Release\n\n!!!warning\n    This section is for developers only. It is recommended to install the application from Ledger Live unless you _know precisely what you're doing_."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#why-you-might-need-the-developer-release", "page_title": "Ledger Guides", "index": 8, "depth": 3, "title": "Why you might need the Developer Release", "anchor": "why-you-might-need-the-developer-release", "start_char": 5986, "end_char": 6889, "estimated_token_count": 194, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Why you might need the Developer Release\n\nLedger apps for the Polkadot ecosystem are developed by [Zondax](https://zondax.ch/). When new\nfunctionalities are added to the Ledger apps, they are made available on a developer release for\ntesting purposes. After a successful audit and review, the apps would be available for download and\ninstallation using [Ledger Live](https://www.ledger.com/ledger-live). As it takes some time for\nLedger to audit and review the release, the app upgrade option may not be available on Ledger Live\nwhen the new runtime is deployed on the network. If this happens, users cannot use Ledger devices to\nsign transactions. Suppose you cannot wait a few days until the app passes the Ledger audit, you can\ninstall the developer release from the shell using the latest version published on\n[the Zondax GitHub repository](https://github.com/Zondax/ledger-polkadot/releases)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-ledger", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-ledger/#install-the-developer-release", "page_title": "Ledger Guides", "index": 9, "depth": 3, "title": "Install the Developer Release", "anchor": "install-the-developer-release", "start_char": 6889, "end_char": 8637, "estimated_token_count": 376, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:8e5c92c56999e054ffe222c49fc4e5d6323c0a61d396b2d81e9a89abee71a24d", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Install the Developer Release\n\n!!!info\n    See [**this video tutorial**](https://youtu.be/4SyVQrlXZ_Q) to learn how to install the developer release of your ledger app.\n\nCurrently, the developer release can be installed only on the Nano S and S Plus devices and can't be\ninstalled on the Nano X.\n\nTo install the developer version, make sure you have the latest `pip` version and follow the steps\nbelow:\n\n- Install _ledgerblue_ running the command `python3 -m pip install ledgerblue`.\n- Download the developer release from the\n  [Zondax GitHub repository](https://github.com/Zondax/ledger-polkadot/releases). The file will be\n  named `installer_nanos_plus.sh` or something similar, depending on your ledger device.\n- Locate the downloaded shell script and make it executable in your shell by typing the command\n  `chmod +x installer_nanos_plus.sh`.\n- You can now use the `./installer_nanos_plus.sh --help` command to visualize the available options\n  (see below)\n\n![Dev Ledger Help Menu](../assets/ledger-help-menu.png)\n\n- Attach your Ledger Nano (in this case, Nano S Plus) to your computer, enter the PIN code, and run\n  the command `./installer_nanos_plus.sh load`. Scroll with the right button until you see \"Allow\n  unsafe manager\", left and right press to confirm. You will be asked to confirm the action of\n  uninstalling the app and subsequently installing the newer version. After confirming both actions,\n  the shell script will install the version on your device. You must insert the PIN code to use the\n  device after the installation.\n- If you wish to revert the version to the stable release, go to Ledger Live. The app will\n  automatically detect the developer release and give the option to install the previous stable\n  release."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#nominate-using-polkadot-js", "page_title": "Polkadot-JS Nominator Guides", "index": 0, "depth": 2, "title": "Nominate Using Polkadot-JS", "anchor": "nominate-using-polkadot-js", "start_char": 416, "end_char": 721, "estimated_token_count": 91, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominate Using Polkadot-JS\n\n!!!info \"Video Tutorials\"\n    - [How to Nominate/Stake](https://youtu.be/FCXC0CDhyS4?t=219)\n    - [Staking with a Ledger device and Polkadot-JS](https://youtu.be/7VlTncHCGPc)\n    - [Staking with a Ledger device and Ledger Live](https://www.youtube.com/watch?v=jL-N_IWiYVA)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#bond-your-tokens", "page_title": "Polkadot-JS Nominator Guides", "index": 1, "depth": 3, "title": "Bond your Tokens", "anchor": "bond-your-tokens", "start_char": 721, "end_char": 3969, "estimated_token_count": 827, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Bond your Tokens\n\n!!!info \"Related guide\"\n    Read the article about [How to Bond Tokens and Nominate](how-to/stake-nominate.md).\n\nOn the [Polkadot Developer Interface](https://polkadot.js.org/apps) navigate to the \"Staking\" tab (within the\n\"Network\" menu).\n\nThe \"Staking Overview\" subsection will show you all the active validators and their information -\ntheir identities, the amount of KSM that are staking for them, amount that is their own provided\nstake, how much they charge in commission, the era points they've earned in the current era, and the\nlast block number that they produced. If you click on the chart button it will take you to the\n\"Validator Stats\" page for that validator that shows you more detailed and historical information\nabout the validator's stake, rewards and [slashes](./learn-offenses.md).\n\nThe \"Account actions\" subsection ([link](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)) allows you\nto stake and nominate.\n\nThe \"Payouts\" subsection ([link](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)) allows you to\nclaim rewards from staking.\n\nThe \"Targets\" subsection ([link](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/all-validators)) will help you\nestimate your earnings and this is where it's good to start picking favorites.\n\nThe \"Waiting\" subsection ([link](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async)) lists all pending\nvalidators that are awaiting more nominations to enter the active validator set. Validators will\nstay in the waiting queue until they have enough KSM backing them (as allocated through the\n[Phragmén election mechanism](./learn-phragmen.md)). It is possible validator can remain in the\nqueue for a very long time if they never get enough backing.\n\nThe \"Validator Stats\" subsection ([link](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/query)) allows you\nto query a validator's stash address and see historical charts on era points, elected stake,\nrewards, and [slashes](./learn-offenses.md).\n\nPick \"Account actions\" underneath \"Network\" > \"Staking\", then click the \"+ Nominator\" button.\n\nYou will see a modal window that looks like the below:\n\n![nominator-update-1](../assets/kusama/kusama_nominator_popup.png)\n\nSelect a \"value bonded\" that is **less** than the total amount of KSM you have, so you have some\nleft over to pay transaction fees. Transaction fees are currently at least 0.01 KSM, but they are\ndynamic based on a variety of factors including the load of recent blocks.\n\nAlso be mindful of the reaping threshold - the amount that must remain in an account lest it be\nburned. That amount is 0.01 in Kusama, so it's recommended to keep at least 0.1 KSM in your account\nto be on the safe side.\n\nChoose whatever payment destination that makes sense to you. If you're unsure, you can choose \"Stash\naccount (increase amount at stake)\" to simply accrue the rewards into the amount you're staking and\nearn compound interest.\n\n![Payout account selection dropdown with the custom account option highlighted](../assets/payout/01.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#nominate-a-validator", "page_title": "Polkadot-JS Nominator Guides", "index": 2, "depth": 3, "title": "Nominate a Validator", "anchor": "nominate-a-validator", "start_char": 3969, "end_char": 5722, "estimated_token_count": 411, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Nominate a Validator\n\n!!!info \"Related guide\"\n    Read the article about [How to Select Validators](how-to/choose-validators.md).\n\nYou are now bonded. Being bonded means your tokens are locked and could be\n[slashed](./learn-offenses.md) if the validators you nominate misbehave. All bonded funds can be\ndistributed to [multiple validators](../general/chain-state-values.md).\nBe careful about the validators you choose since you will be slashed if your validator commits an\n[offence](./learn-offenses.md).\n\nClick on \"Nominate\" on an account you've bonded and you will be presented with another popup asking\nyou to select some validators.\n\n![Nominating validators](../assets/kusama/kusama_nominator_selection.png)\n\nSelect them, confirm the transaction, and you're done - you are now nominating. Your nominations\nwill become active in the next era. Eras last six hours on Kusama - depending on when you do this,\nyour nominations may become active almost immediately, or you may have to wait almost the entire six\nhours before your nominations are active. You can check how far along Kusama is in the current era\non the [Staking page](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async).\n\nAssuming at least one of your nominations ends up in the active validator set, you will start to get\nrewards allocated to you. In order to claim them (i.e., add them to your account), you must manually\nclaim them. To initiate a claim, you can do it yourself or have the validator that you staked for\ninitiate a claim. This is to help optimize the effectiveness and storage of payouts on Kusama. See\nthe [Claiming Rewards](./learn-staking.md#claiming-staking-rewards) section of the Staking wiki page for\nmore details."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#stop-nominating", "page_title": "Polkadot-JS Nominator Guides", "index": 3, "depth": 3, "title": "Stop Nominating", "anchor": "stop-nominating", "start_char": 5722, "end_char": 6120, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Stop Nominating\n\n!!!info \"Related guide\"\n    Read the article about [How to Stop Nominating & Unbond Tokens](how-to/unstake-tokens.md). See also the article about [How to Rebond Tokens](how-to/rebond-tokens.md).\n\nAt some point, you might decide to stop nominating one or more validators. You can always change who\nyou're nominating, but you cannot withdraw your tokens unless you unbond them."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#claiming-rewards-with-polkadot-js", "page_title": "Polkadot-JS Nominator Guides", "index": 4, "depth": 2, "title": "Claiming Rewards with Polkadot-JS", "anchor": "claiming-rewards-with-polkadot-js", "start_char": 6120, "end_char": 7270, "estimated_token_count": 257, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Claiming Rewards with Polkadot-JS\n\nAnyone can trigger a payout for any validator, as long as they are willing to pay the transaction\nfee. Someone must submit a transaction with a validator ID and an era index. Polkadot will\nautomatically calculate that validator's reward and distribute the rewards pro rata.\n\nThese details are handled for you automatically if you use the\n[Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async), which also allows you to submit\nbatches of eras at once.\n\nTo claim rewards on Polkadot Developer Interface, you will need to be in the \"Payouts\" tab underneath \"Staking\",\nwhich will list all the pending payouts for your stashes.\n\n![pending-payouts](../assets/polkadotjs_payout_page.png)\n\nTo then claim your reward, select the \"Payout all\" button. This will prompt you to select your stash\naccounts for payout.\n\n![select-payouts](../assets/polkadotjs_payout_popup.png)\n\nOnce you are done with payout, another screen will appear asking for you to sign and submit the\ntransaction.\n\n![transaction-payouts](../assets/polkadotjs_payout_complete.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#using-command-line-interface-cli", "page_title": "Polkadot-JS Nominator Guides", "index": 5, "depth": 2, "title": "Using Command-Line Interface (CLI)", "anchor": "using-command-line-interface-cli", "start_char": 7270, "end_char": 7519, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Using Command-Line Interface (CLI)\n\nApart from using the Polkadot Developer Interface to participate in the staking, you can do all these things in\nCLI instead. The CLI approach allows you to interact with the network without using Polkadot-JS."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#step-1-install-polkadotapi-cli", "page_title": "Polkadot-JS Nominator Guides", "index": 6, "depth": 3, "title": "Step 1: Install @polkadot/api-cli", "anchor": "step-1-install-polkadotapi-cli", "start_char": 7519, "end_char": 7744, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Step 1: Install @polkadot/api-cli\n\nWe assume you have installed [NodeJS with npm](https://nodejs.org). Run the following command to\ninstall the `@polkadot/api-cli` globally:\n\n```bash\nnpm install -g @polkadot/api-cli\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#step-2-bond-tokens", "page_title": "Polkadot-JS Nominator Guides", "index": 7, "depth": 3, "title": "Step 2: Bond Tokens", "anchor": "step-2-bond-tokens", "start_char": 7744, "end_char": 9508, "estimated_token_count": 443, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Step 2: Bond Tokens\n\n!!!info \"Controller accounts have been removed\"\n    Controller accounts have been removed from staking: the `bond` extrinsic no longer takes a\n    controller argument, and rewards can no longer be paid to a controller. Bonding is now signed by\n    the stash account itself. For background, see\n    [this discussion](https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748).\n\nExecuting the following command:\n\n```bash\npolkadot-js-api --seed \"MNEMONIC_PHRASE\" tx.staking.bond NUMBER_OF_TOKENS REWARD_DESTINATION --ws WEBSOCKET_ENDPOINT\n```\n\n`NUMBER_OF_TOKENS`: The number of native tokens (in Plancks) you would like to stake to the network.\nFor more information, see [this page](../learn/learn-DOT.md).\n\n`REWARD_DESTINATION`:\n\n- `Staked` - Pay into the stash account, increasing the amount at stake accordingly.\n- `Stash` - Pay into the stash account, not increasing the amount at stake.\n- `Account` - Pay into a custom account that is not the stash (can be a proxy or another type of\n  account).\n- `None` - Receive no reward.\n\nExample for Kusama:\n\n```bash\npolkadot-js-api --seed \"xxxx xxxxx xxxx xxxxx\" tx.staking.bond 1000000000000 Staked --ws wss://kusama-rpc.polkadot.io\n```\n\nFor wss endpoints see [this page](../../smart-contracts/connect.md).\n\nResult:\n\n```bash\n...\n...\n    \"status\": {\n      \"InBlock\": \"0x0ed1ec0ba69564e8f98958d69f826adef895b5617366a32a3aa384290e98514e\"\n    }\n```\n\nYou can check the transaction status by using the value of the `InBlock` in\n[Subscan](https://www.subscan.io/). Also, you can verify the bonding state under the\n[Staking](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async) page on the Polkadot Developer Interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-nominator/#step-3-nominate-a-validator", "page_title": "Polkadot-JS Nominator Guides", "index": 8, "depth": 3, "title": "Step 3: Nominate a Validator", "anchor": "step-3-nominate-a-validator", "start_char": 9508, "end_char": 10123, "estimated_token_count": 143, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b514dfb9e0a6d3864434ec2922dc4567ec8bd1e42f146d9ee284958b0d3b486a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Step 3: Nominate a Validator\n\nTo nominate a validator, you can execute the following command:\n\n```bash\npolkadot-js-api --seed \"MNEMONIC_PHRASE\" tx.staking.nominate '[\"VALIDATOR_ADDRESS\"]' --ws WS_ENDPOINT\n```\n\n```bash\npolkadot-js-api --seed \"xxxx xxxxx xxxx xxxxx\" tx.staking.nominate '[\"CmD9vaMYoiKe7HiFnfkftwvhKbxN9bhyjcDrfFRGbifJEG8\",\"E457XaKbj2yTB2URy8N4UuzmyuFRkcdxYs67UvSgVr7HyFb\"]' --ws wss://kusama-rpc.polkadot.io\n```\n\nAfter a few seconds, you should see the hash of the transaction, and if you would like to verify the\nnomination status, you can check that on the Polkadot Developer Interface as well."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#create-a-referenda-proposal", "page_title": "Polkadot-JS OpenGov Guides", "index": 0, "depth": 2, "title": "Create a Referenda Proposal", "anchor": "create-a-referenda-proposal", "start_char": 1257, "end_char": 1714, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Create a Referenda Proposal\n\nBefore submitting a referendum, identify the right track and origin for it. For instance, if the\nreferendum is for requesting funds from treasury, select the treasury track with appropriate spend\nlimits. If the referendum is for a suggestion to make changes to the protocol, select the \"Wish for\nChange\" track. For more info, check the\n[tracks and origins](learn-polkadot-opengov.md#origins-and-tracks) of Polkadot OpenGov."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#submitting-a-preimage", "page_title": "Polkadot-JS OpenGov Guides", "index": 1, "depth": 3, "title": "Submitting a Preimage", "anchor": "submitting-a-preimage", "start_char": 1714, "end_char": 3148, "estimated_token_count": 314, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Submitting a Preimage\n\nThe act of creating a proposal is split from submitting the preimage for the proposal since the\nstorage cost of submitting a large preimage could be expensive. Allowing the preimage submission to\ncome as a separate transaction means that another account could submit the preimage for you and pay\nthe fee. The example below demonstrates the creation of a preimage to propose and approve a spend of\ntreasury funds.\n\n![submit preimage](../assets/treasury/OpenGov-Treasury-Preimage-SpendLocal.png)\n\nFollow the steps below to submit a preimage as shown in the screenshot above.\n\n1. Navigate to Governance -> Referenda.\n2. Click on the \"Add preimage\" button.\n3. From the _propose_ drop-down field, select `treasury`.\n4. From the unlabeled drop-down field to the right of the _propose_ drop-down field, select\n   `spendLocal(amount, beneficiary)`.\n5. In the `amount: Compact<u128> (BalanceOf)` text field, enter the spend amount in\n   [plancks](learn-DOT.md#the-planck-unit).\n6. The `beneficiary: MultiAddress (AccountIdLookupOf)` drop-down field will have `Id` selected by\n   default. Select the beneficiary from the `Id: AccountId` drop-down field.\n\n!!!info Copy the `preimage hash` value before clicking the \"Submit preimage\" button.\n\n7. Click the \"Submit preimage\" button.\n\nAfter the preimage is submitted successfully on-chain, Polkadot Developer Interface lists it under the tab of\nGovernance -> Preimages."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#submitting-a-proposal", "page_title": "Polkadot-JS OpenGov Guides", "index": 2, "depth": 3, "title": "Submitting a Proposal", "anchor": "submitting-a-proposal", "start_char": 3148, "end_char": 4209, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Submitting a Proposal\n\nSubmitting a proposal requires you to bond some tokens. On Polkadot Developer Interface, you can navigate to the\nGovernance -> Referenda to make a new proposal. In order to submit a proposal, you will need to\nsubmit what's called the preimage hash. The preimage hash is simply the hash of the proposal to be\nenacted. The easiest way to get the preimage hash is by clicking on the \"Submit preimage\" button as\nshown in the previous section.\n\n![submit proposal](../assets/governance/opengov-submit-proposal.png)\n\nThe proposal will be registered from the account selected and the balance lock will be applied to\nit. An appropriate origin must be chosen, as each origin has different privileges, and acceptance\ncriteria. After entering the hash of the preimage for the proposal, the preimage length field is\nautomatically populated. The enactment delay can be specified either as a block number, or as a\nspecific number of blocks after the referendum is approved. The deposit for this proposal will be\nlocked for the referendum duration."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#submitting-a-referendum-on-the-whitelisted-caller-track", "page_title": "Polkadot-JS OpenGov Guides", "index": 3, "depth": 3, "title": "Submitting a Referendum on the Whitelisted Caller Track", "anchor": "submitting-a-referendum-on-the-whitelisted-caller-track", "start_char": 4209, "end_char": 6765, "estimated_token_count": 502, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Submitting a Referendum on the Whitelisted Caller Track\n\nLet's consider increasing the number of validators participating in parachain consensus. You could\n[submit a preimage](#submitting-a-preimage) with the call that sets the number of validators to\n1,000 and submit a referendum to the Root track directly. However, this requires a large decision\ndeposit and has very conservative passing parameters such that it will probably need the entire\n28-day voting period to pass.\n\nOperations that are deemed safe or time critical by the Polkadot Technical Fellowship can use the\nWhitelisted Caller track. This track requires less turnout in the first half of the decision period\nso that it can pass more quickly. This track is typically used for more neutral, technical proposals\nlike runtime upgrades or changing the system's parachain validation configuration.\n\nUsing the Whitelisted Caller track requires some special calls. Submitting a referendum in the same\nform as other tracks will not work. Namely, rather than voting on a particular `proposal`, the\nWhitelisted Caller track requires a vote to `dispatch` the `proposal` via the Whitelist pallet.\nBefore opening a referendum on this track, you should also attempt to get a positive signal from the\nFellowship that they will whitelist the proposal. If they do not, then even if the public referendum\npasses, it will not execute.\n\nBelow are the steps to follow when submitting a proposal to the Whitelist track.\n\n- [Submit a preimage](#submitting-a-preimage) with the call to _dispatch_ the proposal (`call`) you\n  want to submit -- `whitelist.dispatchWhitelistedCallWithPreimage(call)` -- and obtain the preimage\n  hash. This is the preimage for the _public referendum_ on the Whitelisted Caller track.\n\n![preimage-whitelist](../assets/governance/opengov-submit-preimage-whitelist.png)\n\n- Obtain the hash of `call`. The Polkadot Fellowship needs to start a Fellowship referendum to\n  whitelist the call with `whitelist.whitelistCall(callHash)`. The Fellowship referendum gets voted\n  on by the Polkadot Fellowship members only.\n\n  ![call-hash](../assets/governance/encoded-call-hash.png)\n\n- The public now votes on the referendum. Someone must place a decision deposit to go into the\n  deciding phase.\n- Once passed, it gets enacted successfully as long as the call has been whitelisted by the\n  Fellowship.\n\nNote that the public referendum and Fellowship referendum can happen simultaneously. However, if the\nFellowship does not whitelist the call, you must submit it directly to the Root origin."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#voting-on-referenda", "page_title": "Polkadot-JS OpenGov Guides", "index": 4, "depth": 2, "title": "Voting on Referenda", "anchor": "voting-on-referenda", "start_char": 6765, "end_char": 7578, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Voting on Referenda\n\nAs Polkadot OpenGov takes both the approval and support into account, there are four options to\nchoose from when voting on a referendum:\n\n- Aye\n- Nay\n- Split\n- Abstain\n\nAlso, you have to specify the conviction multiplier for this vote. The longer you are willing to\nlock your tokens, the stronger your vote will be weighted. Unwillingness to lock your tokens means\nthat your vote only counts for 10% of the tokens that you hold.\n\nFor detailed instructions on how to vote on Polkadot OpenGov referenda, check\n[this guide.](how-to/vote-opengov.md)\n\n!!!caution \"Polkadot OpenGov uses Conviction Voting Pallet (Not Democracy Pallet)\"\n    Use `convictionVoting.vote` for voting on Referenda in Polkadot OpenGov instead of `democracy.vote` (which only works for the old version of governance)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#removing-votes", "page_title": "Polkadot-JS OpenGov Guides", "index": 5, "depth": 3, "title": "Removing Votes", "anchor": "removing-votes", "start_char": 7578, "end_char": 7951, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Removing Votes\n\nTo remove votes, you need to use the [Extrinsics tab](https://polkadot.js.org/apps/#/extrinsics) and\ncall the `removeVote` function through the `convictionVoting` pallet.\n\n![rm-vote](../assets/rm-vote.png)\n\nThe `class` is the [OpenGov track](./learn-polkadot-opengov-origins.md) of the referendum you voted\non and the `index` is the referendum number."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#removing-expired-voting-locks", "page_title": "Polkadot-JS OpenGov Guides", "index": 6, "depth": 3, "title": "Removing Expired Voting Locks", "anchor": "removing-expired-voting-locks", "start_char": 7951, "end_char": 8701, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Removing Expired Voting Locks\n\nTo remove an expired lock, you need to use the\n[Extrinsics tab](https://polkadot.js.org/apps/#/extrinsics) and call the `unlock` function through\nthe `convictionVoting` pallet. Note that if you voted on referenda in multiple tracks, the tokens\nwill be unlocked after removing votes and unlocking on all the tracks. Similarly, if you you\n[delegated](#delegations) on multiple tracks, the funds will be unlocked after\n[undelegating](#undelegate-votes) and unlocking on all the tracks.\n\n![rm-voting-lock](../assets/rm-voting-lock.png)\n\nThe `class` is the [OpenGov track](./learn-polkadot-opengov-origins.md) where you have the lock.\n\nFor additional instructions, check\n[this guide.](how-to/remove-referenda-locks.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#delegations", "page_title": "Polkadot-JS OpenGov Guides", "index": 7, "depth": 2, "title": "Delegations", "anchor": "delegations", "start_char": 8701, "end_char": 9336, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Delegations\n\n!!!info \"Video Tutorial about Delegations using the Polkadot Developer Interface\"\n    See [this video tutorial](https://youtu.be/PNGs11EvCB0) to learn about how to delegate, modify delegations and remove delegations using the Polkadot Developer Interface.\n\nFor an overview of how delegation works in Polkadot OpenGov, check out the\n[Multirole Delegation](../learn/learn-polkadot-opengov.md#multirole-delegation) section on the\n[Learn Polkadot OpenGov](../learn/learn-polkadot-opengov.md) page.\n\nInstructions to do delegations with Polkadot-JS are also available on the\n[these guides](how-to/delegate-voting-power.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#delegate-votes", "page_title": "Polkadot-JS OpenGov Guides", "index": 8, "depth": 3, "title": "Delegate Votes", "anchor": "delegate-votes", "start_char": 9336, "end_char": 10561, "estimated_token_count": 309, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Delegate Votes\n\nYou can start delegating your votes by clicking the \"Delegate\" button on\n[Governance > Referenda](https://polkadot.js.org/apps/#/referenda).\n\n![js-delegation-start](../assets/js-delegation-start.png)\n\nIf it is the first time you delegate or vote, there will be a banner message. You can delegate on a\nsingle track or all the tracks. You have an option to specify the number of votes (i.e., the number\nof tokens) and the [conviction multiplier](./learn-polkadot-opengov.md#voluntary-locking-conviction-voting). After\nclicking \"Next\", you will need to specify the account to delegate your votes to, and after clicking\n\"Delegate\" and \"Sign and Submit\" your delegations will appear for each track (see below).\n\n![js-delegation-allTracks](../assets/js-delegation-allTracks.png)\n\nNote that if you want to delegate just a few tracks, you have two options:\n\n- Repeat the process using the \"Delegate\" button multiple times\n- Issue a batch call with multiple `convictionVoting.delegate` extrinsics under\n  [Developer > Extrinsics](https://polkadot.js.org/apps/#/extrinsics)\n\n![js-delegation-delegate](../assets/js-delegation-delegate.png)\n\nBy clicking on \"Add item\" you can add new extrinsics for multiple tracks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#undelegate-votes", "page_title": "Polkadot-JS OpenGov Guides", "index": 9, "depth": 3, "title": "Undelegate Votes", "anchor": "undelegate-votes", "start_char": 10561, "end_char": 11322, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Undelegate Votes\n\nThe \"Delegate\" button on [Governance > Referenda](https://polkadot.js.org/apps/#/referenda) is only\nfor delegating votes. You cannot undelegate or modify your delegations. If you wish to undelegate,\nyou will need to go to [Developer > Extrinsics](https://polkadot.js.org/apps/#/extrinsics) and\nsubmit a `convictionVoting.undelegate` extrinsic, specifying the track you wish to undelegate.\n\n![js-delegation-undelegate](../assets/js-delegation-undelegate.png)\n\nUndelegated tracks will show up as \"0 votes\" on the Delegate tab.\n\n![js-delegation-undelegate](../assets/js-delegation-undelegated.png)\n\nAfter you undelegated, the conviction lock will start the countdown, and your funds will be\navailable for unlocking after the countdown ends."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#remove-expired-locks-from-delegations", "page_title": "Polkadot-JS OpenGov Guides", "index": 10, "depth": 3, "title": "Remove Expired Locks from Delegations", "anchor": "remove-expired-locks-from-delegations", "start_char": 11322, "end_char": 11515, "estimated_token_count": 41, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Remove Expired Locks from Delegations\n\nTo remove expired locks from delegations, you can\n[follow the same procedure as how to remove expired voting locks](#removing-expired-voting-locks)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#modify-your-delegations", "page_title": "Polkadot-JS OpenGov Guides", "index": 11, "depth": 3, "title": "Modify your Delegations", "anchor": "modify-your-delegations", "start_char": 11515, "end_char": 12000, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Modify your Delegations\n\nThe \"Delegate\" button on [Governance > Referenda](https://polkadot.js.org/apps/#/referenda) is only\nfor delegating votes. You cannot undelegate or modify your delegations. If you wish to update the\ndelegated account, the conviction, and the number of votes you will need to go to\n[Developer > Extrinsics](https://polkadot.js.org/apps/#/extrinsics), [undelegate](#undelegate-votes)\nthe track and [delegate](#delegate-votes) again with updated information."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#claiming-opengov-deposits", "page_title": "Polkadot-JS OpenGov Guides", "index": 12, "depth": 2, "title": "Claiming OpenGov Deposits", "anchor": "claiming-opengov-deposits", "start_char": 12000, "end_char": 12263, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Claiming OpenGov Deposits\n\n!!!info \"Video Tutorial about OpenGov deposits using the Polkadot Developer Interface\"\n    See [this video tutorial](https://youtu.be/kkEq5cqW2Pk) to learn about how to claim OpenGov deposits using the Polkadot Developer Interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#claiming-the-preimage-and-decision-deposits", "page_title": "Polkadot-JS OpenGov Guides", "index": 13, "depth": 3, "title": "Claiming the Preimage and Decision Deposits", "anchor": "claiming-the-preimage-and-decision-deposits", "start_char": 12263, "end_char": 13064, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Claiming the Preimage and Decision Deposits\n\nAfter a referendum finishes its life cycle (and gets approved or rejected or timed out), the\npreimage and decision deposits can be claimed. For claiming the preimage deposit, navigate to\n[Polkadot Developer Interface > Governance > Preimages](https://polkadot.js.org/apps/#/preimages) and click on\nunnote button shown on the preimage you submitted.\n\n![Claim Preimage Deposit](../assets/claim-preimage-deposit.png)\n\nSimilarly, to claim the decision deposit, navigate to\n[Polkadot Developer Interface > Governance > Referenda](https://polkadot.js.org/apps/#/referenda) and scroll down\nto the end of the page to click on the referenda with the decision deposit and claim it.\n\n![Claim Referendum Deposits](../assets/claim-referendum-decision-deposit.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#claiming-the-referendum-submission-deposit", "page_title": "Polkadot-JS OpenGov Guides", "index": 14, "depth": 3, "title": "Claiming the Referendum Submission Deposit", "anchor": "claiming-the-referendum-submission-deposit", "start_char": 13064, "end_char": 14510, "estimated_token_count": 307, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Claiming the Referendum Submission Deposit\n\nThe submission deposit for a referendum can be claimed\n[only if the referendum was `Approved` or `Canceled`](https://github.com/paritytech/polkadot-sdk/blob/cfb29254f74412cea35e8048d8aea94bc789fcb1/substrate/frame/referenda/src/types.rs#L261).\nThe submission deposit can be claimed by issuing the `refundSubmissionDeposit` extrinsic.\n\nUsers cannot refund their submission deposit while the referendum is `Ongoing` or `Rejected`.\nSimilarly, users cannot refund their submission deposit if the proposal has `TimedOut` (failing to\nsubmit the decision deposit\n[within specific period](../general/chain-state-values.md) will lead to a\nreferendum timeout). This behavior exists so that users can refrain from spamming the chain with\nproposals that have no interest from the community. If a proposal is in the `TimedOut` state, any\nuser can call `slash_proposal_deposit`, which will move the funds from the user to a\nruntime-configured account, like the treasury.\n\nTo refund your slashed deposit, you can start a new referendum and specifically request a refund\nfrom the treasury. You need to make sure you have enough balance for a new submission and decision\ndeposit, and you will need to select the right track to ask for a refund. For example, the\n[Small Tipper Track](./learn-polkadot-opengov-origins.md#small-tipper) would be fine for any kind of\ndeposit refund up to 250 DOT (8.25 KSM on Kusama)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#cancel-or-kill-a-referendum", "page_title": "Polkadot-JS OpenGov Guides", "index": 15, "depth": 2, "title": "Cancel or Kill a Referendum", "anchor": "cancel-or-kill-a-referendum", "start_char": 14510, "end_char": 17489, "estimated_token_count": 679, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Cancel or Kill a Referendum\n\n!!!info\n    Anybody can cancel an ongoing referendum (i.e., a referendum within the Lead-in or voting/confirmation period). For more information about the referenda timeline in Polkadot OpenGov, see the [dedicated page](../learn/learn-polkadot-opengov.md#referenda-timeline).\n\nTo successfully cancel a referendum through the track `20 / Referendum Canceller`, you will need to\nattain\n[specific approval and support levels](./learn-polkadot-opengov-origins.md#referendum-canceller).\n\nTo cancel a referendum, you need first to submit a preimage with the `referenda.cancel` extrinsic.\nGo to the [Polkadot Developer Interface > Governance > Referenda](https://polkadot.js.org/apps/#/referenda) and\nclick on the \"Add Preimage\" button. You must specify the `referenda.cancel` extrinsic with the index\nequal to the ongoing Referendum you wish to cancel. In the screenshot below, the Referendum to be\ncancelled is 249.\n\n![cancel-referenda-preimage-creation](../assets/cancel-referenda-preimage-creation.png)\n\nThis call will cancel the referendum and return the deposit. You can also kill a referendum using\nthe `referenda.kill` extrinsic. This will cancel the referendum and slash the deposit.\n\n!!!info \"Preimage Submission Deposit\"\n    A deposit is required for the preimage to be stored on chain. The preimage deposit is proportional to the amount of information stored within the preimage. The deposit amount required for a preimage with a treasury spend transaction is around 41 DOT (1.4 KSM on Kusama). Ensure you have enough account balance to pay for this submission deposit as well as the transaction fees.\n\nOnce a preimage is submitted, it can be checked under\n[Governance > Preimages](https://polkadot.js.org/apps/#/preimages).\n\n![cancel-referenda-preimage-check](../assets/cancel-referenda-preimage-check.png)\n\nYou must copy the preimage to use it when you submit your proposal. To submit the proposal to cancel\nreferendum 249, for example, you need to go under\n[Governance > Referenda](https://polkadot.js.org/apps/#/referenda) and click the \"Submit Proposal\"\nbutton.\n\n![cancel-referenda-proposal](../assets/cancel-referenda-proposal.png)\n\nYou must specify the account to submit the proposal (this can differ from the account used to create\nthe preimage). Then you will need to specify the track `20 / Referendum Canceller` and add the\npreimage hash containing the specific action that will be enacted if the referendum passes. Note\nthat a [submission deposit](../general/chain-state-values.md) will be\nreserved for submitting the proposal.\n\nOnce the proposal has been submitted, it will stay in the Lead-in period until there is enough space\nwithin the track, and a\n[track-dependent preparation period and decision deposit](./learn-polkadot-opengov-origins.md#polkadot-opengov-terminology-and-parameters)\nhave been met. Failing to submit the decision deposit will ultimately lead to a\n[referendum timeout](../general/chain-state-values.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-polkadot-opengov/#interpreting-on-chain-voting-data", "page_title": "Polkadot-JS OpenGov Guides", "index": 16, "depth": 2, "title": "Interpreting On-Chain Voting Data", "anchor": "interpreting-on-chain-voting-data", "start_char": 17489, "end_char": 18533, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:25d80d1ca61bdde8f9f5cf0c10ae21b6a5919266f2508a91639d014a56efd8af", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Interpreting On-Chain Voting Data\n\nBelow is the numeric conversion of the type of vote and conviction displayed in a block explorer.\n\n```\nNay 0.1x => 0\nNay 1x => 1\nNay 2x => 2\nNay 3x => 3\nNay 4x => 4\nNay 5x => 5\nNay 6x => 6\n\nAye 0.1x => 128\nAye 1x => 129\nAye 2x => 130\nAye 3x => 131\nAye 4x => 132\nAye 5x => 133\nAye 6x => 134\n```\n\nTake, for example, the information provided for\n[this vote](https://kusama.subscan.io/extrinsic/22460598-2). The vote `131` means the account voted\nAye with 3x conviction.\n\n![vote_numeric_conversion](../assets/vote_numeric_conversion.png)\n\nAt first glance, it may not be easy to interpret what you voted on. We need to take a step back and\nconsider the \"voting data\" at the binary level.\n\nThe vote is stored as a byte using a bitfield data structure and displayed on the block explorer as\na decimal integer. The bitfield stores both the conviction and aye/nay boolean, where the boolean is\nrepresented using the MSB of the byte. This would mean that the seven remaining bits are grouped to\nstore the conviction."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-staking-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-staking-pools/#pool-creation-with-polkadot-js", "page_title": "Polkadot-JS Nomination Pool Guides", "index": 0, "depth": 2, "title": "Pool Creation with Polkadot-JS", "anchor": "pool-creation-with-polkadot-js", "start_char": 434, "end_char": 2111, "estimated_token_count": 398, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5144055af6ea2e5b8d6ed819459dea4ae19710eda2bf4c564d81695588d47b86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pool Creation with Polkadot-JS\n\n!!!info\n    You easily create a pool using the [Polkadot Staking Dashboard](../general/dashboards/staking-dashboard.md#pools). See the [dashboard documentation](https://docs.staking.polkadot.cloud/en/nomination-pools#creating-a-pool-5-step-wizard) for more information.\n\nThe depositor calls the `create` extrinsic, setting the administrative roles and transferring some\nfunds to the pool to add themselves as the first member. As stated above, the depositor must always\nbe a member as long as the pool exists; they will be the last member to leave, ensuring they always\nhave some skin in the game. A significant stake from the depositor is always a good indicator of the\npool's credibility.\n\nThe current minimum bond to create a pool can be found\n[here](../general/chain-state-values.md).\n\nThe pool’s ‘nominator role’ selects validators with the nominate extrinsic. On Polkadot JS Apps UI,\nnavigate to Network > Staking > Pools and click on Add Pool button.\n\n![Create Nomination Pools](../assets/staking/Nomination-Pools-1.png)\n\nThe UI automatically assigns an ID to the pool and allows for entering the name of the pools and the\ndeposit to be bonded.\n\n![Create Nomination Pools - deposit](../assets/staking/Nomination-Pools-2.png)\n\nWhen creating a pool using Polkadot JS Apps UI, all the roles are mapped to the Depositor account by\ndefault. If any of these roles need to be assigned to a different account, create the pool using\n`create` extrinsic available in\n[Developer > Extrinsics > nominationPools](https://polkadot.js.org/apps/#/extrinsics) on Polkadot JS\nApps UI.\n\n![Nomination Pool Roles](../assets/staking/Nomination-Pools-7.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-staking-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-staking-pools/#pool-upkeep-with-polkadot-js", "page_title": "Polkadot-JS Nomination Pool Guides", "index": 1, "depth": 2, "title": "Pool Upkeep with Polkadot-JS", "anchor": "pool-upkeep-with-polkadot-js", "start_char": 2111, "end_char": 2851, "estimated_token_count": 179, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5144055af6ea2e5b8d6ed819459dea4ae19710eda2bf4c564d81695588d47b86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pool Upkeep with Polkadot-JS\n\nThe nominator can update the pool’s validator selection. On Polkadot JS Apps UI, navigate to\n[Network > Staking > Accounts page](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async) and click on\nPooled button. If you have any pooled accounts with the role of nominator, you will notice the\noption to set nominees. Select the validators to nominate like you would normally using a nominator\naccount.\n\n![Nominate validators](../assets/staking/Nomination-Pools-5.png)\n\nThe root and bouncer can update the pool’s state to blocked through `setState` extrinsic and kick\nmembers by calling `unbond` and `withdrawUnbonded`. (The state can also be toggled back to open)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-staking-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-staking-pools/#pool-destruction-with-polkadot-js", "page_title": "Polkadot-JS Nomination Pool Guides", "index": 2, "depth": 2, "title": "Pool Destruction with Polkadot-JS", "anchor": "pool-destruction-with-polkadot-js", "start_char": 2851, "end_char": 4106, "estimated_token_count": 302, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5144055af6ea2e5b8d6ed819459dea4ae19710eda2bf4c564d81695588d47b86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pool Destruction with Polkadot-JS\n\n!!!info\n    As a pool admin, you can easily destroy a pool and permissionlessly remove all members using the [Polkadot Staking Dashboard](../general/dashboards/staking-dashboard.md#pools). See the [dashboard documentation](https://docs.staking.polkadot.cloud/en/nomination-pools#change-pool-state-root-or-bouncer) for more information.\n\nA pool can be pushed into the “destroying” state via one of:\n\n- The root and bouncer set the pool to “destroying”. This can be done by submitting the\n  `nominationPools.setState(poolId, state)` extrinsic using the\n  [Polkadot Developer Interface extrinsic tab](https://polkadot.js.org/apps/#/extrinsics). Where `poolId` is the\n  specific ID of the pool and `state` is the pool's state that must be set to \"destroying\". Other\n  possible states are \"open\" and \"blocked\".\n- Any account can set the pool to destroying if over 90% of the pool's active bonded balance has\n  been [slashed](./learn-offenses.md).\n\nWhen a pool is in ‘destroying’ state, `unbond` and `withdrawUnbonded` become permissionless, so\nanyone can help all the members exit.\n\nThe pool is destroyed once the depositor withdraws, no members belong to the pool, and all the\npool’s resources are wiped from the state."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-staking-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-staking-pools/#claim-rewards-for-other-pool-members-with-polkadot-js", "page_title": "Polkadot-JS Nomination Pool Guides", "index": 3, "depth": 2, "title": "Claim Rewards for Other Pool Members with Polkadot-JS", "anchor": "claim-rewards-for-other-pool-members-with-polkadot-js", "start_char": 4106, "end_char": 5223, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5144055af6ea2e5b8d6ed819459dea4ae19710eda2bf4c564d81695588d47b86", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Claim Rewards for Other Pool Members with Polkadot-JS\n\nAs a pool member you can claim rewards for any other members who set their\n[claim permissions](./learn-nomination-pools.md#claim-permissions) to one of the _permissionless_\noptions.\n\nLet's take the example of ALICE setting the claim permissions to `PermissionlessAll`. Another\naccount STASH can now claim ALICE's rewards (as a free balance or compound them to the existing\nbonded balance). To do so, STASH can go to the\n[Polkadot Developer Interface Extrinsic Tab](https://polkadot.js.org/apps/#/extrinsics) and issue the following\nextrisics:\n\n- `nominationPools.claimPayoutOthers` extrinsic specifying ALICE's account. This will claim the\n  rewards as a free balance on ALICE's account.\n\n![pools-payoutOthers](../assets/nomination-pools-payoutOthers.png)\n\n- `nominationPools.bondExtraOthers` extrinsic specifying ALICE's account and the option to bond:\n  - the free balance currently available in ALICE's account (`FreeBalance`) or\n  - the pool rewards (`Rewards`) unclaimed by ALICE.\n\n![pools-bondExtraOthers](../assets/nomination-pools-bondExtraOthers.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-test-opengov-proposals", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-test-opengov-proposals/#test-a-polkadot-opengov-referendum", "page_title": "Polkadot-JS OpenGov Referenda Testing Guides", "index": 0, "depth": 2, "title": "Test a Polkadot OpenGov Referendum", "anchor": "test-a-polkadot-opengov-referendum", "start_char": 844, "end_char": 1580, "estimated_token_count": 158, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd9dda2527e25f4bec20234e2473232fc2ca07f33f7f5675711883b80aa89d1d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test a Polkadot OpenGov Referendum\n\nTo request 4500 DOT from the treasury, you must create a pre-image with the call\n`treasury.spendLocal(amount,beneficiary)`. The guide for creating pre-images for treasury proposals\nand submitting them is available [here](learn-guides-polkadot-opengov.md) on the Wiki. The proposer\nneeds to know the exact origin and track to submit this proposal. As this is a treasury proposal, it\nwould be one of the treasury tracks -\n[SmallSpender](learn-polkadot-opengov-origins.md#small-spender) in the case of 4500 DOT.\n\n`0x13030b00d00361ed28009e4e7009937c56d267338762a60ed004293afd40e7c2081847c12cb63c76a818`\n\n![opengov-treasury-proposal-call](../assets/governance/opengov-call-test-treasury-proposal.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-test-opengov-proposals", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-test-opengov-proposals/#fork-a-network-locally-using-chopsticks", "page_title": "Polkadot-JS OpenGov Referenda Testing Guides", "index": 1, "depth": 3, "title": "Fork a Network Locally using Chopsticks", "anchor": "fork-a-network-locally-using-chopsticks", "start_char": 1580, "end_char": 3716, "estimated_token_count": 429, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd9dda2527e25f4bec20234e2473232fc2ca07f33f7f5675711883b80aa89d1d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fork a Network Locally using Chopsticks\n\nIf you like to check whether the call above will get executed successfully, you can check that by\nperforming a dry run using [Chopsticks](https://github.com/AcalaNetwork/chopsticks), which is\nembedded in Polkadot Developer Interface. You can run a Chopsticks instance of any Polkadot SDK based chain by\nclicking \"fork locally\" on the UI. The snapshot below shows it for Polkadot.\n\n![polkadot-fork-locally](../assets/governance/polkadot-fork-locally.png)\n\nAfter forking locally, the Polkadot Developer Interface displays a local instance of the Polkadot network, which\ndoes not produce any blocks by default. You will notice a few test accounts with DOT balance that\ncan interact with the network and test out Polkadot protocol features accessible through regular\naccounts. However, the treasury spend call cannot be submitted through a signed account origin, so\nit has to be tested with a treasury track origin. It can be tested by navigating to Developer >\nJavaScript tab on Polkadot Developer Interface, which dispatches the call on the next block via the scheduler with\nthe specified origin.\n\n```\nconst number = (await api.rpc.chain.getHeader()).number.toNumber()\nawait api.rpc('dev_setStorage', {\n scheduler: {\n   agenda: [\n     [\n       [number + 1], [\n         {\n           call: {\n             Inline: '0x13030b00d00361ed28009e4e7009937c56d267338762a60ed004293afd40e7c2081847c12cb63c76a818'\n           },\n           origin: {\n             origins: 'SmallSpender'\n           }\n         }\n       ]\n     ]\n   ]\n }\n})\nawait api.rpc('dev_newBlock')\n```\n\n![polkadot-chopstciks-call](../assets/governance/polkadot-chopsticks-call.png)\n\nAfter clicking the play button in the JavaScript console, the block number visible on the top left\nof the Polkadot Developer Interface should be incremented by 1. You can navigate to Polkadot Developer Interface Network >\nExplorer to check the emitted events and see if the call was executed successfully. You should see\nthe errors displayed here if the call is unsuccessful.\n\n![polkadot-js-ui-explorer](../assets/governance/polkadot-js-ui-explorer.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-test-opengov-proposals", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-test-opengov-proposals/#test-a-polkadot-opengov-referendum-with-cross-chain-calls", "page_title": "Polkadot-JS OpenGov Referenda Testing Guides", "index": 2, "depth": 2, "title": "Test a Polkadot OpenGov Referendum with Cross-chain Calls", "anchor": "test-a-polkadot-opengov-referendum-with-cross-chain-calls", "start_char": 3716, "end_char": 4993, "estimated_token_count": 236, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd9dda2527e25f4bec20234e2473232fc2ca07f33f7f5675711883b80aa89d1d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Test a Polkadot OpenGov Referendum with Cross-chain Calls\n\nTake the example of removing a member of the ambassador collective on the Collectives system chain\nthrough a Polkadot OpenGov referendum. Obtain the call data to remove a member from the ambassador\ncollective in the Collectives system chain runtime.\n\n![collectives-remove-ambassador](../assets/governance/collectives-remove-member.png)\n\nNote down the call data and navigate to Developer > Runtime calls and fetch the weights for\nexecution of the call through `transactionPaymentCallApi.queryCallInfo`. Here is the call info used\nin our example for your reference:\n`0x4603000c691601793de060491dab143dfae19f5f6413d4ce4c363637e5ceacb2836a4e0300`\n\n![tx-payment-call-api](../assets/governance/collectives-remove-call-weights.png)\n\nNow you have all the information you need to create an XCM call that needs to be sent from Polkadot.\nNo fee payment is required for an XCM call dispatched through OpenGov. The Collectives chain\n`ParaID` is 1001. With this information, we can construct the XCM call shown below.\n\n`0x630004000100a50f04082f0000060303e3c4cc9589ad944603000c691601793de060491dab143dfae19f5f6413d4ce4c363637e5ceacb2836a4e0300`\n\n![unpaid-execution-xcm-call](../assets/governance/collectives-remove-xcm-call.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-test-opengov-proposals", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-test-opengov-proposals/#cross-chain-testing-setup-using-chopsticks", "page_title": "Polkadot-JS OpenGov Referenda Testing Guides", "index": 3, "depth": 3, "title": "Cross-chain Testing Setup using Chopsticks", "anchor": "cross-chain-testing-setup-using-chopsticks", "start_char": 4993, "end_char": 10419, "estimated_token_count": 779, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bd9dda2527e25f4bec20234e2473232fc2ca07f33f7f5675711883b80aa89d1d", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cross-chain Testing Setup using Chopsticks\n\nTesting this cross-chain call by [forking locally](#fork-a-network-locally-using-chopsticks) will\nonly perform the required checks on the sending chain, not the receiving chain. To do cross-chain\ntesting, download and install [Chopsticks](https://github.com/AcalaNetwork/chopsticks) on your\nmachine and run the command below:\n\n`npx @acala-network/chopsticks@latest xcm -r polkadot -p polkadot-collectives`\n\nThis should start the Polkadot and the Collectives instances available at ports 8001 and 8000\nrespectively. Connect to both these instances using Polkadot Developer Interface on two separate browser windows.\nTo connect to these local machine instances at the designated ports, edit the custom endpoint for\nPolkadot Developer Interface as shown in the picture below and click on Switch button at the top.\n\n![polkadot-js-local](../assets/governance/polkadot-js-local-node.png)\n\nNavigate to the Polkadot instance and open JavaScript console to run the code below.\n\n```\nconst number = (await api.rpc.chain.getHeader()).number.toNumber()\nawait api.rpc('dev_setStorage', {\n scheduler: {\n   agenda: [\n     [\n       [number + 1], [\n         {\n           call: {\n             Inline: '0x630004000100a50f04082f0000060303e3c4cc9589ad944603000c691601793de060491dab143dfae19f5f6413d4ce4c363637e5ceacb2836a4e0300'\n           },\n           origin: {\n             origins: 'FellowshipAdmin'\n           }\n         }\n       ]\n     ]\n   ]\n }\n})\nawait api.rpc('dev_newBlock')\n```\n\n![javascript-fellowship-admin](../assets/governance/javascript-console-fellowship-admin-call.png)\n\nAfter clicking on the play button in the JavaScript console, the block number visible on the top\nleft of the Polkadot Developer Interface should be incremented by 1. You can navigate to Polkadot Developer Interface Network >\nExplorer to check the emitted events and see if the call got executed successfully. If the call is\nunsuccessful, you should see the respective errors displayed here.\n\n**Successful XCM call dispatch shown on the Polkadot network:**\n\n![xcm-polkadot-send](../assets/governance/polkadot-send-xcm.png)\n\nYou can then navigate to the local Collectives instance and check the events to confirm the call is\nexecuted as expected.\n\n**Successful XCM call receipt shown on the Collectives system chain:**\n\n![xcm-collectives-receive](../assets/governance/collectives-receive-xcm.png)\n\nNow, take the example of [Referendum 1247](https://polkadot.subsquare.io/referenda/1247) which\nexecutes a call that tries to remove 19 ambassadors from the collective at once. This is a very long\ncall and exceeds the JavaScript console `inLine` character limit. In that case, the code can be\nmodified instead to lookup the preimage of call with the specified length and check if it is\nsuccessfully executes.\n\n`0x630004000100a50f04082f0000060307005847f80d824f12009d0b28045046030090bd3d091b8837f2f41c38b6e3bebd28a31ee280f82d15e687f95d798ef41c1703004603000c7f10142a81fedec753f7c556f5b93a400c280805e7fcdff668719637b13434030046030062d8c4e1c6fbab57ba4df15b8120db4cec5c150371d0755d8ee5312382f47f09030046030094c860705264b96854acc3cb307365132bd131524ef83a7c014378ed793737230300460300aeb6173b1b6d5933c79992954d1469e845a89a5c754f91a9cb2f7589d78b9970030046030018bd4fb6b90f5088bdc825c3d674bd72e705c6f1163e86f960eeb7969ab4833a03004603002add0af948eba3b1fcd5cacde1f6fcc70f11ef75056f88ca4d11dcc5b080220e03004603009a3a7fc4a0eba9a8bd47c96aedfb5436ecc4d39536af5fca275fbf88104eae070300460300f4792917b47917519e2c05619763a4e7b45b84815f902f62e16f23e9f2b2265303004603008e156836bd7dc0639ea54540eb6ec55aec2a3793876208bf5d71ff89eb746a07030046030008b712a589f5cb71cd7094809785ab0a924358d3cb52b27efd4933b6efc149630300460300cc10dd1946b0fc65c8993ff7f47052713e9aa4b1cb72c913bd397c34adf4f9490300460300d6b8ec23dc68f20b5d315007d9c1a6706f9bd5c883319181129e76a89e97815503004603000c691601793de060491dab143dfae19f5f6413d4ce4c363637e5ceacb2836a4e03004603000ef2cc1000f878a3880a09d698b5375f20c4ab3d8b3a1b783c8150faca3da65a03004603001eb38b0d5178bc680c10a204f81164946a25078c6d3b5f6813cef61c3aef48430300460300568191edc1aaf4bea93b17cf53ea49ab78e2d25d83dec8581854be93d3bc9609030046030088f28e17671ba1808d7b02cd3caaf80113066a467127666f4d80afc50bfbc1270300460300b430a1d38186a28164facec9010e36b1289eb6d3ad0f03f328188fd52bcb333a0300460300ce2490656709c33bdd50d72dc0ec562bb72db84945ef7a1be45be14bbc6fc8770300`\n\nThe preimage hash of this call is\n`0x82802c62d52a2431e422b58fff1fbdd0efc648e7c98351bd26048d169b94f956` and its length is `733`\n(obtained from Polkadot Developer Interface Governance > Preimgaes tab for that lists the preimages that are\nalready submitted).\n\n```\nconst number = (await api.rpc.chain.getHeader()).number.toNumber()\nawait api.rpc('dev_setStorage', {\n scheduler: {\n   agenda: [\n     [\n       [number + 1], [\n         {\n           call: {\n             Lookup: {\n               hash: \"0x82802c62d52a2431e422b58fff1fbdd0efc648e7c98351bd26048d169b94f956\",\n               len: 733\n             }\n           },\n           origin: {\n             origins: 'FellowshipAdmin'\n           }\n         }\n       ]\n     ]\n   ]\n }\n})\nawait api.rpc('dev_newBlock')\n```\n\nIf there are referenda that are to be submitted on Root track and you like to test it, you can use\nthe same template as above and replace\n\n```\n           origin: {\n             origins: 'FellowshipAdmin'\n           }\n```\n\nwith\n\n```\n           system: {\n             origin: 'Root'\n           }\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#metadata-updates-with-the-polkadot-developer-signer", "page_title": "Polkadot-JS Transfer Guides", "index": 0, "depth": 2, "title": "Metadata Updates with the Polkadot Developer Signer", "anchor": "metadata-updates-with-the-polkadot-developer-signer", "start_char": 355, "end_char": 1296, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Metadata Updates with the Polkadot Developer Signer\n\nBefore signing extrinsics with the Polkadot Developer Signer, always check for metadata updates.\n[**This video tutorial**](https://youtu.be/gbvrHzr4EDY?t=84) will explain how to do it.\n\n!!!info \"Polkadot Vault vs Polkadot Developer Signer\"\n    The Polkadot Vault app updates the full metadata through the QR fountain while the extension updates the metadata index (the metadata is not loaded into it). As a consequence the process of updating metadata is different in this two cases (you will notice that on the Vault app the update takes longer for example). Having outdated metadata on the Vault app will prevent you from signing, while on the extension you will be able to click the sign button but the extrinsic will likely fail (similarly of having an outdated Ledger app). In general, failing to update metadata will most likely result in you not being able to sign extrinsics."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#transfers-using-the-polkadot-developer-interface-and-polkadot-developer-signer", "page_title": "Polkadot-JS Transfer Guides", "index": 1, "depth": 2, "title": "Transfers using the Polkadot Developer Interface and Polkadot Developer Signer", "anchor": "transfers-using-the-polkadot-developer-interface-and-polkadot-developer-signer", "start_char": 1296, "end_char": 1769, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transfers using the Polkadot Developer Interface and Polkadot Developer Signer\n\nSee [this video tutorial](https://www.youtube.com/watch?v=gbvrHzr4EDY) to learn how to send funds\nusing the Polkadot Developer Interface and Polkadot Developer Signer. See also the Polkadot pages for detailed\ninformation about signing transactions using\n[the Polkadot Developer Interface](how-to/sign-transaction.md)\nand\n[the Polkadot Developer Signer](how-to/sign-transaction-signer.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#verify-extrinsics-with-the-polkadot-developer-signer", "page_title": "Polkadot-JS Transfer Guides", "index": 2, "depth": 3, "title": "Verify Extrinsics with the Polkadot Developer Signer", "anchor": "verify-extrinsics-with-the-polkadot-developer-signer", "start_char": 1769, "end_char": 2181, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Verify Extrinsics with the Polkadot Developer Signer\n\nVisit the\n[**dedicated page**](how-to/verify-extrinsic.md#verify-an-extrinsic-in-the-polkadot-developer-signer)\nand see [**this video tutorial**](https://youtu.be/bxMs-9fBtFk?t=261) tutorial to learn about how to\nverify extrinsics before signing them. The video will also mention potential attacks that can happen\nto you while signing for transactions."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#verify-extrinsics-with-the-polkadot-developer-interface", "page_title": "Polkadot-JS Transfer Guides", "index": 3, "depth": 3, "title": "Verify Extrinsics with the Polkadot Developer Interface", "anchor": "verify-extrinsics-with-the-polkadot-developer-interface", "start_char": 2181, "end_char": 2599, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Verify Extrinsics with the Polkadot Developer Interface\n\nVisit the\n[**dedicated page**](how-to/verify-extrinsic.md#verify-an-extrinsic-in-the-polkadot-developer-interface)\nand see [**this video tutorial**](https://youtu.be/bxMs-9fBtFk?t=163) tutorial to learn about how to\nverify extrinsics before signing them. The video will also mention potential attacks that can happen\nto you while signing for transactions."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#keep-alive-checks-with-the-polkadot-developer-interface", "page_title": "Polkadot-JS Transfer Guides", "index": 4, "depth": 3, "title": "Keep-Alive Checks with the Polkadot Developer Interface", "anchor": "keep-alive-checks-with-the-polkadot-developer-interface", "start_char": 2599, "end_char": 3894, "estimated_token_count": 309, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Keep-Alive Checks with the Polkadot Developer Interface\n\n!!!info\n    See [**this video tutorial**](https://youtu.be/mgPHVztHJWk) and [**this page**](how-to/existential-deposit.md) to learn about keep-alive checks and existential deposit.\n\nIn Polkadot there are two main ways to transfer funds from one account to another:\n\n- `transfer keep-alive` (default option) will not allow you to send an amount that would allow the\n  sending account to be removed due to it going below the\n  [existential deposit](../general/chain-state-values.md).\n- `transfer allow-death` will allow you to send tokens regardless of the consequence. If the balance\n  drops below the existential deposit your account will be reaped. It may be that you do not want to\n  keep the account alive (for example, because you are moving all of your funds to a different\n  address). To switch the keep-alive check off visit\n  [this article](how-to/error-frozen-cant-transfer.md).\n\n!!!info\n    Attempting to send less than the [existential deposit](../general/chain-state-values.md) to an account with zero balance will always fail, no matter if the keep-alive check is on or not.\n\nEven if the transfer fails due to a keep-alive check, the transaction fee will be deducted from the\nsending account if you attempt to transfer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#vested-transfers-with-the-polkadot-developer-interface", "page_title": "Polkadot-JS Transfer Guides", "index": 5, "depth": 3, "title": "Vested Transfers with the Polkadot Developer Interface", "anchor": "vested-transfers-with-the-polkadot-developer-interface", "start_char": 3894, "end_char": 7323, "estimated_token_count": 782, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Vested Transfers with the Polkadot Developer Interface\n\nYou can watch [**this video tutorial**](https://youtu.be/JVlwTQBwNGc) to understand how to do vested\ntransfers using the Polkadot Developer Interface, including linear and cliff vesting. Note the tutorial uses the\nWestend Testnet, but the same applies to Polkadot and Kusama.\n\nThere are two ways that vesting schedules can be created.\n\n- One way is through an extrinsic type available in the Vesting pallet, `vested_transfer`. The\n  vested transfer function allows anyone to create a vesting schedule with a transfer of funds, as\n  long as the account for which the vesting schedule will be created does not already have one and\n  the transfer moves at least `MinVestedTransfer` funds, which is specified as a chain constant.\n- A second way is as part of the genesis configuration of the chain. In the case of Polkadot, the\n  chain specification genesis script reads the state of the Claims contract that exists on the\n  Ethereum blockchain and creates vesting schedules in genesis for all the allocations registered as\n  being vested.\n\nVesting schedules have three parameters:\n\n- **locked**, the amount of tokens to be transferred in\n  [Planck units](../learn/learn-DOT.md#the-planck-unit)\n- **per block**, the number of tokens that are released per block\n- **starting block**, the block number after which the vesting schedule starts\n\nThe configuration of these three fields dictates the amount of funds that are originally locked, the\nslope of the unlock line and the block number for when the unlocking begins.\n\n#### Lazy Vesting\n\nLike [simple payouts](learn-staking-advanced.md), vesting is _lazy_, which means that someone must\nexplicitly call an extrinsic to update the lock that is placed on an account.\n\n- The `vest` extrinsic will update the lock that is placed on the caller.\n- The `vest_other` will update the lock that is placed on another \"target\" account's funds.\n\nThese extrinsics are exposed from the Vesting pallet.\n\nIf you are using [the Polkadot Developer Interface](../general/polkadotjs-ui.md), when there are tokens available to\nvest for an account, you can unlock tokens that have already been vested from the\n[Accounts](https://polkadot.js.org/apps/#/accounts) page.\n\n![unbond](../assets/unlock-vesting.png)\n\n#### Calculating When Vesting DOT Will Be Available\n\nGenerally, you should be able to see from the [Accounts](https://polkadot.js.org/apps/#/accounts) by\nlooking at your accounts and seeing when the vesting will finish. However, some DOT vest with\n\"cliffs\" - a single block where all the DOT are released, instead of vesting over time. In this\ncase, you will have to query the chain state directly to see when they will be available (since\ntechnically, the vesting has not yet started - all of the vesting will occur in a single block in\nthe future).\n\n1. Navigate to the\n   [Chain State](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/chainstate) page on\n   Polkadot-JS.\n2. Query chain state for `vesting.vesting(ACCOUNT_ID)`\n3. Note the `startingBlock` where the unlock starts, and how much DOT is unlocked per block\n   (`perBlock`).\n4. You will have to calculate the result into “human time\". To do this, remember that there are\n   approximately 14’400 blocks per day, and you can see what the latest block is shown on the\n   [Explorer](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/explorer) page."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#batch-transfers-with-the-polkadot-developer-interface", "page_title": "Polkadot-JS Transfer Guides", "index": 6, "depth": 3, "title": "Batch Transfers with the Polkadot Developer Interface", "anchor": "batch-transfers-with-the-polkadot-developer-interface", "start_char": 7323, "end_char": 8129, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Batch Transfers with the Polkadot Developer Interface\n\nBatch transfers are balances transfers to multiple accounts executed by one account. In order to\nconstruct a batch transfer you need to:\n\n- Create a `utility.batch(calls)` extrinsic using the\n  [utility pallet](https://paritytech.github.io/substrate/master/pallet_utility/index.html), and\n- Within the batch call you can create multiple `balances.transferKeepAlive` extrinsics using the\n  [balances pallet](https://paritytech.github.io/substrate/master/pallet_balances/index.html). You\n  can specify as many receivers as you desire.\n\n!!!info\n    You can watch [**this video tutorial**](https://youtu.be/uoUC2K8muvw) to learn how to do batch transfers. Note the tutorial uses the Westend Testnet, but the same applies to both Polkadot and Kusama."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#teleporting-tokens-using-the-polkadot-developer-interface", "page_title": "Polkadot-JS Transfer Guides", "index": 7, "depth": 3, "title": "Teleporting Tokens using the Polkadot Developer Interface", "anchor": "teleporting-tokens-using-the-polkadot-developer-interface", "start_char": 8129, "end_char": 8517, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Teleporting Tokens using the Polkadot Developer Interface\n\nSee [this video tutorial](https://youtu.be/3tE9ouub5Tg) and\n[this additional article](how-to/teleport-dot-ksm.md)\nto learn more about how to teleport tokens.\n\n!!!info\n    If you do not see \"Accounts > Teleport\" in the Polkadot Developer Interface, the source chain that you have selected does not support teleportation yet."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#calculating-fees-with-polkadot-js", "page_title": "Polkadot-JS Transfer Guides", "index": 8, "depth": 2, "title": "Calculating Fees with Polkadot-JS", "anchor": "calculating-fees-with-polkadot-js", "start_char": 8517, "end_char": 9595, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Calculating Fees with Polkadot-JS\n\nTo calculate fees you can go to Developer > Runtime Calls and select the following extrinsics:\n\n- `transactionPaymentApi.queryInfo`\n- `transactionPaymentApi.queryFeeDetails`\n\nand specify the `0x` prefixed hex call data and its length.\n\n![Fee details](../assets/fee-details.png)\n\nThe sum of `baseFee`, `lenFee` and `adjustedWeightFee` will yield the `partialFee`.\n\nOne useful utility for estimating transaction fees programmatically is the via the\n[@polkadot/api](https://www.npmjs.com/package/@polkadot/api). Check out the following script that\nlogs some relevant fee information:\n\n```js\n// Estimate the fees as RuntimeDispatchInfo using the signer\nconst info = await api.tx.balances.transfer(recipient, 123).paymentInfo(sender);\n\n// Log relevant info, partialFee is Balance, estimated for current\nconsole.log(`\n  class=${info.class.toString()},\n  weight=${info.weight.toString()},\n  partialFee=${info.partialFee.toHuman()}\n`);\n```\n\nFor additional information on interacting with the API, checkout\n[Polkadot-JS](../general/polkadotjs.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#existing-reference-error", "page_title": "Polkadot-JS Transfer Guides", "index": 9, "depth": 2, "title": "Existing Reference Error", "anchor": "existing-reference-error", "start_char": 9595, "end_char": 10099, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Existing Reference Error\n\nIf you are trying to reap an account and you receive an error similar to\n`\"There is an existing reference count on the sender account. As such the account cannot be reaped from the state\"`,\nthen you have existing references to this account that must be first removed before it can be\nreaped. References may still exist from:\n\n- Bonded tokens (most likely)\n- Unpurged session keys (if you were previously a validator)\n- Token locks\n- Existing recovery info\n- Existing assets"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#bonded-tokens", "page_title": "Polkadot-JS Transfer Guides", "index": 10, "depth": 3, "title": "Bonded Tokens", "anchor": "bonded-tokens", "start_char": 10099, "end_char": 10408, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Bonded Tokens\n\nIf you have tokens that are bonded, you will need to unbond them before you can reap your account.\nFollow the instructions at [Unbonding and Rebonding](./learn-guides-nominator.md#bond-your-tokens)\nto check if you have bonded tokens, stop nominating (if necessary) and unbond your tokens."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#checking-for-locks", "page_title": "Polkadot-JS Transfer Guides", "index": 11, "depth": 3, "title": "Checking for Locks", "anchor": "checking-for-locks", "start_char": 10408, "end_char": 11042, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Checking for Locks\n\n!!!info\n    See [this video tutorial](https://youtu.be/LHgY7ds_bZ0) and [this page](how-to/why-cant-i-transfer-dot.md) to learn how to check for locks and remove them.\n\nYou can also check for locks by querying `system.account(AccountId)` in\n[`Chain state` tab under the `Developer` drop-down menu in the Polkadot Developer Interface](https://polkadot.js.org/apps/#/chainstate).\nSelect your account, then click the \"+\" button next to the dropdowns, and check the relative `data`\nJSON object. If you see a non-zero value for anything other than `free`, you have locks on your\naccount that need to get resolved."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#purging-session-keys", "page_title": "Polkadot-JS Transfer Guides", "index": 12, "depth": 3, "title": "Purging Session Keys", "anchor": "purging-session-keys", "start_char": 11042, "end_char": 11453, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Purging Session Keys\n\nIf you used this account to set up a validator and you did not purge your keys before unbonding your\ntokens, you need to purge your keys. You can do this by seeing the\n[How to Stop Validating](../../node-infrastructure/run-a-validator/onboarding-and-offboarding/stop-validating.md) page. This can also\nbe checked by checking `session.nextKeys` in the chain state for an existing key."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#existing-recovery-info", "page_title": "Polkadot-JS Transfer Guides", "index": 13, "depth": 3, "title": "Existing Recovery Info", "anchor": "existing-recovery-info", "start_char": 11453, "end_char": 11919, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Existing Recovery Info\n\nCurrently, Polkadot does not use the\n[Recovery Pallet](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/recovery/),\nso this is probably not the reason for your tokens having existing references.\n\nOn Kusama, you can check if recovery has been set up by checking the\n`recovery.recoverable(AccountId)` chain state. This can be found under `Developer > Chain state` in\n[PolkadotJS Apps](https://polkadot.js.org/apps/)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-transfers", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-transfers/#existing-non-native-assets", "page_title": "Polkadot-JS Transfer Guides", "index": 14, "depth": 3, "title": "Existing Non-Native Assets", "anchor": "existing-non-native-assets", "start_char": 11919, "end_char": 12162, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:101762e4ce6929a33e98a9c2d44add510c34a716bef1e71b0772dc3d3dee74cf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Existing Non-Native Assets\n\nCurrently, Polkadot does not use the\n[Assets Pallet](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/assets), so\nthis is probably not the reason for your tokens having existing references."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#creating-a-treasury-proposal", "page_title": "Polkadot-JS Treasury Guides", "index": 0, "depth": 2, "title": "Creating a Treasury Proposal", "anchor": "creating-a-treasury-proposal", "start_char": 448, "end_char": 1155, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating a Treasury Proposal\n\nYour proposal should address a problem, outline a goal, give a detailed account of how you will\nreach that goal, and include any ongoing maintenance needs. As much as possible, you should itemize\nthe tasks to be completed so fees can be evaluated and milestones can be followed. You can check the\nguidelines below:\n\n- Guidelines for a successful proposal on\n  [Polkadot](https://docs.google.com/document/d/1IZykdp2cyQavcRyZd_dgNj5DcgxgZR6kAqGdcNARu1w) and\n  [Kusama](https://docs.google.com/document/d/1CzEnurqwqLBOGrJI9CQORiGW9m6QyPOSshhzJdR57Pk)\n- [Treasury proposal template for Polkadot](https://docs.google.com/document/d/1O_84mXYFERCavmnJyxbIPKFkG0bVBySRjCVy-d-VKcc)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#announcing-the-proposal", "page_title": "Polkadot-JS Treasury Guides", "index": 1, "depth": 3, "title": "Announcing the Proposal", "anchor": "announcing-the-proposal", "start_char": 1155, "end_char": 1814, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Announcing the Proposal\n\nTo minimize storage on-chain, proposals don't contain contextual information. When a user submits a\nproposal, they will need to find an off-chain way to explain the proposal via\n[community channels](../general/community.md).\n\nSpreading the word about the proposal's explanation to the community is ultimately up to the\nproposer.\n\n!!!tip \"Use Accounts with Verified On-Chain Identity for Treasury Proposals\"\n    To ensure legitimacy, it is required that the account linked to the Treasury proposal has an [identity set](how-to/set-clear-identity.md) and is [verified by an on-chain registrar](how-to/request-cancel-judgement.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#creating-a-treasury-proposal-spend-local", "page_title": "Polkadot-JS Treasury Guides", "index": 2, "depth": 2, "title": "Creating a Treasury Proposal - Spend Local", "anchor": "creating-a-treasury-proposal-spend-local", "start_char": 1814, "end_char": 2525, "estimated_token_count": 177, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating a Treasury Proposal - Spend Local\n\n!!!info \"\"Spend\" vs. \"Spend Local\"\"\n    You may notice that the Treasury pallet contains two extrinsics - `treasury.spend` and `treasury.spendLocal`. `treasury.spendLocal` (formally called `treasury.spend`) refers to a spend of DOT that is locally available, i.e., DOT from the Asset Hub treasury account. `spend` actually allows the caller to specify an asset other than DOT, or even assets in other locations, e.g. [Asset Hub](../general/glossary.md#asset-hub).\n\nUnlike `treasury.spendLocal`, `treasury.spend` is **not** bound by a spend period, and must be\nclaimed manually via the `treasury.payout` extrinsic. `treasuy.spendLocal` behavior remains\nunchanged."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#submitting-treasury-proposal-preimage", "page_title": "Polkadot-JS Treasury Guides", "index": 3, "depth": 3, "title": "Submitting Treasury Proposal Preimage", "anchor": "submitting-treasury-proposal-preimage", "start_char": 2525, "end_char": 4370, "estimated_token_count": 396, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Submitting Treasury Proposal Preimage\n\nThe example below shows how to create a [preimage](../general/glossary.md#preimage) for a\ntransaction that requests 100 DOT from Treasury.\n\n- Navigate to [Polkadot Developer Interface > Governance > Preimages](https://polkadot.js.org/apps/#/preimages)\n  and then click on Add Preimage.\n- Select the account which will be used to submit the preimage.\n- Choose `treasury` pallet in the \"propose\" dropdown and the `spendLocal(amount, beneficiary)`call\n- Enter the DOT amount.\n- Enter the AccountID of the beneficiary (which has a verified on-chain identity).\n- Submit preimage\n- Sign and submit the transaction by paying the specified transaction fees.\n\n!!!info \"Preimage Submission Deposit\"\n    A deposit is required for the preimage to be stored on chain. The preimage deposit is proportional to the amount of information stored within the preimage. The deposit amount required for a preimage with a treasury spend transaction is around 41 DOT (1.4 KSM on Kusama). Ensure you have enough account balance to pay for the submission deposit and the transaction fees.\n\nHere is the preimage requesting for 100 DOT.\n\n![Treasury Preimage](../assets/treasury/OpenGov-Treasury-Preimage-SpendLocal.png)\n\n!!!info \"Balance entered is in Plancks\"\n    Polkadot Developer Interface is for developers and the UI takes input of the balance in [plancks](learn-DOT.md#the-planck-unit). DOT has 10 decimals, which is 10000000000 plancks per DOT.\n\nAfter successful submission of the preimage, it is displayed on Polkadot Developer Interface > Governance >\nPreimages page. Every preimage is associated with a unique preimage hash (highlighted in a box in\nthe image below). Take a note of this preimage hash, which is required to submit a referendum.\n\n![Treasury Preimage Hash](../assets/treasury/treasury-preimage-hash.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#submitting-a-treasury-track-referendum", "page_title": "Polkadot-JS Treasury Guides", "index": 4, "depth": 3, "title": "Submitting a Treasury Track Referendum", "anchor": "submitting-a-treasury-track-referendum", "start_char": 4370, "end_char": 5260, "estimated_token_count": 189, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Submitting a Treasury Track Referendum\n\nThe example below shows how to submit a Treasury track referendum.\n\n- Navigate to [Polkadot Developer Interface > Governance > Referenda](https://polkadot.js.org/apps/#/referenda)\n  and then click on Submit proposal.\n- Select the account which will be used to submit the proposal.\n- Choose the appropriate submission track (The example below selected Small Spender track).\n- Enter the preimage hash of the treasury spend transaction.(If the preimage exists on-chain, the\n  preimage length box is automatically populated)\n- Click on Submit proposal.\n- Sign and submit the transaction.\n\n![Submit Treasury Proposal](../assets/treasury/submit-proposal-treasury.png)\n\nOnce your submission is executed, your referendum will appear under your chosen track on the\nPolkadot Developer Interface [referenda page](https://polkadot.js.org/apps/#/referenda)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#placing-a-decision-deposit-for-the-treasury-track-referendum", "page_title": "Polkadot-JS Treasury Guides", "index": 5, "depth": 3, "title": "Placing a Decision Deposit for the Treasury Track Referendum", "anchor": "placing-a-decision-deposit-for-the-treasury-track-referendum", "start_char": 5260, "end_char": 5869, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Placing a Decision Deposit for the Treasury Track Referendum\n\nFor the referendum to move from preparing phase to the deciding phase, a decision deposit needs to\nbe placed. The decision deposit values for each individual\n[Treasury Tracks](./learn-polkadot-opengov-treasury.md#treasury-tracks) are listed in a section above\nin this document.\n\n![Submit Treasury Proposal Decision Deposit](../assets/treasury/treasury-proposal-decision-deposit.png)\n\nThe preimage and decision deposits\n[can be claimed once the referendum ends](./learn-guides-polkadot-opengov.md#claiming-the-preimage-and-decision-deposits)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#creating-a-multistage-payout-proposal-with-validfrom", "page_title": "Polkadot-JS Treasury Guides", "index": 6, "depth": 2, "title": "Creating a Multistage Payout Proposal with `validFrom`", "anchor": "creating-a-multistage-payout-proposal-with-validfrom", "start_char": 5869, "end_char": 6835, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating a Multistage Payout Proposal with `validFrom`\n\nStaged proposals are similar to a tranche or milestone-based funding model; instead of all spends\nbeing paid simultaneously, each portion is redeemable at a certain block height. This is done by\nspecifying each milestone, set at its respective amount and block height at which it becomes\nredeemable.\n\nFor example, take the following \"staged\" proposal, which has three milestones, each at 100 DOT, and\nis redeemable at the following block heights. Usually, block heights correspond to a date in the\nfuture:\n\n- 100 DOT paid out at block height 1000\n- 200 DOT paid out at block height 2000\n- 500 DOT paid out at block height 4000\n\nGovernance can also propose to **void** a staged proposal before it has completed all of its\npayouts.\n\n!!!info \"Calculating dates from block heights\"\n    Although not the most accurate form of measurement, block heights can be used to correspond to certain dates in the future."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#using-batch-for-multi-spend-proposals", "page_title": "Polkadot-JS Treasury Guides", "index": 7, "depth": 3, "title": "Using `batch` for Multi-Spend Proposals", "anchor": "using-batch-for-multi-spend-proposals", "start_char": 6835, "end_char": 7290, "estimated_token_count": 104, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Using `batch` for Multi-Spend Proposals\n\nUsing the Utility pallet, one can batch multiple `treasury.spend` calls together. Each of these\ncalls can have its own `validFrom` block height, which allows for scenarios such as the above to be\npossible.\n\n!!!tip \"Multistage payout proposal example\"\n    For reference on how to create a multistage payout proposal, please check [Referendum 382](https://kusama.subsquare.io/referenda/382?tab=call) on Kusama."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#using-validfrom-for-a-milestone-based-proposal", "page_title": "Polkadot-JS Treasury Guides", "index": 8, "depth": 3, "title": "Using `validFrom` for a Milestone-Based Proposal", "anchor": "using-validfrom-for-a-milestone-based-proposal", "start_char": 7290, "end_char": 7793, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Using `validFrom` for a Milestone-Based Proposal\n\nOnce each spend is defined within the batched call, the `validFrom` field can be utilized to specify\nthe \"date\", or block height, at which each spend will be executed.\n\n!!!info \"Treasury Spends have to be claimed manually. Spends can expire!\"\n    Keep in mind that once the `validFrom` block height has been reached, you will have to claim the spend within 30 days. Check the claiming process for treasury spends [here](#manually-claiming-payouts)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#creating-a-usdt-treasury-proposal-spend-with-assethub", "page_title": "Polkadot-JS Treasury Guides", "index": 9, "depth": 2, "title": "Creating a USDT Treasury Proposal - Spend (with AssetHub)", "anchor": "creating-a-usdt-treasury-proposal-spend-with-assethub", "start_char": 7793, "end_char": 8088, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Creating a USDT Treasury Proposal - Spend (with AssetHub)\n\nThe following tutorial mostly goes over how to utilize the `spend` extrinsic, which, unlike\n`spendLocal`, is able to specify assets besides the native asset in other locations, such as\n[Asset Hub](../general/glossary.md#asset-hub)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#creating-a-preimage", "page_title": "Polkadot-JS Treasury Guides", "index": 10, "depth": 3, "title": "Creating a Preimage", "anchor": "creating-a-preimage", "start_char": 8088, "end_char": 8645, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Creating a Preimage\n\nThe example below shows how to create a [preimage](../general/glossary.md#preimage) for a transaction\nthat requests 100 USDT from AssetHub.\n\n- Navigate to [Polkadot Developer Interface > Governance > Referenda](https://polkadot.js.org/apps/#/preimages)\n  and then click on Add Preimage.\n- Select the account to submit the preimage.\n- Choose the `treasury` pallet in the \"propose\" dropdown and the\n  `spend(assetKind, amount, beneficiary, validFrom)` call.\n\nNow, let's go through each field one-by-one and fill them in accordingly:"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#specifying-asset-kind", "page_title": "Polkadot-JS Treasury Guides", "index": 11, "depth": 3, "title": "Specifying Asset Kind", "anchor": "specifying-asset-kind", "start_char": 8645, "end_char": 9860, "estimated_token_count": 289, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Specifying Asset Kind\n\n`assetKind` refers to the asset to be used, specified via XCM. In short, we need to be able to find:\n\n- The relative location of the asset, and\n- How it is identified within this location.\n\nFor this example, we are using USDT, which from the perspective of the Asset Hub would be:\n\n`AssetId (Concrete) > PalletInstance 50 > General Index 1984`\n\nFirst, we specify the location - in this case, Asset Hub (parachain 1,000). `PalletInstance 50`\nrefers to the Assets pallet instance on Asset Hub. The general index is `1984`, which is the ID of\nUSDT in this instance of the Assets pallet.\n\n!!!caution \"Bug on Polkadot Developer Interface\"\n    As the Polkadot Developer Interface is interpreting the general index in DOT, it multiplies the entered values with `10000000000` (As DOT token has 10 decimals) and places it in the `u128` argument. As we would like to have `1984` as the input argument, we can offset this UI induced error by entering `0.0000001984`.\n    \n    The issue on Polkadot-JS repo can be tracked [here](https://github.com/polkadot-js/apps/issues/10430).\n\nHere is how the final `assetKind` field should look:\n\n![Asset Kind](../assets/asset-hub/spend-usdt-assethub-temp.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#specifying-the-amount", "page_title": "Polkadot-JS Treasury Guides", "index": 12, "depth": 3, "title": "Specifying the Amount", "anchor": "specifying-the-amount", "start_char": 9860, "end_char": 10699, "estimated_token_count": 202, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Specifying the Amount\n\nThe amount should be simply the amount of USDT, where each `1` USDT is `1000000`. Because we are\nasking for 100 USDT, we put `100000000` as the input for the amount.\n\n!!!caution \"Bug on Polkadot Developer Interface\"\n    As the Polkadot Developer Interface is interpreting the asset balance in DOT, it multiplies the entered values with `10000000000` (As DOT token has 10 decimals) and places it in the `u128` argument. As we would like to have `100000000` as the input argument, we can offset this UI induced error by entering `0.01` for this particular example where we like to input 100 USDT.\n    \n    The issue on Polkadot-JS repo can be tracked [here](https://github.com/polkadot-js/apps/issues/10430).\n\n![Asset Value, Beneficiary and ValidFrom](../assets/asset-hub/spend-amount-account-validfrom-temp.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#specifying-the-beneficiary", "page_title": "Polkadot-JS Treasury Guides", "index": 13, "depth": 3, "title": "Specifying the Beneficiary", "anchor": "specifying-the-beneficiary", "start_char": 10699, "end_char": 10958, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Specifying the Beneficiary\n\nThe beneficiary account will be one on Asset Hub. For this reason, the XCM junction must be\nspecified as follows, with one junction (`X1`) and the beneficiary account (`AccountId32`), which is\nan account address on the chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#specifying-validfrom-optional", "page_title": "Polkadot-JS Treasury Guides", "index": 14, "depth": 3, "title": "Specifying `validFrom` (optional)", "anchor": "specifying-validfrom-optional", "start_char": 10958, "end_char": 12052, "estimated_token_count": 276, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Specifying `validFrom` (optional)\n\nThe `validFrom` field is optional, and refers to the block height of the Asset Hub upon which the\npayout can be issued. If the `validFrom` parameter is not set, the spend can be [claimed](#manually-claiming-payouts) immediately\nafter approval. For more information on this field, refer to the\n[guide below](#creating-a-multistage-payout-proposal-with-validfrom).\n\nThe final call should look like the following, where we:\n\n- Specify our asset as **USDT** on **Asset Hub**.\n- Specify the **amount** of **USDT** (100).\n- Specify the beneficiary address.\n- If applicable, use the `validFrom` field to specify a block number upon which the payout becomes\n  valid.\n\nThe next steps are to:\n\n- Copy the preimage (and its length)\n- Sign and submit the preimage\n\nOnce this is finished, one may submit a proposal\nas described [here](./learn-guides-treasury.md#submitting-a-treasury-track-referendum). Keep in mind one will also need to\n[provide the decision deposit as well](./learn-guides-treasury.md#placing-a-decision-deposit-for-the-treasury-track-referendum)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#manually-claiming-payouts", "page_title": "Polkadot-JS Treasury Guides", "index": 15, "depth": 3, "title": "Manually Claiming Payouts", "anchor": "manually-claiming-payouts", "start_char": 12052, "end_char": 13405, "estimated_token_count": 321, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Manually Claiming Payouts\n\nIn order to claim the spend, you must manually call the `treasury.payout` extrinsic via a `Signed`\norigin. The `spendID` for the pending payout can be queried on-chain through Polkadot Developer Interface >\nDeveloper > Chain State > Storage > treasury > spends and unselect the include option and then click\non the plus button to the right.\n\n![payout](../assets/treasury/treasury-multistage-payout-spend-id.png)\n\nFrom the list of spends, find the `spendID` of your respetive payout and issue the payout extrinsic.\n\n!!!tip \"payout example\"\n    To claim the first payout of [Referendum 382](https://kusama.subsquare.io/referenda/382?tab=call) on Kusama, [this payout extrinsic](https://kusama.subscan.io/extrinsic/23061444-2) was issued. After issuing the payout extrinsic, the status of the payout changes from `pending` to `Attempted` with a reference to a payment ID. If the payout is successful, the balance on Asset Hub should be updated. [Here](https://assethub-kusama.subscan.io/extrinsic/6923602-0) is the transfer extrinsic on Asset Hub for the first payout of [Referendum 382](https://kusama.subscan.io/referenda_v2/382).\n\nTo clear the on-chain storage of a successful or expired spend, Treasury pallet's `checkStatus`\nextrinsic can be used. The transaction fees paid for issuing this extrinsic will be refunded."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#proposing-a-void-for-a-staged-proposal", "page_title": "Polkadot-JS Treasury Guides", "index": 16, "depth": 3, "title": "Proposing a \"Void\" for a Staged Proposal", "anchor": "proposing-a-void-for-a-staged-proposal", "start_char": 13405, "end_char": 13979, "estimated_token_count": 132, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Proposing a \"Void\" for a Staged Proposal\n\nIf a proposal that hasn't completed all of its spends needs to be voided, the `treasury.voidSpend`\nextrinsic can be utilized via a governance proposal.\n\n!!!tip \"Example proposal - Voiding a Treasury Spend\"\n    For reference, check the referenda on Kusama that [tests VoidSpend functionality for Treasury Payouts](https://kusama.subsquare.io/referenda/391). Through this referenda, a treasury spend was [successfully voided](https://kusama.subscan.io/event?page=1&time_dimension=date&module=treasury&event_id=assetspendvoided)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#submit-treasury-proposal-via-subsquare", "page_title": "Polkadot-JS Treasury Guides", "index": 17, "depth": 2, "title": "Submit Treasury Proposal via Subsquare", "anchor": "submit-treasury-proposal-via-subsquare", "start_char": 13979, "end_char": 14790, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Submit Treasury Proposal via Subsquare\n\nTo submit a treasury track referendum via [Subsquare](https://polkadot.subsquare.io/), open the app\nand start a new proposal on the relevant treasury track. Then,\n\n- Choose an address for the proposer.\n- Write a proposal: add a detailed description for the proposal, which will be stored on Subsquare.\n  Alternatively, you can link an existing discussion post.\n- Create a preimage: an existing preimage can be linked, or a new one can be created. To create a\n  preimage, add the beneficiary address and the token amount. The track will be auto-selected and\n  you can proceed with the creation of a preimage.\n- Create a proposal: final confirmation of the proposal creation. The description of the proposal and\n  the preimage are automatically linked to the proposal."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-treasury/#requesting-tips-from-the-treasury", "page_title": "Polkadot-JS Treasury Guides", "index": 18, "depth": 2, "title": "Requesting Tips from the Treasury", "anchor": "requesting-tips-from-the-treasury", "start_char": 14790, "end_char": 16038, "estimated_token_count": 303, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:77fcdc65d428b20ce09986af890d94035904f6272c817522d6facdd4c7782059", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Requesting Tips from the Treasury\n\nTo request a tip funded by the treasury, you can follow the above steps for\n[creating a treasury proposal](#creating-a-treasury-proposal) but instead of submitting the proposal\nto the `32 / Small Spender` track, you will need to submit it to the `30 / Small Tipper` or\n`31 / Big Tipper` tracks depending on the number of tokens to be requested.\n\nBriefly, you will need to:\n\n- Create a preimage using the `treasury.spendLocal` extrinsic and specifying the number of tokens\n  and the beneficiary of the tip\n- Submit a proposal to the right track (i.e. `30` or `31`) using the preimage hash\n- Once you started the referendum go to [Subsquare](https://polkadot.subsquare.io/), log in with the\n  proposer account and edit the referendum details\n- Notify [the Polkadot Direction Element Channel](https://matrix.to/#/#Polkadot-Direction:parity.io)\n  or [the Kusama Direction Element Channel](https://matrix.to/#/#Polkadot-Direction:parity.io) about\n  your referendum\n- Place the decision deposit\n  [before the timeout](../general/chain-state-values.md)\n- Once the referendum ends you can\n  [claim the preimage and decision deposits back](./learn-guides-polkadot-opengov.md#claiming-the-preimage-and-decision-deposits)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-vault", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-vault/#sending-a-transfer-with-the-vault-app", "page_title": "Polkadot Vault App Guides", "index": 0, "depth": 2, "title": "Sending a Transfer with the Vault App", "anchor": "sending-a-transfer-with-the-vault-app", "start_char": 432, "end_char": 1119, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0a041791497e33a42dce350490ebfe6a325e10a7ed2de23d8e5045a5b689e96c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Sending a Transfer with the Vault App\n\n!!!danger \"Verifying Extrinsics\"\n    Visit the [**dedicated page**](how-to/verify-extrinsic.md#verify-an-extrinsic-using-ledger) and see [**this video tutorial**](https://youtu.be/bxMs-9fBtFk?t=360) tutorial to learn about how to verify extrinsics before signing them. The video will also mention potential attacks that can happen to you while signing for transactions.\n\nGeneral instructions to send a transfer can be found on\n[this page](how-to/transfer-funds.md).\nTo sign transactions with the Polkadot Vault app check\n[this article](how-to/parity-signer-sign-transaction.md)\nor see [this video tutorial](https://youtu.be/gbvrHzr4EDY?t=281)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-vault", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-vault/#import-vault-accounts-into-polkadot-js", "page_title": "Polkadot Vault App Guides", "index": 1, "depth": 2, "title": "Import Vault Accounts into Polkadot-JS", "anchor": "import-vault-accounts-into-polkadot-js", "start_char": 1119, "end_char": 1556, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0a041791497e33a42dce350490ebfe6a325e10a7ed2de23d8e5045a5b689e96c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Import Vault Accounts into Polkadot-JS\n\nSee\n[this article](how-to/vault-add-account.md)\nto import a Polkadot Vault account into the\n[Polkadot Developer Signer](../general/polkadotjs.md#polkadot-developer-signer) or\n[Parity Signer Companion](https://chrome.google.com/webstore/detail/parity-signer-companion/damllfnhhcbmclmjilomenbhkappdjgb).\nAccounts added to those extensions will be injected into the Polkadot Developer Interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-vault", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-vault/#do-your-own-chain-spec-and-metadata-update", "page_title": "Polkadot Vault App Guides", "index": 2, "depth": 2, "title": "Do Your Own Chain Spec and Metadata Update", "anchor": "do-your-own-chain-spec-and-metadata-update", "start_char": 1556, "end_char": 2117, "estimated_token_count": 127, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0a041791497e33a42dce350490ebfe6a325e10a7ed2de23d8e5045a5b689e96c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Do Your Own Chain Spec and Metadata Update\n\n!!!danger \"This section is for developers and power users only\"\n    By requesting the chain specification and metadata you trust the specific endpoint you are using (unless you are using you own node).\n\nThe following guide bases on the [Parity Signer](https://github.com/paritytech/parity-signer) Github\npage (to create the Chain Spec QR code and the metadata QR code fountain) and\n[Metadata Portal](https://github.com/paritytech/metadata-portal) Github page (to embed the Chain\nSpec and Metadata into a portal)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-vault", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-vault/#chain-specification", "page_title": "Polkadot Vault App Guides", "index": 3, "depth": 3, "title": "Chain Specification", "anchor": "chain-specification", "start_char": 2117, "end_char": 4627, "estimated_token_count": 555, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0a041791497e33a42dce350490ebfe6a325e10a7ed2de23d8e5045a5b689e96c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Chain Specification\n\n#### Chain Spec QR\n\nTo add more chains on the Vault app you can follow the instructions\n[here](https://github.com/novasamatech/parity-signer/blob/master/docs/src/tutorials/Add-New-Network.md#add-network-specs).\nIn this example we will add the [Asset Hub](../learn/learn-assets.md) system parachain. Briefly,\nfork the [Parity Signer GitHub repository](https://github.com/paritytech/parity-signer), start the\nterminal within the `/generate_message` folder and type the following:\n\n`cargo run add-specs -d -u wss://kusama-asset-hub-rpc.polkadot.io --encryption sr25519`\n\nwhere `wss://kusama-asset.hub-rpc.polkadot.io` is the Parity RPC endpoint for the Asset Hub on\nKusama. This will create the file `sign_me_add_specs_statemine_sr25510` under the\n`files/in_progress` folder. See all endpoints listed for\n[Polkadot](https://github.com/polkadot-js/apps/blob/089fd77b14169749e35e073a93f7e7276963009c/packages/apps-config/src/endpoints/productionRelayPolkadot.ts)\nand\n[Kusama](https://github.com/polkadot-js/apps/blob/089fd77b14169749e35e073a93f7e7276963009c/packages/apps-config/src/endpoints/productionRelayKusama.ts)\non the Polkadot Developer Interface.\n\n#### Generating Signature\n\n!!!danger \"Use a hot account\"\n    Make sure that the account used to sign the chain specification is a hot account. Never use a cold account from the Vault app or Ledger, as after typing the seed phrase into the terminal that account will be considered hot.\n\nStart the terminal within the `files/in_progress` folder and type the following:\n\n`cat sign_me_add_specs_statemine_sr25519 | subkey sign --suri \"YOUR SEED PHRASE\"`\n\nwhere `\"YOUR SEED PHRASE\"` is the seed phrase of the account that will be used to sign and\nauthenticate both the chain spec and later on the metadata. Running the code above will return a\nsignature similar to that below:\n\n`0xc4ce72db959000b6166af96d3bda55a927fd837747bf1bf1ae8a69e57c9ef37c25a88707c47b105a9eb1fbcf9345680eff57eb978cf73919506f6c738834e78a`\n\n#### Signing Chain Spec\n\nNow, go back to the `/generate_message` folder and type the following:\n\n`cargo run --release make --goal qr --crypto sr25519 --msg add-specs --payload sign_me_add_specs_statemine_sr25519 --verifier-hex PUBLIC KEY --signature-hex SIGNATURE`\n\nwhere `PUBLIC KEY` is the public key of the account with seed `\"YOUR SEED PHRASE\"`, and `SIGNATURE`\nis the signature generated in the previous step. Running the code above will create the file\n`add_specs_statemine-sr25519` under the `files/completed` folder."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-vault", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-vault/#metadata-updates", "page_title": "Polkadot Vault App Guides", "index": 4, "depth": 3, "title": "Metadata Updates", "anchor": "metadata-updates", "start_char": 4627, "end_char": 7372, "estimated_token_count": 590, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0a041791497e33a42dce350490ebfe6a325e10a7ed2de23d8e5045a5b689e96c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Metadata Updates\n\nSimilarly to what we did for the chain specification, we now generate and sign the Asset Hub\nmetadata.\n\n#### Metadata QR Fountain\n\nTo update the chain metadata for the Asset Hub specs on the Vault app you can follow the\ninstructions [here](https://github.com/novasamatech/parity-signer/blob/master/docs/src/tutorials/Add-New-Network.md#add-network-metadata).\nBriefly, in the Parity Signer repository, start the terminal within the `/generate_message` folder\nand type the following:\n\n`cargo run load-metadata -d -u wss://kusama-asset-hub-rpc.polkadot.io`\n\nwhere `wss://kusama-asset-hub-rpc.polkadot.io` is the Parity RPC endpoint for the Asset Hub on\nKusama. This will create the file `sign_me_load_metadata_statemineV9370` under the\n`files/in_progress` folder. Note that for future metadata updates the file name will change as the\nversion at the time of writing was `V9370`.\n\n!!!info\n    Note that the name of the file changes according to the network version. That is, `????` in `sign_me_load_metadata_statemineV????` will be the latest version at fetch time.\n\n#### Generating Signature\n\n!!!danger \"Use a hot account\"\n    Make sure that the account used to sign the metadata is a hot account. Never use a cold account from the Vault app or Ledger, as after typing the seed phrase into the terminal that account will be considered hot.\n\nStart the terminal within the `files/in_progress` folder and type the following:\n\n`cat sign_me_load_metadata_statemineV9370 | subkey sign --suri \"YOUR SEED PHRASE\"`\n\nwhere `\"YOUR SEED PHRASE\"` is the seed phrase of the account you used to sign the chain\nspecification. Running the code above will return a signature similar to that below:\n\n`0xde1ad7aeb252acb3cf42a522dcc8dc3f317a49be2ed636836dd6df8f7e47135f2c712480055822eba87e9ea5ac7d3bba96045992ae795856fdf4eea09a411f85`\n\n!!!info \"Do not copy the code lines above\"\n    Note that the name of the file changes according to the network version. That is, `????` in `sign_me_load_metadata_statemineV????` will be the latest version at fetch time. So, do not copy the code line above, but change the version with the appropriate one saved under the `files/in_progress` folder. The signature changes as well.\n\n#### Signing Metadata\n\nNow, go back to the `/generate_message` folder and type the following:\n\n`cargo run --release make --goal qr --crypto sr25519 --msg load-metadata --payload sign_me_load_metadata_statemineV9370 --verifier-hex PUBLIC KEY --signature-hex SIGNATURE`\n\nwhere `PUBLIC KEY` is the public key of the account with seed `\"YOUR SEED PHRASE\"`, and `SIGNATURE`\nis the signature generated in the previous step. Running the code above will create the file\n`load_metadata_statemineV9370` under the `files/completed` folder."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-vault", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-vault/#add-chain-update-metadata", "page_title": "Polkadot Vault App Guides", "index": 5, "depth": 3, "title": "Add Chain & Update Metadata", "anchor": "add-chain-update-metadata", "start_char": 7372, "end_char": 7775, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0a041791497e33a42dce350490ebfe6a325e10a7ed2de23d8e5045a5b689e96c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Add Chain & Update Metadata\n\nYou can open `add_specs_statemine-sr25519` on your browser (just drag the file on an open tab). This\nis a .png file containing the QR code to add the Asset Hub chain specification into the Vault App.\nYou can do the same with the `load_metadata_statemineV9370`. This is a .apng file containing the QR\ncode fountain to do the metadata update for the Asset Hub on Kusama."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-guides-vault", "url": "https://developer.polkadot.com/wiki/learn/learn-guides-vault/#metadata-portal", "page_title": "Polkadot Vault App Guides", "index": 6, "depth": 3, "title": "Metadata Portal", "anchor": "metadata-portal", "start_char": 7775, "end_char": 9710, "estimated_token_count": 420, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0a041791497e33a42dce350490ebfe6a325e10a7ed2de23d8e5045a5b689e96c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Metadata Portal\n\n#### Modify `config` File\n\nAlternatively, you can add the chain specification QR code and the metadata QR code fountain in a\nmetadata portal. Briefly, fork the\n[Parity's Metadata Portal GitHub repository](https://github.com/paritytech/metadata-portal). You can\nmodify the following fields of the `config.toml` file:\n\n- `name`: your name / institution\n- `public_key`: the public key of the account you use to sign the chain spec and the metadata.\n- At the bottom of the file add the following information:\n\n```\n[[chains]]\nname = \"Statemine\"\ntitle = \"Kusama Asset Hub\"\nrpc_endpoint = \"wss://kusama-asset-hub-rpc.polkadot.io\"\ncolor = \"#f27230\"\n\n[chains.github_release]\nowner = \"paritytech\"\nrepo = \"statemint\"\ngenesis_hash = \"0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\"\n```\n\nFor each additional chain, you need to add the respective information. Information about the genesis\nhash can be found on the Polkadot Developer Interface > connect to the relevant chain > Developer > Chain State.\n\n#### Rename Chain's Files\n\nRename the signed chain specification and metadata files as follow:\n\n- Chain specification: `add_specs_statemine-sr25519` --> `statemine_specs.png`\n\n- Metadata updates: `load_metadata_statemineV9370`--> `statemine_metadata_9370.apng`\n\nThus, for chain specification the file must be renamed to `chainName_specs.png` while for metadata\nthe file must be renamed to `chainName_metadata_version.apng` where `chainName` is the name of the\nchain and `version` is the version of the metadata.\n\nAdd the renamed files to the `/public/qr folder` within the Metadata Portal repository.\n\n#### Run Portal\n\nOpen the terminal within the Metadata Portal repository and run `make updater`. Then run\n`make collector`; this will create the `_latest.apng` files for each of the chains (removed by the\ncommand `make cleaner`). Finally, run `yarn start` to load the metadata portal on your localhost."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#coprocessor-model", "page_title": "Hyperbridge Overview", "index": 0, "depth": 2, "title": "Coprocessor Model", "anchor": "coprocessor-model", "start_char": 1089, "end_char": 2360, "estimated_token_count": 282, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Coprocessor Model\n\nEnsuring secure cross-chain communication involves the meticulous verification of various aspects,\nincluding: [Consensus Mechanisms](./learn-consensus.md),\n[Consensus Faults](https://research.polytope.technology/consensus-proofs),\n[State Proofs](https://research.polytope.technology/state-machine-proofs) and\n[State Transitions](./learn-parachains.md#state-transitions).\n\n> What is a coprocessor?\n>\n> **Coprocessor**, in the context of hardware, can be referred to as a microprocessor designed to\n> supplement the capabilities of the primary processor. For example, a GPU is a coprocessor of the\n> CPU to be optimized for graphical and simultaneous computation.\n\nDue to the complexity and expensiveness of the onchain verification process, in the coprocessor\nmodel, the computation is performed off-chain. The execution outcomes and cryptographic proofs\nvalidating their accuracy are subsequently presented on-chain.\n\nExpanding more about the coprocessor model, it has been applied in other solutions of offloading\ncryptographic computation as well, particularly\n[**Zero-knowledge (ZK) coprocessor**](https://orochi.network/blog/Exploring-ZK-Coprocessor-What-Comes-Next)\nor [SNARK circuit](https://www.di.ens.fr/~nitulesc/files/Survey-SNARKs.pdf)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#parachain-as-coprocessors", "page_title": "Hyperbridge Overview", "index": 1, "depth": 3, "title": "Parachain as Coprocessors", "anchor": "parachain-as-coprocessors", "start_char": 2360, "end_char": 3234, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Parachain as Coprocessors\n\nBy leveraging the cost-effective consensus proofs facilitated by\n[BEEFY](https://spec.polkadot.network/sect-finality#sect-grandpa-beefy), Hyperbridge affirms the\nlegitimacy of all parachain state transitions safeguarded by the network.\n\nThis capability enables the distribution of the validation workload for consensus, state proofs, and\nstate transition re-execution across various designated cores. Hence,\nPolkadot is utilized by Hyperbridge as a verifiable computation layer to provide the\n[\"Full Node Security\"](https://blog.polytope.technology/introducing-hyperbridge-interoperability-coprocessor#full-node-level-security)\nin cross-chain bridges.\n\nHence, an additional layer of security is provided, allowing Hyperbridge to detect and prevent\n[Byzantine](https://en.wikipedia.org/wiki/Byzantine_fault) behaviors across connected chains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#interoperable-state-machine-protocol-ismp", "page_title": "Hyperbridge Overview", "index": 2, "depth": 3, "title": "Interoperable State Machine Protocol (ISMP)", "anchor": "interoperable-state-machine-protocol-ismp", "start_char": 3234, "end_char": 3988, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Interoperable State Machine Protocol (ISMP)\n\n[Interoperable State Machine Protocol (ISMP)](https://blog.polytope.technology/introducing-hyperbridge-interoperability-coprocessor)\nprovides a familiar HTTP-like API for developers who want to make cross-chain requests to trigger\ncertain logic on the counterparty chain. It allows POST requests to send arbitrary data to connected\nchains and GET requests to read the storage (verified through state proofs) of applications on\nconnected chains.\n\nIn addition to facilitating cross-chain message passing among connected chains, ISMP also serves as\na synchronization primitive across Hyperbridge's internal state machines. This enables its parachain\ncores to communicate with each other and delegate tasks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#underlying-technologies", "page_title": "Hyperbridge Overview", "index": 3, "depth": 3, "title": "Underlying Technologies", "anchor": "underlying-technologies", "start_char": 3988, "end_char": 5465, "estimated_token_count": 247, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Underlying Technologies\n\nThe underlying technologies of the Hyperbridge are integrated with:\n\n- [PLONK verifier](https://eprint.iacr.org/2019/953.pdf): The PLONK Verifier within Hyperbridge can\n  be likened to a sophisticated security apparatus. It operates like an expert detective,\n  meticulously ensuring the legitimacy of every transaction without compromising private details.\n  Continuously enhancing its capabilities, particularly with advancements like UltraPLONK, this\n  integral component is pivotal in maintaining the utmost integrity and confidentiality of\n  cross-chain communications.\n- [BEEFY consensus](https://spec.polkadot.network/sect-finality#sect-grandpa-beefy): The BEEFY\n  (Bridge Efficiency Enabling Finality Yielder) protocol functions as a complementary system to\n  GRANDPA, specifically designed to facilitate efficient bridging between the Polkadot network and external, isolated blockchains like Ethereum. Notably, BEEFY addresses the\n  interoperability challenge with blockchains not initially constructed to integrate seamlessly with\n  the Polkadot interchain framework.\n- [The Barretenberg backend](https://github.com/AztecProtocol/barretenberg): Within the realm of\n  Hyperbridge, Barretenberg functions as a powerhouse engine, adeptly managing intricate\n  mathematical computations. As the backend infrastructure, it guarantees the swift, secure, and\n  reliable execution of all cryptographic operations within the Hyperbridge ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#terminology", "page_title": "Hyperbridge Overview", "index": 4, "depth": 2, "title": "Terminology", "anchor": "terminology", "start_char": 5465, "end_char": 5481, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Terminology"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#state-proofs", "page_title": "Hyperbridge Overview", "index": 5, "depth": 3, "title": "State Proofs", "anchor": "state-proofs", "start_char": 5481, "end_char": 5805, "estimated_token_count": 56, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### State Proofs\n\nState proofs are a critical primitive of the blockchain stack that enables things like trustless\nbridges. These off-chain light clients can access on-chain data in a permissionless and secure\nmanner and modular blockchain architectures where the execution layer can be decoupled from the\nconsensus layer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#consensus-proofs", "page_title": "Hyperbridge Overview", "index": 6, "depth": 3, "title": "Consensus Proofs", "anchor": "consensus-proofs", "start_char": 5805, "end_char": 6525, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Consensus Proofs\n\nConsensus Proofs in a blockchain system denote the mechanism by which participants, often nodes or\nvalidators, collectively agree on the validity of new transactions or blocks. The nature of\nconsensus proofs varies across different blockchain architectures, such as Proof-of-Work,\nProof-of-Stake, or other consensus algorithms.\n\nThe ultimate goal is to ensure a widespread and verifiable agreement among network participants,\nenhancing the security and reliability of the distributed ledger.\n\nFor example, Consensus Proofs in a proof of stake system are given as the signatures over the latest\nblock header in the chain from a supermajority (two-thirds plus one) subset of the full authority\nset."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-hyperbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-hyperbridge/#resources", "page_title": "Hyperbridge Overview", "index": 7, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 6525, "end_char": 7349, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4f4ec0a6dcc66f01c05f700741c8419e3cee5ef916b35bb18e4c6cd611dff712", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\nTo learn more about Hyperbridge, see the resources below.\n\n- [Introducing Hyperbridge: An Interoperability Coprocessor](https://blog.polytope.technology/introducing-hyperbridge-interoperability-coprocessor) -\n  Article by Seun Lanlege, Polytope Lab founder.\n- [Hyperbridge: The New Interoperability Coprocessor on Polkadot](https://medium.com/simplystaking/hyperbridge-the-new-interoperability-coprocessor-on-polkadot-b532ae622d8e) -\n  Article by Erik from Simply Staking\n- [Hyperbridge Source Code](https://github.com/polytope-labs/hyperbridge) - Public codebase\n  repository of hyperbridge.\n- [The Puzzle of Blockchain Interoperability](https://twitter.com/stakenode_dev/status/1744653040764817675)\n- [ISMP, The Endgame for Parachain Interoperability | Sub0 2023](https://www.youtube.com/watch?v=MCOAwooWecs)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-identity/#sub-identities", "page_title": "Account Identity", "index": 0, "depth": 2, "title": "Sub-Identities", "anchor": "sub-identities", "start_char": 748, "end_char": 1329, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:16dda8b9a455fcbbf7044c62b2e6c018f2ca0a1c53e8425052d4a6671fcd8f33", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Sub-Identities\n\nUsers can also link accounts by setting \"sub accounts\", each with its own identity, under a primary\naccount. The system reserves a bond for each sub account. An example of how you might use this would\nbe a validation company running multiple validators. A single entity, \"My Staking Company\", could\nregister multiple sub accounts that represent the [Stash accounts](learn-cryptography.md) of each of\ntheir validators.\n\nAn account can have a maximum of 100 sub-accounts. Note that a\n[deposit](../general/chain-state-values.md) is required for every sub-account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-identity/#judgements", "page_title": "Account Identity", "index": 1, "depth": 2, "title": "Judgements", "anchor": "judgements", "start_char": 1329, "end_char": 2658, "estimated_token_count": 262, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:16dda8b9a455fcbbf7044c62b2e6c018f2ca0a1c53e8425052d4a6671fcd8f33", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Judgements\n\nAfter a user injects their information on chain, they can request judgement from a registrar. Users\ndeclare a maximum fee that they are willing to pay for judgement, and registrars whose fee is below\nthat amount can provide a judgement.\n\nWhen a registrar provides judgement, they can select up to six levels of confidence in their\nattestation:\n\n- Unknown: The default value, no judgement made yet.\n- Reasonable: The data appears reasonable, but no in-depth checks (e.g. formal KYC process) were\n  performed.\n- Known Good: The registrar has certified that the information is correct (this step involves\n  verification of state issued identity documents).\n- Out of Date: The information used to be good, but is now out of date.\n- Low Quality: The information is low quality or imprecise, but can be fixed with an update.\n- Erroneous: The information is erroneous and may indicate malicious intent.\n\nA seventh state, \"fee paid\", is for when a user has requested judgement and it is in progress.  \nJudgements in this state, as well as \"erroneous\" judgements, are \"sticky\": modifying the identity information does not remove them.\nThey can only be removed by the complete removal of the identity.\n\nRegistrars gain trust by performing proper due diligence and would presumably be replaced for\nissuing faulty judgments."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-identity/#registrars", "page_title": "Account Identity", "index": 2, "depth": 2, "title": "Registrars", "anchor": "registrars", "start_char": 2658, "end_char": 6268, "estimated_token_count": 1005, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:16dda8b9a455fcbbf7044c62b2e6c018f2ca0a1c53e8425052d4a6671fcd8f33", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Registrars\n\nRegistrars can set a fee for their services and limit their attestation to certain fields. For\nexample, a registrar could charge 1 DOT to verify one's legal name, email, and GPG key. When a user\nrequests judgement, they will pay this fee to the registrar who provides the judgement on those\nclaims. Users set a maximum fee they are willing to pay and only registrars below this amount would\nprovide judgement.\n\nThere are multiple registrars on Polkadot and Kusama. Unless no additional information is available\nhere, you must reach out to specific registrars individually if you want to be judged by those.\n\n!!!info \"Decommissioned Registrar Service\"\n    Registrars shown as struck through in the list below are decommissioned and no longer accept new judgment requests. Existing judgments issued by those registrars remain unaffected. For new identity judgments, please use one of the active registrars.\n\n=== \"Polkadot\"\n\n    ~~Registrar 0~~ : <br /> **URL**: NA <br /> **Account**:\n    ~~12j3Cz8qskCGJxmSJpVL2z2t3Fpmw3KoBaBaRGPnuibFc7o8~~ <br /> **Fee**: ~~0 DOT~~ <br />\n\n    Registrar 1: <br /> **URL**: https://registrar.d11d.net/ <br /> **Account**:\n    1Reg2TYv9rGfrQKpPREmrHRxrNsUDBQKzkYwP1UstD97wpJ <br /> **Fee**: 20 DOT <br />\n\n    ~~Registrar 2~~: <br /> **Account**: ~~1EpXirnoTimS1SWq52BeYx7sitsusXNGzMyGx8WPujPd1HB~~ <br />\n    **Fee**: ~~0 DOT~~ <br />\n\n    ~~Registrar 3~~: <br /> **Account**: ~~13SceNt2ELz3ti4rnQbY1snpYH4XE4fLFsW8ph9rpwJd6HFC~~ <br /> **Fee**:\n    ~~0.5 DOT~~ <br />\n\n    ~~Registrar 4~~: <br /> **URL**: ~~https://polkaidentity.com/~~ <br /> **Account**:\n    ~~16LYBUcQKWZjAYE4oAPWx9XFaEYnCAffwpPuPWrUvU1mqBZT~~ <br /> **Fee**: ~~0.5 DOT~~ <br />\n\n    Registrar 5: <br /> **URL**: https://dotid.app <br /> **Account**:\n    12gL6BDsAMQCij7Ni5CxeN3J9VYwsKAUgbSLxAMbceCkxqv1 <br /> **Fee**: 0 DOT <br /> dotID\n    (Registrar 5) provides setting on-chain ID as a service on their\n    [website](https://dotid.app).\n\n=== \"Kusama\"\n\n    ~~Registrar 0~~ : <br /> **URL**: NA <br /> **Account**:\n    ~~H4XieK3r3dq3VEvRtqZR7wN7a1UEkXxf14orRsEfdFjmgkF~~ <br /> **Fee**: ~~0.04 KSM~~ <br />\n\n    Registrar 1: <br /> **URL**: https://registrar.d11d.net/ <br /> **Account**:\n    Fom9M5W6Kck1hNAiE2mDcZ67auUCiNTzLBUdQy4QnxHSxdn <br /> **Fee**: 4.5 KSM <br />\n\n    Registrar 2: is no longer offering registrar services on Kusama. <br /> **Account**:\n    ~~EK8veMNH6sVtvhSRo4q1ZRh6huCDm69gxK4eN5MFoZzo3G7~~ <br /> **Fee**: ~~1 KSM~~ <br />\n\n    Registrar 3: <br /> **Account**: GLiebiQp5f6G5vNcc7BgRE9T3hrZSYDwP6evERn3hEczdaM <br /> **Fee**: 1\n    KSM <br />\n\n    Registrar 4: <br /> **Account**: GhmpzxUyTVsFJhV7s2wNvD8v3Bgikb6WvYjj4QSuSScAUw6 <br /> **Fee**:\n    0.04 KSM <br />\n\n    ~~Registrar 5~~: <br /> **Account**: ~~F1wAMxpzvjWCpsnbUMamgKfqFM7LRvNdkcQ44STkeVbemEZ~~ <br /> **Fee**:\n    ~~0.04 KSM~~ <br />\n\n    ~~Registrar 6~~: <br /> **URL**: ~~https://polkaidentity.com/~~ <br /> **Account**:\n    ~~HurhThD66KBUf2zcE9Zhx46sCqNJXviKhWAct95rBCkPuix~~ <br /> **Fee**: ~~0.04 KSM~~ <br />\n\n    Registrar 7: <br /> **URL**: https://dotid.app <br /> **Account**:\n    EFecAJfvw9f2qvJX8y1QAa9STqXygRX4UYcBXeCYMPjXZ45 <br /> **Fee**: 0 KSM <br /> dotID\n    (Registrar 7) provides setting on-chain ID as a service on their\n    [website](https://dotid.app).\n\nSee [this page](./learn-guides-identity.md#registrars) to learn how to become a Registrar.\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about account identity](./learn-guides-identity.md).\n    \n    See also [these Polkadot-JS guides](how-to/set-clear-identity.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-identity", "url": "https://developer.polkadot.com/wiki/learn/learn-identity/#how-to-guides", "page_title": "Account Identity", "index": 3, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 6268, "end_char": 6518, "estimated_token_count": 75, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:16dda8b9a455fcbbf7044c62b2e6c018f2ca0a1c53e8425052d4a6671fcd8f33", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [How to Set Identities for Sub Accounts](how-to/set-subaccount-identities.md)\n- [How to Set and Clear an Identity](how-to/set-clear-identity.md)\n- [How to Request and Cancel Identity Judgement](how-to/request-cancel-judgement.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-implementations", "url": "https://developer.polkadot.com/wiki/learn/learn-implementations/#a-wasm-based-meta-protocol", "page_title": "Polkadot Implementations", "index": 0, "depth": 2, "title": "A Wasm-based Meta Protocol", "anchor": "a-wasm-based-meta-protocol", "start_char": 638, "end_char": 911, "estimated_token_count": 62, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:993baf5b5f814593f09bfaf82f9ca6329009affca61b0ceaba3d59c4266a7e89", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## A Wasm-based Meta Protocol\n\nPolkadot uses WebAssembly ([Wasm](https://webassembly.org/)) as a \"meta-protocol\". This allows for the use of\nany programming language that can be interpreted or compiled into Wasm - being the driver for\nPolkadot's multiple implementations."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-implementations", "url": "https://developer.polkadot.com/wiki/learn/learn-implementations/#parity-technologies-a-rustic-vision-for-polkadothttpsgithubcomparitytechpolkadot-sdktreemasterpolkadot", "page_title": "Polkadot Implementations", "index": 1, "depth": 3, "title": "Parity Technologies: A [Rustic Vision for Polkadot](https://github.com/paritytech/polkadot-sdk/tree/master/polkadot)", "anchor": "parity-technologies-a-rustic-vision-for-polkadothttpsgithubcomparitytechpolkadot-sdktreemasterpolkadot", "start_char": 911, "end_char": 3236, "estimated_token_count": 460, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:993baf5b5f814593f09bfaf82f9ca6329009affca61b0ceaba3d59c4266a7e89", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Parity Technologies: A [Rustic Vision for Polkadot](https://github.com/paritytech/polkadot-sdk/tree/master/polkadot)\n\n[Parity Technologies](https://www.parity.io/) is often in the spotlight for its core development of\nPolkadot, and while this is true, Parity Polkadot also serves to be the\n[Rust](https://www.rust-lang.org/) client. Parity Tech has a rustic vision for Polkadot through the\nuse of their main product, [Substrate](../../reference/parachains/index.md#substrate). Substrate can also be used for\ndifferent chains and different networks, but in the case of Polkadot, Substrate acts as the tech\nstack that is used to implement Polkadot's sharded heterogeneous multi-chain model.\n\n> Parity Tech focuses on blockchain infrastructure for the decentralised web, where they initially\n> offered an Ethereum client (Parity Ethereum). Parity Tech was hired by the Web3 Foundation to\n> foster the development of the first implementation of Polkadot.\n\nPolkadot can support parachains that are not built on Substrate, In particular, as long as the state\ntransition function (STF) of a shard is abstracted into Wasm, the validators on the network can\nexecute the STF within a Wasm environment.\n\n> Note: chains can also be built on Substrate and are not required to be deployed onto Polkadot.\n> More on Polkadot's architecture is available on the [Architecture](learn-architecture.md) page.\n\nWith this in mind, we can point to some other implementations of Polkadot. Having different\nimplementations inherently promotes the decentralization of the technology and progresses it in a\nmeaningful way. Other implementations of Polkadot that exist, many of whom have received a grant from the Web3 Foundation, are in programming languages like Go, C++,\nand JavaScript, which are all languages that can be compiled in Wasm.\n\nAs stated in the Soramitsu grant announcement:\n\n    It is critically important to have multiple implementations of the Polkadot protocol for a number\n    of reasons, including decentralization, knowledge dispersion, and better definitions of the\n    protocol... Multiple implementations of Polkadot improves network resilience and adds to the\n    decentralization of the network. The governance of the network is more democratized when multiple\n    teams build clients that run the nodes in the network."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-implementations", "url": "https://developer.polkadot.com/wiki/learn/learn-implementations/#alternative-implementations", "page_title": "Polkadot Implementations", "index": 2, "depth": 2, "title": "Alternative Implementations", "anchor": "alternative-implementations", "start_char": 3236, "end_char": 3268, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:993baf5b5f814593f09bfaf82f9ca6329009affca61b0ceaba3d59c4266a7e89", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Alternative Implementations"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-implementations", "url": "https://developer.polkadot.com/wiki/learn/learn-implementations/#chainsafe-systems-gossamerhttpsgithubcomchainsafegossamera-go-implementation-of-the-polkadot-host", "page_title": "Polkadot Implementations", "index": 3, "depth": 3, "title": "ChainSafe Systems: [Gossamer](https://github.com/ChainSafe/gossamer#a-go-implementation-of-the-polkadot-host)", "anchor": "chainsafe-systems-gossamerhttpsgithubcomchainsafegossamera-go-implementation-of-the-polkadot-host", "start_char": 3268, "end_char": 3641, "estimated_token_count": 96, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:993baf5b5f814593f09bfaf82f9ca6329009affca61b0ceaba3d59c4266a7e89", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### ChainSafe Systems: [Gossamer](https://github.com/ChainSafe/gossamer#a-go-implementation-of-the-polkadot-host)\n\n**Gossamer** is a Go implementation being built by\n[ChainSafe Systems](https://github.com/ChainSafeSystems), a blockchain R&D firm based in Toronto,\nCanada that is also building an Eth2.0 Serenity client. They were awarded a grant from the Web3\nFoundation."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-implementations", "url": "https://developer.polkadot.com/wiki/learn/learn-implementations/#soramitsu-kagomehttpsgithubcomsoramitsukagomeintro", "page_title": "Polkadot Implementations", "index": 4, "depth": 3, "title": "SORAMITSU: [Kagome](https://github.com/soramitsu/kagome#intro)", "anchor": "soramitsu-kagomehttpsgithubcomsoramitsukagomeintro", "start_char": 3641, "end_char": 4151, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:993baf5b5f814593f09bfaf82f9ca6329009affca61b0ceaba3d59c4266a7e89", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### SORAMITSU: [Kagome](https://github.com/soramitsu/kagome#intro)\n\n**Kagome** is a C++ implementation of the Polkadot Host being built by\n[Soramitsu](https://soramitsu.co.jp/), a Japanese digital identity company that previously developed\n[Hyperledger Iroha](https://iroha.tech). They were awarded a grant from the Web3 Foundation and\nreleased the first version of Kagome in April 2020. As part of the process, they also released a\n[libp2p](https://github.com/soramitsu/libp2p-grpc) networking layer in C++."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-implementations", "url": "https://developer.polkadot.com/wiki/learn/learn-implementations/#polkadot-js-project-polkadot-jshttpsgithubcompolkadot-js", "page_title": "Polkadot Implementations", "index": 5, "depth": 3, "title": "Polkadot-JS Project: [Polkadot-JS](https://github.com/polkadot-js)", "anchor": "polkadot-js-project-polkadot-jshttpsgithubcompolkadot-js", "start_char": 4151, "end_char": 4392, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:993baf5b5f814593f09bfaf82f9ca6329009affca61b0ceaba3d59c4266a7e89", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot-JS Project: [Polkadot-JS](https://github.com/polkadot-js)\n\n**Polkadot-JS** is a [JavaScript client](https://github.com/polkadot-js/client) and offers a\ncollection of tools, interfaces, and libraries for Polkadot and Substrate."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-implementations", "url": "https://developer.polkadot.com/wiki/learn/learn-implementations/#other-implementations-that-have-received-grants", "page_title": "Polkadot Implementations", "index": 6, "depth": 3, "title": "Other implementations that have received grants", "anchor": "other-implementations-that-have-received-grants", "start_char": 4392, "end_char": 4883, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:993baf5b5f814593f09bfaf82f9ca6329009affca61b0ceaba3d59c4266a7e89", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Other implementations that have received grants\n\n- [Golkadot](https://github.com/opennetsys/golkadot)\n- [Polkadot in Java](https://github.com/polkadot-java)\n\nWhile the ecosystem continues to grow rapidly, the continued development of alternative\nimplementations will only strengthen Polkadot. Consider becoming a contributor to the ecosystem,\nand [learn about the how you can receive a grant for your development](https://medium.com/web3foundation/new-w3f-grant-guidelines-b2c921a84850)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#a-rollup-chain", "page_title": "Polkadot's JAM Chain", "index": 0, "depth": 2, "title": "A Rollup Chain", "anchor": "a-rollup-chain", "start_char": 1528, "end_char": 2287, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## A Rollup Chain\n\nJAM will be a domain-specific chain that handles one particular domain of problems. In this case,\nroll-ups. JAM's rollups are heavily bounded in terms of their security. This is what Polkadot has\nbeen doing for the last five years, it is already a highly domain-specific roll-up chain. JAM\nessentially makes it less opinionated and more generic.\n\nThe JAM chain accepts outputs of roll-ups, in more general terms, bits of computation done\nelsewhere, and integrates the outputs into a shared state, similarly to how the Polkadot relay chain\nfunctions.\n\nThe job of the JAM chain is to provide the necessary apparatus to ensure that the output correctly\nreflects the input when it goes through the transformation it's meant to have undergone."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#smart-contract-similarity", "page_title": "Polkadot's JAM Chain", "index": 1, "depth": 2, "title": "Smart Contract Similarity", "anchor": "smart-contract-similarity", "start_char": 2287, "end_char": 3167, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Smart Contract Similarity\n\nJAM exhibits several similarities with a smart contract chain:\n\n- Permissionless code execution occurs directly on the JAM chain itself.\n- The state of the JAM chain is organized into distinct encapsulations.\n- Alongside state, encapsulations encompass code and balance.\n\nThese encapsulations of state are termed **services**. Thus, the JAM state is partitioned into\nservices. The creation of a new service is permissionless, akin to deploying a smart contract on a\nsmart contract chain. Consequently, adding a new service to the JAM chain does not necessitate\napproval from any authority or adherence to governance mechanisms, unlike Substrate-based chains\nthat mandate governance approval for adding new pallets. Services encompass code, balance, and\ncertain state components, resembling the structure commonly observed on a smart contract chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#service-entry-points", "page_title": "Polkadot's JAM Chain", "index": 2, "depth": 2, "title": "Service Entry Points", "anchor": "service-entry-points", "start_char": 3167, "end_char": 4471, "estimated_token_count": 277, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Service Entry Points\n\nJAM services' code is split into three different entry points:\n\n- **Refine** is the function that does the mostly stateless computation. It defines the\n  transformation for the rollup for a specific service.\n- **Accumulate** is the function that takes the output of that and folds it into the overall state\n  of the service\n- **OnTransfer** handles information coming from other services.\n\n**Work packages** are the input to a service. Work packages can have many **work items** in them.\nEvery work item is associated with a service, and it reflects the actual input to the service. For\nthe parachains service, this is where the transactions and all of the blockchain inputs are entered.\n\nThe JAM security apparatus consists a two-stage processing where the Refine function accepts a work\nitem as an input and yields a work result as an output, which gets fed into the Accumulate function\n(first Refine, then Accumulate). Work items are refined into **work results**, and therefore, a work\npackage containing many work items is refined into a **work report**, which is the corresponding\nresults of several items. A work package can be assigned that uses one core for a specific time slot\n(typically a period of 6 seconds).\n\n![refine-accumulate](../assets/refine-accumulate.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#jam-is-transactionless", "page_title": "Polkadot's JAM Chain", "index": 3, "depth": 3, "title": "JAM is Transactionless", "anchor": "jam-is-transactionless", "start_char": 4471, "end_char": 6356, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### JAM is Transactionless\n\nJAM distinguishes itself from smart contract chains by operating transactionlessly. There are no\ntransactions within JAM; all actions are permissionless and initially undergo a Refine stage. During\nthis stage, the service pre-refines input data, transforming it into work reports consisting of work\nresults. Subsequently, these work results are transferred onto the chain.\n\nDespite the absence of transactions, JAM still accommodates extrinsic information of a specific\nformat. There are five types of extrinsic information:\n\n- Guarantees\n- Assurances\n- Judgments\n- Preimages\n- Tickets\n\nThe first three types form part of the JAM chain's security framework. Guarantees and assurances\ninvolve validators collectively attesting that a work result accurately reflects the outcome of its\ncorresponding work item after transformation through the service's refine function.\n\nJudgments occur when then integrity of a work result is considered uncertain and a large plurality\nof validators attest to its validity or lack thereof. In this case an invalid work item may already\nhave been integrated into the service’s state and a rollback may need to happen. Judgments must\noccur within one hour of submitting the work report to the chain, during which finality is\ntemporarily paused.\n\nPreimages represent a feature provided by the JAM chain for the refine function. While the refine\nfunction is typically stateless, it can perform one stateful operation: looking up the preimage of a\nhash. This feature is the only opinionated aspect of the refine function.\n\nTickets serve as anonymous entries into the block production mechanism. They are not immediately\nrequired for block production; instead, the system operates two epochs in advance. This mechanism is\npart of the SAFROLE algorithm, a refined version of the original [SASSAFRAS](./learn-safrole.md)\nalgorithm."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#refine-function", "page_title": "Polkadot's JAM Chain", "index": 4, "depth": 3, "title": "Refine Function", "anchor": "refine-function", "start_char": 6356, "end_char": 7802, "estimated_token_count": 310, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Refine Function\n\nIn the Refine processing stage within JAM, up to 15 MB of data can be accepted during each time\nslot, which lasts 6 seconds. However, Refine yields a maximum of 90 kB of data, resulting in\nsignificant data compaction that is necessary due to the distributed nature of\n[the availability system](./learn-parachains-protocol.md#availability-and-validity-anv-protocol).\nFor instance, in the context of a parachain, the 15 MB of data represents the\n[Proof of Validity (PoV)](./learn-parachains-protocol.md#protocols-summary), while the 90 kB of data\ncorresponds to the [candidate receipt](./learn-parachains-protocol.md#candidate-receipts).\n\nRefine can execute for up to 6 seconds of [PVM](#polkadot-virtual-machine-pvm) gas, equivalent to\nthe full block period of the relay chain. This extended execution time, compared to the current\nlimit of two seconds for PVFs, is facilitated by [secure metering](#benchmarks-vs-metering) and\nother optimizations inherent to PVM.\n\nPreimage lookups can also be conducted within Refine. If a hash and its associated preimage are\nbelieved to be available on the JAM chain, the preimage can be requested by providing the hash. This\ncapability enables efficient storage and retrieval of code, such as parachain code, by storing the\ncode on the JAM chain and referencing its hash in the work package.\n\nRefine is the primary processing workhorse, handling tasks with largely stateless operations."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#accumulate-function", "page_title": "Polkadot's JAM Chain", "index": 5, "depth": 3, "title": "Accumulate Function", "anchor": "accumulate-function", "start_char": 7802, "end_char": 9034, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Accumulate Function\n\nThe accumulate function is responsible for integrating the output generated by the Refine function\ninto the chain state. Accumulate can accept multiple outputs from Refine, all originating from the\nsame service. Both Refine and Accumulate serve as entry points from a service-specific code blob.\n\nAccumulate's execution time per output is considerably shorter than Refine’s, typically around 10\nmilliseconds at most. However, the duration depends on factors such as the number of work items in\nthe work package. If a work package contains multiple items, the available time is divided among\nthem.\n\nUnlike Refine, Accumulate is stateful, granting it access to the JAM chain's state. It can read\nstorage from any service, write to its key-value store, transfer funds, and include a memo with fund\ntransfers. Additionally, Accumulate can create new services, upgrade its code, and request preimage\navailability, among other functionalities.\n\nMoreover, Refine can invoke child instances of the PVM. This allows for creating sub-instances, or\nvirtual machines, where code and data can be deployed, memory and stack configurations can be\ncustomized, and computations can be executed within a flexible framework."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#on-transfer-function", "page_title": "Polkadot's JAM Chain", "index": 6, "depth": 3, "title": "On-transfer Function", "anchor": "on-transfer-function", "start_char": 9034, "end_char": 10326, "estimated_token_count": 225, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### On-transfer Function\n\nThe onTransfer function within the JAM system is also stateful, enabling it to modify the service's\nstate. It has the capability to inspect the state of other services and make changes to its own\nstate. This functionality facilitates communication between services, albeit in an asynchronous\nmanner.\n\nUnlike many smart contract platforms, where interactions occur synchronously, in JAM the interaction\nbetween encapsulated components, such as smart contracts or services in this case, happens\nasynchronously. Messages, along with tokens, are sent, and at some point later during the same\nsix-second execution period, the receiving service processes them. There is no immediate return\npath; if a return path is needed, the sending service must initiate another transfer or modify its\nstate in a way that the receiving service can later interpret.\n\nBoth Accumulate and onTransfer are designed to be executed in parallel, allowing different services'\naccumulation and transfers to occur simultaneously. This design opens the possibility for future\nenhancements, such as allocating more than the current 10 milliseconds of gas input. In theory, a\nsecondary core could be utilized to execute certain accumulations, providing them with significantly\nmore gas to utilize."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#jam-chains-generalization", "page_title": "Polkadot's JAM Chain", "index": 7, "depth": 2, "title": "JAM Chain's Generalization", "anchor": "jam-chains-generalization", "start_char": 10326, "end_char": 11873, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## JAM Chain's Generalization\n\nPolkadot, as outlined in the original Polkadot white paper, is primarily tailored to a specific\nservice profile: delivering parachains. In pursuit of this service, Polkadot has developed two\nessential subcomponents:\n\n- the distributed data availability system\n- the auditing and guarantees system for computation (i.e. a roll-up system with robust security\n  guarantees)\n\nJAM represents a reduction in the level of opinionation compared to Polkadot, offering a higher\nlevel of abstraction and generalization. This facilitates easier utilization of underlying\ncomponents according to individual preferences.\n\nJAM operates in a permissionless manner, akin to smart contract chains, allowing individuals to\nupload and expect the execution of code. Additionally, it hosts data, enables preimage lookup, and\nmanages state, resembling a key-value pair system. The genesis block of JAM includes a service to\nfacilitate the creation of new services since JAM lacks a mechanism for accepting transactions\ndirectly.\n\nServices within JAM have no predefined limits on the amount of code, data, or state they can\naccommodate. Their capabilities are determined by crypto-economic factors; the more DOT tokens\ndeposited, the greater capacity for data and state. For instance, **the parachains service**\nconsolidates all Polkadot 1.1 functionality within a single service on JAM, with the potential for\nadditional services to leverage Polkadot's distributed availability system, and auditing and\nguarantees system for computation."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#polkadot-virtual-machine-pvm", "page_title": "Polkadot's JAM Chain", "index": 8, "depth": 2, "title": "Polkadot Virtual Machine (PVM)", "anchor": "polkadot-virtual-machine-pvm", "start_char": 11873, "end_char": 13264, "estimated_token_count": 250, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot Virtual Machine (PVM)\n\nThe PVM design is rooted in the RISC-V ISA (Instruction Set Architecture), known for its simplicity\nand versatility. The RISC-V ISA offers several advantages:\n\n- It is easy to transpile into common hardware formats such as x86, x64, and ARM.\n- It is well-supported by tooling like [LLVM](https://llvm.org/)\n\nThe PVM itself embodies simplicity and security, being sandboxable and offering various execution\nguarantees. It is deterministic, consensus-sensitive, and friendly to metering. Unlike other VMs,\nthe PVM lacks complexity and excessive opinionation.\n\nWasm, while optimized for web use cases, presents challenges with stack management, particularly in\nhandling continuations. RISC-V addresses this issue by placing the stack in memory, facilitating\ncontinuations handling naturally without additional complexity.\n\nAdditionally, the PVM demonstrates exceptional execution speeds, especially when run on conventional\nhardware like X64 and ARM, offering advantages such as free metering compared to Wasm.\n\nThe incorporation of RISC-V-enabled continuations is poised to establish a new standard for scalable\ncoding across multi-core platforms like JAM. Asynchronous, parallelized architectures are\nincreasingly essential for scalability in both hardware and software platforms, a trend that is\nexpected to extend to blockchain and consensus algorithms."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#safrole", "page_title": "Polkadot's JAM Chain", "index": 9, "depth": 2, "title": "SAFROLE", "anchor": "safrole", "start_char": 13264, "end_char": 14108, "estimated_token_count": 171, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## SAFROLE\n\n[SAFROLE](./learn-safrole.md) is a block production algorithm, a simplification of\n[SASSAFRAS](https://research.web3.foundation/Polkadot/protocols/block-production/SASSAFRAS). It\nexcludes some components that may be useful for parachains. So parachains may probably stick with\nSASSAFRAS rather SAFROLE. SAFROLE will be as simple as possible to:\n\n- Ensure that it is as minimally opinionated as possible to maximize the potential future use cases\n- To follow in the footsteps of Ethereum yellow paper, and really try to get as many implementations\n  as possible to try and spread the expertise.\n\nUnderstanding how Polkadot 1.0 works end-to-end is challenging. With JAM, someone who is capable of\nreading and understanding the yellow paper would be able to read and understand fairly quickly how\nJAM works. So simplicity is crucial."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#networking", "page_title": "Polkadot's JAM Chain", "index": 10, "depth": 2, "title": "Networking", "anchor": "networking", "start_char": 14108, "end_char": 14800, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Networking\n\nNetworking for JAM uses the [QUIC protocol](https://en.wikipedia.org/wiki/QUIC). This allows direct\npoint-to-point connections between a large numbers of validators. So essentially all 1,000-plus\nvalidators on Polkadot can have a persistent connection to each other without potential issues with\nsockets. Gossip is avoided, mostly because it is not needed, because JAM will not handle\ntransactions. In case of distributing something that's not point-to-point or within a very small\nsubset validators, grid-diffusal will be used, in which validators are arranged into a grid, and\npackages are sent by a row, and then each node on the row sends it to all members of its column."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#pipelining-for-efficient-block-processing", "page_title": "Polkadot's JAM Chain", "index": 11, "depth": 2, "title": "Pipelining for Efficient Block Processing", "anchor": "pipelining-for-efficient-block-processing", "start_char": 14800, "end_char": 16554, "estimated_token_count": 316, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Pipelining for Efficient Block Processing\n\nIn state-based blockchains like Ethereum, the header of blocks typically contains the posterior\nstate root, summarizing the state after all block computations. Consequently, the header cannot be\nsent until all computations are complete. However, some computations can be performed before sending\nthe header, as their outcomes determine the block's validity.\n\nIn JAM, a different approach is adopted by placing the prior state root in the header instead of the\nposterior state root. This means that the state roots featured in the header lag by one block. As a\nresult, lightweight computations, comprising approximately 5% of the block's workload or execution\ntime, can be executed, and the block can be distributed immediately afterward. The remaining 95% of\nthe block's computation, primarily accumulation tasks, can be completed subsequently. This enables\nthe next block to be started before the execution of the current block is finished.\n\nThis approach allows for more efficient utilization of time between blocks. In traditional setups\nlike Polkadot's six-second block time, where the posterior state root must be provided, only a\nportion of the time can be used for computation. However, with pipelining in JAM, the entire block\ntime can be effectively utilized for computations, maximizing efficiency.\n\nWhile using the full block time for computation may not be ideal, as it could lead to perpetual\ncatching up and delayed block imports, JAM's approach enables significantly more time for\ncomputation compared to traditional setups. This means that approximately three to three and a half\nseconds of effective block computation time can be achieved, a substantial improvement over the\ncurrent setup."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#architectural-differences-jam-vs-relay-chain", "page_title": "Polkadot's JAM Chain", "index": 12, "depth": 2, "title": "Architectural Differences: JAM vs. Relay Chain", "anchor": "architectural-differences-jam-vs-relay-chain", "start_char": 16554, "end_char": 18554, "estimated_token_count": 337, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Architectural Differences: JAM vs. Relay Chain\n\nOne of the architectural distinctions between JAM and the relay chain lies in the degree to which\nfunctionality is fixed. While the relay chain fixes certain elements, such as the language used to\ndefine the protocol (Wasm), JAM goes further in this regard. For instance, it dictates the type used\nfor encoding the block header and the hashing scheme, making alterations to these aspects\nchallenging.\n\nHowever, flexibility comparable to that enabled by the WebAssembly meta-protocol in the relay chain\nis preserved in JAM through its service model. In this model, upgradability responsibility is\nshifted to services, freeing the chain itself from the burden of being upgradable. Three primary\nreasons support this decision:\n\n- Simplicity is prioritized. Maintaining a non-upgradable chain significantly reduces complexity.\n- The relay chain's tendency to introduce complex functionalities without removing older ones\n  complicates matters. Because upgrades are easily implemented, there's little incentive to simplify\n  the Substrate SDK. Consequently, replicating Polkadot becomes impractical.\n- The potential for optimization afforded by JAM's fixed parameters. With a clear understanding of\n  the specific tasks the JAM chain must perform and the ability to set fixed parameters,\n  optimizations in areas like network topology and timing become feasible. This contrasts with the\n  challenges posed by the relay chain's highly upgradable nature, where such optimizations are more\n  complex due to the frequent alterations possible with each upgrade.\n\nDespite these differences, JAM retains flexibility in application-level functionalities, such as\ncoretime sales, staking, and governance, all managed within services. Additionally, JAM introduces a\nnovel concept by associating a token balance with a service, providing opportunities for economic\nmodel adjustments that are not easily achievable in purely upgradable chains like the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#jam-toaster", "page_title": "Polkadot's JAM Chain", "index": 13, "depth": 2, "title": "JAM Toaster", "anchor": "jam-toaster", "start_char": 18554, "end_char": 19860, "estimated_token_count": 212, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## JAM Toaster\n\nOne of the ongoing efforts in ensuring that JAM meets its original expectations involves\nestablishing a comprehensive test environment for the JAM chain. Unlike small-scale test networks\nrunning on unreliable hardware to manage cloud computing costs, this initiative entails a\nsubstantial investment. Introducing the JAM toaster, essentially a test platform designed for\nconducting large-scale trials and performance assessments of JAM. This addresses a prior challenge\nencountered during the development of the Polkadot relay chain, where understanding the emergent\neffects and dynamics of operating a network at such scale proved difficult. Previous attempts were\nlimited to a few dozen nodes on a test network and the Kusama network, which lacks comprehensive\nmonitoring capabilities due to restrictions on accessing validator nodes. Conversely, the\nsmall-scale test network failed to accurately simulate the network dynamics of a larger-scale\ndeployment. The JAM toaster aims to bridge this gap by enabling in-depth research at the scale of\nthe entire JAM network, comprising 1,023 nodes. This platform facilitates the investigation of\nnetwork behavior and performance characteristics, providing valuable insights for developers\nregarding the expected performance of their parachains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#jam-and-substrate", "page_title": "Polkadot's JAM Chain", "index": 14, "depth": 2, "title": "JAM and Substrate", "anchor": "jam-and-substrate", "start_char": 19860, "end_char": 19882, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## JAM and Substrate"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#benchmarks-vs-metering", "page_title": "Polkadot's JAM Chain", "index": 15, "depth": 3, "title": "Benchmarks vs. Metering", "anchor": "benchmarks-vs-metering", "start_char": 19882, "end_char": 20660, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Benchmarks vs. Metering\n\nBenchmarks, or performance tests, can be optional when working with JAM. While they may still be\nnecessary on occasion, JAM's metered system can often obviate the need for frequent benchmarking.\nJAM operates on a metered system, allowing users to assess computational workload after completion.\nAdditionally, there's a theoretical mechanism to control computation, typically implemented at block\nconstruction time.\n\nHowever, there are scenarios where benchmarking remains relevant. For instance, when metering is\ndeemed too conservative for certain use cases, benchmarking might be necessary to enhance\nperformance. Additionally, benchmarking could be useful for tasks requiring extended execution\ntimes, ensuring they aren't run excessively long."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#xcmp", "page_title": "Polkadot's JAM Chain", "index": 16, "depth": 3, "title": "XCMP", "anchor": "xcmp", "start_char": 20660, "end_char": 21475, "estimated_token_count": 170, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### XCMP\n\nMoving on to Cross-Chain Message Passing (XCMP), JAM mandates full XCMP support. This is because\nwithin the relay chain, there's a provision for passing more data via a candidate receipt than would\nbe practical if all parachains transmitted all data all the time. JAM adheres strictly to rules,\neven for parachain services, including limitations on data transmission between the \"refine\" and\n\"accumulate\" phases. Currently, with\n[Horizontal relay chain Message Passing (HRMP)](./learn-xcm-transport.md#hrmp-xcmp-lite), all\nmessages traverse the relay chain, constraining the data payload to 4 kB or less, which might not be\nrealistic. Thus, XCMP, where only message headers are relayed via the chain while the actual message\ndata is transmitted off-chain, emerges as a necessary and overdue improvement."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#accords", "page_title": "Polkadot's JAM Chain", "index": 17, "depth": 3, "title": "Accords", "anchor": "accords", "start_char": 21475, "end_char": 22269, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Accords\n\n[Accords](../general/polkadot-direction.md#xcm-and-accords) essentially encapsulate state and logic,\nresembling smart contracts, with multiple instances residing alongside each parachain. They\nfacilitate message exchange between instances and enable synchronous interactions with parachains.\nAccords find utility in scenarios where trust between parachains is lacking, such as token\ntransfers. Unlike the existing method involving a reserve intermediary, Accords streamline direct\ntoken teleportation between parachains, eliminating the need for trust-compromising intermediaries.\nMoreover, Accords could function as XCM forwarding mechanisms, ensuring message integrity even when\nrelayed through third-party intermediaries, thus eliminating the need for explicit origin markers."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#boosting-efficiency", "page_title": "Polkadot's JAM Chain", "index": 18, "depth": 3, "title": "Boosting Efficiency", "anchor": "boosting-efficiency", "start_char": 22269, "end_char": 23155, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Boosting Efficiency\n\nLastly, JAM's broader, less opinionated approach to leveraging underlying consensus mechanisms makes\nit conducive to implementing more innovative solutions. For instance, distributed availability for\ncomplex tasks like zero-knowledge proofs becomes more practical and efficient with JAM.\nAdditionally, JAM supports a mixed resource consumption model, wherein work packages can contain\nboth computationally intensive tasks and data-heavy operations. By pairing services with diverse\nresource requirements, such as those needing extensive computation with those necessitating high\ndata availability, JAM optimizes the utilization of validators' resources, thereby reducing costs.\nThis flexible approach enables the combination of tasks like distributed availability and SNARK\nverification with parachain workloads, driving down costs while enhancing efficiency."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-chain", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-chain/#enhancements-and-compatibility-in-jam", "page_title": "Polkadot's JAM Chain", "index": 19, "depth": 2, "title": "Enhancements and Compatibility in JAM", "anchor": "enhancements-and-compatibility-in-jam", "start_char": 23155, "end_char": 24577, "estimated_token_count": 237, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d74268eead6b9f7d37669ff977471f46ea26be1d617ea1415c0e6415df3dcbb7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Enhancements and Compatibility in JAM\n\nJAM's design prioritizes compatibility with existing Polkadot 1 parachains. While it maintains\ncompatibility with the Polkadot SDK, the Polkadot Validator Function (PVF) undergoes retargeting.\nInstead of WebAssembly, it will target the Polkadot Virtual Machine (PVM). This transition is\nfacilitated by the fact that PVM is a minor modification of RISC-V, which has already been\nestablished as an official LLVM target. Consequently, PVM could become an official LLVM target\nbefore the deployment of JAM.\n\nBeyond serving as a host for parachains, JAM introduces significant enhancements. It offers the\npotential to streamline benchmarking efforts and alleviate future benchmarking requirements.\nAdditionally, JAM introduces the concept of accords, multi-instance, multi-sharded smart contracts\nthat govern and enforce specific interaction protocols between parachains. Furthermore, full\nCross-Chain Message Passing (XCMP) support is essential, enabling the removal of limitations on\ninformation transfer between parachains, typically facilitated by Cross-Chain Messages (XCM).\n\nRegarding Agile Coretime, JAM retains compatibility with existing setups. However, it introduces the\ncapability to target coretime not only at parachains but also at arbitrary sets of work packages.\nThis flexibility enhances the versatility and efficiency of resource allocation within the JAM\necosystem."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-is-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 0, "depth": 2, "title": "What is JAM?", "anchor": "what-is-jam", "start_char": 144, "end_char": 404, "estimated_token_count": 58, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is JAM?\n\nJAM is a research and development project initiated by\n[Parity Technologies](https://www.parity.io/). It's a computational model that focuses on the\nprocess of collecting, refining, joining, and accumulating data within a blockchain network."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-does-jam-stand-for", "page_title": "FAQ for Polkadot's JAM Chain", "index": 1, "depth": 2, "title": "What does \"JAM\" stand for?", "anchor": "what-does-jam-stand-for", "start_char": 404, "end_char": 577, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What does \"JAM\" stand for?\n\n\"JAM\" stands for \"Join Accumulate Machine.\" It represents the core principles of the computational\nmodel to be implemented on the JAM chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#why-is-jam-groundbreaking", "page_title": "FAQ for Polkadot's JAM Chain", "index": 2, "depth": 2, "title": "Why is JAM groundbreaking?", "anchor": "why-is-jam-groundbreaking", "start_char": 577, "end_char": 1586, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why is JAM groundbreaking?\n\nThe dilemma of achieving ultimate performance and scalability while still being flexible to build\nany use case is as old as blockchains. Current Web3 developers have to choose whether or not to\nbuild a smart contract or an appchain. Smart contracts on L1s are faster to write but come with\ndownsides. They are limited to the underlying protocol, are not as efficient, do not offer the\nflexibility teams need and compete with the rest of the ecosystem for resources. Appchains provide a\nmore efficient and flexible development environment, as the chains are custom-made for a specific\npurpose. With JAM, groundbreaking scalability currently only seen through rollups is brought to the\nconsensus layer. Developers no longer need to decide if they build appchains or smart contracts;\nwith JAM, they have a flexible and rich environment for both. So, in short, there will be L2\nscalability without the need for rollup solutions while being fully flexible to build any\napplication."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-are-services", "page_title": "FAQ for Polkadot's JAM Chain", "index": 3, "depth": 2, "title": "What are services?", "anchor": "what-are-services", "start_char": 1586, "end_char": 1950, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What are services?\n\nServices are modules that run on top of JAM. One of these services would be, for example, the\nChainService. This service would implement the parachain logic that is currently enshrined in the\nPolkadot protocol. JAM’s `refine` and `accumulate` phases are generic entry points that will be used\nto implement specific permissionless services."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#how-does-jam-differ-from-traditional-blockchain-networks", "page_title": "FAQ for Polkadot's JAM Chain", "index": 4, "depth": 2, "title": "How does JAM differ from traditional blockchain networks?", "anchor": "how-does-jam-differ-from-traditional-blockchain-networks", "start_char": 1950, "end_char": 2534, "estimated_token_count": 112, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How does JAM differ from traditional blockchain networks?\n\nJAM is built as a distributed computer. This means that it can run almost any task that can be\nexpressed as a service. The JAM chain will have almost no functionality, meaning there will be no\nuser transactions. All the logic, like governance, staking, etc., would live on system **services**.\nThe services will typically be asynchronous with regards to each other, limiting the possibility of \ninter-service race conditions. However, JAM is also capable of providing synchronous composability across services\nif needed."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#will-agile-coretime-remain-part-of-the-polkadot-vision", "page_title": "FAQ for Polkadot's JAM Chain", "index": 5, "depth": 2, "title": "Will Agile Coretime remain part of the Polkadot vision?", "anchor": "will-agile-coretime-remain-part-of-the-polkadot-vision", "start_char": 2534, "end_char": 2871, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Will Agile Coretime remain part of the Polkadot vision?\n\nYes. [Agile Coretime](./learn-agile-coretime.md), an innovation that transforms Polkadot into a\ncomputational resource, will be rolled out onto the Polkadot network in the near future. JAM is\nfurther down the line, but Coretime will similarly be available to purchase on JAM."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#how-do-services-interact-with-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 6, "depth": 2, "title": "How do services interact with JAM?", "anchor": "how-do-services-interact-with-jam", "start_char": 2871, "end_char": 3231, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How do services interact with JAM?\n\nServices interact with JAM through predefined entry points: Refine, Accumulate, and onTransfer (see\nmore information on the [JAM Chain page](./learn-jam-chain.md#service-entry-points)). Each service\ndefines its specific functions and workflows, executed within the JAM framework according to the\nnetwork's requirements."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-are-the-main-components-of-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 7, "depth": 2, "title": "What are the main components of JAM?", "anchor": "what-are-the-main-components-of-jam", "start_char": 3231, "end_char": 3530, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What are the main components of JAM?\n\nJAM consists of four main components: Refine, Accumulate, and onTransfer (see more information on\nthe [JAM Chain page](./learn-jam-chain.md#service-entry-points)). These components define the\nworkflow for processing and integrating data within the network."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-is-the-goal-of-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 8, "depth": 2, "title": "What is the goal of JAM?", "anchor": "what-is-the-goal-of-jam", "start_char": 3530, "end_char": 3789, "estimated_token_count": 49, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is the goal of JAM?\n\nJAM's primary goal is to provide a flexible and efficient framework for managing data and\ncomputations within a network. It aims to streamline data integration and maintenance while ensuring\nthe network's integrity and security."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#is-jam-related-to-polkadot", "page_title": "FAQ for Polkadot's JAM Chain", "index": 9, "depth": 2, "title": "Is JAM related to Polkadot?", "anchor": "is-jam-related-to-polkadot", "start_char": 3789, "end_char": 4247, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Is JAM related to Polkadot?\n\nYes, JAM is a potential candidate for evolving the Polkadot relay chain. The key change is that\nparachains are no longer enshrined on the relay chain and will be running on top of a service that\nis compatible with parachain protocol. One service will be, for example, the current parachains\nservice. Anyone can permissionlessly add a service to the JAM Chain by specifying the entry points\nRefine, Accumulate and onTransfer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#how-would-the-relay-chain-change-with-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 10, "depth": 2, "title": "How would the Relay Chain change with JAM?", "anchor": "how-would-the-relay-chain-change-with-jam", "start_char": 4247, "end_char": 4644, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How would the Relay Chain change with JAM?\n\nJAM would be a successor to the relay chain, with a more straightforward and flexible architecture.\nOnly the consensus functionality would be kept, while the rest, such as security, governance, etc.,\nwould run on system-level services. The current relay chain will run on multiple cores in the new\nJAM architecture, guaranteeing full compatibility."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#in-the-new-architecture-what-does-the-tech-stack-look-like", "page_title": "FAQ for Polkadot's JAM Chain", "index": 11, "depth": 2, "title": "In the new architecture, what does the tech stack look like?", "anchor": "in-the-new-architecture-what-does-the-tech-stack-look-like", "start_char": 4644, "end_char": 5588, "estimated_token_count": 186, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## In the new architecture, what does the tech stack look like?\n\nFrom the point of view of parachains, the tech stack doesn’t look that much different. They will\ncontinue to get validated by the validators, etc. JAM will offer the possibility of running smart\ncontracts on the same level as parachains. This means a potential service can be written that\nenables people to run Solidity-based smart contracts directly on top of JAM without running on any\nparachain. The other more future-oriented development will be CorePlay. CorePlay will be an\nactor-based framework. The idea is to support long-running tasks/actors on top of JAM. Long-running\nhere means that programs will continue running intermittently (can pause and resume). This provides\nquite a lot of simplifications for the developer when writing contracts. Ultimately, it should be\nmuch simpler to write a program that can run on top of a (decentralized) blockchain than it is now."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#how-can-developers-get-involved-with-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 12, "depth": 2, "title": "How can developers get involved with JAM?", "anchor": "how-can-developers-get-involved-with-jam", "start_char": 5588, "end_char": 5928, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How can developers get involved with JAM?\n\nDevelopers interested in JAM can explore and participate once the\n[RFC](../general/polkadot-v1.md#requests-for-comment-rfcs) is out. Additionally, they can stay\nupdated on announcements and events related to JAM and its integration with other technologies via\nParity’s communication channels."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-are-some-potential-applications-of-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 13, "depth": 2, "title": "What are some potential applications of JAM?", "anchor": "what-are-some-potential-applications-of-jam", "start_char": 5928, "end_char": 6138, "estimated_token_count": 39, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What are some potential applications of JAM?\n\nJAM's flexible and efficient computational model opens up possibilities for various applications,\nbut it is too early to jump into specific use cases just yet."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#is-there-a-roadmap-for-jams-development", "page_title": "FAQ for Polkadot's JAM Chain", "index": 14, "depth": 2, "title": "Is there a roadmap for JAM's development?", "anchor": "is-there-a-roadmap-for-jams-development", "start_char": 6138, "end_char": 6402, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Is there a roadmap for JAM's development?\n\nWhile specific timelines may vary, the development of JAM typically involves ongoing research,\ntesting, and iteration. The RFC will be published as a first step, where the community gives\nfeedback and iterates on it."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-about-polkadot-will-there-be-a-hard-fork", "page_title": "FAQ for Polkadot's JAM Chain", "index": 15, "depth": 2, "title": "What about Polkadot? Will there be a hard fork?", "anchor": "what-about-polkadot-will-there-be-a-hard-fork", "start_char": 6402, "end_char": 7057, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What about Polkadot? Will there be a hard fork?\n\nJAM isn’t a successor to Polkadot but a potential evolution of the Polkadot relay chain. It can only\nproceed if it passes through Polkadot’s decentralized governance system, winning approval from token\nholders. The current parachain-centered logic would continue as a service on top of the new JAM\narchitecture. Part of the proposal will include tooling and hard-coded compatibility guarantees. The\nrelay chain will upgrade, and parachains can then enjoy a much richer environment, synchronous\ncompatibility, and excellent scaling capabilities better than current L2s but built inside the L0/L1\nlayer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#do-parachains-need-to-rewrite-their-code-how-much-work-is-it-to-build", "page_title": "FAQ for Polkadot's JAM Chain", "index": 16, "depth": 2, "title": "Do parachains need to rewrite their code? How much work is it to build?", "anchor": "do-parachains-need-to-rewrite-their-code-how-much-work-is-it-to-build", "start_char": 7057, "end_char": 7544, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Do parachains need to rewrite their code? How much work is it to build?\n\nParachains will be one of the “products” that can run on JAM. JAM will only remove the enshrined\nparachain consensus and replace it with a model that supports different services. For some time, it\nwill likely be easier to develop parachains, as the necessary tooling for developing services needs\nto be developed and adopted. For migration support, full compatibility guarantees will be written\ninto the code."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#does-it-even-make-sense-now-to-build-a-parachain-on-polkadot", "page_title": "FAQ for Polkadot's JAM Chain", "index": 17, "depth": 2, "title": "Does it even make sense now to build a parachain on Polkadot?", "anchor": "does-it-even-make-sense-now-to-build-a-parachain-on-polkadot", "start_char": 7544, "end_char": 7821, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Does it even make sense now to build a parachain on Polkadot?\n\nOf course! Parachains will be one of the “products” that can run on JAM, and they will stay\nfirst-class citizens. There will be different use cases, some suitable for parachains and some\nsuitable for services."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#what-about-dot", "page_title": "FAQ for Polkadot's JAM Chain", "index": 18, "depth": 2, "title": "What about DOT?", "anchor": "what-about-dot", "start_char": 7821, "end_char": 7924, "estimated_token_count": 25, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What about DOT?\n\nDOT will continue to be JAM’s native token. No other native token will be issued."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-jam-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-jam-faq/#where-can-i-learn-more-about-jam", "page_title": "FAQ for Polkadot's JAM Chain", "index": 19, "depth": 2, "title": "Where can I learn more about JAM?", "anchor": "where-can-i-learn-more-about-jam", "start_char": 7924, "end_char": 8414, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9cbceb9006beae4113a94e96a64dd8489aee6139c55c5873b7c2cd979692924c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Where can I learn more about JAM?\n\n- Read the [JAM Chain page](./learn-jam-chain.md).\n- Explore official communication on https://graypaper.com and from W3F, Parity, and Polkadot to\n  learn more about JAM. You can also join discussions on the forum and the fellowship calls.\n- Watch Gavin Wood's [Hong Kong keynote on JAM](https://www.youtube.com/watch?v=8gfZW454CeY).\n- Read [the \"Demystifying JAM\" blog post](https://blog.kianenigma.com/posts/tech/demystifying-jam/)\n  by Kian Paimani."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#pallet-comparison", "page_title": "NFT Pallets", "index": 0, "depth": 2, "title": "Pallet Comparison", "anchor": "pallet-comparison", "start_char": 1393, "end_char": 1556, "estimated_token_count": 29, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Pallet Comparison\n\nThese tables provide a side-by-side comparison of the available NFT pallets in the Polkadot ecosystem and how their functionalities differ."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#asset-metadata", "page_title": "NFT Pallets", "index": 1, "depth": 3, "title": "Asset Metadata", "anchor": "asset-metadata", "start_char": 1556, "end_char": 3127, "estimated_token_count": 271, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Asset Metadata\n\n|                                               | Uniques | NFTs                               | Unique Network         |\n| --------------------------------------------- | ------- | ---------------------------------- | ---------------------- |\n| Collection metadata                           | 🟢      | 🟢                                 | 🟢                     |\n| Collection key-value attributes               | 🟢      | 🟢                                 | 🟢                     |\n| Collection modifiable metadata                | 🟢      | 🟢                                 | 🟢                     |\n| Collection modifiable key-value attributes    | 🟢      | 🟢                                 | 🟢                     |\n| Token modifiable key-value attributes         | 🟢      | 🟢                                 | 🟢                     |\n| Token attributes modification approvals       | 🟥      | 🟢                                 | 🟥 (🟢 with contracts) |\n| Token data modification updatable permissions | 🟥      | 🟢                                 | 🟢                     |\n| Token pre-signed attributes                   | 🟥      | 🟢                                 | 🟥 (🟢 with contracts) |\n| Sponsoring                                    | 🟥      | 🟥                                 | 🟢                     |\n| Fractionalization                             | 🟥      | 🟥 (🟢 with nft-fractionalization) | 🟢                     |\n| Nesting                                       | 🟥      | 🟥                                 | 🟢                     |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#marketplace", "page_title": "NFT Pallets", "index": 2, "depth": 3, "title": "Marketplace", "anchor": "marketplace", "start_char": 3127, "end_char": 3556, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Marketplace\n\nThe ability to create an on-chain NFT marketplace, integrated into the pallets\nAlso:\nNFT Manager has native onchain marketplace support\n\n|                                 | Uniques | NFTs | Unique Network |\n| ------------------------------- | ------- | ---- | -------------- |\n| Embedded market functions       | 🟢      | 🟢   | 🟥             |\n| Custom Smart Contract market(s) | 🟥      | 🟥   | 🟢             |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#evm-support", "page_title": "NFT Pallets", "index": 3, "depth": 3, "title": "EVM support", "anchor": "evm-support", "start_char": 3556, "end_char": 4099, "estimated_token_count": 158, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### EVM support\n\nNative support for EVM and Ethereum by pallets\n\n|                                      | Uniques | NFTs | Unique Network |\n| ------------------------------------ | ------- | ---- | -------------- |\n| EVM support (ERC721 interface)       | 🟥      | 🟥   | 🟢             |\n| EVM support (custom pallet features) | 🟥      | 🟥   | 🟢             |\n\nFor detailed comparison of pallets see [NFT Pallets in the Polkadot ecosystem](https://docs.google.com/presentation/d/1J6kJ5lQSAnHTre3j7-J6fH34kk8TQ4apif-CCHjQo3o/edit?usp=sharing)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#pallet-characteristics", "page_title": "NFT Pallets", "index": 4, "depth": 2, "title": "Pallet Characteristics", "anchor": "pallet-characteristics", "start_char": 4099, "end_char": 5131, "estimated_token_count": 201, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Pallet Characteristics\n\nPallets represent stable runtime code that changes only to accommodate Polkadot runtime upgrades. Parachains may select and customize these pallets for specific use cases.\n\n**NFTs Pallet:**\n- Fellowship-supported with comprehensive feature set\n- Used by the largest NFT projects in the ecosystem\n- Supports delegation for third-party metadata updates\n- Available on AssetHub\n\n**Uniques Pallet:**\n- Community integration experience since 2021\n- Simplest parachain deployment option\n- Adopted by over 10 parachains\n- Deprecated in favor of NFTs Pallet\n\n**Unique Network Pallet:**\n- Native support for NFT 2.0 features (nesting, dynamic NFTs)\n- Gas fee sponsoring capabilities\n- EVM-Substrate interoperability\n- Advanced development tools\n\n**Specialized Pallets:**\n- **Aventus NFT Manager**: Collection-free design with Ethereum bridging\n- **ORML NFT**: Lightweight engine as part of the ORML toolkit\n\nMore information on Unique Network can be found at [their documentation](https://unique.network/learn/)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#nfts-pallet", "page_title": "NFT Pallets", "index": 5, "depth": 2, "title": "NFTs Pallet", "anchor": "nfts-pallet", "start_char": 5131, "end_char": 5449, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## NFTs Pallet\n\nNFTs is a [FRAME pallet](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/nfts#readme) that provides functions to interact with and configure NFTs.\n\nThe pallet allows configuration of NFTs, collections, and items with feature flags to enable or disable specific functionalities."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#collection-management", "page_title": "NFT Pallets", "index": 6, "depth": 3, "title": "Collection Management", "anchor": "collection-management", "start_char": 5449, "end_char": 5863, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Collection Management\n\nCollections have different roles with specific permissions:\n\n- **Owner**: Can destroy collections, manage teams, set supply limits, and lock collections\n- **Admin**: Can set attributes and metadata, lock item properties\n- **Freezer**: Can lock and unlock item transfers  \n- **Issuer**: Can mint NFTs and update mint settings\n\nRoles can be permanently removed by setting them to `none`."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#nft-attributes", "page_title": "NFT Pallets", "index": 7, "depth": 3, "title": "NFT Attributes", "anchor": "nft-attributes", "start_char": 5863, "end_char": 6177, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### NFT Attributes\n\nNFTs can hold different types of attributes:\n\n- **System attributes**: Set by the pallet for specific functions\n- **Collection owner's attributes**: Set by the collection admin\n- **User attributes**: Set by the NFT owner\n- **External attributes**: Allow external services to modify attributes"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#other-capabilities", "page_title": "NFT Pallets", "index": 8, "depth": 3, "title": "Other Capabilities", "anchor": "other-capabilities", "start_char": 6177, "end_char": 6437, "estimated_token_count": 39, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Other Capabilities\n\n- Built-in marketplace functionality\n- Atomic swaps between users\n- Delegation of accounts for transfers and attribute updates\n- Smart attributes allowing external entities to update NFT properties\n- Planned fractionalization features"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-pallets", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-pallets/#uniques-pallet", "page_title": "NFT Pallets", "index": 9, "depth": 2, "title": "Uniques Pallet", "anchor": "uniques-pallet", "start_char": 6437, "end_char": 6929, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:fcac027ef16b28b80e5f1b917681559d5360c2c9945971da42dd5bbe2db70289", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Uniques Pallet\n\nThe Uniques Pallet is deprecated and replaced by the NFTs Pallet.\n\nUniques implemented basic NFT functionality with mutable metadata references that could be frozen. It was designed as a simple solution for Asset Hub's balance-keeping requirements.\n\nThese NFTs can be viewed on [RMRK's Singular platform](https://singular.app) and interacted with through the [Asset Hub interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-asset-hub-rpc.polkadot.io#/extrinsics)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#list-of-nft-projects", "page_title": "NFT Projects on Polkadot and Kusama", "index": 0, "depth": 2, "title": "List of NFT Projects", "anchor": "list-of-nft-projects", "start_char": 238, "end_char": 266, "estimated_token_count": 6, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## List of NFT Projects"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#asset-hub", "page_title": "NFT Projects on Polkadot and Kusama", "index": 1, "depth": 2, "title": "Asset Hub", "anchor": "asset-hub", "start_char": 266, "end_char": 706, "estimated_token_count": 117, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Asset Hub\n\nThe Asset Hub is a [system chain](./learn-system-chains.md) which provides functionality for deploying\nand transferring both Fungible and Non-Fungible Tokens (NFTs). The Asset Hub hosts the [NFTs pallet](./learn-nft-pallets.md#nfts-pallet) and the deprecated [Uniques pallet](./learn-nft-pallets.md#uniques-pallet).\n\nMore information about Asset Hub pallets can be found in the [NFT pallets section](./learn-nft-pallets.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#astar", "page_title": "NFT Projects on Polkadot and Kusama", "index": 2, "depth": 2, "title": "Astar", "anchor": "astar", "start_char": 706, "end_char": 1536, "estimated_token_count": 231, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Astar\n\n[Astar Network](https://astar.network/) and [Shiden Network](https://shiden.astar.network/) are smart contract platforms in the Polkadot ecosystem supporting EVM and Wasm smart contracts for NFT development.\n\nAstar provides familiar EVM tooling for developers transitioning from Ethereum, alongside Wasm smart contract capabilities using [ink!](https://use.ink/) and [PSP34](https://github.com/w3f/PSPs/blob/master/PSPs/psp-34.md) standards.\n\n\nDeveloper tools and documentation links:\n\n- [General information](https://astar.network/blog/An-introduction-to-NFTs-on-Astar-38359)\n- [Generating PSP34 NFTs via ink! contracts](https://docs.astar.network/docs/tutorials/from-zero-to-ink-hero/nft/)\n- [EVM NFT management example](https://docs.astar.network/docs/build/EVM/astarbase/#example-use-case-discount-price-on-an-nft)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#basilisk", "page_title": "NFT Projects on Polkadot and Kusama", "index": 3, "depth": 2, "title": "Basilisk", "anchor": "basilisk", "start_char": 1536, "end_char": 2236, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Basilisk\n\n[Basilisk](https://bsx.fi/) is a Kusama parachain that provides liquidity for the ecosystem. It also\nhas a full-featured NFT platform based on the\n[Uniques pallet](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/uniques).\nOne of the key features of Basilisk is that it allows minting NFTs with a royalty fee. This royalty\nfee is distributed to the original creator of the NFT via the runtime pallet. Additionally\n[Basilisk offers a feature](https://github.com/galacticcouncil/Basilisk-node/tree/master/pallets/marketplace)\nthat allows creating a buy order for a specific NFT.\n\nThese NFTs can be viewed and interacted instantly on [KodaDot](https://kodadot.xyz/)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#crust", "page_title": "NFT Projects on Polkadot and Kusama", "index": 4, "depth": 2, "title": "Crust", "anchor": "crust", "start_char": 2236, "end_char": 2413, "estimated_token_count": 39, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Crust\n\nCrust is primarily a storage solution. A\n[separate section](https://wiki.crust.network/docs/en/buildIntegrationNFTDataStorage) is dedicated\nto NFT storage solutions."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#darwinia-network", "page_title": "NFT Projects on Polkadot and Kusama", "index": 5, "depth": 2, "title": "Darwinia Network", "anchor": "darwinia-network", "start_char": 2413, "end_char": 2724, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Darwinia Network\n\nDarwinia Network is a decentralized heterogeneous cross-chain bridge protocol built on Substrate. It\nfocuses on decentralized cross-chain token swap, exchange, and market and it is an EVM-compatible\nblockchain.\n\nNFT marketplace available [here](https://nft.io/collection/darwinia/assets)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#kodadot", "page_title": "NFT Projects on Polkadot and Kusama", "index": 6, "depth": 2, "title": "KodaDot", "anchor": "kodadot", "start_char": 2724, "end_char": 3646, "estimated_token_count": 277, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## KodaDot\n\n[KodaDot](https://kodadot.xyz/) is an open-source NFT marketplace operating across multiple chains (Polkadot and Kusama Asset Hubs, Mantle, Base, and Immutable zkEVM).\n\nKodaDot operates as a collaborative platform with over [90 open-source contributors](https://hello.kodadot.xyz/about-us/who-are-we/achievements), earning recognition as the [top dApp in the Polkadot ecosystem on Github](https://github.com/topics/polkadot).\n\n<div class=\"row\">\n  <div class=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=SKdx4pTgL04\">\n      <img src=\"https://img.youtube.com/vi/SKdx4pTgL04/0.jpg\" width=\"350\" style=\"border-radius: 10px; border: 1px solid slategrey;\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=SKdx4pTgL04\">KodaDot Tutorial on Minting NFTs</a>\n    </p>\n  </div>\n</div>\n\nFor minting tutorials see [this step-by-step guide](https://hello.kodadot.xyz/tutorial/minting)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#kodadot-ecosystem-tools", "page_title": "NFT Projects on Polkadot and Kusama", "index": 7, "depth": 3, "title": "KodaDot Ecosystem Tools", "anchor": "kodadot-ecosystem-tools", "start_char": 3646, "end_char": 3915, "estimated_token_count": 60, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### KodaDot Ecosystem Tools\n\nKodaDot provides [API interfaces for builders](https://github.com/kodadot/uniquery) using SubSquid indexer, offering searchable collections and ownership insights. More information at [KodaDot's documentation](https://hello.kodadot.xyz/)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#mnet-continuum", "page_title": "NFT Projects on Polkadot and Kusama", "index": 8, "depth": 2, "title": "MNet Continuum", "anchor": "mnet-continuum", "start_char": 3915, "end_char": 4368, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## MNet Continuum\n\nMNet Continuum (ex BitCountry) specializes in providing Metaverse as a Service (MaaS) to all\nnetworks. Their decentralized application (dApp) offers users the tools to create and customize a\nmetaverse, run and reward a community through immersive quests, and mint and trade NFTs. Users can\nenjoy metaverse gaming, learning and networking.\n\n[Minting And NFT Generators](https://metaversenw.gitbook.io/user-manual/nfts/what-is-an-nft)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#moonbeam", "page_title": "NFT Projects on Polkadot and Kusama", "index": 9, "depth": 2, "title": "Moonbeam", "anchor": "moonbeam", "start_char": 4368, "end_char": 5062, "estimated_token_count": 155, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Moonbeam\n\n[Moonbeam](https://moonbeam.network/) and Moonriver are full EVM deployments with Ethereum RPC endpoints, providing familiar tooling (Hardhat, Remix, Truffle, Metamask) for Ethereum developers.\n\nAs Substrate chains, they can integrate custom pallets for NFT-specific optimizations while maintaining EVM compatibility.\n\nAvailable applications: [Moonbeam dApps directory](https://apps.moonbeam.network/moonbeam/app-dir)\n\nDeveloper tools and documentation links:\n\n[Minting a Cross-Chain NFT with Axelar SDK](https://docs.moonbeam.network/tutorials/interoperability/using-axelar-sdk/)\n[Deploying an ERC-721 Contract Example](https://docs.moonbeam.network/tutorials/eth-api/thirdweb/)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#mythical", "page_title": "NFT Projects on Polkadot and Kusama", "index": 10, "depth": 2, "title": "Mythical", "anchor": "mythical", "start_char": 5062, "end_char": 5715, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Mythical\n\n[Mythical Games](https://mythicalgames.com/) is an online gaming platform that implements NFTs in\nits gaming ecosystem. Mythical Games has Mythos Chain, an L1 rollup in the Polkadot ecosystem that\nimplements the Polkadot NFTs pallet to provide advanced NFT functionalities.\n\nMythical offers a platform for game developers with comprehensive documentation and onboarding\nguides, to ensure anyone can get up and running in time. The primary integration path is REST APIs,\nbut SDKs are also available upon request.\n\nDeveloper tools and documentation links:\n\n- [The Mythical Platform API](https://docs.mythicalgames.com/mythical-platform-api)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#nodle", "page_title": "NFT Projects on Polkadot and Kusama", "index": 11, "depth": 2, "title": "Nodle", "anchor": "nodle", "start_char": 5715, "end_char": 5926, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Nodle\n\nThe Nodle Network is a decentralized wireless network, composed of Nodle Edge Nodes, powered by the\nNodle Chain, and the NODL token.\n\n[Nodle NFT Minting Tool](https://docs.nodle.com/nft-minting-tool)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#unique-network", "page_title": "NFT Projects on Polkadot and Kusama", "index": 12, "depth": 2, "title": "Unique Network", "anchor": "unique-network", "start_char": 5926, "end_char": 6382, "estimated_token_count": 77, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Unique Network\n\n[Unique Network](https://unique.network) is a Polkadot parachain specializing in advanced NFT capabilities including dynamic, nested, fractionalized and composable NFTs. It provides a hybrid environment combining EVM and Substrate functionality.\n\nUnique Network focuses on infrastructure for other projects rather than end-user applications. It develops XCM utilities for cross-chain NFT interoperability across the Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#advanced-nft-features", "page_title": "NFT Projects on Polkadot and Kusama", "index": 13, "depth": 3, "title": "Advanced NFT Features", "anchor": "advanced-nft-features", "start_char": 6382, "end_char": 6935, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Advanced NFT Features\n\nUnique Network creates NFTs as independent addressable objects that can receive and contain other NFTs, forming parent/child relationships through simple transfers rather than complex contracts.\n\nKey capabilities include:\n- Nested NFT bundles containing NFTs, RFTs and fungible tokens\n- Arbitrary metadata attribute structures\n- Multi-asset NFTs\n- Controlled attribute mutability\n- Management rights separation\n- Dynamic NFT capabilities\n- Fractionalization (RFTs - refungible tokens)\n- On-chain data obfuscation for privacy"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#evm-integration", "page_title": "NFT Projects on Polkadot and Kusama", "index": 14, "depth": 3, "title": "EVM Integration", "anchor": "evm-integration", "start_char": 6935, "end_char": 7357, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### EVM Integration\n\nUnique Network's EVM maps addresses to Substrate address space, allowing direct interaction between EVM applications and native Substrate objects without intermediary contracts.\n\nCurrent applications using Unique Network include [TapNation](https://www.tap-nation.io/) and [ForeverHasFallen](https://foreverhasfallen.com/). More projects are listed on the [official website](https://unique.network)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#ecosystem-overview", "page_title": "NFT Projects on Polkadot and Kusama", "index": 15, "depth": 2, "title": "Ecosystem Overview", "anchor": "ecosystem-overview", "start_char": 7357, "end_char": 7492, "estimated_token_count": 20, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Ecosystem Overview\n\nThe Polkadot NFT ecosystem supports millions of users across multiple parachains with various tooling options:"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#integration-solutions", "page_title": "NFT Projects on Polkadot and Kusama", "index": 16, "depth": 3, "title": "Integration Solutions", "anchor": "integration-solutions", "start_char": 7492, "end_char": 7753, "estimated_token_count": 53, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Integration Solutions\n\n- **Apillon Platform**: IPFS integration and metadata management\n- **Unique Network SDK**: JavaScript/TypeScript toolkit for advanced NFT features  \n- **Cross-chain Development**: Tools for expanding from Ethereum-based applications"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft-projects", "url": "https://developer.polkadot.com/wiki/learn/learn-nft-projects/#cross-chain-capabilities", "page_title": "NFT Projects on Polkadot and Kusama", "index": 17, "depth": 3, "title": "Cross-Chain Capabilities", "anchor": "cross-chain-capabilities", "start_char": 7753, "end_char": 8036, "estimated_token_count": 57, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a849df5c99d2190e46d2d326672ba92c75bc3bc8a36a1730854142ed2c1ac1ab", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cross-Chain Capabilities\n\n- **NFT XCM Integration**: Trustless cross-parachain transfers without external bridges\n- **Unified Marketplaces**: Cross-chain interoperability for ecosystem-wide liquidity\n- **Specialized Chains**: Different chains optimized for specific NFT use cases"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft", "url": "https://developer.polkadot.com/wiki/learn/learn-nft/#fungibility", "page_title": "NFTs", "index": 0, "depth": 2, "title": "Fungibility", "anchor": "fungibility", "start_char": 135, "end_char": 1056, "estimated_token_count": 197, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:82a665c3b59bc4ea3128de7b5eaf242ecaa32cb3ad4cd66d70e7ab3e1ee32584", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Fungibility\n\nNFT stands for non-fungible token. Fungibility is defined as interchangeability inside of a group.\nAll valid issued $1 notes are a group to itself. A $1 note is always interchangeable with any other\n$1 note. It is not, however, interchangeable with $20, $50 or $100 dollar notes (these are separate\nnote groups).\n\nA fungible item may be unique. In the currency note example, each issued note has a serial number\nmaking it a unique member of the group\n\n![one dollar](https://www.investopedia.com/thmb/Nr-RLORu5CX_lIWZfLmV5X0eIrc=/613x345/smart/filters:no_upscale%28%29/Clipboard01-d20f6eb9351e4f36a46e11fd87b53b2d.jpg)\n\nA case where a fungible item is not unique is a simple plastic betting chip. Each chip in its\npristine state is indistinguishable from any other chip and each is interchangeable within its own\ngroup.\n\nOn the other hand, an NFT is unique and has features that allow for its uniqueness."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft", "url": "https://developer.polkadot.com/wiki/learn/learn-nft/#nft-anatomy", "page_title": "NFTs", "index": 1, "depth": 2, "title": "NFT Anatomy", "anchor": "nft-anatomy", "start_char": 1056, "end_char": 1530, "estimated_token_count": 106, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:82a665c3b59bc4ea3128de7b5eaf242ecaa32cb3ad4cd66d70e7ab3e1ee32584", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## NFT Anatomy\n\nEvery NFT has three common components irrespective of the chain it belongs to or originates from\nthat make it unique.\n\n- **Identity**: Defined via a property, address or a contract.\n- **Ownership**: Determined via a contract or a wallet address.\n- **Metadata**: Can be a single reference to an off-chain object (digital asset or contract) or, in\n  case of advanced NFTs, an elaborate data structure containing both on-chain data and off-chain\n  references."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft", "url": "https://developer.polkadot.com/wiki/learn/learn-nft/#nft-purpose", "page_title": "NFTs", "index": 2, "depth": 2, "title": "NFT Purpose", "anchor": "nft-purpose", "start_char": 1530, "end_char": 3233, "estimated_token_count": 356, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:82a665c3b59bc4ea3128de7b5eaf242ecaa32cb3ad4cd66d70e7ab3e1ee32584", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## NFT Purpose\n\nWhat purpose does a unique digital asset provide? The answer to this question lies in the two\ndistinct ways an NFT is utilized.\n\nThe first is the use of NFTs as a speculative store of value derived from their uniqueness (rarity,\nimplied, or intrinsic worth). This initial novelty aspect of NFTs initiated an era of collectibles\nand tradeables and instantiated the appearance of the mass markets where NFTs were traded as a\ncommodity. This is also recognized as the era of the simple NFT, otherwise known as static NFT. The\nUniques pallet was created to facilitate this implementation of the NFT.\n\nThe second implementation is as a utility. As mentioned, when we define an NFT, it can store data\non-chain. By convention, we call this NFT component the NFT’s _metadata_. Generally, an NFT is an\nindependent, sovereign data record. This is where the utility aspect of an NFT lies. An NFT can be a\ndigital key, a collection of documents, an atomic data fragment, or a unique personal set of related\nassets and information that can be owned. An example of NFT utility is the\n[OG WUD Burn NFT Collection](https://kodadot.xyz/ahp/collection/244) where each NFT grants some\nbenefits within the [FlappyWUD game](https://flappywud.lol/).\n\nThese two roles are not mutually exclusive. An NFT can be a store of value only, a value-less\nutility token exclusively, or both at the same time if it has worth on the market as a utility token\nor, inversely, if it is primarily a token of worth with additional utility.\n\nIt is the utility aspect of the NFTs that has been the driving force behind the development of and\ntransition to the advanced NFT concept central to Polkadot’s NFTs pallet development."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft", "url": "https://developer.polkadot.com/wiki/learn/learn-nft/#nft-standards", "page_title": "NFTs", "index": 3, "depth": 2, "title": "NFT Standards", "anchor": "nft-standards", "start_char": 3233, "end_char": 4592, "estimated_token_count": 269, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:82a665c3b59bc4ea3128de7b5eaf242ecaa32cb3ad4cd66d70e7ab3e1ee32584", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## NFT Standards\n\nDue to its heterogeneous nature, the Polkadot ecosystem supports multiple implementations of NFTs.\nPolkadot's core blockchain technology is based on the Polkadot SDK (Substrate). NFTs created in a\nSubstrate-based context are called \"native\" NFTs. Native NFTs are created through dedicated methods\navailable in pallets, collections of functions written as Wasm code. Pallets operate at the chain level with \ndirect access to the blockchain's storage and logic, ensuring security under Polkadot's shared \nsecurity model.\n\nPolkadot Uniques and NFTs pallets and Unique Network's NFT utility pallet bundle provide native NFT functionality. Common\nstandards for metadata provide direct interoperability through the XCM initiative\n([RFC-0125: XCM Asset Metadata](https://polkadot-fellows.github.io/RFCs/approved/0125-xcm-asset-metadata.html#rfc-0125-xcm-asset-metadata)).\n\nThe ink! smart contract language for writing contracts provides another mechanism for\ncreating NFTs. Astar has implemented\n[PSP34](https://github.com/w3f/PSPs/blob/master/PSPs/psp-34.md) (Polkadot Standards Proposals)\nfor standardizing NFTs using the Contracts pallet.\n\nEthereum Virtual Machine (EVM) implementations in the Polkadot ecosystem provide another\nway to create and manage NFTs using Solidity contracts. These NFTs\nfollow ERC standards from the Ethereum network."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft", "url": "https://developer.polkadot.com/wiki/learn/learn-nft/#birth-of-nfts-the-evm-domain", "page_title": "NFTs", "index": 4, "depth": 2, "title": "Birth of NFTs - The EVM Domain", "anchor": "birth-of-nfts-the-evm-domain", "start_char": 4592, "end_char": 6482, "estimated_token_count": 398, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:82a665c3b59bc4ea3128de7b5eaf242ecaa32cb3ad4cd66d70e7ab3e1ee32584", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Birth of NFTs - The EVM Domain\n\nA general-purpose blockchain is not built to natively support the concept of NFTs. It is only\nnatively aware and optimized for its own native fungible tokens, and implementations built on such a\nchain are essentially \"special case smart contracts\".\n\nFor example, Ethereum is a general-purpose blockchain that does not have the concept of \"tokens\" at\nall (fungible or not) built-in. Tokens in Ethereum are essentially spreadsheets of information to be\ninterpreted and read in a certain way by various user interfaces via an executable code named a\n“smart contract”. An agreement on the structure of such a construct is declared a standard and is\ndesignated by the Ethereum Request For Comments (ERC) document.\n\nThe core NFT EVM standard is defined in [ERC721](https://eips.ethereum.org/EIPS/eip-721), but there\nare extended implementations that introduce some aspects of advanced NFT features like\n[ERC1155](https://ethereum.org/en/developers/docs/standards/tokens/erc-1155/).\n\nThis approach’s significant shortcoming is its inability to combine standards implicitly. This\nintroduces the necessity of creating custom contract implementations for specialized use cases where\none might desire combined features. Each ERC that provides an advanced NFT feature is an isolated\nsubset. As will be shown later, this is not the case for Polkadot native NFTs.\n\nA blockchain must provide a mechanism for overcoming these limitations to facilitate the creation of\nadvanced NFT tokens, as we will see in the upcoming section.\n\nA typical\n[NFT on Ethereum](https://opensea.io/assets/ethereum/0x2127fe7ffce4380459cced92f2d4793f3af094a4/12598)[​](learn-nft.md#a-typical-nft-on-ethereum)\\*\\*\n\n![samurai nft](../assets/nft/samurai.png)\n\nFor the sake of reference, we can refer to these as static NFTs that are almost exclusively\nimage-based collectibles of varying rarity."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft", "url": "https://developer.polkadot.com/wiki/learn/learn-nft/#nfts-in-polkadot-kusama", "page_title": "NFTs", "index": 5, "depth": 2, "title": "NFTs in Polkadot & Kusama", "anchor": "nfts-in-polkadot-kusama", "start_char": 6482, "end_char": 8020, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:82a665c3b59bc4ea3128de7b5eaf242ecaa32cb3ad4cd66d70e7ab3e1ee32584", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## NFTs in Polkadot & Kusama\n\nAs mentioned, standardized pallets provide a decentralized processing mechanism through Wasm\ncontracts, specifically optimized for an NFT implementation’s advanced functionality. Two examples\nare the Polkadot NFTs pallet and the Unique Network’s collection of NFT utility pallets. This\napproach allows any parachain in the ecosystem to access advanced NFT features without building a\ncontract framework from scratch.\n\nWith the introduction of NFT capabilities to the cross-chain messaging format (XCM), a direct\ninter-chain NFT transfer solution is becoming a reality.\n\nA critical aspect of NFT interoperability hinges on the ability of differing networks to agree on a\ncommon metadata format. This greatly simplifies interoperability and removes the need for metadata\nconversion steps. In this regard, an effort is underway to make this a reality in this proposal\n[RFC-0125: XCM Asset Metadata](https://polkadot-fellows.github.io/RFCs/approved/0125-xcm-asset-metadata.html#rfc-0125-xcm-asset-metadata).\n\nThe other option of building a framework of Solidity contracts as the scaffolding for advanced\nfeatures within an EVM is also viable. Still, it is hampered by the necessity of using bridging\nmechanisms for cross-chain transfers and a lack of a derivative NFT solution. This approach exhibits\nmuch less efficient transaction processing than the native substrate solutions.\n\n!!!info\n    See [this page](./learn-nft-projects.md) for more information about specific NFT project on Polkadot\n    and Kusama."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nft", "url": "https://developer.polkadot.com/wiki/learn/learn-nft/#cross-chain-transfers", "page_title": "NFTs", "index": 6, "depth": 2, "title": "Cross-Chain Transfers", "anchor": "cross-chain-transfers", "start_char": 8020, "end_char": 9668, "estimated_token_count": 290, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:82a665c3b59bc4ea3128de7b5eaf242ecaa32cb3ad4cd66d70e7ab3e1ee32584", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Cross-Chain Transfers\n\nTransfer of NFTs across chains is handled through two approaches on the Polkadot network:\n\n- Asset teleportation\n- Asset reservation via sovereign account mechanism - derivative NFTs\n\nCross-chain transfers within the Polkadot ecosystem are executed through the\nXCM (Cross-Consensus Messaging) system. This system provides native security at the\nprotocol level, eliminating the need for external bridge solutions.\n\nNFT XCM capabilities are operational in development environments between Asset Hub and \nUnique Network, with expansion to other parachains planned. This enables cross-chain NFT \ntransfers across Polkadot parachains without external bridge infrastructure.\n\nNFT transfers can be split into two components:\n\n- Core asset properties (identity and ownership data)\n- Optional metadata attributes\n\nComplete NFT teleportation may not always be necessary. A successful\n[XCM implementation between Unique Network and Acala](https://unique.network/blog/unique-network-cross-chain-nft-proof-of-concept-is-here/)\ncreated a derivative NFT on the Acala chain representing the original NFT from Unique\nNetwork, requiring only core asset properties for staking and collateral use cases.\n\nTeleportation, i.e., a complete transfer of identity ownership and metadata, may be the optimal\nsolution for a complete asset migration and the only available option for bridging mechanisms.\n\nBridging to and from Substrate chains and EVM chains takes much effort but is a highly desired\nfeature in the NFT industry. Merging the collector and customer base has significant implications,\nso multiple projects focus on making this possible."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#nominating-vs-joining-a-pool", "page_title": "Nomination Pools", "index": 0, "depth": 2, "title": "Nominating vs Joining a Pool", "anchor": "nominating-vs-joining-a-pool", "start_char": 3835, "end_char": 10246, "estimated_token_count": 917, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Nominating vs Joining a Pool\n\n|                                                                                                                                 Nominating                                                                                                                                  |                                                                                                              Joining a Pool                                                                                                               |\n| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |\n|                                                                                                                        Minimum 250 DOT to nominate.                                                                                                                         |                                                                                                       Minimum 1 DOT to be a member.                                                                                                       |\n|                                                                                                       Rewards can be compounded automatically or sent to any account.                                                                                                       |                                                              Rewards can be manually claimed to the pool member's account and be bonded in the pool again to compound them.                                                               |\n|                                                                                           If the active validator gets slashed, all active nominators are subjected to slashing.                                                                                            |                                                                             If the active validator gets slashed, all pool members are subjected to slashing.                                                                             |\n|                                                                                                                    Can bond and stake DOT indefinitely.                                                                                                                     |                                                                                               Can bond and stake DOT until the pool exists.                                                                                               |\n|                                                                                                    Maximum unbonding period of 28 days. Can switch validators without unbonding.                                                                                                    |                                                                             Maximum unbonding period of 28 days. Need to unbond before switching to a different pool.                                                                             |\n|                                                                                                                              Maximum uncapped.                                                                                                                              |                                                                                                             Maximum uncapped.                                                                                                             |\n| Should bond more than the [minimum active nomination](../learn/learn-nominator.md#minimum-active-nomination-to-receive-staking-rewards) in an era to be eligible to earn staking rewards, although it can depend on multiple other factors outlined in the linked document. |           A nomination pool earns rewards in an era if it satisfies all the conditions mentioned for the nominator (as the nomination pool is just a nominator from [the NPoS system](../learn/learn-phragmen.md) perspective).           |\n|                                                                                                         Staked tokens can be used for participation in Governance.                                                                                                          |                                                                                       Staked tokens can be used for participation in Governance.                                                                                       |\n|                                                            [Rewards payout](../learn/learn-staking-advanced.md#claiming-rewards) can be triggered permissionlessly by anyone (typically done by the validator).                                                             | A pool member can self claim the rewards or can grant permission to any other account to claim and compound rewards on your behalf. See [Claim Permissions](#claim-permissions). |\n|                                                                                                                    Bonded funds remain in your account.                                                                                                                     |        Bonded funds remain in your account.        |\n|                                                                                                         Nominator manages the list of staked validators (up to 16).                                                                                                         |                                                                                                 Nominations managed by the pool operator.                                                                                                 |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#for-pool-members", "page_title": "Nomination Pools", "index": 1, "depth": 2, "title": "For Pool Members", "anchor": "for-pool-members", "start_char": 10246, "end_char": 10267, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## For Pool Members"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#join-a-pool", "page_title": "Nomination Pools", "index": 2, "depth": 3, "title": "Join a Pool", "anchor": "join-a-pool", "start_char": 10267, "end_char": 11789, "estimated_token_count": 332, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Join a Pool\n\n!!!note \"Ledger users\"\n    Joining a nomination pool is possible only with the XL version of the Polkadot Ledger App. This should be installed by default on Ledger Nano X and S Plus, but not on the Nano S.\n\nBefore joining a nomination pool, you must ensure that the\npool is earning rewards and nominating the validators that match your preferences. Participating in\npools is more of a set-and-forget action than nominating by yourself. The pool operator maintains\nthe list of validators nominated by the pool, and so, in a way, you are trusting the pool operator\nto act in your best interests. However, it is advised to check the validators nominated by the pool\nfrom time to time and change the pool if necessary.\n\nA member delegates funds to a pool with the `join` extrinsic. The pool then increases its bond with the new funds. A member is afforded the\nability to bond additional funds or re-stake rewards as long as they are already actively bonded.\nNote that a member may only belong to one pool at a time.\n\nThe current minimum bond to join a pool can be seen\n[here](../general/chain-state-values.md).\n\n!!!tip \"Use Proxy Accounts to join Nomination Pools\"\n    Depending on how much control you want to give your proxy, you might choose between any > non-transfer > staking > nomination pool proxy, with the latter being only able to sign transactions related to the `NominationPool` pallet.\n\nCheck the \"How to join a pool\" section in\n[this article](how-to/nomination-pools-guide.md)\nfor guidelines."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#claim-rewards", "page_title": "Nomination Pools", "index": 3, "depth": 3, "title": "Claim Rewards", "anchor": "claim-rewards", "start_char": 11789, "end_char": 12203, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Claim Rewards\n\nThe member can claim their portion of any rewards that have accumulated since the previous time they\nclaimed (or in the case that they have never claimed, any rewards that have accumulated since the\nera after they joined). Rewards are split pro rata among the actively bonded members. Check the \"How\nto claim rewards\" section in\n[this article](how-to/nomination-pools-guide.md)\nfor guidelines."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#claim-permissions", "page_title": "Nomination Pools", "index": 4, "depth": 3, "title": "Claim Permissions", "anchor": "claim-permissions", "start_char": 12203, "end_char": 13159, "estimated_token_count": 208, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Claim Permissions\n\nAs a pool member, you can grant permission to any other account to claim and compound rewards on\nyour behalf. There are four permission options:\n\n- `Permissioned` (default): you need to claim and compound your rewards.\n- `PermissionlessCompound`: you grant permission to any other account to compound (claim and bond)\n  your rewards on your behalf.\n- `PermissionlessWithdraw`: you grant permission to any other account to withdraw (claim and keep as\n  a free balance) your rewards on your behalf.\n- `PermissionlessAll`: you grant permission to any other account to compound or withdraw your\n  rewards on your behalf.\n\nSee the [Staking Dashboard page](../general/dashboards/staking-dashboard.md#pools) for more information about how to set your claim permissions.\n\nSee the [advanced guides](./learn-guides-staking-pools.md#claim-rewards-for-other-pool-members-with-polkadot-js) to\nlearn how to claim rewards for another pool member."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#vote-in-opengov", "page_title": "Nomination Pools", "index": 5, "depth": 3, "title": "Vote in OpenGov", "anchor": "vote-in-opengov", "start_char": 13159, "end_char": 13752, "estimated_token_count": 131, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Vote in OpenGov\n\nNomination pool members can vote in Polkadot OpenGov with funds they delegated to the pool. In the past, pool members' funds were transferred to the pool system account. A [delegation staking system](https://hackmd.io/@ak0n/454-np-governance#Pallet-Delegation-Staking) was introduced to allow keeping ownership of your funds and voting in governance. \n\n!!!info \"Dual Staking\"\n    Since the runtime 1.6.1 upgrade, any account can be both a nomination pool member and a solo staker at the same time, and the earlier manual migration for dual stakers is no longer required."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#unbond-and-withdraw-funds", "page_title": "Nomination Pools", "index": 6, "depth": 3, "title": "Unbond and withdraw Funds", "anchor": "unbond-and-withdraw-funds", "start_char": 13752, "end_char": 14619, "estimated_token_count": 182, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Unbond and withdraw Funds\n\nAt any point in time after joining the pool, a member can start the process of exiting by unbonding.\n`unbond` will unbond part or all of the member's funds. After unbond has been called and the\n[unbonding duration](../general/chain-state-values.md) has passed a member may\nwithdraw their funds with `withdrawUnbonded`. Withdrawing effectively ends a member's relationship\nwith their pool, allowing them to join a different pool if desired. Check the \"Withdraw unbonded\nfunds\" section in\n[this article](how-to/nomination-pools-guide.md)\nfor guidelines.\n\n!!!info \"Unbonding transaction automatically triggers withdrawal of rewards\"\n    When there is a change in the bonded balance, the accumulated rewards in the pool thus far are automatically withdrawn to the account. The rewards are then accrued based on the updated bonded balance."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#limitations-of-nomination-pools", "page_title": "Nomination Pools", "index": 7, "depth": 3, "title": "Limitations of Nomination Pools", "anchor": "limitations-of-nomination-pools", "start_char": 14619, "end_char": 14861, "estimated_token_count": 52, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Limitations of Nomination Pools\n\n- For a member to switch pools, all funds from the account must be unbonded. This process takes up to 28\n  eras.\n- A member can partially unbond the staked funds in the pool (at most 32 partial unbonds)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#nomination-pools-lazy-slashing", "page_title": "Nomination Pools", "index": 8, "depth": 2, "title": "Nomination Pools - Lazy Slashing", "anchor": "nomination-pools-lazy-slashing", "start_char": 14861, "end_char": 16770, "estimated_token_count": 366, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Nomination Pools - Lazy Slashing\n\nBecause pool funds are spread to all its members and each member need to be slashed proportionally, slashes are applied to pool members lazily. The protocol keeps track of how much a pool and its members need to be slashed. There is a permissionless extrinsic to apply any pending slash to the pool member. If successful, the caller gets part of slash as reward (if configured), incentivising free market bots to monitor and apply slashes swiftly.\n\nThe advantage is, the slashing (computation) cost is spread over multiple blocks. A disadvantage is that a member might have more funds in their account locked than their actual pool contribution, which they can use to vote, until these pending slashes are applied.\n\nSuppose the staking system [slashes](./learn-offenses.md) a pool’s underlying nomination account. In\nthat case, the slash is distributed evenly across the bonded pool, and the unbonding pools from\nslash era+1 through the slash apply era. Thus, any member who either a) was unbonding or b) was\nactively bonded in the aforementioned range of eras will be affected by the slash. In other words, a\nmember who may have been actively bonded during the offence is slashed pro rata based on its stake\nrelative to the total slash amount.\n\nUnbonding pools need to be slashed to ensure all nominators who were in the bonded pool while it was\nbacking a validator that committed an offense are punished. Without these measures a nominator could\nunbond right after a validator equivocated with no consequences.\n\nThis strategy is unfair to members who joined after the slash because they get slashed as well, but\nit spares members who unbond. The latter is much more important for security: if a pool's validators\nattack the network, their members need to unbond fast! Avoiding additional slashes gives them an\nincentive to do that if validators get repeatedly slashed."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#for-pool-admins", "page_title": "Nomination Pools", "index": 9, "depth": 2, "title": "For Pool Admins", "anchor": "for-pool-admins", "start_char": 16770, "end_char": 16790, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## For Pool Admins"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#states", "page_title": "Nomination Pools", "index": 10, "depth": 3, "title": "States", "anchor": "states", "start_char": 16790, "end_char": 17204, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### States\n\n- Open: The pool is open to be joined by anyone.\n- Blocked: The pool is blocked; no joiners are permitted.\n- Destroying: The pool is in the process of being destroyed. Once in this state, the pool may never\n  revert to any other state; it can only proceed to be destroyed. All members can be\n  permissionlessly unbonded; this allows the pool to be dismantled regardless of any member’s\n  proactivity."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#roles", "page_title": "Nomination Pools", "index": 11, "depth": 3, "title": "Roles", "anchor": "roles", "start_char": 17204, "end_char": 17729, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Roles\n\n- Depositor: Creates the pool and is the initial member. The depositor can only leave the pool once\n  all other members have left. Once they leave by withdrawing, the pool is fully removed from the\n  system.\n- Nominator: Can select the validators the pool nominates.\n- Bouncer: Can change the pool’s state and kick (permissionlessly unbond/withdraw) members if the\n  pool is blocked.\n- Root: Can change the nominator, bouncer, or itself. Further, it can perform any of the actions the\n  nominator or bouncer can."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#pool-commissions", "page_title": "Nomination Pools", "index": 12, "depth": 3, "title": "Pool Commissions", "anchor": "pool-commissions", "start_char": 17729, "end_char": 20901, "estimated_token_count": 675, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Pool Commissions\n\nAs the pool root role, you can set pool commissions that will be applied to the staking rewards paid\nout to the pool's system account before rewards are allocated for the pool members. You can set pool\ncommissions through the [Polkadot Staking Dashboard](../general/dashboards/staking-dashboard.md#pools).\n\nThree methods can be used when setting the pool commission:\n\n- **Commission Rate** (`nominationPools.setCommission` extrinsic): the start or new commission rate\n  (`newCommission` parameter) that can be set between 0% and the\n  [max commission parameter](../general/chain-state-values.md)\n  (decided through [governance referendum](./learn-polkadot-opengov.md)) via the\n  [`globalMaxCommission`](https://paritytech.github.io/substrate/master/pallet_nomination_pools/pallet/type.GlobalMaxCommission.html)\n  parameter. You will need to specify an Input Payee Account, i.e. the account that will receive the\n  commission.\n- **Max Commission** (`nominationPools.setCommissionMax` extrinsic): the maximum commission\n  (`maxCommission` parameter) the pool will apply to its members (between 0% and Max Commission).\n  Note that once set, **the pool admin can only lower it**.\n- **Change Rate** (`nominationPools.setCommissionChangeRate` extrinsic): the maximum rate increase\n  (`maxIncrease` parameter) allowed for a single commission update. Note that once set, **the pool\n  admin can only lower it**. When setting the Change Rate, it will also be possible to set a\n  `minDelay` quantified as the number of blocks (since last commission update) after which it is\n  possible to change the commission (i.e. the minimum delay between commission updates). Note that\n  once set, **the pool admin can only increase it**.\n\nMax Commission and Change Rate must not be necessarily set. It is the choice of the pool admin to\nset those parameters and provide transparency to the pool members about the pool's commission\npolicy.\n\n!!!warning \"Max Commission and Change Rate are currently permanent\"\n    Once the Max Commission and the Change Rate are set, the pool admin currently can only decrease those values. The minimum delay between commission updates can only be increased. The situation can change in the future and a `forceSetCommissionMax` method can be proposed through governance referendum.\n\nLet's take, for example, Pool A, which sets the Commission Rate to 10%, the Max Commission to 100%,\nand the Change Rate to 1% every 300 blocks (which equates to approximately 30 minutes). The\nfollowing statements are true:\n\n- The pool commission can be increased by 1% every 30 minutes. Bigger increases are not allowed.\n  Increases of less than or equal to 1% are not allowed sooner than 30 minutes since the last\n  commission update.\n- The Max Commission can only be decreased from 100%. Once decreased, it can be decreased again but\n  it cannot be increased.\n- The Change Rate's maximum increase can only be decreased from 1%. Once decreased, it can be\n  decreased again but it cannot be increased.\n- The Change Rate's minimum delay between updates of 30 min can only be increased. Once increased,\n  it can be increased again but it cannot be decreased."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#pool-lifecycle", "page_title": "Nomination Pools", "index": 13, "depth": 3, "title": "Pool Lifecycle", "anchor": "pool-lifecycle", "start_char": 20901, "end_char": 21155, "estimated_token_count": 63, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Pool Lifecycle\n\n!!!info \"Advanced How-to Guides\"\n    See [this page](./learn-guides-staking-pools.md#pool-creation-with-polkadot-js) for more information about the lifecycle of nomination pools. The cycle includes creation, upkeep and destruction."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nomination-pools", "url": "https://developer.polkadot.com/wiki/learn/learn-nomination-pools/#how-to-guides", "page_title": "Nomination Pools", "index": 14, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 21155, "end_char": 21349, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:4314817ae0e1756e5885186cfb085b0fc05237748a2de5ddf80385889e924e95", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [Nomination Pools on the Polkadot Developer Interface](how-to/nomination-pools-guide.md)\n- [How Do I Know Which Nomination Pool to Choose?](how-to/choose-nomination-pool.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#who-are-nominators", "page_title": "Nominator", "index": 0, "depth": 2, "title": "Who are Nominators?", "anchor": "who-are-nominators", "start_char": 1802, "end_char": 2743, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Who are Nominators?\n\nNominators are one type of staking participant. They appoint their stake to the validators, the\nsecond type of participant. By appointing their stake, they can elect the active set of validators\nand share in the rewards that are paid out.\n\nWhile the [validators](../../node-infrastructure/run-a-validator/requirements.md#running-a-validator) are active\nparticipants in the network that engage in the block production and finality mechanisms, nominators\ntake a slightly more passive role. Being a nominator does not require running a node of your own or\nworrying about online uptime. However, a good nominator performs due diligence on the validators\nthat they elect. When looking for validators to nominate, a nominator should pay attention to their\nown reward percentage for nominating a specific validator - as well as the risk that they bear of\nbeing [slashed](./learn-offenses.md) if the validator gets slashed."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#why-nominate", "page_title": "Nominator", "index": 1, "depth": 2, "title": "Why Nominate?", "anchor": "why-nominate", "start_char": 2743, "end_char": 4979, "estimated_token_count": 491, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Why Nominate?\n\n- You become a network participant, a group of diverse professionals and enthusiasts around the\n  world aspiring to build and foster the next-gen Internet, Web3: a decentralized, privacy-focused,\n  and trustless internet.\n- You are an essential piece of the puzzle, keeping the network secure. The bonded balance can be\n  used to vote in [Polkadot OpenGov](./learn-polkadot-opengov.md) and shape the network's future\n  direction.\n- You will start to understand how Polkadot works at a technical-level. When you feel comfortable\n  with your nomination skills and knowledge, you can open your\n  [nomination pool](./learn-nomination-pools.md), help others secure the network and earn rewards,\n  and build your reputation as a trusted nomination pool operator. If you like to be more involved,\n  the next step is to become a [validator](./learn-validator.md).\n- By getting [staking](./learn-staking.md) rewards you keep up with or (likely) stay ahead of\n  network inflation.\n\nNominators secure the relay chain by staking native tokens (DOT on Polkadot or KSM on Kusama) and\nnominating validators. You may have an account with DOT and want to earn fresh DOT. You could do so\nas a validator, which requires experience setting up a node and running and maintaining it 24/7.\n\nOn Polkadot, you can also earn DOT by nominating one or more validators. Doing so makes you a\nnominator for the validator(s) you chose. Pick your validators carefully -\n[if they do not behave properly, they will get slashed, and you will lose some DOT](./learn-offenses.md).\nHowever, if they follow the network rules, you can share the staking rewards they generate.\n\nWhile your tokens are staked for nominations, they are 'locked' (bonded). You can\n[stop nominating at any time](./learn-guides-nominator.md#stop-nominating), but remember that the\naction is effective in the next era and does not automatically unbond your funds. Unbonding is a\nseparate action, and it takes effect after the\n[unbonding period](../general/chain-state-values.md). A staking lock will be\nvisible on the Polkadot Developer Interface during the unbonding period, and after it, the staking lock can be\nunlocked, and the bonded funds become free balance you can transfer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#setting-up-accounts", "page_title": "Nominator", "index": 2, "depth": 2, "title": "Setting up Accounts", "anchor": "setting-up-accounts", "start_char": 4979, "end_char": 5003, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Setting up Accounts"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#stash-staking-proxy", "page_title": "Nominator", "index": 3, "depth": 3, "title": "Stash & Staking Proxy", "anchor": "stash-staking-proxy", "start_char": 5003, "end_char": 6329, "estimated_token_count": 312, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Stash & Staking Proxy\n\nNominators are recommended to set up separate stash and staking proxy accounts. Explanation and the\nreasoning for generating distinct accounts for this purpose is elaborated in the\n[keys section](../learn/learn-cryptography.md#keys).\n\nYou can generate your stash and staking proxy account via any of the recommended methods, which are\ndetailed on the [account generation](../learn/learn-accounts.md#account-generation) page. The first\nthing you need to do before becoming a nominator is to make sure you have a\n[**stash account**](./learn-staking.md#stash-account-and-staking-proxy) where you can transfer funds\nyou want to use for staking. For these accounts, it is recommended to use a \"cold wallet\" solution\nsuch as [Ledger](../general/ledger.md) or [Polkadot Vault](../general/polkadot-vault.md).\n\nAfter setting up the stash account, it is recommended to have a\n[**staking proxy**](./learn-staking-advanced.md#staking-proxies). Although you can be a nominator\nwith just a stash account, having a staking proxy is good practice for security reasons.\n\nA staking proxy of the stash will be able to sign for all staking-related transactions as well. The\nstash will be fully isolated (except if the user decides to change the staking proxy of the stash or\nto attach different proxies to the stash)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#rewards-payout-account", "page_title": "Nominator", "index": 4, "depth": 3, "title": "Rewards Payout Account", "anchor": "rewards-payout-account", "start_char": 6329, "end_char": 7365, "estimated_token_count": 235, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Rewards Payout Account\n\nAs a nominator, you will be asked to choose an account where rewards will be paid. You can select\none of the following options:\n\n- back to staking: rewards are compounded to the bonded amount.\n- to stash: rewards are sent to the stash account as a free balance.\n- to another account: rewards are sent to a user-defined account (not stash).\n\nStarting with runtime version v23 natively included in the client version\n[0.8.23](https://github.com/paritytech/polkadot/releases/tag/v0.8.23), payouts can go to any custom\naddress. If you'd like to redirect payments to an account that is neither the staking proxy nor the\nstash account, set one up. Note that setting an exchange address as the recipient of the staking\nrewards is extremely unsafe.\n\n!!!info\n    Being a nominator is made simpler by using the [**Staking Dashboard**](https://staking.polkadot.cloud/#/overview) that will guide you step by step through specifying rewards destination and bonded amount, and nominating validators (more on this below)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#nominating-with-the-polkadot-developer-interface", "page_title": "Nominator", "index": 5, "depth": 2, "title": "Nominating with the Polkadot Developer Interface", "anchor": "nominating-with-the-polkadot-developer-interface", "start_char": 7365, "end_char": 7418, "estimated_token_count": 8, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominating with the Polkadot Developer Interface"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#targets-page", "page_title": "Nominator", "index": 6, "depth": 3, "title": "Targets Page", "anchor": "targets-page", "start_char": 7418, "end_char": 13197, "estimated_token_count": 1268, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Targets Page\n\nThere are many factors to consider when deciding which of your nominations. One helpful tool to\nchoose validators is the Staking [Targets](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/all-validators) table in\nthe Polkadot Developer Interface. This allows sorting validators using various metrics. Below are the relevant\nmetrics shown as an example, followed by a brief description of each.\n\n| validator | payout   | nominators             | comm. | total stake | own stake | return |\n| --------- | -------- | ---------------------- | ----- | ----------- | --------- | ------ |\n| A         | recently | 1 (`active`) 4 (`all`) | 3%    | 1.6 MDOT    | 8500 DOT  | 17.8%  |\n\n- **payout**: How recently the validator made its last reward payout to nominators.\n- **nominators**: This column consists of two number values. The **active** count (left number) is\n  the number of nominators whose stake is baking the validator in the current era. In this case\n  Validator A has one active nominator. The total or **all** count (right number) is the number of\n  all nominators who nominated Validator A. This includes the active count and all the other\n  nominators whose stake in the current era is baking other validators.\n\n  Every nominator can select up to\n  [a maximum number of validators](../general/chain-state-values.md),\n  which contributes towards maximizing the probability of having the nominator’s stake applied to\n  the validators active set. Nominating too few validators could result in the nominators not\n  receiving their rewards when none of them make it to the active set or when those validators stop\n  validating. The election algorithm attempts to maximize the overall network stake while minimizing\n  the variance of the active stake across the validators. For additional information on the election\n  process, check out the research behind\n  [nominated proof-of-stake](https://research.web3.foundation/Polkadot/protocols/NPoS).\n\n- **comm.**: Total commission kept by the validator (100% means the validator will keep all rewards\n  , and thus nominators will not receive them). A validator's commission is the percentage of the\n  validator reward taken by the validator before the rewards are split among the nominators. As a\n  nominator, you may think that choosing validators with the lowest commission is best. However,\n  validators must be able to run at break-even to continue operations sustainably. Independent\n  validators that rely on the commission to cover their server costs help to keep the network\n  decentralized. Some validators, operated by central exchanges, etc., keep 100% of the commission\n  to payout their staking service clients and therefore do not provide any rewards to external\n  nominators. The commission is just one piece of the puzzle you should consider when picking\n  nominating validators.\n- **total stake**: The total amount of tokens staked by nominators and the validator (i.e. own\n  stake, see below).\n- **own stake**: The amount of tokens the validator has put up as a stake. A higher own stake can be\n  considered as having more \"skin in the game\". This can imply increased trustworthiness. However, a\n  validator not having a large amount of \"own stake\" is not automatically untrustworthy, as the\n  validator could nominate from a different address.\n- **return**: Average annual yield paid out to nominators (i.e. number of rewards divided by the\n  number of bonded tokens). Note that nominating those with a higher yield may not guarantee similar\n  future performance.\n\n![Staking Returns](../assets/nominators_target.png)\n\nOn the Targets page, you can use different filters to select validators with specific traits (where\na trait is a combination of the metrics above). Available filters are:\n\n- **one validator per operator**: Do not show groups of validators run by a single operator. It\n  shows small operators only who will likely have a higher commission and higher self-stake.\n  Nominating only small operators might not always guarantee staking rewards, but it helps to keep\n  the network more resilient to attacks.\n\n!!!info \"Validator vs Operator\"\n    A validator is the node, the physical equipment with installed software that allows to produce new blocks and earn rewards. An operator is the entity responsible for setting up, running and maintaining the node. An operator can have multiple validators under different sub-identities. For example, `ZUG CAPITAL/07` is one of the numerous validators belonging to the operator Zug Capital.\n\n- **comm. < 20%**: Do not show any validators with a commission of 20% or higher.\n- **recent payouts**: Only show validators that have recently caused a\n  [payout to be issued](learn-staking-advanced.md). Note that anyone can cause a payout to occur; it\n  does not have to be the operator of a validator.\n- **currently elected**: Only show validators in the active set (i.e., they have been elected to\n  produce blocks in the current era).\n- **with an identity**: Only show validators that have set an [identity](learn-identity.md). Note\n  that this identity does not have to be verified by a registrar for the validator to appear in the\n  list.\n\n!!!warning \"Single Operators with Multiple Validators\"\n    Recall that [slashing](./learn-offenses.md) is an additive function; the more validators equivocating in a given session, the harsher the penalties. Since validators that are controlled by a single operator are more at risk of a \"synchronized\" failure, nominating them implies a greater risk of having a large slash of your nominated funds. Generally, it is safer to nominate validators whose behavior is independent of others in many ways (different hardware, geographic location, owner, etc.)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#bags-list", "page_title": "Nominator", "index": 7, "depth": 3, "title": "Bags List", "anchor": "bags-list", "start_char": 13197, "end_char": 14620, "estimated_token_count": 305, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Bags List\n\n!!!info\n    On Polkadot and Kusama, the instance of the pallet [Bags List](https://paritytech.github.io/substrate/master/pallet_bags_list/) is named as `voterList`.\n\nNominating accounts are placed in a semi-sorted list called bags list. This sorting functionality is\nextremely important for the long-term improvements of the staking/election system. The bags list allows\nan unlimited number nominators to set their intention to nominate, of which 22500 are considered for the [electing set](#staking-election-stages) that eventually\ndetermines the active validators.\n\nThe nominator accounts in a bag are sorted based on their insertion order, not by their nomination\nstake. The `voterList.putInFrontOf` extrinsic can be issued to move up in the bag, which might be\nvery useful for the accounts in the last bag eligible for receiving staking rewards. Balance changes\ndue to staking rewards or slashing do not automatically rebag the account. Whenever applicable,\nPolkadot JS Apps UI prompts the nominator account to rebag or move up by calling the\n`voterList.rebag` extrinsic.\n\nFor guidelines about how to rebag or move your account within a bag, see the following:\n\n- The \"Bags List\" Section on\n  [this page](learn-staking-advanced.md).\n- The [Bags List Section](./learn-staking-advanced.md#bags-list) in Advanced Staking Concepts.\n- The [dedicated technical explainer video](https://youtu.be/hIIZRJLrBZA)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#validator-stats", "page_title": "Nominator", "index": 8, "depth": 3, "title": "Validator Stats", "anchor": "validator-stats", "start_char": 14620, "end_char": 15477, "estimated_token_count": 195, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Validator Stats\n\nNominators can query [validator histories](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/query) to see\nstatistics such as era points, elected stake, rewards and slashes, and commission. It is good\npractice to do comprehensive research on validator candidates. This could include (but should not be\nlimited to) checking the validators' [identity](learn-identity.md) (if they have set one) and going\nover the validators' websites to see who they are, what kind of infrastructure setup they are using,\nreputation, the vision behind the validator, and more.\n\nAny problematic behavior must be taken seriously. An example of problematic behavior will be if a\nvalidator is regularly offline. In this case, nominators will get fewer rewards.\n\n![Validator Stats](../assets/validator_stats.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#nominating-with-the-staking-dashboard", "page_title": "Nominator", "index": 9, "depth": 2, "title": "Nominating with the Staking Dashboard", "anchor": "nominating-with-the-staking-dashboard", "start_char": 15477, "end_char": 16193, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominating with the Staking Dashboard\n\nIf you are a beginner, please watch the video below for detailed instructions.\n\n[![Staking Tutorial](https://img.youtube.com/vi/F59N3YKYCRs/0.jpg)](https://www.youtube.com/watch?v=F59N3YKYCRs)\n\nThe [Polkadot Staking Dashboard](../general/dashboards/staking-dashboard.md) allows to choose pre-selected\nlists of validators based on user preference, or to manually select validators similarly as in the\nPolkadot Developer Interface.\n\nPre-selected choices are:\n\n- Optimal Selection: Selects a mix of majority active and inactive validators.\n- Active Low Commission: Gets a set of active validators with low commission.\n- From Favorites: Gets a set of your favorite validators."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#staking-election-stages", "page_title": "Nominator", "index": 10, "depth": 2, "title": "Staking Election Stages", "anchor": "staking-election-stages", "start_char": 16193, "end_char": 16982, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking Election Stages\n\nThe staking election system has three stages for both validators and nominators, namely \"intention\",\n\"electable/electing\", and \"active\".\n\n- **intention to nominate:** an account that has stated the intention to nominate; also called\n  simply a \"nominator\".\n- **electing nominator:** a nominator who is selected to be a part of the input to the\n  [NPoS election algorithm](learn-phragmen.md). This selection is based on stake and is made using\n  the [bags list](./learn-staking-advanced.md#bags-list).\n- **active nominator:** a nominator who came out of the NPoS election algorithm backing an active\n  validator. When slashing occurs, all the active nominators backing the validator get slashed.\n\n![Nominator Election](../assets/staking/nominator-election.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#the-election-solution-set", "page_title": "Nominator", "index": 11, "depth": 3, "title": "The Election Solution Set", "anchor": "the-election-solution-set", "start_char": 16982, "end_char": 17690, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### The Election Solution Set\n\nDetermining which validators are in the active set and which nominators are nominating them creates\na very large graph mapping nominators to their respective validators. This \"solution set\" is\ncomputed off-chain and submitted to the chain, which means it must fit in a single block. If there\nare a large number of nominators, this means that some nominators must be eliminated. Nominators are sorted by the amount of DOT staked, and those with more DOT are prioritized. This\nmeans that you may not receive rewards if you are staking with a small amount of DOT. This minimal\namount is dynamic based on the number of validators, nominators, amount nominated, and other\nfactors."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#receiving-rewards", "page_title": "Nominator", "index": 12, "depth": 2, "title": "Receiving Rewards", "anchor": "receiving-rewards", "start_char": 17690, "end_char": 19708, "estimated_token_count": 461, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Receiving Rewards\n\nAs long as you have nominated more than one validator candidate, at least one of them got elected,\nand you are nominating with enough stake to get into the solution set, your bonded stake will be\nfully distributed to one or more validators. That being said, you may not receive rewards if you\nnominated very few validator candidates and no one got elected, or your stake is small, and you are\nnot part of the [top 22,500 nominators](./learn-staking-advanced.md#bags-list), or the validator you\nare nominating has 100% commission. It is generally wise to choose as many trustworthy validators as\nyou can to reduce the risk of none of your nominated validators being elected.\n\n!!!info \"Not receiving Staking Rewards?\"\n    To explore the possible reasons for not receiving staking rewards, check out the following:\n    - The [Staking FAQ](learn-staking.md).\n    - The [\"Why am I not receiving staking rewards?\"](https://www.reddit.com/r/Polkadot/comments/10kurje/why_am_i_not_receiving_staking_rewards/) Reddit article.\n    - The [\"Why am I not receiving staking rewards?\"](./learn-staking.md#why-am-i-not-receiving-rewards) section on the Staking Page.\n\nRewards are _lazy_ - somebody must trigger a payout for a validator for rewards to go to all of the\nvalidator's nominators. Any account can do this, although validator operators often do this as a\nservice to their nominators. See the page on [Simple Payouts](learn-staking-advanced.md) for more\ninformation and instructions for claiming rewards.\n\n!!!note \"Explainer videos on Nominating\"\n    These concepts have been further explained in the following videos:\n    - [Why Nominate on Polkadot & Kusama](https://www.youtube.com/watch?v=weG_uzdSs1E&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=4)\n    - [What to Consider when Nominating Validators on Polkadot and Kusama](https://www.youtube.com/watch?v=K-a4CgVchvU&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=9)\n    - [Nominating/Staking on Polkadot and Kusama](https://youtu.be/FCXC0CDhyS4)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#good-nominator-practices", "page_title": "Nominator", "index": 13, "depth": 2, "title": "Good Nominator Practices", "anchor": "good-nominator-practices", "start_char": 19708, "end_char": 19737, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Good Nominator Practices"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#required-minimum-stake", "page_title": "Nominator", "index": 14, "depth": 3, "title": "Required Minimum Stake", "anchor": "required-minimum-stake", "start_char": 19737, "end_char": 21061, "estimated_token_count": 296, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Required Minimum Stake\n\nDue to the way the [Phragmen algorithm](learn-phragmen.md) generates the solution set and due to the\nfact that the solution set must fit in a single block, a minimum number of DOT will be required to\nnominate with to receive staking rewards can change between the eras.\n\n- **min-intention-threshold:** minimum stake to declare the intention to nominate. This parameter\n  can be updated via on-chain governance, and the most recent and up-to-date version can be found on\n  [chain state](https://polkadot.js.org/apps/#/chainstate) (select **state query > staking >\n  minimumNominatorBond**)\n\n- **min-electing:** minimum stake among the electing nominators. Since this is almost always the\n  same as “min-active”, it might not be reported.\n\n- **min-active:** minimum stake among the active nominators. If your stake falls below this dynamic\n  threshold in a given era, you will not receive staking rewards for that era.\n\nThus, for **nominator counters**, we have:\n\n- count of nominator intentions and\n  [max possible nominator intentions](../general/chain-state-values.md)\n- count of electing nominators, and maximum possible electing nominators (22500 on Polkadot and\n  12500 on Kusama)\n- count of active nominators and maximum possible active nominators (22500 on Polkadot and 12500 on\n  Kusama)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#active-vs-inactive-nomination", "page_title": "Nominator", "index": 15, "depth": 3, "title": "Active vs. Inactive Nomination", "anchor": "active-vs-inactive-nomination", "start_char": 21061, "end_char": 22782, "estimated_token_count": 367, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Active vs. Inactive Nomination\n\nWhen you go to the [Account actions](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async) under staking\npage, you should see your bonded accounts and nomination status. If not, you can follow\n[this](./learn-guides-nominator.md#nominate-using-polkadot-js) guide to configure it first. Your\nnominations will be effective in the next era; eras are roughly 24 hours on Polkadot (6 hours on\nKusama).\n\n![Nominations](../assets/staking/polkadotjs_nominator_account.png)\n\nSuppose you have nominated five validator candidates, and three out of five were elected to the\nactive validator set; then you should see two of your nominations as \"waiting\", and most likely one\nas \"active\" and the rest as \"inactive\". Active or inactive nomination means your nominated\nvalidators have been elected to be in the validator set, whereas waiting means they did not get\nelected. Generally, you will only have a single validator have an active nomination, which means\nthat you are directly supporting it with your stake this era and thus potentially receiving staking\nrewards. Inactive nominators were validators elected for this era but which you are not actively\nsupporting. Every era, a new election will take place, and you may be assigned a different active\nnomination from the validators you selected.\n\nIf you are committing a very large stake, you may have more than one active nomination. However, the\nelection algorithm attempts to minimize this situation, and it should not occur often, so you should\nalmost always see only a single active nomination per era. See the\n[section on Phragmén optimization](learn-phragmen.md#optimizations) for more details."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#minimum-active-nomination-to-receive-staking-rewards", "page_title": "Nominator", "index": 16, "depth": 3, "title": "Minimum Active Nomination to Receive Staking Rewards", "anchor": "minimum-active-nomination-to-receive-staking-rewards", "start_char": 22782, "end_char": 23191, "estimated_token_count": 100, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Minimum Active Nomination to Receive Staking Rewards\n\n!!!info \"Minimum DOT required to earn staking rewards\"\n    The [minimum number of tokens required to submit intent to nominate](../general/chain-state-values.md) differs from the [minimum active nomination](../general/chain-state-values.md) required to earn staking rewards.\n\n![Minimum Active Nomination](../assets/staking/min-active-nomination.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#guides", "page_title": "Nominator", "index": 17, "depth": 2, "title": "Guides", "anchor": "guides", "start_char": 23191, "end_char": 23483, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Guides\n\n- [Be a Nominator (Polkadot)](./learn-guides-nominator.md#nominate-a-validator) - Guide on\n  nominating on the Kusama canary network.\n- [Stop Being a Nominator (all networks)](./learn-guides-nominator.md#stop-nominating) - Guide on\n  stopping nominations and withdrawing tokens."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-nominator", "url": "https://developer.polkadot.com/wiki/learn/learn-nominator/#how-to-guides", "page_title": "Nominator", "index": 18, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 23483, "end_char": 23559, "estimated_token_count": 24, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:280a9672895b40b2abc25d11a24167ecc4b9eb310ceaf54c0dcae54731143abe", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [How to Choose Validators](how-to/choose-validators.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-offenses", "url": "https://developer.polkadot.com/wiki/learn/learn-offenses/#offenses", "page_title": "Offenses & Slashes on Polkadot", "index": 0, "depth": 2, "title": "Offenses", "anchor": "offenses", "start_char": 2348, "end_char": 4664, "estimated_token_count": 479, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a14eab088b289bb00b2c16c631e4e3a36e1debccf55f5ddaec90e627024f2df9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Offenses\n\n!!!info \"Learn more about the parachain protocol\"\n    To better understand the terminology used for offenses, it is recommended to get familiar with the [parachain protocol](./learn-parachains-protocol.md).\n\nOn Polkadot, there are six main validator offenses as shown below.\n\n- **Backing Invalid:** A para-validator is backing an invalid block.\n- **ForInvalid Vote:** A validator (secondary checker) votes in favor of an invalid block.\n- **AgainstValid Vote:** A validator (secondary checker) is voting against a valid block (and\n  wasting network resources).\n- **Equivocation:** A validator produces two or more of the same block or vote.\n  - GRANDPA and BEEFY Equivocation: A validator signs two or more votes in the same round on\n    different chains.\n  - BABE Equivocation: A validator produces two or more blocks on the relay chain in the same time\n    slot.\n- **Double Seconded Equivocation:** Within a backing group of 5 para-validators, at most 5 backed\n  parablocks are possible. Each parablock requires exactly one seconded and at least two more valid\n  votes from the five potential backers. This makes an upper bound on the number of parablocks the\n  system has to deal with while still allowing some choice for relay chain block authors. Backers\n  must decide which parablock to second, and they cannot second another. If another seconding vote\n  is found, they will be punished (somewhat lightly as of now, but there is little to gain from\n  this). All of this is made slightly more complicated with\n  [asynchronous backing](./learn-async-backing.md) as it is no longer one candidate per relay chain\n  block as backers can back blocks \"into the future\" optimistically. See\n  [this page](https://paritytech.github.io/polkadot-sdk/book/node/backing/statement-distribution.html#seconding-limit)\n  for more information.\n- **Seconded + Valid Equivocation:** Occurs when a malicious node first seconds something\n  (takes absolute responsibility for it), and then only pretends to be someone who just said it is\n  correct after another node takes responsibility. This behavior is a clear case of equivocation, as the node presents two conflicting stances. A node\n  could use that tactic to escape responsibility, but once the system notices the two conflicting\n  votes, the offense is reported."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-offenses", "url": "https://developer.polkadot.com/wiki/learn/learn-offenses/#equivocation-conflicting-statements", "page_title": "Offenses & Slashes on Polkadot", "index": 1, "depth": 3, "title": "Equivocation (Conflicting Statements)", "anchor": "equivocation-conflicting-statements", "start_char": 4664, "end_char": 5521, "estimated_token_count": 159, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a14eab088b289bb00b2c16c631e4e3a36e1debccf55f5ddaec90e627024f2df9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Equivocation (Conflicting Statements)\n\nEquivocation occurs when a validator produces statements that conflict with each other.\n\nFor instance, as a block author appointed by BABE, only a single block should be authored for the\ngiven slot, and if two or more are authored, they are in conflict with each other. This would be a\nBABE Equivocation Offence.\n\nIn BEEFY & GRANDPA validators are expected to cast a single vote for the block they believe is the\nbest, but if they are found with two or more votes for different blocks, it means they tried to\nconfuse the network with conflicting statements and when found out this will be a BEEFY/GRANDPA\nEquivocation Offense.\n\nEquivocations usually occur when duplicate signing keys reside on the validator host. If keys are\nnever duplicated, the probability of an honest equivocation slash decreases to near 0."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-offenses", "url": "https://developer.polkadot.com/wiki/learn/learn-offenses/#punishments", "page_title": "Offenses & Slashes on Polkadot", "index": 2, "depth": 2, "title": "Punishments", "anchor": "punishments", "start_char": 5521, "end_char": 5699, "estimated_token_count": 32, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a14eab088b289bb00b2c16c631e4e3a36e1debccf55f5ddaec90e627024f2df9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Punishments\n\nOn Polkadot, offenses to the network can be punished depending on their severity. There are three\nmain punishments: slashing, disabling, and reputation changes."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-offenses", "url": "https://developer.polkadot.com/wiki/learn/learn-offenses/#slashing", "page_title": "Offenses & Slashes on Polkadot", "index": 3, "depth": 3, "title": "Slashing", "anchor": "slashing", "start_char": 5699, "end_char": 15527, "estimated_token_count": 2284, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a14eab088b289bb00b2c16c631e4e3a36e1debccf55f5ddaec90e627024f2df9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Slashing\n\n**Slashing** will happen if a validator misbehaves in the network. They and their nominators will\nbe slashed by losing a percentage of their staked tokens, from as little as 0.01% up to 100%.\n\nAny slashed token will go to the [Treasury](./learn-polkadot-opengov-treasury.md). The rationale for\nthis (rather than burning or distributing them as rewards) is that slashes may be reverted by simply\npaying out from the Treasury. This would be useful in situations such as faulty slashes. In the case\nof legitimate slashing, tokens are reallocated from malicious validators to contributors who support and strengthen the ecosystem, in accordance with the Treasury process.\n\nSlashing only occurs for active validations for a given nominator, and slashes are not mitigated by\nhaving other inactive or waiting nominations. They are also not mitigated by the validator operator\nrunning separate nodes; each node is considered its own entity for slashing purposes.\n\n!!!info \"Multiple Active Nominations\"\n    In rare instances, with very large bonds, a nominator may actively nominate several validators in a single era. In this case, the slash is proportionate to the amount staked to that specific validator. Note that you cannot control the percentage of stake allocated to each validator or choose who your active validator will be (except in the trivial case of nominating a single validator). Staking allocations are controlled by the [Phragmén algorithm](learn-phragmen.md).\n\nOnce a validator is slashed, it is saved into the state as an \"unapplied slash\". You can check this\nvia\n[Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async/slashes).\nThe UI shows it per validator, followed by all the affected nominators and the amounts. While\nunapplied, a governance proposal can be made to reverse it during a 27-day grace period, after which\nthe slashes are applied.\n\nA slash may occur under the circumstances below:\n\n1.  Equivocations – A slash of 0.01% is applied with as little as a single evocation. The slashed\n    amount increases to 100% incrementally as more validators also equivocate.\n2.  Disputes – This may result from a validator trying to represent the contents of a block falsely\n    . Slashing penalties of 100% may apply.\n\n#### Slash for Equivocation\n\nThe following levels of offense are\n[defined](https://research.web3.foundation/Polkadot/security/slashing/amounts). However, these\nparticular levels are not implemented or referred to in the code or the system; they are meant as\nguidelines for different levels of severity for offenses.\n\n- Level 1: Isolated equivocation slashes a minimal amount of the stake.\n- Level 2: Misconducts unlikely to be accidental but do not harm the network's security to any large\n  extent. Examples include concurrent equivocation or isolated cases of unjustified voting in\n  [GRANDPA](learn-consensus.md). Slashes a moderately small amount of the stake.\n- Level 3: misconduct that poses severe security or monetary risk to the system or mass collusion.\n  Slashes all or most of the stake behind the validator.\n\nThe following are scenarios that build towards slashes under equivocation:\n\n1.  Cloning a server, i.e., copying all contents when migrating to new hardware. This action should\n    be avoided. If an image is desired, it should be taken before keys are generated.\n2.  High Availability (HA) Systems – Equivocation can occur if there are any concurrent operations,\n    either when a failed server restarts or if a false positive event results in both servers being\n    online simultaneously. HA systems are to be treated with extreme caution and are not advised.\n3.  The keystore folder is copied when attempting to copy a database from one instance to another.  \n    It is important to note that equivocation slashes occur with a single incident. This can happen\n    if duplicated keystores are used for only a few seconds. A slash can result in losing nominators and funds, and reputational damage.\n\nSee the next section to understand how slash amounts for equivocations are calculated. If you want\nto know more about slashing, please look at the\n[slashing research page](https://research.web3.foundation/Polkadot/security/slashing/amounts).\n\n#### Slash Calculation for Equivocation\n\nGRANDPA, BABE, and BEEFY equivocation use the same formula for calculating the slashing penalty:\n\n    Let x = offenders, n = total number of validators in the active set\n\n    min((3 * x / n )^2, 1)\n\nFor example, assume that there are 100 validators in the active set, and one equivocates in a slot\n(for our purposes, it does not matter whether it was a BABE or GRANDPA equivocation). This is\nunlikely to be an attack on the network but much more likely to be a misconfiguration of a\nvalidator. The penalty would be min(3 \\* 1 / 100)^2, 1) = 0.0009, or a 0.09% slash for that\nvalidator (i.e., the stake held by the validator and its nominators).\n\nNow, assume that a group is running several validators, and they all have an issue in the same slot.\nThe penalty would be min((3 \\* 5 / 100)^2, 1) = 0.0225, or a 2.25% slash. If 20 validators\nequivocate, this is a much more serious offense, possibly indicating a coordinated attack on the\nnetwork. So, the slash will be much greater - min((3 \\* 20 / 100)^2, 1) = 0.36, or a 36% slash on\nall these validators and their nominators. All slashed validators will also be chilled.\n\nThe example above shows the risk of nominating or running many validators in the active set. While\nrewards grow linearly (two validators will get you approximately twice as many staking rewards as\none) slashing grows exponentially. A single validator equivocating causes a 0.09% slash, and two\nvalidators equivocating does not cause a 0.09 \\* 2 = 0.18% slash, but rather a 0.36% slash - 4x as\nmuch as the single validator.\n\nValidators may run their nodes on multiple machines to ensure they can still perform validation work\nif one of their nodes goes down. Still, validator operators should be cautious when setting these\nup. Equivocation is possible if they do not have good coordination in managing signing machines.\n\n#### Good Practices to Avoid Slashing\n\nThe following are advised to node operators to ensure that they obtain pristine binaries or source\ncode and to ensure the security of their node:\n\n1.  Always download either source files or binaries from the official Parity repository\n2.  Verify the hash of downloaded files.\n3.  Use the W3F secure validator setup or adhere to its principles\n4.  Ensure essential security items are checked, use a firewall, manage user access, use SSH\n    certificates\n5.  Avoid using your server as a general-purpose system. Hosting a validator on your workstation or\n    one that hosts other services increases the risk of maleficence.\n\nBelow are some examples of small equivocations that happened in the past.\n\n| Network  | Era  | Event Type         | Details                                                                                                                                                                                                                                                                                                                       | Action Taken                                                                                                                       |\n| -------- | ---- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |\n| Polkadot | 774  | Small Equivocation | [The validator](https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io/$165562246360408hKCfC:matrix.org?via=matrix.parity.io&via=corepaper.org&via=matrix.org) migrated servers and cloned the keystore folder. The on-chain event can be viewed [here](https://polkadot.subscan.io/extrinsic/11190109-0?event=11190109-5). | The validator did not submit a request for the slash to be canceled.                                                               |\n| Kusama   | 3329 | Small Equivocation | The validator operated a test machine with cloned keys; the test machine was online at the same time as the primary, which resulted in a slash.                                                                                                        | The validator requested a slash cancellation, but the council declined.                                                            |\n| Kusama   | 3995 | Small Equivocation | The validator noticed several errors, after which the client crashed, and a slash was applied. The validator recorded all events and opened GitHub issues to allow for technical opinions to be shared.                                                | The validator requested to cancel the slash. The council approved the request as they believed the error was not operator-related. |\n\n#### Slashing Across Eras\n\nThere are three main difficulties to account for with slashing in NPoS:\n\n- A nominator can nominate multiple validators and be slashed via any of them.\n- Until slashed, the stake is reused from era to era. Nominating with N coins for E eras in a row\n  does not mean you have N\\*E coins to be slashed - you've only ever had N.\n- Slashable offenses can be found after the fact and out of order.\n\nTo balance this, the system applies only the maximum slash a participant can receive in a given time\nperiod rather than the sum. This ensures protection from overslashing."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-offenses", "url": "https://developer.polkadot.com/wiki/learn/learn-offenses/#disabling", "page_title": "Offenses & Slashes on Polkadot", "index": 4, "depth": 3, "title": "Disabling", "anchor": "disabling", "start_char": 15527, "end_char": 16085, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a14eab088b289bb00b2c16c631e4e3a36e1debccf55f5ddaec90e627024f2df9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Disabling\n\n**Disabling** stops validators from performing specific actions after they have committed an\noffense. Disabling is further divided into:\n\n- On-chain disabling lasts for a whole era and stops validators from block authoring, backing, and\n  initiating a dispute.\n- Off-chain disabling lasts for a session, is caused by losing a dispute, and stops validators from\n  initiating a dispute.\n\nOff-chain disabling is always a lower priority than on-chain disabling. Off-chain disabling\nprioritizes disabling first backers and then approval checkers."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-offenses", "url": "https://developer.polkadot.com/wiki/learn/learn-offenses/#reputation-changes", "page_title": "Offenses & Slashes on Polkadot", "index": 5, "depth": 3, "title": "Reputation Changes", "anchor": "reputation-changes", "start_char": 16085, "end_char": 16797, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a14eab088b289bb00b2c16c631e4e3a36e1debccf55f5ddaec90e627024f2df9", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Reputation Changes\n\nSome minor offenses often connected to spamming are only punished by Networking Reputation Changes.\nWhen validators connect to each other, they use a reputation metric for each of their peers. If our\npeers provide valuable data and behave appropriately, the system adds reputation; if they provide us\nwith faulty or spam data, the system reduces their reputation. A validator can lose enough\nreputation so that the peers will temporarily close their channels. This helps in fighting against\nDoS (Denial of Service) attacks. The consequences of closing channels may vary. In general,\nperforming validator tasks under reduced reputation will be harder, resulting in lower validator\nrewards."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#general", "page_title": "Parachains FAQ", "index": 0, "depth": 2, "title": "General", "anchor": "general", "start_char": 598, "end_char": 610, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## General"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#what-is-parachain-consensus", "page_title": "Parachains FAQ", "index": 1, "depth": 3, "title": "What is \"parachain consensus\"?", "anchor": "what-is-parachain-consensus", "start_char": 610, "end_char": 1156, "estimated_token_count": 101, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What is \"parachain consensus\"?\n\n\"Parachain consensus\" is special in that it will follow the relay chain. Parachains cannot use other\nconsensus algorithms that provide their own finality. Only sovereign chains (that must bridge to the\nrelay chain via a parachain) can control their own consensus. Parachains have control over how\nblocks are authored and by whom. The relay chain guarantees valid state transitions. Executing a\nblock finality outside the context of the relay chain is outside the scope of trust that the relay\nchain provides."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#how-about-parachains-that-are-not-substrate-based", "page_title": "Parachains FAQ", "index": 2, "depth": 3, "title": "How about parachains that are not Substrate-based?", "anchor": "how-about-parachains-that-are-not-substrate-based", "start_char": 1156, "end_char": 2000, "estimated_token_count": 180, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### How about parachains that are not Substrate-based?\n\nSubstrate provides [FRAME Pallets](../../reference/parachains/index.md#frame)\nas part of its framework to seamlessly build a rustic-based blockchain. Part of FRAME are pallets\nthat can be used for consensus. Polkadot, being a Substrate-based chain, relies on BABE as the block\nproduction scheme and GRANDPA as the finality gadget as part of its consensus mechanism.\nCollectively, this is a [Hybrid Consensus Model](learn-consensus.md#hybrid-consensus), where block\nproduction and block finality are separate. Parachains only need to produce blocks as they can rely\non the relay chain to validate the state transitions. Thus, parachains can have their own block\nproduction where the [collators](learn-collator.md) act as the block producers, even if the\nparachain is not Substrate-based."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#is-100-a-hard-limit-on-the-number-of-parachains-that-can-be-supported", "page_title": "Parachains FAQ", "index": 3, "depth": 3, "title": "Is 100 a hard limit on the number of Parachains that can be supported?", "anchor": "is-100-a-hard-limit-on-the-number-of-parachains-that-can-be-supported", "start_char": 2000, "end_char": 2662, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Is 100 a hard limit on the number of Parachains that can be supported?\n\nNo. The network went through a significant number of optimizations, and there are\n[several updates planned](https://polkadot.network/blog/polkadot-roadmap-roundup/) in the near\nfuture. The exact number of parachains that the relay chain can support without any degradation in\nperformance is yet to be discovered. Also, with the\n[blockspace over blockchains](https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/) paradigm\nwhich brings on-demand parachains into the picture, there is no hard limit number on the number of\nblockchains that can be supported by the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#what-happens-to-parachains-when-the-number-of-validators-drops-below-a-certain-threshold", "page_title": "Parachains FAQ", "index": 4, "depth": 3, "title": "What happens to parachains when the number of validators drops below a certain threshold?", "anchor": "what-happens-to-parachains-when-the-number-of-validators-drops-below-a-certain-threshold", "start_char": 2662, "end_char": 4579, "estimated_token_count": 378, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### What happens to parachains when the number of validators drops below a certain threshold?\n\nThe minimal safe ratio of validators per parachain is 5:1. With a sufficiently large set of\nvalidators, the randomness of their distribution along with\n[availability and validity](./learn-parachains-protocol.md#availability-and-validity-anv-protocol) will make sure security is\non-par. However, should there be a big outage of a popular cloud provider or another network\nconnectivity catastrophe, it is reasonable to expect that the number of validators per chain will\ndrop.\n\nDepending on how many validators went offline, the outcome differs.\n\nIf a few validators went offline, the parachains whose validator groups are too small to validate a\nblock will skip those blocks. Their block production speed will slow down to an increment of six\nseconds until the situation is resolved and the optimal number of validators is in that parachain's\nvalidator group again.\n\nIf anywhere from 30% to 50% of the validators go offline, availability will suffer because we need\ntwo-thirds of the validator set to back the parachain candidates. In other words, all parachains\nwill stop until the situation is resolved. Finality will also stop, but low-value transactions on\nthe relay chain should be safe enough to execute, despite common forks. Once the required number of\nvalidators are in the validator set again, parachains will resume block production.\n\nGiven that collators are full nodes of the relay chain and the parachain they are running, they will\nbe able to recognize a disruption as soon as it occurs and should stop producing block candidates.\nLikewise, it should be easy for them to recognize when it's safe to restart block production -\nperhaps based on finality delay, validator set size or some other factor that is yet to be decided\nwithin [Cumulus](https://github.com/paritytech/polkadot-sdk/tree/master/cumulus)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#polkadot-sdk", "page_title": "Parachains FAQ", "index": 5, "depth": 3, "title": "Polkadot SDK", "anchor": "polkadot-sdk", "start_char": 4579, "end_char": 4792, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot SDK\n\nPolkadot SDK is a set of tools that enable developers to build their own\napplications as parachains. For more information, see the [Parachain Development page](../../parachains/get-started.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#security", "page_title": "Parachains FAQ", "index": 6, "depth": 2, "title": "Security", "anchor": "security", "start_char": 4792, "end_char": 4805, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Security"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#is-security-correlated-to-the-number-of-validators-what-about-the-number-of-parachains", "page_title": "Parachains FAQ", "index": 7, "depth": 3, "title": "Is security correlated to the number of validators? What about the number of parachains?", "anchor": "is-security-correlated-to-the-number-of-validators-what-about-the-number-of-parachains", "start_char": 4805, "end_char": 5495, "estimated_token_count": 125, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Is security correlated to the number of validators? What about the number of parachains?\n\nSecurity is independent of the number of parachains that are connected to the Polkadot relay chain.\nThe correlation of security and the number of validators exists as the higher number of validators\nwill give the network stronger decentralization properties and make it harder to try to take down.\nHowever, the biggest indicator of the security of the network is the economic signal of the number\nof DOT that are bonded and staked. The greater the number of DOT staked by honest validators and\nnominators, the higher the minimum amount of DOT an attacker would need to acquire a validator slot."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-faq", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-faq/#in-what-scenarios-do-parachains-need-their-own-security", "page_title": "Parachains FAQ", "index": 8, "depth": 3, "title": "In what scenarios do parachains need their own security?", "anchor": "in-what-scenarios-do-parachains-need-their-own-security", "start_char": 5495, "end_char": 6485, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:386859f6110afc80c62dce144b744fc3be9e9e3fe69986c815b5180ac0285b4a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### In what scenarios do parachains need their own security?\n\nMost parachains do not need to worry about their own security, since all state transitions are\nsecured by the Polkadot relay chain validator set. However, in some cases (which are considered more\nexperimental), parachains may require their own security. In general, these cases will revolve\naround lack of data available to relay chain validators.\n\nOne example is if the state transition function is some succinct or zero-knowledge proof, the\nparachain would be responsible for keeping its data available as the relay chain won't have it.\nAdditionally, for chains with their own consensus, like the one that enables fast payments on\n[Blink Network](https://www.youtube.com/watch?v=sf5GMDlG7Uk), there would probably need to be a\nByzantine agreement between stakers before a parachain block is valid. The agreement would be\nnecessary because the data associated with the fast consensus would be unknown to relay chain\nvalidators."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#main-actors", "page_title": "Security Protocol Overview", "index": 0, "depth": 2, "title": "Main Actors", "anchor": "main-actors", "start_char": 792, "end_char": 808, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Main Actors"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#validatorslearnlearn-validatormd", "page_title": "Security Protocol Overview", "index": 1, "depth": 3, "title": "[Validators](../learn/learn-validator.md)", "anchor": "validatorslearnlearn-validatormd", "start_char": 808, "end_char": 1198, "estimated_token_count": 90, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### [Validators](../learn/learn-validator.md)\n\nThey are responsible for validating the proposed parachain's blocks by checking the\n**Proof-of-Validity** (PoV) of the blocks and ensuring the PoV remains available for a designated\nperiod. They have \"skin in the game\", meaning they have funds bonded on-chain that can be partially\nor fully confiscated by the network in case of misbehavior."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#collatorslearnlearn-collatormd", "page_title": "Security Protocol Overview", "index": 2, "depth": 3, "title": "[Collators](../learn/learn-collator.md)", "anchor": "collatorslearnlearn-collatormd", "start_char": 1198, "end_char": 1452, "estimated_token_count": 55, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### [Collators](../learn/learn-collator.md)\n\nThey create the PoV that validators know how to check. Creating PoV requires familiarity with\ntransaction format and block authoring rules of a specific parachain, as well as having access to\nits full state."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#fishermen-deprecated", "page_title": "Security Protocol Overview", "index": 3, "depth": 3, "title": "Fishermen: Deprecated", "anchor": "fishermen-deprecated", "start_char": 1452, "end_char": 2347, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fishermen: Deprecated\n\nFishermen are not planned for formal implementation, despite previous proposals in the\n[AnV protocol](./learn-parachains-protocol.md#availability-and-validity-anv-protocol).\n\nThe idea behind Fishermen is that they are full nodes of parachains, like collators, but perform a\ndifferent role in relation to the network. Instead of packaging the state transitions and producing\nthe next parachain blocks as collators do, fishermen will watch this process and ensure no invalid\nstate transitions are included.\n\nTo address the motivation behind the Fishermen design consideration, the current\n[secondary backing checkers](#assignments-secondary-checks) perform a similar role in relation to\nthe network. From a security standpoint, security is based on having at least one honest validator\neither among parachain validators or secondary checker (more about this later on)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#protocols-summary", "page_title": "Security Protocol Overview", "index": 4, "depth": 2, "title": "Protocols' Summary", "anchor": "protocols-summary", "start_char": 2347, "end_char": 2370, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Protocols' Summary"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#parachain-protocol", "page_title": "Security Protocol Overview", "index": 5, "depth": 3, "title": "Parachain Protocol", "anchor": "parachain-protocol", "start_char": 2370, "end_char": 3286, "estimated_token_count": 193, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Parachain Protocol\n\nThe parachain protocol is divided into two main phases:\n\n- [**Inclusion Pipeline**](#inclusion-pipeline): Collators send parachain blocks (parablocks) with\n  PoV to Validators. Validators verify if the parablocks follow the state transition rules of the\n  parachain and sign statements that can have a positive or negative outcome. With enough positive\n  statements, the block is **backed** and **included** in the relay chain, but is still pending\n  approval.\n- [**Approval Process**](#approval-process): Validators perform additional checks that, if positive,\n  allow the parablock to be **approved**.\n\nThe figure below shows a representation of a parachain with collators and validators. The figure\nalso shows the journey of a parachain block (white square) through the Inclusion Pipeline and the\nApproval Process.\n\n![parachain-protocol-summary](../assets/parachain-protocol-summary.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#availability-and-validity-anv-protocol", "page_title": "Security Protocol Overview", "index": 6, "depth": 3, "title": "Availability and Validity (AnV) Protocol", "anchor": "availability-and-validity-anv-protocol", "start_char": 3286, "end_char": 4251, "estimated_token_count": 210, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Availability and Validity (AnV) Protocol\n\nThe Availability and Validity (AnV) Protocol is a way of looking at the Parachain Protocol from\nanother perspective, emphasizing the importance of a parablock being available and valid before\nbeing included in the finalized relay chain. It is divided into five different phases, three within\nthe [Inclusion Pipeline](#inclusion-pipeline) and two within the\n[Approval Process](#approval-process):\n\n- **Inclusion Pipeline**\n  1.  [Parachain phase](#parachain-phase)\n  2.  [Relay chain submission phase](#relay-chain-submission-phase)\n  3.  [Availability and unavailability phase](#availability-and-unavailability-phase)\n- **Approval Process**\n  1.  [Assignments and secondary (validity) checks](#assignments-secondary-checks)\n  2.  [Chain Selection](#chain-selection)\n\nIn the Inclusion Pipeline, a parablock is made available (or unavailable), while in the Approval\nProcess a parablock is checked if it is valid or not."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#inclusion-pipeline", "page_title": "Security Protocol Overview", "index": 7, "depth": 2, "title": "Inclusion Pipeline", "anchor": "inclusion-pipeline", "start_char": 4251, "end_char": 4274, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Inclusion Pipeline"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#overview", "page_title": "Security Protocol Overview", "index": 8, "depth": 3, "title": "Overview", "anchor": "overview", "start_char": 4274, "end_char": 6716, "estimated_token_count": 527, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Overview\n\nThe inclusion pipeline is the path of a parachain block (or parablock) from its creation to its\ninclusion into the non-finalized relay chain (i.e. in a fork of the relay chain).\n\n![parachain-inclusion-pipeline](../assets/parachain-inclusion-pipeline.png)\n\nThe figure above shows the path of a candidate block through the Inclusion pipeline. The block\nchanges its status through this path as follows:\n\n- Candidate: A block with its PoV is put forward by a collator to a para-validator (in this case\n  V1). The candidate block is shown as a white square with one white tick mark at the side (PoV from\n  the collator). Note the candidate is not valid yet and can still fail to be included in the Relay\n  Chain.\n- Seconded: The block is put forward by the para-validator V1 to other para-validators (in this case\n  V2 and V3). The seconded block is shown as a white square with a white tick mark and a yellow tick\n  mark on top of it. The yellow mark show the PoV from para-validator V1.\n- Backable: The block validity is attested by a majority of the para-validators. The backable block\n  is shown as white square with a white tick mark and three yellow tick marks on top of it. The\n  yellow marks show the PoV from the para-validators, while the white mark the PoV from the\n  collator.\n- Backed: The block is backed and noted in a fork on the relay chain by a relay chain block author\n  (in this case V4). The backed block is shown as a square with white background and yellow border\n  enclosing a \"B\". The backed block can still fail to be included in the relay chain. Note that for\n  simplicity here the backed parachain block is represented within the relay chain block, but in\n  reality a relay chain block does not contain the parablocks themselves (more about this later).\n- Pending availability: The block is backed but not considered available yet.\n- Included: The block is backed and considered available (we have a parablock). Included parablocks\n  are shown as square with white background and yellow border enclosing an \"I\".\n\n!!!info \"Asynchronous Backing\"\n    Parablocks' backing and inclusion take 12 seconds to be recorded on the relay chain, i.e. backing happens in one relay chain block (6 seconds) and inclusion in another relay chain block (additional 6 seconds, see Figure above). With [**asynchronous backing**](./learn-async-backing.md), backing and inclusion can be recorded in just one relay chain block."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#parachain-phase", "page_title": "Security Protocol Overview", "index": 9, "depth": 3, "title": "Parachain Phase", "anchor": "parachain-phase", "start_char": 6716, "end_char": 8875, "estimated_token_count": 453, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Parachain Phase\n\nIn the parachain phase, some validators are assigned to parachains by the **Validator Assignment\nRoutine** (these validators are called para-validators). Para-validators establish a connection with\ncollators, which propose candidate blocks together with Proof-of-Validity (PoV) to para-validators\nvia the **Collator Distribution Subsystem**.\n\nPara-validators participate in the **Candidate Backing Subsystem**. A para-validator needs to check\nif the candidate block follows the\n[state transition](../learn/learn-parachains.md#state-transitions) rules of the parachain. Because\nstates are stored within Merkle trees, a para-validator can verify state transitions without having\naccess to the entire state, but it needs:\n\n- The block candidate (list of state transitions)\n- The values in the parachain's database that the block modifies\n- The hashes of the unaffected points in the Merkle tree\n\nThis set of information is the proof-of-validity (PoV).\n\nOnce a para-validator has the PoV, it gossips this information to the other para-validators, who\ncheck the candidate block against the PoV. Candidates that gather more than half of signed validity\nstatements are considered **backable** (i.e. they _seem_ to represent a valid state transition), and\ntheir backing is the set of signed statements. The para-validators can then start to construct the\n[**candidate receipt**](#candidate-receipts) (this is what goes into the relay chain block) and an\n[**erasure coding**](#erasure-codes) (this is what will make the parablock available, more on this\nlater on) that will be sent to all validators in the network.\n\n!!!info \"Polkadot guarantees valid state transitions, not valid states\"\n    Validators do not inspect every value in a parachain's state, only those that are modified. This insures that the modification is valid.\n\nPreviously, we said that backable blocks _seem_ to represent valid state transitions because\npara-validators are a small subset of all validators. Thus, it is possible to have the majority of\nthem dishonest. Later on, we will see that more validators with come in to help to make sure the\nparablock is fully valid."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#relay-chain-submission-phase", "page_title": "Security Protocol Overview", "index": 10, "depth": 3, "title": "Relay Chain Submission Phase", "anchor": "relay-chain-submission-phase", "start_char": 8875, "end_char": 9822, "estimated_token_count": 198, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Relay Chain Submission Phase\n\nThe [receipt](#candidate-receipts) of the backable parablock is added to the relay chain transaction\nqueue together with other receipts from other parachains. Receipts are gossiped around, and when a\nrelay chain block author wins [BABE](./learn-consensus.md#block-production-babe) slot leadership, it\nwill select a candidate receipt to include in a block on a fork of the relay chain.\n\nA block author can note up to 1 backable candidate for each parachain to be included in the Relay\nChain block alongside its backing. Once included in a fork of the relay chain the candidate is\nconsidered **backed** in that fork. The candidate is considered to be in **\"pending availability\"**\nstatus, and it can only be considered a part of the parachain once proven available. Remember, at\nthis stage validators of the relay chain already received the\n[erasure coding information](#erasure-codes) of that specific parablock."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#availability-and-unavailability-phase", "page_title": "Security Protocol Overview", "index": 11, "depth": 3, "title": "Availability and Unavailability Phase", "anchor": "availability-and-unavailability-phase", "start_char": 9822, "end_char": 12039, "estimated_token_count": 442, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Availability and Unavailability Phase\n\nDuring the availability and unavailability phases, the validators will participate to **Availability\nDistribution Subsystem** to ensure availability of the candidate. They gossip the\n[erasure coded](#erasure-codes) pieces among the network. At least 1/3 + 1 validators must report\nthat they possess their piece of the code word. Once this threshold of validators has been reached,\nthe network can consider the candidate block available. The block is graduated to being a full\nparachain block, and its header will be included in that fork of the relay chain. The information\nabout the candidate availability is noted in the subsequent relay chain blocks of that fork.\n\nThe availability check by the block author ensures that the relay chain will only include blocks for\nwhich the validators distributed their erasure-coded chunks, but it does not guarantee their\nvalidity. Because the number of para-validators on each parachain is so low, collusion is a\nreasonable concern. By separating block production\n([BABE](./learn-consensus.md#block-production-babe)) from finality\n([GRANDPA](./learn-consensus.md#finality-gadget-grandpa)), validators can perform extra validity\nchecks after a block is produced but before it is finalized.\n\nThus, once the parablock is considered available and part of the parachain, it is still \"pending\napproval\". The Inclusion Pipeline must conclude for a specific parachain before a new block can be\naccepted on that parachain. After inclusion, the [Approval Process](#approval-process) starts and it\nmakes sure the block is valid, and it can run for many parachain blocks at once.\n\n!!!info \"Data Availability - Erasure Codes of Parachain Blocks and PoVs\"\n    The erasure code chunks necessary for reconstructing parachain blocks and their respective Proofs-of-Validity (PoV) are stored on the relay chain validator’s hardware (disk) and made available to the relay chain network for up to 24 hours. It is important to note that this data is neither stored within the relay chain blocks nor in the chain state. Only the root of those chunks is embedded within the [candidate receipt](#candidate-receipts) and is stored in the relay chain blocks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#failure-to-inclusion", "page_title": "Security Protocol Overview", "index": 12, "depth": 3, "title": "Failure to Inclusion", "anchor": "failure-to-inclusion", "start_char": 12039, "end_char": 12502, "estimated_token_count": 88, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Failure to Inclusion\n\nThe candidate can fail to be included in the parachain in any of the following ways:\n\n- The collator cannot propagate the block to any of the assigned validators.\n- The candidate is not backed by validators participating in the Candidate Backing subsystem.\n- A relay chain block author does not select the candidate.\n- The candidate's PoV is not considered available within a timeout, and the block is discarded from\n  the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#approval-process", "page_title": "Security Protocol Overview", "index": 13, "depth": 2, "title": "Approval Process", "anchor": "approval-process", "start_char": 12502, "end_char": 12523, "estimated_token_count": 4, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Approval Process"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#overview_1", "page_title": "Security Protocol Overview", "index": 14, "depth": 3, "title": "Overview", "anchor": "overview_1", "start_char": 12523, "end_char": 15121, "estimated_token_count": 516, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Overview\n\nOnce the parablock is considered available and part of the parachain, it is still \"pending\napproval\". At this stage, the parablock is tentatively included in the parachain, although more\nconfirmation is necessary. The validators assigned to the parachain (i.e. the parachain validators)\nare sampled from a validator set assumed to be 1/3 dishonest in the worst-case scenario. In this\ncase, it is likely that the majority of the random para-validators sampled for a specific parachain\nare dishonest and can back a candidate wrongly. To address this, the **Approval Process** allows\ndetecting misbehavior after the fact without allocating more para-validators, which would ultimately\nreduce the system's throughput. As a parablock can accept children blocks after being considered\navailable, failure to pass the approval process will invalidate the parablock and its descendants\n(children blocks). Only the validators who backed the block in question will be\n[slashed](./learn-offenses.md), not those who backed the descendants.\n\nThe approval pipeline can be divided into the following steps:\n\n1. Parablocks included by the Inclusion Pipeline are pending approval for a time window known as the\n   **secondary checking window**.\n2. During the secondary checking window, validators (secondary checkers) randomly self-select based\n   on a [VRF](./learn-cryptography.md#vrf) lottery to perform secondary checks on each of the\n   parablock.\n3. Secondary checkers acquire the parablock with PoV (erasure codings are necessary to reconstruct\n   PoV) and re-run the validation function.\n4. Secondary checkers gossip about the results of their checks. Contradictory results lead to an\n   escalation in which all validators must check the block. The validators on the losing side will\n   be slashed.\n5. At the end of the process the parablock is either approved or rejected.\n\nThe figure below shows the path of a parachain block when it exits the Inclusion Pipeline, and\nenters the Approval Process. The parablock becomes accepted when it is backed, available and\n**undisputed**. The parablock is checked a second time by a subset of validators (V5, V6 and V7),\nand if there are no contradictory results the block is approved and gossiped to other relay chain\nvalidators. Note the parablock after secondary checks is shown as a square with a white background a\nyellow border enclosing an \"I\" (stands for _included_), and three white ticks (one for each\nsecondary check). Approved para-blocks are shown as yellow squares.\n\n![parachain-approval-process](../assets/parachain-approval-process.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#assignments-secondary-checks", "page_title": "Security Protocol Overview", "index": 15, "depth": 3, "title": "Assignments & Secondary Checks", "anchor": "assignments-secondary-checks", "start_char": 15121, "end_char": 20175, "estimated_token_count": 1065, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Assignments & Secondary Checks\n\nHaving a bad parablock on a fork of the relay chain is not catastrophic as long as the block is not\napproved and finalized by the finality gadget\n[GRANDPA](./learn-consensus.md#finality-gadget-grandpa). If the block is not finalized, the fork on\nthe chain containing that block can be ignored in favor of another fork containing good blocks.\nDealing with a bad parablock includes the following stages:\n\n- Detection: the bad block must be detected by honest validators.\n- Escalation: the honest validators must start a [dispute](#disputes).\n- Consequences: the backer for that parablock is [slashed](./learn-offenses.md).\n\nThe result of the dispute must be transplantable to all other forks so that malicious validators are\nslashed in all possible histories and so that honest validators will ignore any forks containing\nthat parablock.\n\n!!!info \"Parablocks vs. relay chain Blocks\"\n    It is important to understand that a relay chain block does not contain parablocks, but para-headers. Parachain blocks are within the parachain. Thus, it makes more sense to think of relay chain blocks as having been approved instead of parablocks that have been approved. A relay chain block containing information about approved parablocks can be considered approved as long as its parent relay chain block is also approved. Thus, the validity of a relay chain block depends on the validity of its ancestry.\n\nValidators perform two main actions in the Approval Process:\n\n- **[Assignments](https://paritytech.github.io/polkadot/book/protocol-approval.html#assignments)**\n  determine which validators perform approval checks on which candidates, ensuring each candidate\n  receives enough random checkers. This stage tracks approval votes to identify when\n  [no-show](https://paritytech.github.io/polkadot/book/protocol-approval.html#no-shows) approval\n  checks take suspiciously long. It also tracks relay chain\n  [equivocations](../learn/learn-offenses.md#slash-for-equivocation) to determine when adversaries\n  possibly gained foreknowledge about assignments and add more checks in those cases. Assignees\n  determine their own assignments to check specific candidates using two or three\n  [assignment criteria](https://paritytech.github.io/polkadot/book/protocol-approval.html#assignment-criteria),\n  which are based on two possible\n  [stories](https://paritytech.github.io/polkadot/book/protocol-approval.html#stories) about the\n  relay chain block that included the candidate (i.e. declared the candidate available).\n  [Assignment notices](https://paritytech.github.io/polkadot/book/protocol-approval.html#announcements--notices)\n  are gossiped among nodes so that all validators know which validators should check which\n  candidates, and if any candidate requires more checkers.\n- **Approval checks** perform the checks by obtaining the candidate, verifying its validity, sending\n  out the approval vote, or initiating a dispute. Approval checks have a no-show timeout window\n  (i.e. longer than one relay chain slot) to succeed in reconstructing the candidate block, redo its\n  erasure coding to check the candidate receipt, and recheck the candidate block itself. A validator\n  becomes tagged as a no-show if it does not approve or dispute within the no-show timeout window.\n  Because validators can be overloaded with assignments, they can intentionally delay sending their\n  assignment notice to avoid creating no-shows (see more in\n  [Assignment postponement](https://paritytech.github.io/polkadot/book/protocol-approval.html#assignment-postponement)).\n\nThese two steps first run as off-chain consensus protocols using messages gossiped among all\nvalidators, and then as on-chain record of those protocols' progress. The on-chain protocol is\nneeded to provide rewards for the off-chain protocol. The\n[on-chain verification](https://paritytech.github.io/polkadot/book/protocol-approval.html#on-chain-verification)\nhas two phases: a) assignments notices and approval votes are recorded in a relay chain block, and\nb) in another relay chain block notes are fed into the approval code.\n\nThe gossiped messages are of two types, assignment notices, and approval votes, and are signed with\n[approval keys](https://paritytech.github.io/polkadot/book/protocol-approval.html#approval-keys).\nSuch keys are part of the [session keys](./learn-cryptography.md#session-keys) used by validators.\nBriefly, approval keys are:\n\n- **Approval assignment keys** that are sr25519 keys used only for assignment criteria\n  [VRF](./learn-cryptography.md#vrf).\n- **Approval vote keys** that are ed25519 and would only sign off on a candidate parablock validity.\n\n!!!info\n    For detailed information about the approval process, see dedicated section in [The Polkadot Parachain Host Implementers' Guide](https://paritytech.github.io/polkadot/book/protocol-approval.html).\n\nAccepting a parablock is the result of having passed through the detection stage without dispute, or\nhaving passed through and escalation/dispute stage with a positive outcome."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#chain-selection", "page_title": "Security Protocol Overview", "index": 16, "depth": 3, "title": "Chain Selection", "anchor": "chain-selection", "start_char": 20175, "end_char": 21185, "estimated_token_count": 227, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Chain Selection\n\nAfter enough secondary checks have been performed on all candidate receipts within a block,\nvalidators can vote for that block (and all previous blocks) in GRANDPA. Once the block has more\nthan 2/3 of positive votes, the block is finalized on chain.\n\nChain selection is used to select blocks to build on and finalize. These processes need to\nconsistent among nodes and resilient to a maximum proportion of malicious nodes. The parachain host\nuses a block authoring system and a finality gadget. The chain selection strategy involves a\n_[leaf-selection rule](https://paritytech.github.io/polkadot/book/protocol-chain-selection.html)_\nand a set of\n_[finality constraints](https://paritytech.github.io/polkadot/book/protocol-chain-selection.html#the-best-chain-containing-rule)_.\n\n!!!info\n    For detailed information about chain selection, see dedicated section in [The Polkadot Parachain Host Implementers' Guide](https://paritytech.github.io/polkadot/book/protocol-chain-selection.html)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#candidate-receipts", "page_title": "Security Protocol Overview", "index": 17, "depth": 2, "title": "Candidate Receipts", "anchor": "candidate-receipts", "start_char": 21185, "end_char": 22094, "estimated_token_count": 185, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Candidate Receipts\n\nPoV are typically between 1 MB and 10 MB in size and are not included in the relay chain blocks. For\nPolkadot to scale to hundreds of parachains, PoV need to be represented by something smaller on the\nrelay chain: candidate receipts. A para-validator constructs a candidate receipt for a parachain\nblock by signing:\n\n- The parachain ID.\n- The collator's ID and signature.\n- A hash of the parent block's candidate receipt.\n- A Merkle root of the block's erasure-coded pieces.\n- A Merkle root of any outgoing messages.\n- A hash of the block.\n- The state root of the parachain before block execution.\n- The state root of the parachain after block execution.\n\nThis information is of constant size, while the actual PoV block of the parachain can be variable\nlength. It is enough information for anyone that obtains the full PoV block to verify the state\ntransition contained inside of it."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#erasure-codes", "page_title": "Security Protocol Overview", "index": 18, "depth": 2, "title": "Erasure Codes", "anchor": "erasure-codes", "start_char": 22094, "end_char": 23966, "estimated_token_count": 362, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Erasure Codes\n\nBefore sending the candidate receipt to the relay chain transaction queue, the para-validator who\nconstructs the receipt must also construct an erasure coding of the parachain block.\n\nAn erasure coding takes a message (in this case, the parachain block and PoV) and creates a set of\nsmaller messages such that you can reconstruct the original message by obtaining a fraction of the\nsmaller messages. In the case of Polkadot, the total number of smaller messages is equal to the\ntotal number of validators and the fraction is 1/3.\n\nThe para-validator creates the erasure coding chunks, puts them into their Merkle tree, and sends\nout each chunk (together with the candidate receipt) to a corresponding validator on the Relay\nChain. Validators who receive the receipts with an erasure coding chunk will include the receipt in\nthe relay chain queue, where an author can include it in a block.\n\nThe type of erasure codes used by Polkadot's availability scheme are\n[Reed-Solomon](https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction) codes, which\nalready enjoy a battle-tested application in technology outside the blockchain industry. One example\nis found in the compact disk industry. CDs use Reed-Solomon codes to correct any missing data due to\ninconsistencies on the disk face such as dust particles or scratches.\n\nIn Polkadot, the erasure codes are used to keep parachain state available to the system without\nrequiring all validators to keep tabs on all the parachains. Instead, validators share smaller\npieces of the data and can later reconstruct the entire data under the assumption that 1/3+1 of the\nvalidators can provide their pieces of the data.\n\n!!!note\n    The 1/3+1 threshold of validators that must be responsive to construct the full parachain state data corresponds to Polkadot's security assumption about Byzantine nodes."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#disputes", "page_title": "Security Protocol Overview", "index": 19, "depth": 2, "title": "Disputes", "anchor": "disputes", "start_char": 23966, "end_char": 28388, "estimated_token_count": 891, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Disputes\n\nAll parachain blocks that are in the finalized relay chain should be valid. This does not apply to\nbacked blocks that are not included. To ensure nothing invalid ends up in the finalized relay chain,\nthere are approval checks (described above) and disputes. The latter ensures that each attempt to\ninclude something invalid is caught and the offending validators are punished.\n\nFalse positives can happen; those actors responsible for it will be [slashed](./learn-offenses.md).\nTo detect false positives, PoV information must be available after the block has been included to\nthe relay chain via the [availability scheme](#availability-and-unavailability-phase).\n\nDisputes are _independent from a particular fork_, while backing and approval operate on particular\nforks. The approval voting stops if an alternative fork (which might not contain the\ncurrently-approved candidate) is finalized. The sole purpose of the approval process is to make sure\ninvalid blocks are not finalized. However, even though the danger is past and the offending\nvalidators did not manage to get the invalid block approved, those validators need to get slashed\nfor the attempt.\n\nA dispute stems from a disagreement between two or more validators. For this to happen, a bad actor\nneeds to distribute an invalid block to honest validators. Scenarios leading to a dispute can be one\nof the following (ordered from most to least important):\n\n- A parablock included on a branch of the relay chain is bad\n- A parablock backed on a branch of the relay chain is bad\n- A parablock seconded, but not backed on any branch of the relay chain, is bad\n\nChecking a parachain block requires three pieces of data: the parachain validator code, the\navailability of data, and the candidate receipt. The validator code is available on-chain and\npublished ahead of time. Thus, a dispute process begins with the availability to ensure the\navailability of the data. Such a process will conclude quickly if the data is already available,\notherwise, the initiator of the dispute must make it available.\n\nDisputes have both off- and on-chain components. Slashing is handled on-chain, so votes by\nvalidators on either side of the dispute must be placed on-chain. Moreover, a dispute on one branch\nof the chain must be transposed to all active branches so that misbehavior can be punished in all\npossible histories. There is, thus, a distinction between _local_ (the one we are looking at) and\n_remote_ disputes relative to a particular branch of the relay chain.\n\nDisputes can be divided into three different phases:\n\n- [Dispute initiation](https://paritytech.github.io/polkadot/book/protocol-disputes.html#initiation):\n  Disputes are initiated by any validator who finds their opinion on the validity of a parablock in\n  opposition to another issued statement. The initiation begins off-chain by only nodes perceiving\n  that a parablock is bad. The validator can be one of the para-validators (i.e. one of the backers)\n  or one of the approval checkers. Note that if the dispute occurs during the backing phase, the\n  initiator must make the data available while if the dispute occurs during the approval process the\n  data is already available.\n- [Dispute participation](https://paritytech.github.io/polkadot/book/protocol-disputes.html#dispute-participation):\n  Once becoming aware of the dispute, all validators must participate.\n- [Dispute conclusion](https://paritytech.github.io/polkadot/book/protocol-disputes.html#dispute-conclusion):\n  Disputes conclude after a 2/3 supermajority is reached on either side. Disputes may also conclude\n  after a timeout. This will only happen if the majority of validators are unable to vote for some\n  reason.\n\nThe on-chain component of the dispute can be initiated by providing any two conflicting votes and it\nalso waits for a 2/3 supermajority on either side. The component also tracks which parablocks have\nalready been disputed so that the same parablock can be disputed only once on any branch of the\nrelay chain. Inclusion is halted for the parachain until the dispute resolves.\n\n!!!info\n    For detailed information about disputes, see dedicated section in [The Polkadot Parachain Host Implementers' Guide](https://paritytech.github.io/polkadot/book/protocol-disputes.html). In the Guide, there are also more details about [disputes' flows](https://paritytech.github.io/polkadot/book/disputes-flow.html)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#network-asynchrony", "page_title": "Security Protocol Overview", "index": 20, "depth": 2, "title": "Network Asynchrony", "anchor": "network-asynchrony", "start_char": 28388, "end_char": 29976, "estimated_token_count": 348, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Network Asynchrony\n\nWe have mentioned how a relay chain block author must select the candidate and note it on the Relay\nChain (we say the block is backed). The relay chain block author is selected by\n[BABE](./learn-consensus.md#block-production-babe), which is a forkful algorithm. This means that\ndifferent block authors are chosen at the same time, and they may not work on the same block parent\n(i.e. the representations in the previous figures are simplistic). Also, the sets of validators and\nparachains are not fixed, and the validators' assignments to parachains is also flexible.\n\nWe say that the network is **asynchronous** since there will be validators who have received a block\nand other validators who did not. Thus, the network is variable, and it exists in multiple states.\nIn the figure below (_left_), Group 1 received block C while Group 2 did not due to network\nasynchrony. Validators in Group 2 can build another block on top of B, called C'. Assume that\nafterward, some validators become aware of both C and C' while others remain aware of one of them\n(_right_). Validators in Group 3 must be aware of the network state in each head (C and C’), and\nthey may contribute to some or full extent on both. It is possible that due to network asynchrony,\ntwo forks may grow in parallel for some time, but eventually, one fork will be chosen by the\nfinality gadget. In the absence of an adversarial network, it is unlikely that two forks will\ncoexist for some time as there will be validators aware of both chain heads.\n\n![parachain-forks](../assets/parachain-forks.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains-protocol", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains-protocol/#further-resources", "page_title": "Security Protocol Overview", "index": 21, "depth": 2, "title": "Further Resources", "anchor": "further-resources", "start_char": 29976, "end_char": 30456, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:e6cc3ff40b472328e146ca60775088dfac8746e186c8e1dc1d7edb4d7241f64c", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Further Resources\n\n- [Path of a Parachain Block](https://polkadot.network/the-path-of-a-parachain-block/) - Article by\n  Parity analyst Joe Petrowski expounds on the validity checks that a parachain block must pass in\n  order to progress the parachain.\n- [Availability and Validity](https://github.com/w3f/research/tree/85cd4adfccb7d435f21cd9fd249cd1b7f5167537/docs/papers/AnV) -\n  Paper by the W3F Research Team that specifies the availability and validity protocol in detail."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#definition-of-a-parachain", "page_title": "Parachains", "index": 0, "depth": 2, "title": "Definition of a Parachain", "anchor": "definition-of-a-parachain", "start_char": 826, "end_char": 2095, "estimated_token_count": 249, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Definition of a Parachain\n\nA parachain is an application-specific data structure that is globally coherent and can be validated\nby the validators of the relay chain. They take their name from the concept of parallelized chains\nthat run parallel to the relay chain. Most commonly, a parachain will take the form of a blockchain,\nbut there is no specific need for them to be actual blockchains.\n\n![One parachain](../assets/one-parachain.png)\n\nDue to their parallel nature, they can parallelize transaction processing and achieve scalability of\nthe protocol. They [inherit the security](#shared-security) of the entire network and can\ncommunicate with other parachains through the [XCM](learn-xcm.md) format.\n\nParachains are maintained by a network maintainer known as a [collator](learn-collator.md). The role\nof the collator node is to maintain a full node of the parachain, retain all necessary information\nabout the parachain, and produce new block candidates to pass to the relay chain validators for\nverification and inclusion in the shared state. The incentivization of a collator node is an\nimplementation detail of the parachain. They are not required to be staked on the relay chain or own\nthe native token unless stipulated by the parachain implementation."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#state-transitions", "page_title": "Parachains", "index": 1, "depth": 3, "title": "State Transitions", "anchor": "state-transitions", "start_char": 2095, "end_char": 4087, "estimated_token_count": 419, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### State Transitions\n\nLike other blockchains, parachains are **deterministic state machines**. Each parachain has a\n**state**, executes a batch of transactions grouped into a block, and achieves a new state. Joe\nPetrowski provided in [this article](https://medium.com/polkadot-network/the-path-of-a-parachain-block-47d05765d7a) a\ngood analogy of a state with a light switch that can be either on or off, which is one of the\nsimplest examples of how a state machine functions. Each parachain has its own state, and the Relay\nChain links all those states into one state, i.e. a state of states. A multi-chain network like\nPolkadot can be viewed like one computer's state with many light switches where a **state transition\nfunction** is the logic to decide which switches should be toggled. Parachains have their own\ntransition rule, separate economies, governance mechanisms, and users.\n\nA parachain's state is stored in a [Merkle tree](https://en.wikipedia.org/wiki/Merkle_tree). Merkle\ntrees have the convenient property that if some values within the tree change, this will be\nreflected in the Merkle root (in this case, the state root). One can verify the change by only\nlooking at the new values and the paths that are affected within the tree.\n\nThe Polkadot Host requires that the state transitions performed on parachains be specified as a\n[Wasm](https://webassembly.org/) executable. Proofs of new state transitions that occur on a parachain must be\nvalidated against the registered state transition function (STF) that is stored on the relay chain\nby the validators before the relay chain acknowledges a state transition has occurred on a\nparachain. The key constraint regarding the logic of a parachain is that it must be verifiable by\nthe relay chain validators. Verification most commonly takes the form of a bundled proof of a state\ntransition known as a Proof-of-Verification (PoV) block, which is submitted for checking to the\nvalidators from one or more parachain collators."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#why-parachains", "page_title": "Parachains", "index": 2, "depth": 2, "title": "Why Parachains?", "anchor": "why-parachains", "start_char": 4087, "end_char": 4871, "estimated_token_count": 134, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Why Parachains?\n\nParachains are a solution to two fundamental problems in blockchains:\n\n- **Scalability**: Having one blockchain for many purposes makes it difficult to scale as future\n  implementations and upgrades will likely advantage some purposes and disadvantage others.\n  Conversely, having different blockchains will allow them to implement features without affecting\n  other chains.\n- **Flexibility**: It is reasonable to state a blockchain will either be really good at solving one\n  problem or not so good at trying to solve many problems. A blockchain specializing in solving a\n  specific problem has more leverage toward itself and its users. Parachains are purpose-built\n  blockchains are highly specialized and can take advantage of each other through cooperation."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#parachain-benefits", "page_title": "Parachains", "index": 3, "depth": 3, "title": "Parachain Benefits", "anchor": "parachain-benefits", "start_char": 4871, "end_char": 6184, "estimated_token_count": 233, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Parachain Benefits\n\nParachains contain their own runtime/STF logic and benefit from the shared security and the\ncross-consensus messaging provided by the relay chain. Parachains permit high flexibility and\ncustomization but require more effort to create and maintain over time. A production-grade parachain\nis typically more involved to create due to the complexity involved in blockchain networks'\ntechnical and economic aspects.\n\nParachains grant the creators more space to build the monetary system and other chain aspects from\nthe ground up. They will allow for a more concise and efficient execution of complex logic than a\nsmart contract platform could offer. Parachains also provide more flexibility in the form of\ngovernance and can perform complete upgrades in a less controversial way than the current process of\nhard forks.\n\nSome examples of features you can have on a parachain or parathread:\n\n- Custom fee structure (for example, pay a flat transaction fee or pay per byte).\n- Shared security and finalization via the relay chain (Polkadot or Kusama).\n- Custom monetary policy for the native token and local economy.\n- Treasury to be funded through transitions in your state function.\n- A governance mechanism that could manage a DAO that is responsible for allocating your on-chain\n  treasury."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#shared-security", "page_title": "Parachains", "index": 4, "depth": 3, "title": "Shared Security", "anchor": "shared-security", "start_char": 6184, "end_char": 7900, "estimated_token_count": 340, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Shared Security\n\nShared security, sometimes referred as _pooled security_, is one of the unique value propositions\nfor chains considering becoming a [parachain](learn-parachains.md) and joining the network. On a\nhigh level, shared security means that all parachains that are connected to the relay chain by\naccessing a core will benefit from the economic security provided by the relay chain\n[validators](learn-validator.md).\n\nThe notion of shared security is different from inter-chain protocols that build on an architecture\nof bridges. For bridge protocols, each chain is considered sovereign and must maintain its own\nvalidator set and economic security. One concern in these protocols is the point of scalability of\nsecurity. For example, one suggestion to scale blockchains is that of _scale by altcoins,_ which\nsuggests that transaction volumes will filter down to lower market cap altcoins as the bigger ones\nfill their blocks. A major flaw in this idea is that the lower market cap coins will have less\neconomic security attached and be easier to attack. A real-life example of a 51% attack occurred\nrecently (\n[Ethereum Classic attack on January 10, 2019](https://cointelegraph.com/news/ethereum-classic-51-attack-the-reality-of-proof-of-work)\n), in which an unknown attacker double spent 219_500 ETC (~1.1 million USD). This was followed by\ntwo more 51% attacks on ETC.\n\nPolkadot overcomes security scalability concerns since it gravitates all the economic incentives to\nthe relay chain and allows the parachains to tap into stronger guarantees at genesis. Sovereign\nchains must expend much more effort to grow the value of their coin so that it is sufficiently\nsecure against well-funded attackers."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#pow-vs-parachain-model", "page_title": "Parachains", "index": 5, "depth": 3, "title": "PoW vs Parachain Model", "anchor": "pow-vs-parachain-model", "start_char": 7900, "end_char": 9526, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### PoW vs Parachain Model\n\nLet's compare the standard sovereign security model that exists on current proof-of-work (PoW)\nchains to Polkadot's shared security model. Bitcoin, Zcash, and their derivatives, must bootstrap\ntheir independent network of miners and maintain a competitive portion of honest hashing power.\nSince mining is becoming a larger industry that increasingly centralizes key players, it is becoming\nmore real that a single actor may control enough hash power to attack a chain.\n\nThis means that smaller chains that cannot maintain a secure amount of hash power on their networks\ncould potentially be attacked by a large mining cartel at the simple whim of redirecting its hash\npower away from Bitcoin and toward a new and less secure chain.\n[51% attacks are viable today](https://www.crypto51.app) with attacks having been reported on\nEthereum Classic (see above),\n[Verge](https://coincentral.com/verge-suffers-51-attack-hard-forks-in-response/),\n[Bitcoin Gold](https://bitcoingold.org/responding-to-attacks/), and other cryptocurrencies.\n\nOn Polkadot, this disparity between chain security will not be present. When a parachain connects to\nthe relay chain, validators become the securers of that parachain's state transitions. The parachain\nwill only have the overhead of running a few collator nodes to keep the validators informed with the\nlatest state transitions and proofs/witness. Validators will then check these for the parachains to\nwhich they are assigned. In this way, new parachains instantly benefit from the overall security\nprovided by the relay chain even if they have just been launched."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#parachain-economies", "page_title": "Parachains", "index": 6, "depth": 2, "title": "Parachain Economies", "anchor": "parachain-economies", "start_char": 9526, "end_char": 10827, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachain Economies\n\nParachains may have their economies with their native tokens. Schemes such as Proof-of-Stake are\nusually used to select the validator set to handle validation and finalization; parachains will not\nbe required to do either of those things. However, since Polkadot is not overly particular about\nwhat the parachain can implement, it may be the choice of the parachain to implement a staking\ntoken, but it's not generally necessary.\n\nCollators may be incentivized through the inflation of a native parachain token. There may be other\nways to incentivize the collator nodes that do not involve inflating the native parachain token.\n\nTransaction fees in a native parachain token can also be an implementation choice of parachains.\nPolkadot makes no hard and fast rules for how the parachains decide on the original validity of\ntransactions. For example, a parachain may be implemented so that transactions must pay a minimum\nfee to collators to be valid. The relay chain will enforce this validity. Similarly, a parachain\ncould not include that in their implementation, and the relay chain would still enforce its\nvalidity.\n\nParachains are not required to have their token. If they do, it is up to the parachain (and not the\nrelay chain) to make the economic case for their token."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#coretime", "page_title": "Parachains", "index": 7, "depth": 2, "title": "Coretime", "anchor": "coretime", "start_char": 10827, "end_char": 11736, "estimated_token_count": 206, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Coretime\n\nParachains can access the relay chain via cores.\n\nThere are two ways to allocate relay chain cores:\n\n- Via Governance only to [system chains](./learn-system-chains.md).\n- Via [coretime](./learn-agile-coretime.md) purchase with DOT (KSM on Kusama) for non-system chains.\n  Coretime is used to rent computation time on a relay chain core. This is the only way to access\n  Polkadot's shared security and interoperability.\n\n[System parachains](#system-parachains) are allocated by Polkadot's on-chain\n[governance](./learn-polkadot-opengov.md) and are part of the network's protocol, such as bridges to\nother networks or chains. These typically do not have an economic model and help remove transactions\nfrom the relay chain, allowing for more efficient parachain processing.\n\nNon-system chains can access the relay chain's cores via bulk or on-demand coretime purchased with\nDOT (or KSM on Kusama)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#coretime-expiration", "page_title": "Parachains", "index": 8, "depth": 3, "title": "Coretime Expiration", "anchor": "coretime-expiration", "start_char": 11736, "end_char": 12342, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Coretime Expiration\n\nThe DOT (or KSM on Kusama) used to purchase coretime are burned. Before the coretime expires,\nparachains can renew it at a fixed cost through a bulk coretime purchase. If the parachain does not\npurchase bulk coretime, it has an option to purchase coretime on-demand (at a variable price per\nblock, depending on the demand and other market conditions) when they need to access the relay\nchain. Parachains without coretime to extend time on a relay chain core will be deprecated to the\nstatus of a parathread (i.e., a chain with a registered `ParaID` but without access to a core)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#system-parachains", "page_title": "Parachains", "index": 9, "depth": 2, "title": "System Parachains", "anchor": "system-parachains", "start_char": 12342, "end_char": 12693, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## System Parachains\n\n[System parachains](./learn-system-chains.md) are parachains that use execution cores allocated by\nthe network's governance. These chains remove transactions from the relay chain, allowing network\nvalidators to allocate resources to validating parachains. System chains are Polkadot using its\nscaling technology to host itself."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#on-demand-parachains", "page_title": "Parachains", "index": 10, "depth": 2, "title": "On-demand Parachains", "anchor": "on-demand-parachains", "start_char": 12693, "end_char": 13561, "estimated_token_count": 184, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## On-demand Parachains\n\n!!!info \"On-demand parachains were previously named parathreads\"\n    On-demand parachains (previously called parathreads) are parachains that acquire [on-demand coretime](./learn-agile-coretime.md#on-demand-coretime).\n\nOn-demand parachains temporarily participate (on a block by block basis) in network security without\nneeding to lease a dedicated relay chain core. This is done through economically sharing the scarce\nresource of a core among several competing resources (parachains). Chains that otherwise would not\nbe able to acquire a full core or do not find it economically sensible to do so, can participate in\nshared security, as the [on-demand coretime](./learn-agile-coretime.md#on-demand-coretime) offers a\ngraceful off-ramp to parachains that no longer require a dedicated core, but would like to continue\nusing the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#historical-context-of-on-demand-parachains", "page_title": "Parachains", "index": 11, "depth": 3, "title": "Historical Context of On-demand parachains", "anchor": "historical-context-of-on-demand-parachains", "start_char": 13561, "end_char": 14209, "estimated_token_count": 135, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Historical Context of On-demand parachains\n\nAccording to [this talk](https://v.douyu.com/show/a4Jj7llO5q47Dk01) in Chengdu back in 2019, the\norigin of the idea for on-demand parachains came from similar notions in the limited resource of\nmemory on early personal computers of the late '80s and '90s. Since computers have a limited amount\nof physical memory, when an application needs more, the computer can create virtual memory by using\n_swap space_ on a hard disk. Swap space allows the capacity of a computer's memory to expand and for\nmore processes to run concurrently with the trade-off that some processes will take longer to\nprogress."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#parachains-vs-on-demand-parachains", "page_title": "Parachains", "index": 12, "depth": 3, "title": "Parachains vs. On-demand Parachains", "anchor": "parachains-vs-on-demand-parachains", "start_char": 14209, "end_char": 15114, "estimated_token_count": 180, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Parachains vs. On-demand Parachains\n\nParachains and on-demand parachains are very similar from a development perspective. One can imagine\nthat a chain developed with Substrate can at different points in its lifetime assume one of three\nstates:\n\n- an independent chain with secured bridge,\n- a parachain continuously connected to the relay chain,\n- or a parachain intermittently connected to the relay chain (i.e. on-demand)\n\nIt can switch between these states with relatively minimal effort since the difference is more of an\neconomic distinction than a technological one.\n\nOn-demand parachains have the exact same benefits for connecting to the relay chain that a full\nparachain has. Namely, it is able to send messages to other para-objects through\n[XCMP](learn-xcm-transport.md#xcmp-cross-chain-message-passing) and it is secured under the full economic security of the relay chain\nvalidator set."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#parachains-use-cases", "page_title": "Parachains", "index": 13, "depth": 2, "title": "Parachains' Use Cases", "anchor": "parachains-use-cases", "start_char": 15114, "end_char": 15866, "estimated_token_count": 149, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachains' Use Cases\n\nNote that we still have to see the true potential of parachains and what it is listed below are just\na few examples.\n\n- **Encrypted Consortium Chains**: These are possibly private chains that do not leak any\n  information to the public but still can be interacted with trustlessly due to the nature of the\n  XCMP protocol.\n- **High-Frequency Chains**: These chains can compute many transactions in a short amount of time by\n  taking certain trade-offs or making optimizations.\n- **Privacy Chains**: These chains do not leak any information to the public through novel\n  cryptography.\n- **Smart Contract Chains**: These chains can have additional logic implemented through the\n  deployment of code known as _smart contracts_."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#parachain-host", "page_title": "Parachains", "index": 14, "depth": 2, "title": "Parachain Host", "anchor": "parachain-host", "start_char": 15866, "end_char": 19639, "estimated_token_count": 824, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachain Host\n\nA blockchain is a [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph)\n(DAG) of state transitions, where every added block can be viewed as the head of the chain or fork\nwith cumulative state. All paths through the DAG terminate at the Genesis Block. A blockchain is a\ntree, as each block can have only one parent.\n\nA blockchain network is made of nodes that have a view of many forks of the chain and must decide\nwhich fork to follow. To construct the parachain host we need to answer two categories of questions\naddressed by two different components:\n\n- What is the state transition function of the blockchain? This is handled by the **Runtime**, which\n  defines the state transition logic of the chain. The Runtime logic is divided into:\n\n  - **Modules** encapsulate particular behavior of the protocol and consist of:\n    - Storage\n    - Routines are invoked by entry points and other modules upon block initialization or closing.\n      Routines can alter the storage of a module.\n    - The entry point defines how new information is introduced to a module and can limit the origin\n      from which they are called (user, root, parachain).\n  - **API** provides means for the node-side behavior to extract meaningful information from the\n    state of a single fork.\n\n  !!!info The Polkadot Parachain Host Implementers' Guide provides details about\n  [Runtime Architecture](https://paritytech.github.io/polkadot/book/runtime/index.html) and\n  [Runtime API](https://paritytech.github.io/polkadot/book/runtime-api/index.html).\n\n- Knowing various forks of the blockchain, what behaviors should a node take? What information\n  should a node extract from the state of which forks, and how should that information be used? This\n  is handled by the **Node-side behavior**, which defines all activities a node undertakes given its\n  view of the blockchain. The node-side behavior can be divided into two categories:\n\n  - **Networking behaviors**, relate to how information is distributed between nodes but not how the\n    information is used afterward.\n  - **Core behaviors**, relate to internal work that a specific node does. Such behavior cares about\n    that information is _distributed_ and _received_, but not how these two are achieved.\n\n  These two categories often interact, but they can be heavily abstracted from each other. The\n  node-side behavior is split into various **subsystems**, which perform a particular category of\n  work. Subsystems can communicate with each other through an\n  [Overseer](https://paritytech.github.io/polkadot/book/node/overseer.html) that prevents race\n  conditions.\n\n  !!!info\n      The Polkadot Parachain Host Implementers' Guide provides details about [node architecture](https://paritytech.github.io/polkadot/book/node/index.html) the main subsystems:\n      \n      - [Collator subsystem](https://paritytech.github.io/polkadot/book/node/collators/index.html)\n      - [Backing subsystem](https://paritytech.github.io/polkadot/book/node/backing/index.html)\n      - [Availability subsystem](https://paritytech.github.io/polkadot/book/node/availability/index.html)\n      - [Approval subsystem](https://paritytech.github.io/polkadot/book/node/approval/index.html)\n      - [Dispute subsystem](https://paritytech.github.io/polkadot/book/node/disputes/index.html)\n      - [Utility subsystem](https://paritytech.github.io/polkadot/book/node/utility/index.html)\n\nThe Runtime and Node-side behavior are dependent on each other. The Runtime depends on Node-side\nbehavior to author blocks, and to include [extrinsics](./learn-transactions.md) which trigger the\ncorrect entry points. The Node-side behavior relies on the Runtime APIs to extract information\nnecessary to determine which action to take."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#parachain-hubs", "page_title": "Parachains", "index": 15, "depth": 2, "title": "Parachain Hubs", "anchor": "parachain-hubs", "start_char": 19639, "end_char": 21298, "estimated_token_count": 311, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachain Hubs\n\nWhile the relay chain enables crosschain functionality amongst the parachains, it necessitates that\nthere is some latency between the dispatch of a message from one parachain until the destination\nparachain receives the message. In the optimistic scenario, the latency for this message should be\nat least two blocks - one block for the message to be dispatched and one block for the receiving\nparachain to process and produce a block that acts upon the message. However, in some cases, we may\nsee that the latency for messages is higher if many messages are in queue to be processed or if no\nnodes are running both parachain networks that can quickly gossip the message across the networks.\n\nDue to the necessary latency in sending crosschain messages, some parachains plan to become _hubs_\nfor an entire industry (see the [Asset Hub](./learn-assets.md) and\n[Bridge Hub](./learn-system-chains.md#bridge-hub)). For example, many DeFi applications could take\nadvantage of a property known as _composability_ which means that functions of one application can\nbe synergistically composed with others to create new applications. One example of this includes\nflash loans, which borrow funds to execute some on-chain logic as long as the loan is repaid at the\nend of the transaction.\n\nAn issue with crosschain latency means that composability property weakens among parachains compared\nto a single blockchain. **This implication is common to all sharded blockchain designs, including\nPolkadot, Ethereum, and others.** The solution to this is the introduction of parachain hubs, which\nmaintain the stronger property of single block composability."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-parachains", "url": "https://developer.polkadot.com/wiki/learn/learn-parachains/#resources", "page_title": "Parachains", "index": 16, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 21298, "end_char": 21924, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:5b935da091289d16ff9519464cc4c3fb3d6901825b9cf856f1620d14f879d1aa", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Resources\n\n- [Polkadot: The Parachain](https://medium.com/polkadot-network/polkadot-the-parachain-3808040a769a) -\n  Blog post by Polkadot co-founder Rob Habermeier who introduced parachains in 2017 as \"a simpler\n  form of blockchain, which attaches to the security provided by a relay chain rather than providing\n  its own. The relay chain provides security to attached parachains, but also provides a guarantee\n  of secure message-passing between them.\"\n- [The Path of a Parachain Block](https://polkadot.network/the-path-of-a-parachain-block/) - A\n  technical walk-through of how parachains interact with the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#npos-election-algorithms", "page_title": "NPoS Election Algorithms", "index": 0, "depth": 2, "title": "NPoS Election Algorithms", "anchor": "npos-election-algorithms", "start_char": 1, "end_char": 740, "estimated_token_count": 156, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## NPoS Election Algorithms\n\nSince validators are paid almost equally in each era, it is important that the stake behind each\nvalidator is uniformly spread out. An election algorithm for Nominated Proof of Staking (NPoS) will\ntry to optimize three metrics when computing a solution graph of nominators and validators:\n\n1. Maximize the total amount at stake.\n1. Maximize the stake behind the minimally staked validator.\n1. Minimize the variance of the stake in the set.\n\n!!!note [Sequential Phragmén](#basic-phragmen), [Phragmms](#phragmms-aka-balphragmms) and\n[Star balancing](https://crates.parity.io/sp_npos_elections/balancing/fn.balance.html) are a few\nnotable algorithms used for computing the NPoS solutions in Polkadot and Kusama."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#what-is-the-sequential-phragmen-method", "page_title": "NPoS Election Algorithms", "index": 1, "depth": 2, "title": "What is the sequential Phragmén method?", "anchor": "what-is-the-sequential-phragmen-method", "start_char": 740, "end_char": 1432, "estimated_token_count": 137, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is the sequential Phragmén method?\n\nThe sequential Phragmén method is a multi-winner election method introduced by Edvard Phragmén in\nthe 1890s. The quote below taken from the reference [Phragmén paper](#external-resources) sums up\nthe purpose of the sequential Phragmén method:\n\n!!!note The problem that Phragmén’s methods try to solve is that of electing a set of a given numbers of persons from a larger set of candidates. Phragmén discussed this in the context of a parliamentary election in a multi-member constituency; the same problem can, of course, also occur in local elections, but also in many other situations such as electing a board or a committee in an organization."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#validator-elections", "page_title": "NPoS Election Algorithms", "index": 2, "depth": 3, "title": "Validator Elections", "anchor": "validator-elections", "start_char": 1432, "end_char": 2360, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Validator Elections\n\nThe sequential Phragmén is one of the methods used in the Nominated Proof-of-Stake scheme to elect\nvalidators based on their own self-stake and the stake that is voted to them from nominators. It\nalso tries to equalize the weights between the validators after each election round.\n\n#### Off-Chain Phragmén\n\nGiven the large set of nominators and validators, Phragmén's method is a difficult optimization\nproblem. Polkadot uses off-chain workers to compute the result off-chain and submit a transaction to\npropose the set of winners. The reason for performing this computation off-chain is to keep a\nconstant block time of six seconds and prevent long block times at the end of each era, when the\nvalidator election takes place.\n\n!!!info \"Staking Miners\"\n    The process of computing the optimal solution for NPoS election can be delegated to [Staking Miners](./learn-staking-advanced.md#staking-miner)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#council-elections", "page_title": "NPoS Election Algorithms", "index": 3, "depth": 3, "title": "Council Elections", "anchor": "council-elections", "start_char": 2360, "end_char": 2912, "estimated_token_count": 102, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Council Elections\n\n!!!info \"Deprecated in Polkadot OpenGov\"\n    Phragmen was used for Council elections in Governance V1.\n\nThe Phragmén method was also used in the council election mechanism. When you voted for council\nmembers, you could select up to 16 different candidates and then place a reserved bond as the weight\nof your vote. Phragmén would run once on every election to determine the top candidates to assume\ncouncil positions and then again amongst the top candidates to equalize the weight of the votes\nbehind them as much as possible."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#what-does-it-mean-for-node-operators", "page_title": "NPoS Election Algorithms", "index": 4, "depth": 2, "title": "What does it mean for node operators?", "anchor": "what-does-it-mean-for-node-operators", "start_char": 2912, "end_char": 3505, "estimated_token_count": 120, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What does it mean for node operators?\n\nPhragmén is something that will run in the background and requires no extra effort from you.\nHowever, it is good to understand how it works since it means that not all the stake you've been\nnominated will end up on your validator after an election. Nominators are likely to nominate a few\ndifferent validators that they trust to do a good job operating their nodes.\n\nYou can use\n[this offline-phragmén](https://gist.github.com/tugytur/3531cc618bfbb42f1a6cfb44d9906197) tool for\npredicting the outcome of a validator election ahead of a new election."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#understanding-phragmen", "page_title": "NPoS Election Algorithms", "index": 5, "depth": 2, "title": "Understanding Phragmén", "anchor": "understanding-phragmen", "start_char": 3505, "end_char": 3623, "estimated_token_count": 19, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Understanding Phragmén\n\nThis section explains the sequential Phragmén method in-depth and walks through examples."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#basic-phragmen", "page_title": "NPoS Election Algorithms", "index": 6, "depth": 3, "title": "Basic Phragmén", "anchor": "basic-phragmen", "start_char": 3623, "end_char": 3643, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Basic Phragmén"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#rationale", "page_title": "NPoS Election Algorithms", "index": 7, "depth": 3, "title": "Rationale", "anchor": "rationale", "start_char": 3643, "end_char": 5024, "estimated_token_count": 302, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Rationale\n\nIn order to understand the Weighted Phragmén method, we must first understand the basic Phragmén\nmethod. There must be some group of candidates, a group of seats they are vying for (which is less\nthan the size of the group of candidates), and some group of voters. The voters can cast an approval\nvote - that is, they can signal approval for any subset of the candidates.\n\nThe subset should be a minimum size of one (i.e., one cannot vote for no candidates) and a maximum\nsize of one less than the number of candidates (i.e., one cannot vote for all candidates). Users are\nallowed to vote for all or no candidates, but this will not affect the final result, making votes of\nthis nature meaningless.\n\nNote that in this example, all voters are assumed to have equal say (that is, their vote does not\ncount more or less than any other votes). The weighted case will be considered later. However,\nweighting can be \"simulated\" by having multiple voters vote for the same slate of candidates. For\ninstance, five people voting for a particular candidate is mathematically the same as a single\nperson with weight `5` voting for that candidate.\n\nThe particular algorithm we call here the \"Basic Phragmén\" was first described by Brill _et al._ in\ntheir paper\n[\"Phragmén’s Voting Methods and Justified Representation\"](https://ojs.aaai.org/index.php/AAAI/article/view/10598)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#algorithm", "page_title": "NPoS Election Algorithms", "index": 8, "depth": 3, "title": "Algorithm", "anchor": "algorithm", "start_char": 5024, "end_char": 5757, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Algorithm\n\nThe Phragmén method will iterate, selecting one seat at a time, according to the following rules:\n\n1. Voters submit their ballots, marking which candidates they approve. Ballots will not be modified\n   after submission.\n2. An initial load of 0 is set for each ballot.\n3. The candidate who wins the next available seat is the one where the ballots of their supporters\n   would have the _least average (mean) cost_ if that candidate wins.\n4. The _n_ ballots that approved that winning candidate get _1/n_ added to their load.\n5. The load of all ballots that supported the winner of this round are averaged out so that they are\n   equal.\n6. If there are any more seats, go back to step 3. Otherwise, the selection ends."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#example", "page_title": "NPoS Election Algorithms", "index": 9, "depth": 3, "title": "Example", "anchor": "example", "start_char": 5757, "end_char": 9580, "estimated_token_count": 1256, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Example\n\nLet's walk through an example with four candidates vying for three seats, and five voters.\n\n```\nOpen Seats: 3\n\nCandidates:   A B C D  L0\n-------------------------\nVoter V1:       X      0\nVoter V2:         X X  0\nVoter V3:       X   X  0\nVoter V4:     X X      0\nVoter V5:       X X X  0\n```\n\nIn this example, we can see that voter `V1` approves only of candidate `B`, voter `V2` approves of\ncandidates `C` and `D`, etc. Voters can approve any number of candidates between 1 and\n`number_of_candidates - 1`. An initial \"load\" of `0` is set for each ballot (`L0` = load after round\n`0`, i.e., the \"round\" before the first round). We shall see shortly how this load is updated and\nused to select candidates.\n\nWe will now run through an iterative algorithm, with each iteration corresponding to one \"seat\".\nSince there are three seats, we will walk through three rounds.\n\nFor the first round, the winner is simply going to be the candidate with the most votes. Since all\nloads are equal, the lowest average load will be the candidate with the highest n, since `1/n` will\nget smaller as `n` increases. For this first example round, for instance, candidate `A` had only one\nballot vote for them. Thus, the average load for candidate A is `1/1`, or 1. Candidate C has two\nballots approving of them, so the average load is `1/2`. Candidate B has the lowest average load, at\n`1/4` and they get the first seat. Ballots loads are now averaged out, although for the first\niteration, this will not have any effect.\n\n```\nFilled seats: 1 (B)\nOpen Seats: 2\n\nCandidates:   A B C D  L0 L1\n-----------------------------\nVoter V1:       X      0  1/4\nVoter V2:         X X  0  0\nVoter V3:       X   X  0  1/4\nVoter V4:     X X      0  1/4\nVoter V5:       X X X  0  1/4\n```\n\nWe are now down to candidates `A`, `C`, and `D` for two open seats. There is only one voter (`V4`)\nfor `A`, with load `1/4`. `C` has two voters, `V2` and `V5`, with loads of `0` and `1/4`. `D` has\nthree voters approving of them, `V2`, `V3`, and `V5`, with loads of `0`, `1/4`, and `1/4`,\nrespectively.\n\nIf Candidate `A` wins, the average load would be `(1/4 + 1/1) / 1`, or `5/4`. If candidate `C` wins,\nthe average load would be `((0 + 1/2) + (1/4 + 1/2)) / 2`, or `5/8`. If candidate `D` wins, the\naverage load would be `((0 + 1/3) + (1/4 + 1/3) + (1/4 + 1/3)) / 3`, or `1/2`. Since `1/2` is the\nlowest average load, candidate D wins the second round.\n\nNow everybody who voted for Candidate `D` has their load set to the average, `1/2` of all the loads.\n\n```\nFilled seats: 2 (B, D)\nOpen Seats: 1\n\nCandidates:   A B C D  L0 L1  L2\n---------------------------------\nVoter V1:       X      0  1/4 1/4\nVoter V2:         X X  0  0   1/2\nVoter V3:       X   X  0  1/4 1/2\nVoter V4:     X X      0  1/4 1/4\nVoter V5:       X X X  0  1/4 1/2\n```\n\nThere is now one seat open and two candidates, `A` and `C`. Voter `V4` is the only one voting for\n`A`, so if `A` wins then the average load would be `(1/4 + 1/1) / 1`, or `5/4`. Voters `V2` and `V5`\n(both with load `1/2`) support `C`, so if `C` wins the average load would be\n`((1/2 + 1/2) + (1/2 + 1/2)) / 2`, or `1`. Since the average load would be lower with `C`, `C` wins\nthe final seat.\n\n```\nFilled seats: 3 (B, D, C)\nOpen Seats: 0\n\nCandidates:   A B C D  L0 L1  L2  L3\n------------------------------------\nVoter V1:       X      0  1/4 1/4 1/4\nVoter V2:         X X  0  0   1/2 1\nVoter V3:       X   X  0  1/4 1/2 1/2\nVoter V4:     X X      0  1/4 1/4 1/4\nVoter V5:       X X X  0  1/4 1/2 1\n```\n\nAn interesting characteristic of this calculation is that the total load of all voters will always\nequal the number of seats filled in that round. In the zeroth round, load starts at `0` and there\nare no seats filled. After the first round, the total of all loads is `1`, after the second round it\nis `2`, etc."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#weighted-phragmen", "page_title": "NPoS Election Algorithms", "index": 10, "depth": 3, "title": "Weighted Phragmén", "anchor": "weighted-phragmen", "start_char": 9580, "end_char": 9603, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Weighted Phragmén"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#rationale_1", "page_title": "NPoS Election Algorithms", "index": 11, "depth": 3, "title": "Rationale", "anchor": "rationale_1", "start_char": 9603, "end_char": 10562, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Rationale\n\nWhile this method works well if all voters have equal weight, this is not the case in Polkadot.\nElections for both validators and candidates for the Council are weighted by the number of tokens\nheld by the voters. This makes elections more similar to a corporate shareholder election than a\ntraditional political election, where some members have more pull than others. Someone with a single\ntoken will have much less voting power than someone with 100. Although this may seem\nanti-democratic, in a pseudonymous system, it is trivial for someone with 100 tokens to create 100\ndifferent accounts and spread their wealth to all of their pseudonyms.\n\nTherefore, not only do we want to allow voters to have their preferences expressed in the result,\nbut do so while keeping as equal a distribution of their stake as possible and express the wishes of\nminorities as much as is possible. The Weighted Phragmén method allows us to reach these goals."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#algorithm_1", "page_title": "NPoS Election Algorithms", "index": 12, "depth": 3, "title": "Algorithm", "anchor": "algorithm_1", "start_char": 10562, "end_char": 12902, "estimated_token_count": 468, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Algorithm\n\nWeighted Phragmén is similar to Basic Phragmén in that it selects candidates sequentially, one per\nround, until the maximum number of candidates are elected. However, it has additional features to\nalso allocate weight (stake) behind the candidates.\n\n_NOTE: in terms of validator selection, for the following algorithm, you can think of \"voters\" as\n\"nominators\" and \"candidates\" as \"validators\"._\n\n1. Candidates are elected, one per round, and added to the set of successful candidates (they have\n   won a \"seat\"). This aspect of the algorithm is very similar to the \"basic Phragmén\" algorithm\n   described above.\n2. However, as candidates are elected, a weighted mapping is built, defining the weights of each\n   selection of a validator by each nominator.\n\nIn more depth, the algorithm operates like so:\n\n1. Create a list of all voters, their total amount of stake, and which validators they support.\n2. Generate an initial edge-weighted graph mapping from voters to candidates, where each edge weight\n   is the total _potential_ weight (stake) given by that voter. The sum of all potential weight for\n   a given candidate is called their _approval stake_.\n3. Now we start electing candidates. For the list of all candidates who have not been elected, get\n   their score, which is equal to `1 / approval_stake`.\n4. For each voter, update the score of each candidate they support by adding their total budget\n   (stake) multiplied by the load of the voter and then dividing by that candidate's approval stake\n   `(voter_budget * voter_load / candidate_approval_stake)`.\n5. Determine the candidate with the lowest score and elect that candidate. Remove the elected\n   candidate from the pool of potential candidates.\n6. The load for each edge connecting to the winning candidate is updated, with the edge load set to\n   the score of the candidate minus the voter's load, and the voter's load then set to the\n   candidate's score.\n7. If there are more candidates to elect, go to Step 3. Otherwise, continue to step 8.\n8. Now the stake is distributed amongst each nominator who backed at least one elected candidate.\n   The backing stake for each candidate is calculated by taking the budget of the voter and\n   multiplying by the edge load then dividing by the candidate load\n   (`voter_budget * edge_load / candidate_load`)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#example_1", "page_title": "NPoS Election Algorithms", "index": 13, "depth": 3, "title": "Example", "anchor": "example_1", "start_char": 12902, "end_char": 21071, "estimated_token_count": 2337, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Example\n\n_Note: All numbers in this example are rounded off to three decimal places._\n\nIn the following example, there are five voters and five candidates vying for three potential seats.\nEach voter `V1 - V5` has an amount of stake equal to their number (e.g., `V1` has stake of 1, `V2`\nhas stake of 2, etc.). Every voter is also going to have a _load,_ which initially starts at `0`.\n\n```\nFilled seats: 0\nOpen Seats: 3\n\nCandidates:    A B C D E  L0\n----------------------------\nVoter V1 (1):  X X        0\nVoter V2 (2):  X X        0\nVoter V3 (3):  X          0\nVoter V4 (4):    X X X    0\nVoter V5 (5):  X     X    0\n```\n\nLet us now calculate the approval stake of each of the candidates. Recall that this is merely the\namount of all support for that candidate by all voters.\n\n```\nCandidate A: 1 + 2 + 3 + 5 = 11\nCandidate B: 1 + 2 + 4 = 7\nCandidate C: 4 = 4\nCandidate D: 4 + 5 = 9\nCandidate E: 0\n```\n\nThe first step is easy - candidate `E` has 0 approval stake and can be ignored from here on out.\nThey will never be elected.\n\nWe can now calculate the initial scores of the candidates, which is `1 / approval_stake`:\n\n```\nCandidate A: 1 / 11 = 0.091\nCandidate B: 1 / 7 = 0.143\nCandidate C: 1 / 4 = 0.25\nCandidate D: 1 / 9 = 0.111\nCandidate E: N/A\n```\n\nFor every edge, we are going to calculate the score, which is current score plus the total budget \\*\nthe load of the voter divided by the approval stake of the candidate. However, since the load of\nevery voter starts at 0, and anything multiplied by 0 is 0, any addition will be `0 / x`, or 0. This\nmeans that this step can be safely ignored for the initial round.\n\nThus, the best (lowest) score for Round 0 is Candidate A, with a score of `0.091`.\n\n```\nCandidates:    A B C D E  L0 L1\n----------------------------------\nVoter V1 (1):  X X        0  0.091\nVoter V2 (2):  X X        0  0.091\nVoter V3 (3):  X          0  0.091\nVoter V4 (4):    X X X    0  0\nVoter V5 (5):  X     X    0  0.091\n```\n\n```\nFilled seats: 1 (A)\nOpen Seats: 2\n\nCandidates:    A B C D E  L0\n----------------------------\nVoter V1 (1):  X X        0\nVoter V2 (2):  X X        0\nVoter V3 (3):  X          0\nVoter V4 (4):    X X X    0\nVoter V5 (5):  X     X    0\n```\n\nCandidate `A` is now safe; there is no way that they will lose their seat. Before moving on to the\nnext round, we need to update the scores on the edges of our graph for any candidates who have not\nyet been elected.\n\nWe elided this detail in the previous round, since it made no difference to the final scores, but we\nshould go into depth here to see how scores are updated. We first must calculate the new loads of\nthe voters, and then calculate the new scores of the candidates.\n\nAny voter who had one of their choices for candidate fill the seat in this round (i.e., voters `V1`,\n`V2`, `V3`, and `V5`, who all voted for `A`) will have their load increased. This load increase will\nblunt the impact of their vote in future rounds, and the edge (which will be used in determining\nstake allocation later) is set to the score of the elected candidate minus the _current_ voter load.\n\n```\nedge_load = elected_candidate_score - voter_load\nvoter_load = elected_candidate_score\n```\n\nIn this instance, the score of the elected candidate is `0.091` and the voter loads are all `0`. So\nfor each voter who voted for `A`, we will calculate a new edge load `Voter` -> `A` of:\n\n```\nEdge load: 0.091 - 0 = 0.091\n```\n\nand a new voter load of:\n\n```\nVoter load: 0.091\n```\n\nAs a reminder, here are the current scores. Loads of the voters are all `0`.\n\n```\nCandidate B : 0.143\nCandidate C : 0.25\nCandidate D : 0.111\n```\n\nNow, we go through the weighted graph and update the score of the candidate and the load of the\nedge, using the algorithm:\n\n```\ncandidate_score = candidate_score + ((voter_budget * voter_load) / candidate_approval_stake)\n```\n\nWithout walking through each step, this gives us the following modifications to the scores of the\ndifferent candidates.\n\n```\nV1 updates B to 0.156\nV2 updates B to 0.182\nV4 updates B to 0.182\nV4 updates C to 0.25\nV4 updates D to 0.111\nV5 updates D to 0.162\n```\n\nAfter scores are updated, the final scores for the candidates for this round are:\n\n```\nCandidate B: 0.182\nCandidate C: 0.25\nCandidate D: 0.162\n```\n\n`D`, with the lowest score, is elected. You will note that even though candidate `B` had more voters\nsupporting them, candidate `D` won the election due to their lower score. This is directly due to\nthe fact that they had the lowest score, of course, but the root reason behind them having a lower\nscore was both the greater amount of stake behind them and that voters who did not get one of their\nchoices in an earlier round (in this example, voter V4) correspond to a higher likelihood of a\ncandidate being elected.\n\nWe then update the loads for the voters and edges as specified above for any voters who voted for\ncandidate `D` (viz., `V4` and `V5`) using the same formula as above.\n\n```\nFilled seats: 2 (A, D)\nOpen Seats: 1\n\nCandidates:    A B C D E  L0 L1    L2\n-----------------------------------\nVoter V1 (1):  X X        0  0.091 0.091\nVoter V2 (2):  X X        0  0.091 0.091\nVoter V3 (3):  X          0  0.091 0.091\nVoter V4 (4):    X X X    0  0     0.162\nVoter V5 (5):  X     X    0  0.091 0.162\n```\n\nFollowing a similar process for Round 2, we start with initial candidate scores of:\n\n```\nCandidate B : 0.143\nCandidate C : 0.25\n```\n\nWe can then update the scores of the remaining two candidates according to the algorithm described\nabove.\n\n```\nV1 updates B to 0.156\nV2 updates B to 0.182\nV4 updates B to 0.274\nV4 updates C to 0.412\n```\n\nWith the lowest score of `0.274`, Candidate `B` claims the last open seat. Candidates `A`, `D`, and\n`B` have been elected, and candidates `C` and `E` are not.\n\nBefore moving on, we must perform a final load adjustment for the voters and the graph.\n\n```\nFilled seats: 3 (A, D, B)\nOpen Seats: 0\n\nCandidates:    A B C D E  L0 L1    L2    L3\n------------------------------------------\nVoter V1 (1):  X X        0  0.091 0.091 0.274\nVoter V2 (2):  X X        0  0.091 0.091 0.274\nVoter V3 (3):  X          0  0.091 0.091 0.091\nVoter V4 (4):    X X X    0  0     0.162 0.274\nVoter V5 (5):  X     X    0  0.091 0.162 0.162\n```\n\nNow we have to determine how much stake every voter should allocate to each candidate. This is done\nby taking the load of the each edge and dividing it by the voter load, then multiplying by the total\nbudget of the voter.\n\nIn this example, the weighted graph ended up looking like this:\n\n```\nNominator: V1\n\tEdge to A load= 0.091\n\tEdge to B load= 0.183\nNominator: V2\n\tEdge to A load= 0.091\n\tEdge to B load= 0.183\nNominator: V3\n\tEdge to A load= 0.091\nNominator: V4\n\tEdge to B load= 0.113\n\tEdge to D load= 0.162\nNominator: V5\n\tEdge to A load= 0.091\n\tEdge to D load= 0.071\n```\n\nFor instance, the budget of `V1` is `1`, the edge load to `A` is `0.091`, and the voter load is\n`0.274`. Using our equation:\n\n```\nbacking_stake (A) = voter_budget * edge_load / voter_load\n```\n\nWe can fill these variables in with:\n\n```\nbacking_stake (A) = 1 * 0.091 / 0.274 = 0.332\n```\n\nFor `V1` backing stake of `B`, you can simply replace the edge load value and re-calculate.\n\n```\nbacking_stake (B) = 1 * 0.183 / 0.274 = 0.668\n```\n\nNote that the total amount of all backing stake for a given voter will equal the total budget of the\nvoter, unless that voter had no candidates elected, in which case it will be 0.\n\nThe final results are:\n\n```\nA is elected with stake 6.807.\nD is elected with stake 4.545.\nB is elected with stake 3.647.\n\nV1 supports: A with stake: 0.332 and B with stake: 0.668.\nV2 supports: A with stake: 0.663 and B with stake: 1.337.\nV3 supports: A with stake: 3.0.\nV4 supports: B with stake: 1.642 and D with stake: 2.358.\nV5 supports: A with stake: 2.813 and D with stake: 2.187.\n```\n\nYou will notice that the total amount of stake for candidates `A`, `D`, and `B` equals (aside from\nrounding errors) the total amount of stake of all the voters (`1 + 2 + 3 + 4 + 5 = 15`). This is\nbecause each voter had at least one of their candidates fill a seat. Any voter who had none of their\ncandidates selected will also not have any stake in any of the elected candidates."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#optimizations", "page_title": "NPoS Election Algorithms", "index": 14, "depth": 2, "title": "Optimizations", "anchor": "optimizations", "start_char": 21071, "end_char": 21404, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Optimizations\n\nThe results for nominating validators are further optimized for several purposes:\n\n1. To reduce the number of edges, i.e. to minimize the number of validators any nominator selects\n2. To ensure, as much as possible, an even distribution of stake among the validators\n3. Reduce the amount of block computation time"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#high-level-description", "page_title": "NPoS Election Algorithms", "index": 15, "depth": 3, "title": "High-Level Description", "anchor": "high-level-description", "start_char": 21404, "end_char": 23081, "estimated_token_count": 376, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### High-Level Description\n\nAfter running the weighted Phragmén algorithm, a process is run that redistributes the vote amongst\nthe elected set. This process will never add or remove an elected candidate from the set. Instead,\nit reduces the variance in the list of backing stake from the voters to the elected candidates.\nPerfect equalization is not always possible, but the algorithm attempts to equalize as much as\npossible. It then runs an edge-reducing algorithm to minimize the number of validators per\nnominator, ideally giving every nominator a single validator to nominate per era.\n\nTo minimize block computation time, the staking process is run as an\n[off-chain worker](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/frame_offchain_workers/index.html). In order to\ngive time for this off-chain worker to run, staking commands (bond, nominate, etc.) are not allowed\nin the last quarter of each era.\n\nThese optimizations will not be covered in-depth on this page. For more details, you can view the\n[Rust implementation of elections in Substrate](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/elections-phragmen/src/lib.rs),\nthe\n[Rust implementation of staking in Substrate](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/staking/src/lib.rs),\nor the `seqPhragménwithpostprocessing` method in the\n[Python reference implementation](https://github.com/w3f/consensus/tree/master/NPoS). If you would\nlike to dive even more deeply, you can review the\n[W3F Research Page on Sequential Phragmén Method](https://research.web3.foundation/Polkadot/protocols/NPoS/Overview#the-election-process)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#rationale-for-minimizing-the-number-of-validators-per-nominator", "page_title": "NPoS Election Algorithms", "index": 16, "depth": 3, "title": "Rationale for Minimizing the Number of Validators Per Nominator", "anchor": "rationale-for-minimizing-the-number-of-validators-per-nominator", "start_char": 23081, "end_char": 24932, "estimated_token_count": 341, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Rationale for Minimizing the Number of Validators Per Nominator\n\nPaying out rewards for staking from every validator to all of their nominators can cost a\nnon-trivial amount of chain resources (in terms of space on chain and resources to compute). Assume\na system with 200 validators and 1000 nominators, where each of the nominators has nominated 10\ndifferent validators. Payout would thus require `1_000 * 10`, or 10_000 transactions. In an ideal\nscenario, if every nominator selects a single validator, only 1_000 transactions would need to take\nplace - an order of magnitude fewer. Empirically, network slowdown at the beginning of an era has\noccurred due to the large number of individual payouts by validators to nominators. In extreme\ncases, this could be an attack vector on the system, where nominators nominate many different\nvalidators with small amounts of stake in order to slow the system at the next era change.\n\nWhile this would reduce network and on-chain load, being able to select only a single validator\nincurs some diversification costs. If the single validator that a nominator has nominated acts\nmaliciously, then the nominator incurs a risk of a significant amount of\n[slashing](./learn-offenses.md). Nominators are thus allowed to nominate up to 16 different\nvalidators. However, after the weighted edge-reducing algorithm is run, the number of validators per\nnominator is minimized. Nominators are likely to see themselves nominating a single active validator\nfor an era.\n\nAt each era change, as the algorithm runs again, nominators are likely to have a different validator\nthan they had before (assuming a significant number of selected validators). Therefore, nominators\ncan diversify against incompetent or corrupt validators causing slashing on their accounts, even if\nthey only nominate a single validator per era."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#rationale-for-maintaining-an-even-distribution-of-stake", "page_title": "NPoS Election Algorithms", "index": 17, "depth": 3, "title": "Rationale for Maintaining an Even Distribution of Stake", "anchor": "rationale-for-maintaining-an-even-distribution-of-stake", "start_char": 24932, "end_char": 26214, "estimated_token_count": 261, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Rationale for Maintaining an Even Distribution of Stake\n\nAnother issue is that we want to ensure that as equal a distribution of votes as possible amongst\nthe elected validators or council members. This helps us increase the security of the system by\nensuring that the minimum amount of tokens in order to join the active validator set or council is\nas high as possible. For example, assume a result of five validators being elected, where validators\nhave the following stake: `{1_000, 20, 10, 10, 10}`, for a total stake of 1_050. In this case, a\npotential attacker could join the active validator set with only 11 tokens, and could obtain a\nmajority of validators with only 33 tokens (since the attacker only has to have enough stake to\n\"kick out\" the three lowest validators).\n\nIn contrast, imagine a different result with the same amount of total stake, but with that stake\nperfectly equally distributed: `{210, 210, 210, 210, 210}`. With the same amount of stake, an\nattacker would need to stake 633 tokens in order to get a majority of validators, a much more\nexpensive proposition. Although obtaining an equal distribution is unlikely, the more equal the\ndistribution, the higher the threshold - and thus the higher the expense - for attackers to gain\nentry to the set."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#rationale-for-reducing-block-computing-time", "page_title": "NPoS Election Algorithms", "index": 18, "depth": 3, "title": "Rationale for Reducing Block Computing Time", "anchor": "rationale-for-reducing-block-computing-time", "start_char": 26214, "end_char": 26831, "estimated_token_count": 119, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Rationale for Reducing Block Computing Time\n\nRunning the Phragmén algorithm is time-consuming, and often cannot be completed within the time\nlimits of production of a single block. Waiting for calculation to complete would jeopardize the\nconstant block production time of the network. Therefore, as much computation as possible is moved\nto an off-chain worker, which validators can work on the problem without impacting block production\ntime.\n\nTo limit the complexity of the election and payout, any given nominator can only\n[select a limited number of validators](../general/chain-state-values.md)\nto nominate."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#phragmms-aka-balphragmms", "page_title": "NPoS Election Algorithms", "index": 19, "depth": 3, "title": "Phragmms (aka Balphragmms)", "anchor": "phragmms-aka-balphragmms", "start_char": 26831, "end_char": 33519, "estimated_token_count": 1239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Phragmms (aka Balphragmms)\n\n`Phragmms`, formerly known as `Balphragmms`, is a new election rule inspired by Phragmén and\ndeveloped in-house for Polkadot. In general, election rules on blockchains is an active topic of\nresearch. This is due to the conflicting requirements for election rules and blockchains: elections\nare computationally expensive, but blockchains are computationally limited. Thus, this work\nconstitutes state of the art in terms of optimization.\n\nProportional representation is a very important property for a decentralized network to have in\norder to maintain a sufficient level of decentralization. While this is already provided by the\ncurrently implemented `seqPhragmen`, the `Balphragmms` election rule provides the advantage of the added\nsecurity guarantee described below. As far as we can tell, at the time of writing, Polkadot and\nKusama are the only blockchain networks that implement an election rule that guarantees proportional\nrepresentation.\n\nThe security of a distributed and decentralized system such as Polkadot is directly related to the\ngoal of avoiding _overrepresentation_ of any minority. This is a stark contrast to traditional\napproaches to proportional representation axioms, which typically only seek to avoid\nunderrepresentation.\n\n#### Maximin Support Objective and PJR\n\nThis new election rule aims to achieve a constant-factor approximation guarantee for the _maximin\nsupport objective_ and the closely related _proportional justified representation_ (PJR) property.\n\nThe maximin support objective is based on maximizing the support of the least-supported elected\ncandidate, or in the case of Polkadot and Kusama, maximizing the least amount of stake backing\namongst elected validators. This security-based objective translates to a security guarantee for\nNPoS and makes it difficult for an adversarial whale’s validator nodes to be elected. The `Phragmms`\nrule, and the guarantees it provides in terms of security and proportionality, have been formalized\nin a [peer-reviewed paper](https://arxiv.org/pdf/2004.12990.pdf)).\n\nThe PJR property considers the proportionality of the voter’s decision power. The property states\nthat a group of voters with cohesive candidate preferences and a large enough aggregate voting\nstrength deserve to have a number of representatives proportional to the group’s vote strength.\n\n#### Comparing Sequential Phragmén, MMS, and Phragmms\n\n_Sequential Phragmén_ (`seqPhragmen`) and `MMS` are two efficient election rules that both achieve\nPJR.\n\nPolkadot employs the `seqPhragmen` method for validator and council elections. Although\n`seqPhramen` has a very fast runtime, it does not provide constant-factor approximation for the\nmaximin support problem. This is due to `seqPhramen` only performing an _approximate_ rebalancing of\nthe distribution of stake.\n\nIn contrast, `MMS` is another standard greedy algorithm that simultaneously achieves the PJR\nproperty and provides a constant factor approximation for maximin support, although with a\nconsiderably slower runtime. This is because for a given partial solution, `MMS` computes a balanced\nedge weight vector for each possible augmented committee when a new candidate is added, which is\ncomputationally expensive.\n\nWe introduce a new heuristic inspired by `seqPhragmen`, `PhragMMS`, which maintains a comparable\nruntime to `seqPhragmen`, offers a constant-factor approximation guarantee for the maximin support\nobjective, and satisfies PJR. This is the fastest known algorithm to achieve a constant-factor\nguarantee for maximin support.\n\n#### The New Election Rule: Phragmms\n\n`Phragmms` is an iterative greedy algorithm that starts with an empty committee and alternates\nbetween the `Phragmms` heuristic for inserting a new candidate and _rebalancing_ by replacing the\nweight vector with a balanced one. The main differentiator between `Phragmms` and `seqPhragmen` is\nthat the latter only perform an approximate rebalancing. Details can be found in\n[Balanced Stake Distribution](#rationale-for-maintaining-an-even-distribution-of-stake).\n\nThe computation is executed by off-chain workers privately and separately from block production, and\nthe validators only need to submit and verify the solutions on-chain. Relative to a committee _A_,\nthe score of an unelected candidate _c_ is an easy-to-compute rough estimate of what would be the\nsize of the least stake backing if we added _c_ to committee _A_. Observing on-chain, only one\nsolution needs to be tracked at any given time, and a block producer can submit a new solution in\nthe block only if the block passes the verification test, consisting of checking:\n\n1. Feasibility,\n2. Balance and\n3. Local Optimality - The least stake backing of _A_ is higher than the highest score among\n   unelected candidates\n\nIf the tentative solution passes the tests, then it replaces the current solution as the tentative\nwinner. The official winning solution is declared at the end of the election window.\n\nA powerful feature of this algorithm is the fact that both its approximation guarantee for maximin\nsupport and the above checks passing can be efficiently verified in linear time. This allows for a\nmore scalable solution for secure and proportional committee elections. While `seqPhragmen` also has\na notion of score for unelected candidates, `Phragmms` can be seen as a natural complication of the\n`seqPhragmen` algorithm, where `Phragmms` always grants higher score values to candidates and thus\ninserts them with higher support values.\n\n**To summarize, the main differences between the two rules are:**\n\n- In `seqPhragmen`, lower scores are better, whereas in `Phragmms`, higher scores are better.\n- Inspired by `seqPhragmen`, the scoring system of `Phragmms` can be considered to be more intuitive\n  and does a better job at estimating the value of adding a candidate to the current solution, and\n  hence leads to a better candidate-selection heuristic.\n- Unlike `seqPhragmen`, in `Phragmms`, the edge weight vector _w_ is completely rebalanced after\n  each iteration of the algorithm.\n\nThe `Phragmms` election rule is implemented on Polkadot. This election rule provides both fair representation (PJR) and security (constant-factor approximation for the maximin support objection) to a blockchain network.\n\n#### Algorithm\n\nThe `Phragmms` algorithm iterates through the available seats, starting with an empty committee of\nsize _k_:\n\n1. Initialize an empty committee _A_ and zero edge weight vector _w = 0_.\n\n2. Repeat _k_ times:\n\n   - Find the unelected candidate with highest score and add it to committee _A_.\n   - Re-balance the weight vector _w_ for the new committee _A_.\n\n3. Return _A_ and _w_."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-phragmen", "url": "https://developer.polkadot.com/wiki/learn/learn-phragmen/#external-resources", "page_title": "NPoS Election Algorithms", "index": 20, "depth": 2, "title": "External Resources", "anchor": "external-resources", "start_char": 33519, "end_char": 34701, "estimated_token_count": 294, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:67459c0c9ff0adec2336db8267567c2eccbadf947377f5d632e099beb1e8e9c7", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## External Resources\n\n- [Phragmms](https://arxiv.org/pdf/2004.12990.pdf) - W3F research paper that expands on the\n  sequential Phragmén method.\n- [W3F Research Page on NPoS](https://research.web3.foundation/Polkadot/protocols/NPoS/Overview) -\n  An overview of Nominated Proof of Stake as its applied to Polkadot.\n- [Python Reference Implementations](https://github.com/w3f/consensus/tree/master/NPoS) - Python\n  implementations of Simple and Complicated Phragmén methods.\n- [Substrate Implementation](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/staking/src/lib.rs) -\n  Rust implementation used in Substrate.\n- [Phragmén's and Thiele's Election Methods](https://arxiv.org/pdf/1611.08826.pdf) - 95-page paper\n  explaining Phragmén's election methods in detail.\n- [Phragmén’s Voting Methods and Justified Representation](https://ojs.aaai.org/index.php/AAAI/article/view/10598) -\n  This paper by Brill _et al._ is the source for the simple Phragmén method, along with proofs about\n  its properties.\n- [Offline Phragmén](https://github.com/kianenigma/offline-phragmen) - Script to generate the\n  Phragmén validator election outcome before the start of an era."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-host", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-host/#components-of-the-polkadot-host", "page_title": "Polkadot Host", "index": 0, "depth": 2, "title": "Components of the Polkadot Host", "anchor": "components-of-the-polkadot-host", "start_char": 813, "end_char": 2205, "estimated_token_count": 276, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f5969e45dc5c4f8c9c1365c05b5978bc88fd6aec8687251b8ee1ed8f15fa3851", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Components of the Polkadot Host\n\n- Networking components such as `Libp2p` that facilitates network interactions.\n- State storage and the storage trie along with the database layer.\n- Consensus engine for GRANDPA and BABE.\n- Wasm interpreter and virtual machine.\n- Low level primitives for a blockchain, such as cryptographic primitives like hash functions.\n\nA compiled Polkadot runtime, a blob of Wasm code, can be uploaded into the Polkadot host and used as\nthe logic for the execution of state transitions. Without a runtime, the Polkadot host is unable to\nmake state transitions or produce any blocks.\n\nA host node...\n\n1. must populate the state storage with the official genesis state.\n2. should maintain a set of around 50 active peers at any time. New peers can be found using the\n   discovery protocols.\n3. should open and maintain the various required streams with each of its active peers.\n4. should send block requests to these peers to receive all blocks in the chain and execute each of\n   them.\n5. should exchange neighbor packets.\n\nConsensus in the Polkadot Host is achieved during the execution of two different procedures,\nblock-production and finality. The Polkadot Host must run these procedures if (and only if) it is\nrunning on a validator node.\n\nAdditional information on each of these requirements can be found\n[here](https://spec.polkadot.network/#sect-node-full)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-host", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-host/#polkadot-runtime", "page_title": "Polkadot Host", "index": 1, "depth": 2, "title": "Polkadot Runtime", "anchor": "polkadot-runtime", "start_char": 2205, "end_char": 2544, "estimated_token_count": 72, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f5969e45dc5c4f8c9c1365c05b5978bc88fd6aec8687251b8ee1ed8f15fa3851", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot Runtime\n\nBelow is a diagram that displays the Polkadot host surrounding the Polkadot runtime. Think of the\nruntime (in white) as a component that can be inserted, swapped out, or removed entirely. While the\nparts in grey are stable and cannot change without an explicit hard fork.\n\n![polkadot host](../assets/updated_pre.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-host", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-host/#code-executor", "page_title": "Polkadot Host", "index": 2, "depth": 2, "title": "Code Executor", "anchor": "code-executor", "start_char": 2544, "end_char": 2942, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f5969e45dc5c4f8c9c1365c05b5978bc88fd6aec8687251b8ee1ed8f15fa3851", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Code Executor\n\nThe Polkadot Host executes the calls of Runtime entrypoints inside a Wasm Virtual Machine (VM),\nwhich in turn provides the Runtime with access to the Polkadot Host API. This part of the Polkadot\nHost is referred to as the Executor. For additional technical implementation details, check out\n[this section](https://spec.polkadot.network/#sect-code-executor) of the Polkadot Spec."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-host", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-host/#resources", "page_title": "Polkadot Host", "index": 3, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 2942, "end_char": 3273, "estimated_token_count": 86, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f5969e45dc5c4f8c9c1365c05b5978bc88fd6aec8687251b8ee1ed8f15fa3851", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\n- [Polkadot Host Protocol Specification](https://github.com/w3f/polkadot-spec) - Incubator for the\n  Polkadot Host spec, including tests.\n- [Gossamer: A Go implementation of the Polkadot Host](https://github.com/ChainSafe/gossamer)\n- [Kagome - C++ implementation of Polkadot Host](https://github.com/soramitsu/kagome)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#polkadot-opengov-terminology-and-parameters", "page_title": "Polkadot OpenGov Origins", "index": 0, "depth": 2, "title": "Polkadot OpenGov Terminology and Parameters", "anchor": "polkadot-opengov-terminology-and-parameters", "start_char": 185, "end_char": 2531, "estimated_token_count": 479, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Polkadot OpenGov Terminology and Parameters\n\nThe important parameters to be aware of when voting using the Referenda module are as follows:\n\n**Origin** - Each origin has a fixed set of privileges. When making a proposal, it is important to\nchoose the origin that has the privilege to execute the referenda.\n\n**Track** - Each track has its own dispatch origin and a preset configuration that governs the\nvoting process and parameters.\n\n**Submission Deposit** - The minimum amount to be used as a (refundable) deposit to submit a public\nreferendum proposal.\n\n**Prepare Period** - The minimum time the referendum needs to wait before it can progress to the\nnext phase after submission. Voting is enabled, but the votes do not count toward the outcome of the\nreferendum yet.\n\n**Decision Deposit** - This deposit is required for a referendum to progress to the decision phase\nafter the end of prepare period.\n\n**Decision Period** - Amount of time a decision may take to be approved to move to the confirming\nperiod. If the proposal is not approved by the end of the decision period, it gets rejected.\n\n**Max Deciding** - The maximum number of referenda that can be in the decision period of a track all\nat once.\n\n**Conviction**: A multiplier to increase voting power.\n\n**Approval**: the share of the approval vote-weight after adjustments for conviction against the\ntotal number of vote-weight for both approval and rejection\n\n**Support**: The total number of votes in approval (ignoring adjustments for conviction) compared to\nthe total possible amount of votes that could be made in the system. Support also takes into account\nabstained votes.\n\n**Min Approval** - The threshold of approval (along with the min support) needed for a proposal to\nmeet the requirements of the confirm period.\n\n**Min Support** - The threshold of support (along with the min approval) needed for a proposal to\nmeet the requirements of the confirm period.\n\n**Confirmation Period** - The total time the referenda must meet both the min approval and support\ncriteria during the decision period in order to pass and enter the enactment period.\n\n**Min Enactment Period** - Minimum time that an approved proposal must be in the dispatch queue\nafter approval. The proposer has the option to set the enactment period to be of any value greater\nthan the min enactment period."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#origins-and-tracks-info", "page_title": "Polkadot OpenGov Origins", "index": 1, "depth": 2, "title": "Origins and Tracks Info", "anchor": "origins-and-tracks-info", "start_char": 2531, "end_char": 9634, "estimated_token_count": 1429, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Origins and Tracks Info\n\n=== \"Polkadot\"\n    | ID  | Origin              | Max Deciding | Decision Deposit | Prepare Period | Decision Period | Confirm Period | Min Enactment Period | Min Approval         | Min Support          |\n    |-----|---------------------|--------------|------------------|----------------|-----------------|----------------|----------------------|----------------------|----------------------|\n    | 0   | Root                | 1            | 100000 DOT       | 2 Hours        | 28 Days         | 1 Day          | 1 Day                | Reciprocal           | Linear Decreasing    |\n    | 1   | Whitelisted Caller  | 100          | 10000 DOT        | 30 Minutes     | 28 Days         | 10 Minutes     | 10 Minutes           | Reciprocal           | Reciprocal           |\n    | 2   | Wish For Change     | 10           | 20000 DOT        | 2 Hours        | 28 Days         | 1 Day          | 10 Minutes           | Reciprocal           | Linear Decreasing    |\n    | 10  | Staking Admin       | 10           | 5000 DOT         | 2 Hours        | 28 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 11  | Treasurer           | 10           | 1000 DOT         | 2 Hours        | 28 Days         | 7 Days         | 1 Day                | Reciprocal           | Linear Decreasing    |\n    | 12  | Lease Admin         | 10           | 5000 DOT         | 2 Hours        | 28 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 13  | Fellowship Admin    | 10           | 5000 DOT         | 2 Hours        | 28 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 14  | General Admin       | 10           | 5000 DOT         | 2 Hours        | 28 Days         | 3 Hours        | 10 Minutes           | Reciprocal           | Reciprocal           |\n    | 15  | Auction Admin       | 10           | 5000 DOT         | 2 Hours        | 28 Days         | 3 Hours        | 10 Minutes           | Reciprocal           | Reciprocal           |\n    | 20  | Referendum Canceller| 1,000        | 10000 DOT        | 2 Hours        | 7 Days          | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 21  | Referendum Killer   | 1,000        | 50000 DOT        | 2 Hours        | 28 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 30  | Small Tipper        | 200          | 1 DOT            | 1 Minutes      | 7 Days          | 10 Minutes     | 1 Minutes            | Linear Decreasing    | Reciprocal           |\n    | 31  | Big Tipper          | 100          | 10 DOT           | 10 Minutes     | 7 Days          | 1 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 32  | Small Spender       | 50           | 100 DOT          | 4 Hours        | 28 Days         | 2 Days         | 1 Day                | Linear Decreasing    | Reciprocal           |\n    | 33  | Medium Spender      | 50           | 200 DOT          | 4 Hours        | 28 Days         | 4 Days         | 1 Day                | Linear Decreasing    | Reciprocal           |\n    | 34  | Big Spender         | 50           | 400 DOT          | 4 Hours        | 28 Days         | 7 Days         | 1 Day                | Linear Decreasing    | Reciprocal           |\n\n=== \"Kusama\"\n    | ID  | Origin              | Max Deciding | Decision Deposit | Prepare Period | Decision Period | Confirm Period | Min Enactment Period | Min Approval         | Min Support          |\n    |-----|---------------------|--------------|------------------|----------------|-----------------|----------------|----------------------|----------------------|----------------------|\n    | 0   | Root                | 1            | 3333.333333 KSM  | 2 Hours        | 14 Days         | 1 Day          | 1 Day                | Reciprocal           | Linear Decreasing    |\n    | 1   | Whitelisted Caller  | 100          | 333.333333 KSM   | 30 Minutes     | 14 Days         | 10 Minutes     | 10 Minutes           | Reciprocal           | Reciprocal           |\n    | 2   | Wish For Change     | 10           | 666.666667 KSM   | 2 Hours        | 14 Days         | 1 Day          | 10 Minutes           | Reciprocal           | Linear Decreasing    |\n    | 10  | Staking Admin       | 10           | 166.666667 KSM   | 2 Hours        | 14 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 11  | Treasurer           | 10           | 33.333333 KSM    | 2 Hours        | 14 Days         | 2 Days         | 1 Day                | Reciprocal           | Linear Decreasing    |\n    | 12  | Lease Admin         | 10           | 166.666667 KSM   | 2 Hours        | 14 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 13  | Fellowship Admin    | 10           | 166.666667 KSM   | 2 Hours        | 14 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 14  | General Admin       | 10           | 166.666667 KSM   | 2 Hours        | 14 Days         | 3 Hours        | 10 Minutes           | Reciprocal           | Reciprocal           |\n    | 15  | Auction Admin       | 10           | 166.666667 KSM   | 2 Hours        | 14 Days         | 3 Hours        | 10 Minutes           | Reciprocal           | Reciprocal           |\n    | 20  | Referendum Canceller| 1,000        | 333.333333 KSM   | 2 Hours        | 7 Days          | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 21  | Referendum Killer   | 1,000        | 1666.666667 KSM  | 2 Hours        | 14 Days         | 3 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 30  | Small Tipper        | 200          | 0.033333 KSM     | 1 Minutes      | 7 Days          | 10 Minutes     | 1 Minutes            | Linear Decreasing    | Reciprocal           |\n    | 31  | Big Tipper          | 100          | 0.333333 KSM     | 10 Minutes     | 7 Days          | 1 Hours        | 10 Minutes           | Linear Decreasing    | Reciprocal           |\n    | 32  | Small Spender       | 50           | 3.333333 KSM     | 4 Hours        | 14 Days         | 2 Days         | 1 Day                | Linear Decreasing    | Reciprocal           |\n    | 33  | Medium Spender      | 50           | 6.666667 KSM     | 4 Hours        | 14 Days         | 4 Days         | 1 Day                | Linear Decreasing    | Reciprocal           |\n    | 34  | Big Spender         | 50           | 13.333333 KSM    | 4 Hours        | 14 Days         | 7 Days         | 1 Day                | Linear Decreasing    | Reciprocal           |\n\n!!!info\n    For every referendum in each of these tracks, the Polkadot Developer Interface displays interactive graphs of the support and approval.\n    ![UI Support and Approval](./../assets/governance/support-approval-polkadot-js-ui.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#extrinsics-and-tracks", "page_title": "Polkadot OpenGov Origins", "index": 2, "depth": 2, "title": "Extrinsics and Tracks", "anchor": "extrinsics-and-tracks", "start_char": 9634, "end_char": 12215, "estimated_token_count": 420, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Extrinsics and Tracks\n\n!!!note\n    You must submit the extrinsics in the table below using either the Root or a compatible OpenGov origin.\n\n\n| Pallet                        | Extrinsic Function       | Required OpenGov Origin                                                                 |\n|-------------------------------|--------------------------|---------------------------------------------------------------------------------|\n| **Scheduler**                 | `schedule_named`         | `AuctionAdmin`, `Treasurer`                                            |\n|                               | `schedule`              | `AuctionAdmin`, `Treasurer`                                            |\n| **Treasury**                  | `reject_proposal`        | `Treasurer`                                                            |\n|                               | `approve_proposal`       | `Treasurer`                                                            |\n| **Election Provider Multi-Phase** | `submit_unsigned`    | `StakingAdmin`                                                         |\n| **Nomination Pools**          | `set_metadata`           | `StakingAdmin`                                                         |\n|                               | `update_roles`           | `StakingAdmin`                                                         |\n| **Asset Rate**                | `create`                | `Treasurer`                                                            |\n|                               | `remove`                | `Treasurer`                                                            |\n|                               | `update`                | `Treasurer`                                                            |\n| **Auctions**                  | `new_auction`           | `AuctionAdmin`                                                         |\n| **Slots**                     | `force_lease`           | `LeaseAdmin`                                                           |\n| **HRMP**                      | `open_channel`          | `GeneralAdmin`                                                         |\n| **Dynamic Parameters**        | `set`                   | `DynamicParameterOrigin` (uses specific roles internally, e.g., `Treasurer`)   |\n| **Staking**                   | `force_new_era`         | `StakingAdmin`                                                         |\n|                               | `set_validator_count`   | `StakingAdmin`                                                         |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#root", "page_title": "Polkadot OpenGov Origins", "index": 3, "depth": 3, "title": "Root", "anchor": "root", "start_char": 12215, "end_char": 13652, "estimated_token_count": 304, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Root\n\n=== \"Polkadot\"\n\n    The origin with the highest level of privileges. This track requires extremely high levels of\n    approval and support for early passing. The prepare and enactment periods are also large. For\n    instance, a referendum proposed in this track needs to amass 48.2% support (total network issuance)\n    by the end of the first day with over 93.5% approval to be considered to be part of the confirm\n    period. The support curve drops linearly to 25% by the end of day 14 and almost to 0% by the end of\n    day 28. This ensures that the token holders receive ample time to vote on the proposal during the\n    decision period.\n\n     ![](./../assets/polkadot-opengov-origins/root_origin_polkadot.png)\n\n=== \"Kusama\"\n\n    The origin with the highest level of privileges. This track requires extremely high levels of\n    approval and support for early passing. The prepare and enactment periods are also large. For\n    instance, a referendum proposed in this track needs to amass 46.8% support (total network issuance)\n    by the end of the first day with over 88% approval to be considered to be part of the confirm\n    period. The support curve drops linearly to 25% by the end of day 7 and almost to 0% by the end of\n    day 14. This ensures that the token holders receive ample time to vote on the proposal during the\n    decision period.\n\n     ![](./../assets/polkadot-opengov-origins/root_origin_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#whitelisted-caller", "page_title": "Polkadot OpenGov Origins", "index": 4, "depth": 3, "title": "Whitelisted Caller", "anchor": "whitelisted-caller", "start_char": 13652, "end_char": 15224, "estimated_token_count": 341, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Whitelisted Caller\n\n=== \"Polkadot\"\n\n    Origin commanded by the [Fellowship](../learn/learn-polkadot-technical-fellowship.md) whitelist some\n    hash of a call and allow the call to be dispatched with the root origin (after the referendum\n    passes). This track allows for a shorter voting turnaround, safe in the knowledge through an open\n    and transparent process for time-critical proposals. For instance, a referendum proposed in this\n    track needs to amass 20% :polkadot support (much lesser than the root) by the end of the first day\n    with over 93.5% approval to be considered to be part of the confirm period. **Note how no referendum\n    on the Whitelisted track can ever pass with less than 5% support.**\n\n    ![](./../assets/polkadot-opengov-origins/whitelisted_caller_polkadot.png)\n\n=== \"Kusama\"\n\n    Origin commanded by the [Fellowship](../learn/learn-polkadot-technical-fellowship.md) whitelist some\n    hash of a call and allow the call to be dispatched with the root origin (after the referendum\n    passes). This track allows for a shorter voting turnaround, safe in the knowledge through an open\n    and transparent process for time-critical proposals. For instance, a referendum proposed in this\n    track needs to amass 14% support (much lesser than the root) by the end of the first day with over\n    88% approval to be considered to be part of the confirm period. **Note how no referendum on the\n    Whitelisted track can ever pass with less than 5% support.**\n\n    ![](./../assets/polkadot-opengov-origins/whitelisted_caller_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#wish-for-change", "page_title": "Polkadot OpenGov Origins", "index": 5, "depth": 3, "title": "Wish For Change", "anchor": "wish-for-change", "start_char": 15224, "end_char": 16185, "estimated_token_count": 204, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Wish For Change\n\nThe Wish For Change track serves as a medium for gathering consensus through OpenGov on a proposed\nchange to the network through an [on-chain remark](../general/glossary.md#remarks). This track was\nadded to ensure the Root track, which is typically utilized for handling one referendum at a time\ndue to the sensitive nature of Root calls, is not employed to convey network desires to various\nbodies within the network. These remark statements could be voted on simultaneously because they\nlack stateful logic impacting the network. They should not delay voting on proposals requiring Root\nor be obligated to its queue. The approval/support criteria resemble Root, and passing items on this\ntrack serves as a signal for a change without conferring privileges.\n\n=== \"Polkadot\"\n\n    ![](./../assets/polkadot-opengov-origins/wish_for_change_polkadot.png)\n\n=== \"Kusama\"\n\n    ![](./../assets/polkadot-opengov-origins/wish_for_change_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#staking-admin", "page_title": "Polkadot OpenGov Origins", "index": 6, "depth": 3, "title": "Staking Admin", "anchor": "staking-admin", "start_char": 16185, "end_char": 16554, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Staking Admin\n\nThe origin for canceling [slashes](./learn-offenses.md). This origin has the privilege to execute\ncalls from the staking pallet and the Election Provider Multiphase Pallet.\n\n=== \"Polkadot\"\n\n    ![](./../assets/polkadot-opengov-origins/staking_admin_polkadot.png)\n\n=== \"Kusama\"\n\n    ![](./../assets/polkadot-opengov-origins/staking_admin_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#treasurer", "page_title": "Polkadot OpenGov Origins", "index": 7, "depth": 3, "title": "Treasurer", "anchor": "treasurer", "start_char": 16554, "end_char": 17037, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Treasurer\n\n=== \"Polkadot\"\n\n    The origin for spending funds from the treasury (up to 10M DOT). This origin has the privilege to\n    execute calls from the Treasury pallet.\n\n    ![](./../assets/polkadot-opengov-origins/treasurer_polkadot.png)\n\n=== \"Kusama\"\n\n    The origin for spending funds from the treasury (up to 333333.33 KSM). This origin has the privilege\n    to execute calls from the Treasury pallet.\n\n    ![](./../assets/polkadot-opengov-origins/treasurer_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#lease-admin", "page_title": "Polkadot OpenGov Origins", "index": 8, "depth": 3, "title": "Lease Admin", "anchor": "lease-admin", "start_char": 17037, "end_char": 17325, "estimated_token_count": 78, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Lease Admin\n\nOrigin can force slot leases. This origin has the privilege to execute calls from the Slots pallet.\n\n=== \"Polkadot\"\n\n    ![](./../assets/polkadot-opengov-origins/slot_admin_polkadot.png)\n\n=== \"Kusama\"\n\n    ![](./../assets/polkadot-opengov-origins/slot_admin_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#fellowship-admin", "page_title": "Polkadot OpenGov Origins", "index": 9, "depth": 3, "title": "Fellowship Admin", "anchor": "fellowship-admin", "start_char": 17325, "end_char": 17589, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Fellowship Admin\n\nThe origin for managing the composition of the fellowship.\n\n=== \"Polkadot\"\n\n    ![](./../assets/polkadot-opengov-origins/fellowship_admin_polkadot.png)\n\n=== \"Kusama\"\n\n    ![](./../assets/polkadot-opengov-origins/fellowship_admin_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#general-admin", "page_title": "Polkadot OpenGov Origins", "index": 10, "depth": 3, "title": "General Admin", "anchor": "general-admin", "start_char": 17589, "end_char": 17861, "estimated_token_count": 70, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### General Admin\n\nThe origin managing the registrar and permissioned HRMP channel operations.\n\n=== \"Polkadot\"\n\n    ![](./../assets/polkadot-opengov-origins/general_admin_polkadot.png)\n\n=== \"Kusama\"\n\n    ![](./../assets/polkadot-opengov-origins/general_admin_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#referendum-canceller", "page_title": "Polkadot OpenGov Origins", "index": 11, "depth": 3, "title": "Referendum Canceller", "anchor": "referendum-canceller", "start_char": 17861, "end_char": 18236, "estimated_token_count": 87, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Referendum Canceller\n\nThe origin can cancel referenda. This track has a low lead time and approval/support curves with\nslightly sharper reductions in their thresholds for passing.\n\n=== \"Polkadot\"\n\n    ![](./../assets/polkadot-opengov-origins/referendum_canceller_polkadot.png)\n\n=== \"Kusama\"\n\n    ![](./../assets/polkadot-opengov-origins/referendum_canceller_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#referendum-killer", "page_title": "Polkadot OpenGov Origins", "index": 12, "depth": 3, "title": "Referendum Killer", "anchor": "referendum-killer", "start_char": 18236, "end_char": 18643, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Referendum Killer\n\nThe origin can cancel an ongoing referendum and slash the deposits. This track also has a low\nlead-time and approval/support curves with slightly sharper reductions in their thresholds for\npassing.\n\n=== \"Polkadot\"\n\n    ![](./../assets/polkadot-opengov-origins/referendrum_killer_polkadot.png)\n\n=== \"Kusama\"\n\n    ![](./../assets/polkadot-opengov-origins/referendum_killer_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#small-tipper", "page_title": "Polkadot OpenGov Origins", "index": 13, "depth": 3, "title": "Small Tipper", "anchor": "small-tipper", "start_char": 18643, "end_char": 18970, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Small Tipper\n\n=== \"Polkadot\"\n\n    Origin able to spend up to 250 DOT from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/small_tipper_polkadot.png)\n\n=== \"Kusama\"\n\n    Origin able to spend up to 8.25 KSM from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/small_tipper_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#big-tipper", "page_title": "Polkadot OpenGov Origins", "index": 14, "depth": 3, "title": "Big Tipper", "anchor": "big-tipper", "start_char": 18970, "end_char": 19293, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Big Tipper\n\n=== \"Polkadot\"\n\n    Origin able to spend up to 1000 DOT from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/big_tipper_polkadot.png)\n\n=== \"Kusama\"\n\n    Origin able to spend up to 33.33 KSM from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/big_tipper_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#small-spender", "page_title": "Polkadot OpenGov Origins", "index": 15, "depth": 3, "title": "Small Spender", "anchor": "small-spender", "start_char": 19293, "end_char": 19627, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Small Spender\n\n=== \"Polkadot\"\n\n    Origin able to spend up to 10000 DOT from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/small_spender_polkadot.png)\n\n=== \"Kusama\"\n\n    Origin able to spend up to 333.33 KSM from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/small_spender_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#medium-spender", "page_title": "Polkadot OpenGov Origins", "index": 16, "depth": 3, "title": "Medium Spender", "anchor": "medium-spender", "start_char": 19627, "end_char": 19966, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Medium Spender\n\n=== \"Polkadot\"\n\n    Origin able to spend up to 100000 DOT from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/medium_spender_polkadot.png)\n\n=== \"Kusama\"\n\n    Origin able to spend up to 3333.33 KSM from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/medium_spender_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-origins", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-origins/#big-spender", "page_title": "Polkadot OpenGov Origins", "index": 17, "depth": 3, "title": "Big Spender", "anchor": "big-spender", "start_char": 19966, "end_char": 20296, "estimated_token_count": 89, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6534fe57f8126efc1fb05d2eac5b02505cba6e19de8292bd065126b4616728a3", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Big Spender\n\n=== \"Polkadot\"\n\n    Origin able to spend up to 1000000 DOT from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/big_spender_polkadot.png)\n\n=== \"Kusama\"\n\n    Origin able to spend up to 33333.33 KSM from the treasury at once.\n\n    ![](./../assets/polkadot-opengov-origins/big_spender_kusama.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#treasury-inflow-and-outflow", "page_title": "Treasury", "index": 0, "depth": 2, "title": "Treasury Inflow and Outflow", "anchor": "treasury-inflow-and-outflow", "start_char": 670, "end_char": 2244, "estimated_token_count": 377, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Treasury Inflow and Outflow\n\nTokens that are deposited into the Treasury (i.e. the inflow) is determined by the following\nmechanisms:\n\n- **Transaction fees:** 80% of the transaction fees of every submitted extrinsic is diverted to the\n  Treasury, while 20% is given to the block producers.\n- **Inflation:** 15% of DOT annual inflation is directed to the Treasury.\n- **Slashes:** whenever validators and nominators are [slashed](./learn-offenses.md), a share of the\n  slashed tokens are diverted to Treasury. They are typically rare and unpredictable events.\n- **Transfers:** everyone can send funds to the Treasury directly. This is a rare event and\n  typically due to grantees reimbursing some of the amount they got allocated for various reasons.\n\nThe outflow is determined by the following mechanisms:\n\n- **Burned tokens:** at the end of each spend period,\n  **[a fraction](../general/chain-state-values.md) of the available funds are\n  burned**.\n- **Treasury proposals & Bounties:** they make up the largest share of outflow tokens to the\n  community and need to be approved by governance. Then, payouts occur at the end of a\n  [spend period](../general/glossary.md#spend-period).\n- **Tips:** smaller payouts directly to grantees that can happen within a\n  [spend period](../general/glossary.md#spend-period).\n\n!!!info \"Spend Period Schedule\"\n    On Polkadot Developer Interface, navigate to Governance > Treasury to view the status of current [spend period](../general/glossary.md#spend-period).\n\n![preimage-whitelist](../assets/treasury/treasury-spend-period.png)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#treasury-tracks", "page_title": "Treasury", "index": 1, "depth": 2, "title": "Treasury Tracks", "anchor": "treasury-tracks", "start_char": 2244, "end_char": 2826, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Treasury Tracks\n\nOpenGov allows for managing funds through six tracks, each with its own\n[origin and track parameters](./learn-polkadot-opengov-origins.md#origins-and-tracks-info).\n\n- [Treasurer](./learn-polkadot-opengov-origins.md#treasurer)\n- [Big Spender](./learn-polkadot-opengov-origins.md#big-spender)\n- [Medium Spender](./learn-polkadot-opengov-origins.md#medium-spender)\n- [Small Spender](./learn-polkadot-opengov-origins.md#small-spender)\n- [Big Tipper](./learn-polkadot-opengov-origins.md#big-tipper)\n- [Small Tipper](./learn-polkadot-opengov-origins.md#small-tipper)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#submit-treasury-proposal-via-subsquare", "page_title": "Treasury", "index": 2, "depth": 2, "title": "Submit Treasury Proposal via Subsquare", "anchor": "submit-treasury-proposal-via-subsquare", "start_char": 2826, "end_char": 3807, "estimated_token_count": 199, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Submit Treasury Proposal via Subsquare\n\nAccess to Treasury funds requires successful enactment of a referendum in the respective treasury\ntrack on-chain. Learn how to submit a treasury proposal for referendum using\n[Subsquare](../general/governance-apps.md).\n\nGo to [Subsquare](https://polkadot.subsquare.io/) and start a new treasury proposal on the relevant\ntrack. Then,\n\n- Choose an address for the proposer.\n- Write a proposal: add a detailed description for the proposal, which will be stored on Subsquare.\n  Alternatively, you can link an existing discussion post.\n- Create a preimage: an existing preimage can be linked, or a new one can be created. To create a\n  preimage, add the beneficiary address and the token amount. The track will be auto-selected and\n  you can proceed with the creation of a preimage.\n- Create a proposal: final confirmation of the proposal creation. The description of the proposal and\n  the preimage are automatically linked to the proposal."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#sub-treasuries", "page_title": "Treasury", "index": 3, "depth": 2, "title": "Sub-treasuries", "anchor": "sub-treasuries", "start_char": 3807, "end_char": 4518, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Sub-treasuries\n\nThe treasury currently operates on a single account on-chain. The above tracks manage the outflow of\nthe treasury on the network. With _sub_-treasuries, having treasury accounts that correspond to each\n[collective](./learn-system-chains.md#collectives) is also possible.\n\nRather than have many referenda through OpenGov, the treasury can allocate funds to each\nsub-treasury (through [governance](./learn-polkadot-opengov.md)), from which each respective collective\ncan spend funds (depending on their specific rule set).\n\nNew treasuries could be added to respective\n[system chains](./learn-system-chains.md#existing-system-chains) through governance by adding more\ninstances of this pallet."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#multi-asset-treasury-support", "page_title": "Treasury", "index": 4, "depth": 2, "title": "Multi-Asset Treasury Support", "anchor": "multi-asset-treasury-support", "start_char": 4518, "end_char": 5587, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Multi-Asset Treasury Support\n\nThe treasuries can support multiple asset types and thus can spend assets other than DOT (or KSM on\nKusama) held within the treasury, and their transfers and interactions across the chains facilitated\nby [cross-consensus messaging](./learn-xcm.md). These assets have a few requirements:\n\n1. The asset is listed on the [AssetHub system parachain](https://assethub-polkadot.subscan.io/).\n2. The asset is active and has sufficient liquidity to be utilized for payouts.\n3. The asset has a set conversion rate, as per OpenGov referenda on the Treasurer track (set via the\n   asset rate pallet). This conversion rate defines a fixed-point representation for converting from\n   that asset to the native asset (DOT or KSM).\n4. The asset must be approved and onboarded via OpenGov to become spendable via the treasury as a\n   valid spend method.\n\n> For example,\n> [see how USDT became approved as an asset on AssetHub](https://forum.polkadot.network/t/multi-asset-treasury-and-milestone-based-spends/6780),\n> which can be used in the treasury."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#bounties", "page_title": "Treasury", "index": 5, "depth": 2, "title": "Bounties", "anchor": "bounties", "start_char": 5587, "end_char": 5600, "estimated_token_count": 3, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Bounties"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#parent-bounties", "page_title": "Treasury", "index": 6, "depth": 3, "title": "Parent Bounties", "anchor": "parent-bounties", "start_char": 5600, "end_char": 8849, "estimated_token_count": 661, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Parent Bounties\n\nGetting treasury funding through OpenGov, depending on which treasury track you submit your\nreferendum, can be a long and uncertain process. This is not always a suitable option, for example,\nfor event organizers who need to pay costs upfront or close to the event's date. Bounties solve this\nproblem by procuring access to treasury funds in a single shot and using them to fund multiple\nevents later on through [child bounties](#child-bounties). This is why bounties are also called\n_parent_ bounties.\n\nParent bounty proposals aim to reserve a portion of treasury funds once, which will be used later.\nThey save proponents the time needed to create and obtain approval for several OpenGov referenda.\nBounties are managed by curators, where the curator is usually a\n[multi-signature account](./learn-account-multisig.md). Bounties can access a large amount of funds,\nso managing those funds with a multisig is a good practice to enhance security. Essentially,\ncurators are multisig addresses with agency over a portion of the treasury to promote events, fix a\nbug or vulnerability, develop a strategy, or monitor a set of tasks related to a specific topic, all\nfor the benefit of the ecosystem.\n\nA proposer can [submit a bounty proposal](./learn-guides-bounties.md#submit-a-bounty-proposal) to\nOpenGov,\n[with a curator to be defined later](./learn-guides-bounties.md#assign-a-curator-to-a-bounty), whose\nbackground and expertise is such that they can determine when the task is complete.\n\nWhen submitting the value of the bounty, the proposer can specify a fee that will be paid to\ncurators willing to invest their time and expertise in the task; this amount will be included in the\ntotal value of the bounty. In this sense, the curator's fee can be defined as the difference between\nthe amounts paid to child bounty awardees and the total value of the bounty.\n\nCurators are selected through OpenGov referendum after the bounty proposal passes; and they need to\npay an upfront [deposit](../general/chain-state-values.md) to take the\nposition. This deposit can be used to punish curators if they act maliciously. However, if they are\nsuccessful in managing the bounty to completion, they will receive their deposit back, and part of\nthe bounty funding as a payment for their efforts.\n\nCurators are expected to have a decent track record in addressing the issues the bounty wants to\nsolve. They should be very knowledgeable on the topics covered by the bounty and have proven project\nmanagement skills or experience. These recommendations help ensure an effective use of the bounty\nmechanism. A Bounty is a reward for a specified body of work or set of objectives that needs to be\nexecuted for a predefined treasury amount designated to be paid out. The responsibility of assigning\na payout address once the specified set of objectives is completed is delegated to the curator.\n\nThe bounty has a [predetermined duration](../general/chain-state-values.md), with\npossible extension(s) to be requested by the curator. To maintain flexibility during the tasks’\ncuration, the curator will also be able to create child bounties for more granularity in the\nallocation of funds and as part of a nested iteration of the bounty mechanism."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov-treasury", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov-treasury/#child-bounties", "page_title": "Treasury", "index": 7, "depth": 3, "title": "Child Bounties", "anchor": "child-bounties", "start_char": 8849, "end_char": 9238, "estimated_token_count": 97, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6cba5196bad3336f0320c66053e83c2c12d8631972eaeb0c634c199d090713ea", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Child Bounties\n\nChild bounties are spawned from [parent bounties](#parent-bounties). Child bounties are used to\naccess funds directly from the parent bounty without going through an OpenGov referendum.\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about bounties](./learn-guides-bounties.md) and [treasury](./learn-guides-treasury.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#summary", "page_title": "Polkadot OpenGov", "index": 0, "depth": 2, "title": "Summary", "anchor": "summary", "start_char": 1891, "end_char": 4276, "estimated_token_count": 494, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Summary\n\nIn Polkadot OpenGov, all the proposals are initiated by the public. The proposal will enter a\nLead-in period (for more information, see [Referenda Timeline](#referenda-timeline)), after which it\nwill follow a specific [track](#origins-and-tracks) which has a dedicated origin. There are\n[15 origins](./learn-polkadot-opengov-origins.md#origins-and-tracks-info), each with a different\ntrack configuration. Tracks parameters are preset values that set the duration of a referendum as\nwell as how many referenda can be voted on simultaneously. For example, a treasury proposal can now\nbe submitted in different tracks depending on the amount requested. A proposal for a small tip will\nneed to be submitted to the Small Tipper track, while a proposal requiring substantial funds will\nneed to be submitted to the Medium or Big Spender track.\n\n![opengov-overview](../assets/opengov-overview.png)\n\nThe [Polkadot Technical Fellowship](./learn-polkadot-technical-fellowship.md) can decide to\n[whitelist](./learn-polkadot-technical-fellowship.md#whitelisting) a proposal that will be enacted through the Whitelist Caller origin.\nThose proposals will have a shorter Lead-in, Confirmation, and Enactment period when compared to the Root origin.\n\nEach track has its own preset [Approval and Support](#approval-and-support) curves based on the\norigin's privileges. When both the approval and support criteria are satisfied for a specific period\n(called the confirmation period), the referendum passes and will be executed after the enactment\nperiod.\n\nAll referenda within each track and across tracks can be voted on simultaneously (assuming the\ntrack's maximum capacity is not reached).\n\nPolkadot OpenGov also comes with [multi-role delegations](#multirole-delegation) where the token holder can assign voting\npower on different tracks to different entities who are experts in judging the referenda submitted\nto those tracks. For example, suppose a token holder does not have the technical background to\nconsider the merits and vote on the referenda submitted to the Root track. In that case, they can\ndelegate their voting power just for the Root track to a trusted expert who (according to them) acts\nin the best interest of the network protocol. In this way, token holders do not need to be\nup-to-date with governance matters and can still make their votes count through delegates."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#referenda", "page_title": "Polkadot OpenGov", "index": 1, "depth": 2, "title": "Referenda", "anchor": "referenda", "start_char": 4276, "end_char": 4839, "estimated_token_count": 136, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Referenda\n\nIn Polkadot OpenGov all referenda are public. Anyone can start a referendum at any time and do\nso as often as they wish. [**Origins and Tracks**](#origins-and-tracks) help facilitate the flow and processing of the submitted referenda, while the [Technical Fellowship](./learn-polkadot-technical-fellowship.md) has the option to [whitelist](./learn-polkadot-technical-fellowship.md#whitelisting) referenda that can be then proposed in the track with [whitelist origin](./learn-polkadot-opengov-origins.md#whitelisted-caller) (sort of a fast track)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#opengov-deposits", "page_title": "Polkadot OpenGov", "index": 2, "depth": 3, "title": "OpenGov Deposits", "anchor": "opengov-deposits", "start_char": 4839, "end_char": 5298, "estimated_token_count": 109, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### OpenGov Deposits\n\nA submission deposit is needed to store a proposal's preimage as part of the proposal creation process. On Polkadot, the submission deposit is around [42 DOT](https://polkadot.js.org/apps/#/preimages). \n\nAn origin-dependent decision deposit is also needed to enter the decision period of a particular referendum (see below). See how you can claim back your deposits [here](./learn-guides-polkadot-opengov.md#claiming-opengov-deposits)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#referenda-timeline", "page_title": "Polkadot OpenGov", "index": 3, "depth": 3, "title": "Referenda Timeline", "anchor": "referenda-timeline", "start_char": 5298, "end_char": 9216, "estimated_token_count": 772, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Referenda Timeline\n\n![opengov-timeline](../assets/opengov-timeline.png)\n\nThe figure above provides a summary view of the referenda timeline for Polkadot OpenGov.\n\nIn (1), when a referendum is initially created, the community can immediately vote on it. However,\nit is not immediately in a state where it can end or otherwise have its votes counted, approved, and\nultimately enacted. Instead, the proposal will stay within a **Lead-in Period** until it fulfills\nthree criteria:\n\n- Proposals must stay within the lead-in period for a pre-defined minimum amount of time. This helps\n  mitigate against the possibility of \"decision sniping\" where an attacker controlling a substantial\n  amount of voting power might seek to have a proposal passed immediately after proposing, not\n  allowing the overall voting population adequate time to consider and participate.\n- There must be enough room for the decision within the origin. Different origins have their limit\n  on the number of proposals that can be decided simultaneously. Origins that have more potent\n  abilities will have lower limits. For example, the Root level origin has a limit of one, implying\n  that only a single proposal may be decided on at once on its track.\n- A decision deposit must be submitted. Creating a referendum is cheap as the submission deposit value consists\n  of only the value required for the on-chain storage needed to track it. But, having a referendum\n  reviewed and decided upon carries the risk of using up the limited spots available in the\n  referenda queue. Having a more significant but refundable deposit requirement helps\n  mitigate spam. Failing to submit the decision deposit will lead to a referendum _timeout_.\n\n!!!info \"Decision Deposit Amounts\"\n    In Polkadot OpenGov, someone must submit the Decision Deposit for a referendum to enter its Decision Period. The number of tokens required for the Decision Deposit depends on the origin’s privilege level. The higher the privilege, the higher the deposit. For example, malicious referenda posted on the Small Tipper origin inflict low economic damage to the network. In contrast, malicious referenda on the Root origin can inflict more significant harm, such as changing the entire network's runtime.\n\nUntil they are in the lead-in period, proposals remain undecided. Once the criteria above are met,\nthe referendum moves to the _deciding_ state. The votes of the referendum are now counted towards\nthe outcome.\n\nIn (2), the proposal enters the **Decision Period**, where voting can continue. For a proposal to be\napproved, votes must satisfy the approval and support criteria for at least the **Confirmation\nPeriod**; otherwise, the proposal is automatically rejected. A rejected proposal can be resubmitted\nanytime and as many times as needed.\n\nIn (3), approved proposals will enter the **Enactment Period**, after which proposed changes will be\nexecuted.\n\nNote how the length of the lead-in, decision, confirmation, and enactment periods vary depending on\nthe origin. Root origin has more extended periods than the other tracks. Also, the number of\nreferenda within each track differs, with the Root origin only accepting one proposal at a\ntime (see below).\n\n![opengov-track-capacity](../assets/opengov-track-capacity.png)\n\nThis directly affects the number of proposals that can be voted on and executed simultaneously.\nContinuing the comparison between Root and Small Tipper, Small Tipper will allow many proposals on\nits track to be executed simultaneously. In contrast, Root will allow only one proposal to be on its\ntrack. Once the track capacity is filled, additional proposals in the lead-in period will queue\nuntil place is available to enter the decision period.\n\nFor examples of collectives, see the [Polkadot Alliance](https://polkadot.subsquare.io/democracy/referenda/94) and the [Polkadot Technical Fellowship](./learn-polkadot-technical-fellowship.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#origins-and-tracks", "page_title": "Polkadot OpenGov", "index": 4, "depth": 3, "title": "Origins and Tracks", "anchor": "origins-and-tracks", "start_char": 9216, "end_char": 12192, "estimated_token_count": 616, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Origins and Tracks\n\nAn **Origin** is a specific level of privilege that will determine the **Track** configuration of all referenda\nexecuted with that origin. The track is a pipeline in which the proposal lives and proceeds,\nindependent of other origins' tracks. The proposer of the referenda selects an appropriate\norigin for their request based on the proposal’s requirements.\n\nAlthough the track structure is the same for all origins, track parameters are not. Such parameters include:\n\n- **Maximum Deciding or Capacity**: the limit for the number of referenda that can be decided at\n  once (i.e., the number of tracks within each origin).\n- **Decision deposit**: the amount of funds that must be placed on deposit to enter the Decision\n  Period (note that more requirements must be met to enter the Decision Period).\n- **Preparation Period**: the minimum amount of voting time needed before entering the Decision\n  Period (given capacity and deposit are met).\n- **Decision Period**: the time interval during which a proposal's outcome can be decided.\n- **Confirmation Period**: the minimum amount of time the approval and support criteria must hold\n  before the proposal is approved and moved to the enactment period. The confirmation period should\n  start before the end of the decision period.\n\n!!!info \"Example Scenario of an Edge Case\"\n    A referendum may enter the confirmation period just one block before the decision period ends. In this scenario, the referendum will pass if it satisfies approval and support thresholds for the minimum confirmation period (track-dependent).\n\n- **Voting Period**: The period in which voting is allowed on a referendum, which includes\n  preparation, decision, and confirmation periods.\n- **Minimum Enactment Period**: the minimum amount of waiting time before the proposed changes are\n  applied\n- **Approval Curve**: the curve describing the minimum % of _aye_ votes as a function of time within\n  the Decision Period. The approval % is the portion of _aye_ votes (adjusted for conviction) over\n  the total votes (_aye_, _nay_, and _abstained_).\n- **Support Curve**: the curve describing the minimum % of all votes in support of a proposal as a\n  function of time within the Decision Period. The support % is defined as the portion of all votes\n  (_aye_ and _abstained_) without conviction over the total possible amount of votes in the system\n  (i.e., the total active issuance).\n\nFor example, a runtime upgrade (requiring a `set_code` call, if approved) does not have the same\nimplications for the ecosystem as the approval of a treasury tip (`reportAwesome` call) and\ntherefore, different Origins for these two actions are needed in which different deposits, support,\napproval, and a minimum [enactment](#enactment) periods will be predetermined on the pallet.\n\nFor detailed information about origin and tracks, and parameter values in Kusama, see\n[this page](./learn-polkadot-opengov-origins.md#origins-and-tracks-info)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#voluntary-locking-conviction-voting", "page_title": "Polkadot OpenGov", "index": 5, "depth": 3, "title": "Voluntary Locking (Conviction Voting)", "anchor": "voluntary-locking-conviction-voting", "start_char": 12192, "end_char": 14087, "estimated_token_count": 495, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Voluntary Locking (Conviction Voting)\n\nPolkadot utilizes an idea called voluntary locking that allows token holders to increase their\nvoting power by declaring how long they are willing to lock up their tokens; hence, the number of votes for each token holder will be calculated by the following formula:\n\n```\nvotes = tokens * conviction_multiplier\n```\n\nThe conviction multiplier increases the vote multiplier by one every time the number of lock periods\ndouble.\n\n| Lock Periods | Vote Multiplier  | Length in Days   |\n|-----|------|------|\n|0|0.1|0|\n|1|1|7|\n|2|2|14|\n|4|3|28|\n|8|4|56|\n|16|5|112|\n|32|6|224|\n\nThe maximum number of \"doublings\" of the\n[lock period](../general/chain-state-values.md) is set to 6 (and thus\n32 lock periods in total). For additional information regarding the timeline of governance events, see the [origins and tracks information](./learn-polkadot-opengov-origins.md#origins-and-tracks-info).\n\nVotes are always \"counted\" at the same time (at the end of the voting period), no matter how long\nthe tokens are locked.\n\nSee below an example that shows how voluntary locking works.\n\nPeter: Votes `No` with 10 DOT for a 32-week lock period => 10 x 6 = 60 Votes\n\nLogan: Votes `Yes` with 20 DOT for one week lock period => 20 x 1 = 20 Votes\n\nKevin: Votes `Yes` with 15 DOT for a 2-week lock period => 15 x 2 = 30 Votes\n\nEven though both Logan and Kevin vote with more DOT than Peter, the lock period for both of them is\nless than Peter’s, leading to their voting power counting as less.\n\n!!!info \"Staked tokens can be used in governance\"\n    While the tokens are locked, you can still use them for voting and [staking](./learn-staking.md). You are only prohibited from transferring these tokens to another account. **See the section about [OpenGov locks](#voting-on-a-referendum), and learn more about locks on the [Balances page](./learn-account-balances.md#locks).**"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#approval-and-support", "page_title": "Polkadot OpenGov", "index": 6, "depth": 3, "title": "Approval and Support", "anchor": "approval-and-support", "start_char": 14087, "end_char": 19311, "estimated_token_count": 1092, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Approval and Support\n\n![opengov-curves-pass](../assets/opengov-curves-pass.png)\n\nThe figure above provides a summary view of how the approval and support system works during the\nDecision Period.\n\nOnce the proposal exits the Lead-in Period and enters the Voting Period, to be approved, it must\nsatisfy the approval and support criteria for the **Confirmation Period**.\n\n- **Approval** is defined as the share of [conviction](#voluntary-locking-conviction-voting)-weighted _aye_ votes\n  against the conviction-weighted total of _aye_ and _nay_ votes. The code implementation can be\n  viewed\n  [here](https://github.com/paritytech/polkadot-sdk/blob/f2fbba3be1d7deaf7cfc731cea00552c212ddfcf/substrate/frame/conviction-voting/src/types.rs#L77)\n- **Support** is the total number of _aye_ and _abstain_ votes (ignoring any adjustment for\n  conviction) compared to the total possible votes ([active issuance](../general/chain-state-values.md))\n  that could be made in the system. In case of _split_ votes, only _aye_ and _abstain_ will count.\n\nFor example, let us consider a hypothetical example where the total active issuance is 100 DOT.\n\n- An account A votes \"Aye\" with 10 DOT with 4x conviction\n- An account B votes \"Nay\" with 5 DOT with 2x conviction\n- An account C votes \"Abstain\" with 20 DOT. (no conviction can be applied to \"Abstain\" votes)\n\nIn this scenario, only 35 DOT from the total active issuance participated in voting on the\nreferendum. Now, let us calculate the Approval and Support values for that referendum.\n\n- Approval is calculated as (Aye') / (Aye' + Nay’), where Aye' and Nay' are the votes after applying\n  the conviction multiplier. Hence, Approval = (10 x 4) / (10 x 4 + 5 x 2) = 40/50 which is 80%.\n- Support is calculated as (Aye + Abstain) / (total active issuance), where \"Aye\" and \"Abstain\" are\n  the votes without the conviction multiplier. Hence, Support = (10 + 20) / 100 which is 30%.\n\n!!!info \"Nay votes are not counted towards Support\"\n    Support is a measure of voters who turned out either in favor of the referenda or consciously abstained from it. Support does not include _nay_ votes. This avoids edge situations where _nay_ votes could push a referendum into a confirming state. For example, imagine current approval is high (near 100%, way above the approval curve), and current support is just below the support curve. A _nay_ could bump support above the support curve but not reduce approval below the approval curve. Therefore, someone voting against a proposal would make it pass. Hence, a decrease in % of current approval through new votes does not directly translate into increasing support because Support needs to consider _nay_ votes.\n\n![opengov-curves-pass](../assets/opengov-curves-nopass.png)\n\nThe figure above shows the following:\n\n- Even if the approval threshold is reached (i.e., % of current approval is greater than the\n  approval curve), the proposal only enters the confirmation period once the support threshold is\n  also reached (i.e., % current support is greater than the underlying support curve).\n- If the referendum meets the approval and support thresholds for the duration of the confirmation\n  period, the proposal will be approved and will be scheduled for enactment. Each track has a\n  default minimum Enactment Period, and the approved referendum needs to wait till the end of it to\n  be executed. Powerful Tracks like `Root` enforce a larger Enactment Period to ensure the network\n  has ample time to prepare for any changes the proposal may bring. The referendum proposers can\n  also set the enactment period higher than its default value.\n- A referendum may exit the confirmation period when the thresholds are no longer met due to new\n  _Nay_ votes or a change of existing _Aye_ or _Abstain_ votes to _Nay_ . Each time it exits, the\n  confirmation period clock is reset. For example, suppose the confirmation period is 20 minutes,\n  and a referendum enters it just for 5 min before exiting. The next time it enters, it must be\n  confirmed for 20 minutes (not 15 minutes).\n- It is possible that a referendum meets the approval and support thresholds almost at the end of\n  the decision period. In this case, even though the decision period elapses, the referendum can\n  pass if it stays confirming for the duration of the track-specific confirmation period. It is\n  rejected immediately if it exits the confirmation period after the decision period elapses.\n- The approval curve starts at 100% and gradually decreases to 50%, but never below 50%. Assuming\n  all the active token supply has voted on a proposal, the conviction vote-weighted support should\n  always be above 50% to pass.\n\nNote that support may not increase monotonically, as shown in the figure, as people might switch\nvotes.\n\nDifferent origins' tracks have different Confirmation Periods and requirements for approval and\nsupport. For additional details on the various origins and tracks, check out\n[this table](./learn-polkadot-opengov-origins.md#origins-and-tracks-info). With proposals that use\nless privileged origins, it is far more reasonable to drop the required support to a more realistic\namount earlier than those which use highly privileged classes such as `Root`."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#enactment", "page_title": "Polkadot OpenGov", "index": 7, "depth": 3, "title": "Enactment", "anchor": "enactment", "start_char": 19311, "end_char": 19826, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Enactment\n\nIn Polkadot OpenGov, the proposer suggests the enactment period, but there is also a minimum set for\neach origin track. For example, `root` origin approvals require an extended period because of the\nimportance of the changes they bring to the network.\n\nApproved referenda are enforced on-chain automatically. Once the enactment period elapses, the\nruntime executes the proposal's preimage directly, rather than treating the outcome as an advisory\nsignal that a third party must choose to implement."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#cancelling-killing-blacklisting", "page_title": "Polkadot OpenGov", "index": 8, "depth": 3, "title": "Cancelling, Killing & Blacklisting", "anchor": "cancelling-killing-blacklisting", "start_char": 19826, "end_char": 21724, "estimated_token_count": 365, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Cancelling, Killing & Blacklisting\n\nPolkadot OpenGov has two origins dedicated to rejecting ongoing referenda:\n[Referendum Canceller](./learn-polkadot-opengov-origins.md#referendum-canceller) and\n[Referendum Killer](./learn-polkadot-opengov-origins.md#referendum-killer).\n\nReferendum Canceller aims to cancel an already ongoing referendum. When this origin cancels a\nreferendum, the Submission and Decision Deposit are refunded to their originators. An example of\nwhen a referendum might be considered to be canceled is if the originator has made some errors in\ncreating the preimage and did not necessarily do anything malicious. Cancellation has a lower\nDecision Period, and Approval and Support criteria are much easier to meet over time than most other\nOrigins. This is because the cancellation of a referendum usually comes with a sense of urgency.\n\nReferendum Killer aims to instantly kill an ongoing referendum, slashing submission and decision\ndeposit (the account(s) that posted these deposits will lose those funds). This origin can be\nengaged if, for example, a malicious actor submits a referendum on the Root Track to set the code of\nthe chains' runtime to stop block production.\n\nThe Decision Deposit for the Referendum Killer track itself is high to prevent malicious actors from\nattempting to slash deposits of good referenda. A subsequent Referendum Killer can kill an existing\nReferendum Killer.\n\nFor more information about how to cancel or kill a referendum, see the\n[advanced how-to guides](./learn-guides-polkadot-opengov.md#cancel-or-kill-a-referendum).\n\nA proposal can be blacklisted by Root Origin. A blacklisted proposal and its related referendum (if any) are immediately canceled. Additionally, a blacklisted proposal's hash cannot re-appear in the proposal queue. Blacklisting is useful when removing erroneous proposals that could be submitted with the same hash."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#voting-on-a-referendum", "page_title": "Polkadot OpenGov", "index": 9, "depth": 2, "title": "Voting on a Referendum", "anchor": "voting-on-a-referendum", "start_char": 21724, "end_char": 23288, "estimated_token_count": 362, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Voting on a Referendum\n\nIf you are a voter, it means that you will vote with your tokens on each single referendum.\n\nIn Polkadot OpenGov, voters can cast _aye_, _nay_, _abstain_, and _split_ votes.\n[Vote splitting](./learn-guides-polkadot-opengov.md#voting-on-referenda) allows voters to allocate\ndifferent votes for _aye_, _nay_, and _abstain_. Voting with conviction is not possible when\nabstaining or splitting the votes.\n\n!!!info \"Only the last vote counts\"\n    Voting a second time replaces your original vote, e.g. voting with 10 DOT, then a second extrinsic to vote with 5 DOT, means that you are voting with 5 DOT, not 10 DOT.\n\nNote that to successfully cast votes you need to have the\n[existential deposit](./learn-accounts.md#existential-deposit-and-reaping) and some additional funds\nto pay for transaction fees.\n\nIn general, you can remove your vote:\n\n- While a referendum is ongoing (your vote does not count)\n- After a referendum ended (your vote counts)\n\nIf you voted without conviction, there's no conviction lock in either case. If you voted with\nconviction, you only get a conviction lock if the referendum ended and you voted with the winning\nside.\n\n![voting-locks-1](../assets/voting-locks-1.png)\n\n!!!info \"Revoke your delegation on a track if you like to vote on your own\"\n    If you want to vote on a referendum on a specific track on your own, you will need to revoke any existing [delegation](#multirole-delegation) on that track (i.e. undelegate). You can have a conviction lock on the track, but you cannot have an active delegation."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#voting-without-conviction", "page_title": "Polkadot OpenGov", "index": 10, "depth": 3, "title": "Voting Without Conviction", "anchor": "voting-without-conviction", "start_char": 23288, "end_char": 23715, "estimated_token_count": 79, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Voting Without Conviction\n\nIf you vote without conviction, the referendum is ongoing, and you remove the vote, you can unlock\nyour tokens immediately. If the referendum ended, you can remove your vote and unlock your tokens\nimmediately, regardless of whether you are on the winning or losing side of the referendum. The interface you used for participating in Polkadot OpenGov should show an option to\nunlock your tokens."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#voting-with-conviction", "page_title": "Polkadot OpenGov", "index": 11, "depth": 3, "title": "Voting with Conviction", "anchor": "voting-with-conviction", "start_char": 23715, "end_char": 25432, "estimated_token_count": 366, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Voting with Conviction\n\nIf you voted with conviction, the referendum is ongoing, and you removed the vote, you can unlock\nyour tokens immediately. If the referendum ended and you are on the losing side, you can remove your\nvote and unlock the tokens immediately. However, if you are on the winning side of the referendum,\nyou will get a conviction lock.\n\nConviction locks are calculated from the time the referendum ended but are applied when you remove\nthe vote.\n\nFor example, if you voted with conviction 1x with 10 DOT, those 10 DOT will be locked for 7 days\nafter the referendum ends (assuming you are on the winning side). If you remove the vote 3 days\nafter the referendum ended, your tokens will be locked for 4 more days. If you remove it on the 8th\nday after the end of the referendum, the tokens can be unlocked right away (after you remove the\nvote). When you remove the vote, the lock expiration block is calculated and added to the chain\nstate.\n\nIf you voted on multiple referenda, and you are on the winning side of all those referenda, you will\nget multiple conviction voting locks for all those referenda. **Locks do not stack**; the length and\nsize of the lock decides. This means that - assuming you used the same conviction on the same number\nof tokens - when the conviction lock on the latest referendum (see below, Ref 4) expires, you will\nbe able to unlock your tokens. In the meantime, the previous locks (1 to 3) might have expired, and\nyou can remove those locks (after removing the votes).\n\n![voting-locks-2](../assets/voting-locks-2.png)\n\nWhen you delegate your votes, the locking mechanism differs slightly. Please check the next section\non Multirole Delegation for more information."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#multirole-delegation", "page_title": "Polkadot OpenGov", "index": 12, "depth": 2, "title": "Multirole Delegation", "anchor": "multirole-delegation", "start_char": 25432, "end_char": 28426, "estimated_token_count": 578, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Multirole Delegation\n\nPolkadot OpenGov introduces a feature known as **multirole delegation**, where voters can specify a different delegate for every class of\nreferendum in the system. Delegation can be done per track, and accounts can choose to select\ndifferent delegates (or no delegation) for each track.\n\nFor example, a voter could delegate one entity for managing a less potent referenda class, choose a\ndifferent delegate for another class with more powerful consequences and still retain full voting\npower over any remaining classes.\n\nContrary to solo voting, with delegations, any conviction locks are applied as soon as you\nundelegate, regardless of whether your delegated votes were used for voting during that time. If\nyour delegated votes were used in any ongoing referenda, they would be removed from those referenda\nwhen you undelegate. Alternatively, after undelegating, you can delegate to another person or modify\nyour delegation. The only way to modify the delegation is to undelegate and delegate again. You do\nnot have to do this yourself; wallets and extensions should have implemented UI to modify delegation\nwithout you knowing this.\n\nIf you delegate without conviction and you undelegate, you can unlock your tokens immediately.\nAlternatively, after undelegating, you can always delegate to another person or modify your\ndelegation.\n\n![delegation-locks-1](../assets/delegation-locks-1.png)\n\nIn the case you delegated with 1x conviction, you undelegate and re-delegate with 2x conviction; the\ntime you undelegate again, you will have created two conviction locks: one for the 1x and one for\nthe 2x conviction. If you re-delegate immediately with 1x conviction and undelegate, you will get a\nsecond 1x conviction lock, but the 2x conviction lock will be the one deciding when your token can\nbe unlocked.\n\n![delegation-locks-2](../assets/delegation-locks-2.png)\n\n!!!info\n    If the account delegated votes to different delegates using different convictions, then after undelegating those delegates, there will be different unlocking periods with lengths dependent on the conviction multipliers.\n\n**Before delegating a specific track, you must remove any [vote](#voting-on-a-referendum) on that\ntrack.**\n\nIt is worth noting that a user delegating their voting power does not imply that the delegate will\nhave control over the funds of the delegating user's account. That delegate's account can vote with\na user's voting power but won't be able to transfer balances, nominate a different set of\nvalidators, or execute any call other than voting on the tracks defined by the user.\n\nThe goal of delegations is to ensure the required support for proposals to be enacted is reached\nwhile keeping the overall design censorship-free. Also, voters might not have the technical\nknowledge to judge some referenda or might not have the time to read all referenda. Delegations\nallow voters to participate in OpenGov hands-free by delegating their voting power to trusted\nentities."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#governance-v1-vs-polkadot-opengov", "page_title": "Polkadot OpenGov", "index": 13, "depth": 2, "title": "Governance V1 vs. Polkadot OpenGov", "anchor": "governance-v1-vs-polkadot-opengov", "start_char": 28426, "end_char": 37708, "estimated_token_count": 1574, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Governance V1 vs. Polkadot OpenGov\n\nBelow is a comparison table between the first iteration of Polkadot governance (Governance V1) and OpenGov. If you are curious about Governance V1, see [this documentation](https://messari.io/report/polkadot-opengov-report).\n\n| Governance V1                                                                                                                                                                                                                                                                                                                                          | Polkadot OpenGov                                                                                                                                                                                                                                       | Polkadot OpenGov Benefit                                                                                                                                           |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| Includes the Council, the Technical Committee, and the Public (i.e. token holders).                                                                                                                                                                      | Includes the Public and the [Technical Fellowship](./learn-polkadot-technical-fellowship.md).                                                                                                                                                          | Simpler and more decentralized structure.                                                                                                                          |\n| Referenda executed only from one origin (Root). Referenda in this origin must be carefully scrutinized. Therefore, there is only one track (i.e., only one referendum at a time can be executed).                                                                                                                                                      | Referenda executed from [multiple origins](./learn-polkadot-opengov-origins.md#origins-and-tracks-info), each with a different track that shapes proposals’ timelines. Depending on the origin, multiple referenda within the same track are possible. | Possibility to categorize proposals (based on importance and urgency) and execute them simultaneously within and between origin tracks.                            |\n| Proposals can be submitted by either the Council or the Public.                                                                                                                                                                                                                                                                                        | The public submits proposals.                                                                                                                                                                                                                          | More democratic.                                                                                                                                                   |\n| Uses Adaptive Quorum Biasing to define the approval threshold based on turnout. Given the same turnout, council-initiated referenda require fewer Aye votes to pass compared to public referenda.                                                                                             | Uses origin-specific approval and support curves defining the amount of approval and support (i.e. turnout) needed as a function of time. The same curves are applied to all referenda within the same origin track.                                   | Referenda timeline depends on the origin and not on who submitted the proposal (i.e. Council or Public). This is a more democratic and equalitarian system.        |\n| Uses alternating voting timetable allowing voters to cast votes for either council or public referenda every 28 eras.                                                                                                                                                                    | Multiple referenda can be voted at the same time.                                                                                                                                                                                                      | More flexible and agile governance system.                                                                                                                         |\n| Except for emergency proposals, all referenda have fixed voting and enactment periods of 28 eras.                                                                                                                                                                                                                                                      | Periods' length is customizable and has pre-defined limits for each origin. The same limits apply to all tracks with the same origin. For example, the track in the origin Root will be longer than the track within the Small Tipper origin.          | Referenda’s timeline is tailored to their importance and urgency. Flexible enactment period based on origin.                                                       |\n| Emergency proposals turned referenda can be simultaneously voted on and executed with other referenda and have shorter enactment periods. They must be proposed by the Technical Committee and approved by the Council.                                                                                                                                | No emergency proposals. The Technical Fellowship can whitelist proposals that will have their origin with shorter lead-in, confirmation, and enactment periods.                                                                                        | The Technical Fellowship is a more decentralized entity than the Technical Committee. Whitelisting a proposal requires a majority of approval from the fellowship. |\n| Only the most endorsed proposal is able to transit from Launch to Voting period. The time for the transition is indeterminate, and (with no possibility of canceling endorsements) proposers and endorsers might wait a long time before a referendum is tabled, and getting their deposits back. | All proposals will eventually be voted on (given track capacity and deposit are met and the Lead-in period has ended).                                                                                                                                 | It allows all proposals to get a chance to be voted on in a timely, predictive manner.                                                                             |\n| Only _aye_ or _nay_ votes possible.                                                                                                                                                                                                                                                                                                                    | Voters can have the additional voting options of abstaining or splitting votes.                                                                                                                                                                        | More ways to engage in voting and increase turnout.                                                                                                                |\n| Voters can decide to delegate votes to another account.                                                                                                                                                                                                                                                                                                | Voters can use [multirole delegations](#multirole-delegation) and delegate votes to different accounts depending on origins.                                                                                                                           | More agile delegations tailored by expertise.                                                                                                                      |\n\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about OpenGov](./learn-guides-polkadot-opengov.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-opengov", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-opengov/#how-to-guides", "page_title": "Polkadot OpenGov", "index": 14, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 37708, "end_char": 38027, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:6a122ca0d92541bcdfd8fbf62df18abf3bc39f8eb2fb2ae15150cc0ac756f80f", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [How to Remove Expired Referenda Locks](how-to/remove-referenda-locks.md)\n- [How to Vote on Polkadot OpenGov](how-to/vote-opengov.md)\n- [How to Participate in Polkadot OpenGov](how-to/opengov-participate.md)\n- [How to Delegate Your Voting Power on Polkadot OpenGov](how-to/delegate-voting-power.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-technical-fellowship", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-technical-fellowship/#technical-fellowship-referenda", "page_title": "Polkadot Technical Fellowship", "index": 0, "depth": 2, "title": "Technical Fellowship Referenda", "anchor": "technical-fellowship-referenda", "start_char": 1563, "end_char": 2320, "estimated_token_count": 151, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1cdad112531ca2e49c311479e5e869ae865a37201e9f42120fe1d196103011f0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Technical Fellowship Referenda\n\nThe fellowship's governance model has multiple tracks with their own approval and support\nparameters, where the votes are weighted by the rank of the member. Members of the Fellowship can\nvote on any given Fellowship proposal and the aggregated opinion of the members (weighted by their\nrank) constitutes the Fellowship's collective opinion. The list of current and historic fellowship\nreferenda can be viewed on [Subsquare](https://collectives.subsquare.io/) or\n[Subsquare.](https://collectives.subsquare.io/) The fellowship governance is primarily used for its\nmembership management, [approving RFCs](https://github.com/polkadot-fellows/RFCs) and whitelisting\nPolkadot OpenGov proposals created on the whitelist track."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-technical-fellowship", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-technical-fellowship/#whitelisting", "page_title": "Polkadot Technical Fellowship", "index": 1, "depth": 3, "title": "Whitelisting", "anchor": "whitelisting", "start_char": 2320, "end_char": 3533, "estimated_token_count": 254, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1cdad112531ca2e49c311479e5e869ae865a37201e9f42120fe1d196103011f0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Whitelisting\n\nPolkadot OpenGov allows the Technical Fellowship to authorize an origin known as\n\"Whitelisted-Caller\" to execute with Root-level privileges for calls approved by the Fellowship\n(currently only level-three fellows and above can vote for whitelist calls). Note that the\nfellowship cannot unanimously change the network parameters, conduct rescues or move assets. The\nwhitelisted proposals still have to go through the whole life cycle of an OpenGov referendum and can\nonly be enacted when the referendum passes successfully.\n\nThe whitelisting process starts as a fellowship referenda with embedded XCM call from the\ncollectives system chain to the Polkadot relay chain. For instance,\n[the Polkadot Fellowship referenda 68](https://collectives.subsquare.io/fellowship/referenda/68) was used to\n**whitelist** [the Polkadot OpenGov referenda 440](https://polkadot.subsquare.io/referenda/440).\n\n![whitelist-xcm](../assets/fellowship-whitelist-xcm.png)\n\n!!!info \"Submitting Whitelisted Proposals\"\n    For more information about how to submit a whitelisted proposal see the [dedicated advanced how-to guides](./learn-guides-polkadot-opengov.md#submitting-a-referendum-on-the-whitelisted-caller-track)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-technical-fellowship", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-technical-fellowship/#technical-fellowship-ranking-and-salary", "page_title": "Polkadot Technical Fellowship", "index": 2, "depth": 2, "title": "Technical Fellowship Ranking and Salary", "anchor": "technical-fellowship-ranking-and-salary", "start_char": 3533, "end_char": 4663, "estimated_token_count": 270, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1cdad112531ca2e49c311479e5e869ae865a37201e9f42120fe1d196103011f0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Technical Fellowship Ranking and Salary\n\nThe Fellowship [manifesto](https://github.com/polkadot-fellows/manifesto) outlines the requirements\nand expectations for individuals to attain and retain any given rank, ranging between 0 to 9. By\ndefault, an active account on the collectives system chain has no assigned rank and can be inducted\ninto the Polkadot Technical Fellowship starting with rank 0. The Fellowship Manifesto states that\nmembers should receive a monthly allowance on par with gross income in OECD countries. A\n[fellowship RFC](https://github.com/polkadot-fellows/RFCs/pull/50) was proposed with concrete\namounts for each ranked members.\n\n| Dan  |      Title      | Annual Salary |\n| :--: | :-------------: | :-----------: |\n|  I   |     Member      |    $10,000    |\n|  II  |   Proficient    |    $20,000    |\n| III  |     Fellow      |    $80,000    |\n|  IV  |    Architect    |   $120,000    |\n|  V   | Architect Adept |   $160,000    |\n|  VI  | Grand Architect |   $200,000    |\n| VII  |   Free Master   |   $200,000    |\n| VIII | Master Constant |   $200,000    |\n|  IX  |  Grand Master   |   $200,000    |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-technical-fellowship", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-technical-fellowship/#membership-management", "page_title": "Polkadot Technical Fellowship", "index": 3, "depth": 2, "title": "Membership Management", "anchor": "membership-management", "start_char": 4663, "end_char": 5064, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1cdad112531ca2e49c311479e5e869ae865a37201e9f42120fe1d196103011f0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Membership Management\n\nThe Polkadot technical Fellowship was initially\n[seeded](https://github.com/polkadot-fellows/seeding) with its members and their corresponding\nranks, and got [added on to Polkadot's Collectives](https://polkadot.subsquare.io/council/motions/403)\nsystem chain. Membership requests will go through the fellowship governance and the\nprocedure is outlined in the section below."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-technical-fellowship", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-technical-fellowship/#becoming-a-member", "page_title": "Polkadot Technical Fellowship", "index": 4, "depth": 3, "title": "Becoming a Member", "anchor": "becoming-a-member", "start_char": 5064, "end_char": 5942, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1cdad112531ca2e49c311479e5e869ae865a37201e9f42120fe1d196103011f0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Becoming a Member\n\nAs a member of the Polkadot Technical Fellowship, you are expected to faithfully uphold the below\ntenets:\n\n- Sincerely uphold the interests of Polkadot and avoid actions which clearly work against it.\n- Respect the philosophy and principles of Polkadot.\n- Respect the operational procedures, norms and voting conventions of the Fellowship.\n- Respect fellow Members and the wider community.\n\n!!!tip \"Register your interest\"\n    New fellowship inductions are handled through the [fellowship dashboard](https://polkadot-fellows.xyz/#/membership). This initiative was funded by the Polkadot treasury through [OpenGov referendum 373](https://polkadot.subsquare.io/treasury/proposals/574).\n\nThe full set of instructions to be inducted to the Polkadot Technical Fellowship are available on\n[the fellowship dashboard](https://polkadot-fellows.xyz/#/membership)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-technical-fellowship", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-technical-fellowship/#rank-updates", "page_title": "Polkadot Technical Fellowship", "index": 5, "depth": 3, "title": "Rank Updates", "anchor": "rank-updates", "start_char": 5942, "end_char": 6728, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1cdad112531ca2e49c311479e5e869ae865a37201e9f42120fe1d196103011f0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Rank Updates\n\nThe Polkadot Technical Fellowship members are expected to provide a periodic evidence to request for\nretaining their rank or to get promoted to a higher rank. Any fellowship member upto rank 4 can be\npromoted to the next rank through a fellowship referenda that can be voted by the members who are 2\nranks higher. For instance, the fellowship\n[referenda 64](https://collectives.subsquare.io/fellowship/referenda/64) which promotes a member\nfrom rank 1 to rank 2 can only be voted by members whose ranks are greater than or equal to 3.\nPromotion of the Polkadot Fellowship members from rank 5 needs to be done through an OpenGov\nreferendum. For more information, check the rank updates section on\n[the fellowship dashboard](https://polkadot-fellows.xyz/#/membership)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-polkadot-technical-fellowship", "url": "https://developer.polkadot.com/wiki/learn/learn-polkadot-technical-fellowship/#cumulative-rank-based-voting", "page_title": "Polkadot Technical Fellowship", "index": 6, "depth": 2, "title": "Cumulative Rank-Based Voting", "anchor": "cumulative-rank-based-voting", "start_char": 6728, "end_char": 8848, "estimated_token_count": 617, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:1cdad112531ca2e49c311479e5e869ae865a37201e9f42120fe1d196103011f0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Cumulative Rank-Based Voting\n\nAs specified in the [manifesto](https://github.com/polkadot-fellows/manifesto/blob/main/manifesto.pdf), when it comes to governance voting, the Polkadot Technical Fellowship uses a **cumulative rank-voting** system, where the **weight of a vote increases non-linearly with the member's rank**. The weight function `w(r)` is defined as:\n\n```\nw(r) = r(r + 1) / 2\n```\n\nwhere `r` is the member rank. For example, a member with rank 3 has a voting weight of 6, while rank 5 has a weight of 15. Thus, higher-ranked members have significantly more influence than lower-ranked ones.\n\nFor votes requiring a **minimum rank** to participate (such as Membership, Promotion, or Continuation votes), the weight calculation is adjusted so that the **lowest eligible rank has a base weight of 1**, and higher ranks scale upward from there. This is formalized as:\n\n```\nw'(r, m) = w(r - m + 1)\n```\n\nWhere `r` is the member's rank and `m` is the minimum rank allowed to vote.\n\nThe table below illustrates this system with a minimum voting rank of 2 and a maximum of 6:\n\n| Rank | r - m + 1 | Weight w'(r, 2) |\n|------|-----------|-----------------|\n| 1    | 0         | 0 *(ineligible)* |\n| 2    | 1         | 1               |\n| 3    | 2         | 3               |\n| 4    | 3         | 6               |\n| 5    | 4         | 10              |\n| 6    | 5         | 15              |\n\nNote that because of this system, the same rank can have different voting weights, depending on the minimum rank required in that specific vote type (Membership, Promotion, or Continuation). Se the example below taken from an RFC proposal:\n\n| Rank | Amount |\n|-----|-------|\n|3|1|\n|4|3|\n|2|1|\n|3|3|\n|4|6|\n|6|15|\n\nRank 3 has power 1 in one vote and power 3 in another, it means:\n\n- In the first vote, the minimum rank allowed was 3 → w'(3, 3) = w(1) = 1\n\n- In the second vote, the minimum rank was 2 → w'(3, 2) = w(2) = 3\n\nSimilarly, for Rank 4 with power of 3 and 6, it means:\n\n- First case: w'(4, 3) = w(2) = 3\n\n- Second case: w'(4, 2) = w(3) = 6\n\nThe system is flexible by design to reflect different eligibility levels."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies-pure/#why-pure-proxy", "page_title": "Pure Proxy Accounts", "index": 0, "depth": 2, "title": "Why Pure Proxy?", "anchor": "why-pure-proxy", "start_char": 1102, "end_char": 1692, "estimated_token_count": 118, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b385541fbec112ff8f351be461de10f9f9abbc892ab86aaef857339fb0100cd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why Pure Proxy?\n\nIn the Polkadot ecosystem, pure proxies are helpful in efficiently managing multi-signature accounts. Multi-signature accounts are deterministic, which means that once a multisig is created, the signatories cannot be changed. If one of the signatories wants to leave the multisig, a new multisig must be created. _Pure_ proxies allow keeping the same multisig address when the multisig configuration changes (signatories and threshold). See more examples about using pure proxies with multisigs [here](./learn-guides-accounts-proxy-pure.md#pure-proxies-and-multisigs)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies-pure/#use-of-pure-proxy", "page_title": "Pure Proxy Accounts", "index": 1, "depth": 2, "title": "Use of Pure Proxy", "anchor": "use-of-pure-proxy", "start_char": 1692, "end_char": 3382, "estimated_token_count": 364, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b385541fbec112ff8f351be461de10f9f9abbc892ab86aaef857339fb0100cd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Use of Pure Proxy\n\n!!!info \"Use dApps that deal with pure proxies for you\"\n    Because dealing with pure proxies is complicated, using [multisig applications](../general/multisig-apps.md) that deal with the complexity for you is recommended.\n\nThe use of the _pure proxy_ is strictly bound to the relationship between the _pure proxy_ and the\n_any_ proxy. Note that the _any_ proxy does not necessarily be the one who created the _pure proxy_\nin the first place. Hence, _pure proxies_ are not really owned by somebody but can be\ncontrolled. \n\n!!!danger \"Once that relationship between the _pure proxy_ and its _any_ proxy is broken, the _pure_ proxy will be inaccessible.\"\n\nPure proxies are non-deterministic accounts, meaning that if we lose one _pure proxy_, the next one we create from the same primary account will have a different address.\n\n_Pure proxies_ cannot sign anything because they do not have private keys. However, although they do\nnot have private keys and cannot sign any transaction directly, they can act as proxies (or better,\nproxy channels) within proxy calls via `proxy.proxy` extrinsic. [For example](./learn-guides-accounts-proxy-pure.md#scenario-one-one-pure-proxy-within-a-multisig), having _pure\nproxies_ within a multisig is possible. Using proxy calls, it is possible to use the _any_ proxy to call the\n_pure_ proxy, which in turn will do a multisig call.\n\n!!!info \"Staking Migration to Asset Hub\"\n    **Pure proxies** are automatically migrated to Asset Hub. Additionally, **\"Any\" type pure proxies** are kept on the relay chain to prevent them from becoming inaccessible. **Proxy announcements are not migrated** and will be deleted from the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies-pure/#history-of-pure-proxies", "page_title": "Pure Proxy Accounts", "index": 2, "depth": 2, "title": "History of Pure Proxies", "anchor": "history-of-pure-proxies", "start_char": 3382, "end_char": 4455, "estimated_token_count": 229, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b385541fbec112ff8f351be461de10f9f9abbc892ab86aaef857339fb0100cd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## History of Pure Proxies\n\nIn the past, pure proxies were called anonymous proxies. However, pure proxies are not anonymous because they have an address spawned by a primary account acting as _any_ proxy. Even if _any_ proxy changes, it is still possible to find who generated the _anonymous_ proxy by going backward using a block explorer. There was thus the need to change the name of _anonymous_ proxy. People suggested _keyless accounts_ since they do not have a private key and are proxied accounts. However, multisig accounts are also keyless (but deterministic). Moreover, even if _anonymous_ proxies are proxied accounts, they can still act as proxies and control other accounts via proxy calls (see multisig example below). Thus, the name that has been chosen is **pure proxy**. If you want to know more about the reasoning behind the renaming of pure proxies, see the discussion in [this PR](https://github.com/paritytech/substrate/pull/12283) or the discussion on [Polkadot forum](https://forum.polkadot.network/t/parachain-technical-summit-next-steps/51/14)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies-pure/#remote-proxies", "page_title": "Pure Proxy Accounts", "index": 3, "depth": 2, "title": "Remote Proxies", "anchor": "remote-proxies", "start_char": 4455, "end_char": 6485, "estimated_token_count": 450, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b385541fbec112ff8f351be461de10f9f9abbc892ab86aaef857339fb0100cd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Remote Proxies\n\nRemote proxies enable the utilization of pure proxy accounts, initially established on a designated parent chain (i.e., the Polkadot relay chain), for actions on a separate target chain (i.e., Polkadot Asset Hub). This is achieved by providing a cryptographic proof, specifically a storage proof anchored to the parent chain's storage root. This proof verifies that the specified pure proxy account indeed exists and is valid on the parent chain at a particular point in time.\n\nAn example would be a multi-signature account, where a pure proxy is created on the Polkadot relay chain. To cosign a transaction on Polkadot Asset Hub, this keyless pure proxy cannot directly interact. The remote proxy mechanism bridges this gap. Leveraging the remote proxy pallet on Asset Hub, a transaction can be constructed that includes a storage proof demonstrating the pure proxy's existence on the relay chain. Upon successful verification of this proof, the Asset Hub chain allows actions to be executed as if they originated from the pure proxy on the relay chain.\n\nOnce a successful remote proxy call is executed, a `ProxyExecuted` event should be visible. \n\nHere is an example usage of a remote proxy call: If you have a pure proxy setup on Kusama relay chain, you can use [this tool](https://w3f.github.io/RemoteProxyCall/) to construct a transaction that transfers all funds from the pure proxy account address to its controlling account address on Kusama Asset Hub, even though no proxy setup is present on Kusama Asset Hub. The underlying code is available [on GitHub](https://github.com/w3f/RemoteProxyCall), and is based on [this blog post](https://blog.kchr.de/polkadot/guides/remote-proxies-for-the-braves/). For more context on how remote proxies work and why they're helpful, check out [this blog post](https://blog.kchr.de/ecosystem-proxy/).\n\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about pure proxy accounts](./learn-guides-accounts-proxy-pure.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies-pure", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies-pure/#how-to-guides", "page_title": "Pure Proxy Accounts", "index": 4, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 6485, "end_char": 6563, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:7b385541fbec112ff8f351be461de10f9f9abbc892ab86aaef857339fb0100cd", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [How to Create a Pure Proxy](how-to/create-pure-proxy.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies/#proxy-types", "page_title": "Proxy Accounts", "index": 0, "depth": 2, "title": "Proxy Types", "anchor": "proxy-types", "start_char": 2367, "end_char": 4538, "estimated_token_count": 467, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5332258d023f7fb8b732d4b05f6a19499e8f91a773a9ec9920fadc66eaf3fe0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Proxy Types\n\nWhen a proxy account makes a transaction, Polkadot filters the desired transaction to ensure that\nthe proxy account has the appropriate permission to make that transaction on behalf of the proxied\naccount. For example, staking proxies have permission to do only staking-related transactions.\n\nWhen you set a proxy, you must choose a type of proxy for the relationship with the proxied account.\n\n- **Any**: allow any transaction, including balance transfers. In most cases, this should be avoided\n  as the proxy account is used more frequently than the cold account and is therefore less secure.\n- **Non-transfer**: allow any type of transaction except\n  [balance transfers](./learn-transactions.md#balance-transfers) (including\n  [vested](./learn-transactions.md#vested-transfers) transfers). Hence, this proxy does not have\n  permission to access calls in the Balances and XCM pallet.\n- **Governance**: allow to make transactions related to governance.\n- **Nomination pool**: allow transactions pertaining to\n  [Nomination Pools](./learn-nomination-pools.md).\n- **Staking**: allow all staking-related transactions. The stash account is meant to stay in cold\n  storage, while the staking proxy account makes day-to-day transactions like setting session keys\n  or deciding which validators to nominate. Visit the\n  [Advanced Staking Concepts page](./learn-staking-advanced.md#staking-proxies) for more detailed\n  information about staking proxies.\n- **Identity Judgement**: allow registrars to make judgments on an account's identity. If you are\n  unfamiliar with judgment and identities on chain, please refer to\n  [this page](learn-identity.md#judgements). This proxy can only access `provide_judgement` call\n  from the Identity pallet along with the calls from the Utility pallet.\n- **Cancel**: allow to reject and remove any time-delay proxy announcements. This proxy can only\n  access `reject_announcement` call from the Proxy pallet.\n- **Spokesperson**: Kusama-specific proxy type that only allows `remark` or `remark_with_event`\n  calls.\n- **Society**: Kusama-specific proxy type that only allows\n  [society-related](https://ksmsociety.io/) calls."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies/#proxy-deposits", "page_title": "Proxy Accounts", "index": 1, "depth": 2, "title": "Proxy Deposits", "anchor": "proxy-deposits", "start_char": 4538, "end_char": 5572, "estimated_token_count": 226, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5332258d023f7fb8b732d4b05f6a19499e8f91a773a9ec9920fadc66eaf3fe0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Proxy Deposits\n\nProxies require deposits in the native currency to be created. The deposit is required because\nadding a proxy requires some storage space on-chain, which must be replicated across every peer in\nthe network. Due to the costly nature of this, these functions could open up the network to a\nDenial-of-Service attack. To defend against this attack, proxies require a deposit to be reserved\nwhile the storage space is consumed over the lifetime of the proxy. When the proxy is removed, so is\nthe storage space, and therefore the deposit is returned.\n\nThe required deposit amount for `n` proxies is equal to:\n\n`ProxyDepositBase` + `ProxyDepositFactor` \\* `n`\n\nwhere the [`ProxyDepositBase`](../general/chain-state-values.md) is the required\namount to be reserved for an account to have a proxy list (creates one new item in storage). For\nevery proxy the account has, an additional amount defined by the\n[`ProxyDepositFactor`](../general/chain-state-values.md) is reserved as well (appends\n33 bytes to storage location)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies/#time-delayed-proxy", "page_title": "Proxy Accounts", "index": 2, "depth": 2, "title": "Time-delayed Proxy", "anchor": "time-delayed-proxy", "start_char": 5572, "end_char": 7074, "estimated_token_count": 328, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5332258d023f7fb8b732d4b05f6a19499e8f91a773a9ec9920fadc66eaf3fe0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Time-delayed Proxy\n\nWe can add a layer of security to proxies by giving them a delay time. The delay will be quantified\nin blocks. Polkadot has approximately 6 seconds of block time. A delay value of 10 will mean ten\nblocks, which equals about one minute delay.\n\nThe proxy will announce its intended action and will wait for the number of blocks defined in the\ndelay time before executing it. Within this time window, the intended action may be canceled by\naccounts that control the proxy.\n\nAnnouncing `n` calls using a time-delayed proxy also requires a deposit of the form:\n\n`announcementDepositBase` + `announcementDepositFactor` \\* `n`\n\nwhere the [`announcementDepositBase`](../general/chain-state-values.md) is the\nrequired amount to be reserved for an account to announce a proxy call. For every proxy call the\naccount has, an additional amount defined by the\n[`announcementDepositFactor`](../general/chain-state-values.md) is reserved as well.\n\n!!!info \"Staking Migration to Asset Hub\"\n    **Proxy delegations** are automatically migrated to Asset Hub with proxy types translated appropriately. However, **proxy announcements are not migrated** and will be deleted from the Relay Chain. Any time-delayed proxy announcements will need to be re-created on Asset Hub.\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about proxy accounts](./learn-guides-accounts-proxy.md). You can find information about creating and removing proxies, and more."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-proxies", "url": "https://developer.polkadot.com/wiki/learn/learn-proxies/#how-to-guides", "page_title": "Proxy Accounts", "index": 3, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 7074, "end_char": 7158, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:d5332258d023f7fb8b732d4b05f6a19499e8f91a773a9ec9920fadc66eaf3fe0", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [How to Create a Proxy Account](how-to/create-proxy-account.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#forkless-upgrades", "page_title": "Runtime Upgrades", "index": 0, "depth": 2, "title": "Forkless Upgrades", "anchor": "forkless-upgrades", "start_char": 206, "end_char": 2410, "estimated_token_count": 432, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Forkless Upgrades\n\nYou may have encountered the term \"hard fork\" before in the blockchain space. A **hard fork** occurs\nwhen a blockchain's logic changes such that nodes that do not include the new changes cannot remain\nin consensus with nodes that do. Such changes are backward incompatible. Hard forks can be political\ndue to the nature of the upgrades and logistically demanding due to the number (potentially\nthousands) of nodes in the network that need to upgrade their software. Thus, hard forking is slow,\ninefficient, and error-prone due to the levels of offline coordination required and, therefore, the\npropensity to bundle many upgrades into one large-scale event.\n\nThe usage of [WebAssembly](https://webassembly.org/) in the Polkadot SDK (the framework powering Polkadot,\nKusama and their respective parachains), give the relay chain, its parachains, as well as any other\nstandalone solo chains built with the Polkadot SDK the ability to upgrade their runtime (the chain's\n\"business logic\") without a hard fork of the respective network.\n\nRather than encoding the runtime in the nodes, Polkadot nodes contain a WebAssembly\n[execution host](learn-polkadot-host.md). They maintain consensus on a very low-level and\nwell-established instruction set. Upgrades can be small, isolated, and very specific by deploying\nWebAssembly on-chain and having nodes auto-enact the new logic at a particular block height.\n\nThe runtime is stored on the blockchain itself. Polkadot can upgrade its runtime by upgrading the\nlogic stored on-chain and removes the coordination challenge of requiring thousands of node\noperators to upgrade in advance of a given block number. Polkadot stakeholders propose and approve\nupgrades through the [on-chain governance](./learn-polkadot-opengov.md) system, which also enacts\nthem autonomously once the runtime upgrade referendum is approved through on-chain voting.\n\nAs a result of storing the runtime as part of the state, the runtime code itself becomes state\nsensitive, and calls to runtime can change the runtime code itself. Therefore, the Polkadot Host\nmust always ensure it provides the runtime corresponding to the state in which the entry point has\nbeen called."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#forkless-upgrades-parachains-solo-chains", "page_title": "Runtime Upgrades", "index": 1, "depth": 3, "title": "Forkless Upgrades - Parachains & Solo Chains", "anchor": "forkless-upgrades-parachains-solo-chains", "start_char": 2410, "end_char": 3562, "estimated_token_count": 248, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Forkless Upgrades - Parachains & Solo Chains\n\nThe node architectural design for parachains and solo chains is similar to that of the relay chain,\nwith the runtime code being a Wasm blob that is stored in chain state. Solo chains built with\nPolkadot SDK, which are blockchains that have a native consensus mechanism that is independent of\nthe relay chain's consensus, can be updated through an on-chain governance system like\n[OpenGov](./learn-polkadot-opengov.md) or a simple sudo/multisig setup.\n\nParachains must notify the relay chain whenever a new upgrade is to be enacted. This is done using\ntwo key extrinsics:\n\n- [`system.authorizeUpgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.authorize_upgrade) -\n  notifies the relay chain that an upgrade is to take place, and thus a new state transition\n  function is going to be introduced for that parachain to be validated with.\n- [`system.applyAuthorizedUpgrade`](https://paritytech.github.io/polkadot-sdk/master/frame_system/pallet/struct.Pallet.html#method.apply_authorized_upgrade) -\n  enacts the upgrade, assuming it has been approved."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#client-releases", "page_title": "Runtime Upgrades", "index": 2, "depth": 2, "title": "Client Releases", "anchor": "client-releases", "start_char": 3562, "end_char": 4943, "estimated_token_count": 278, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Client Releases\n\nThe existing runtime logic is followed to update the [Wasm](https://webassembly.org/) runtime stored on the\nblockchain to a new version. The upgrade is then included in the blockchain itself, meaning that all\nthe nodes on the network execute it. Generally, there is no need to upgrade your nodes manually\nbefore the runtime upgrade, as they will automatically start to follow the new logic of the chain.\nNodes only need to be updated when the runtime requires new host functions, or there is a change in\nnetworking or consensus.\n\nTransactions constructed for a given runtime version will not work on later versions. Therefore, a\ntransaction constructed based on a runtime version will not be valid in later runtime versions. If\nyou can’t submit a transaction before the upgrade, it is better to wait and construct it afterward.\n\nAlthough upgrading your nodes is generally not necessary to follow an upgrade, we recommend\nfollowing the Polkadot releases and upgrading promptly, especially for high-priority or critical\nreleases.\n\n!!!info \"New Client Releases\"\n    The details about the latest client releases can be found in the [releases section on the Polkadot repository](https://github.com/paritytech/polkadot-sdk/releases). A detailed analysis for client releases can be viewed on the [Polkadot Forum](https://forum.polkadot.network/tag/release-analysis)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#runtime-vs-client-versions", "page_title": "Runtime Upgrades", "index": 3, "depth": 3, "title": "Runtime vs Client versions", "anchor": "runtime-vs-client-versions", "start_char": 4943, "end_char": 5771, "estimated_token_count": 183, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Runtime vs Client versions\n\nThe runtime and client versions are distinct from each other. The runtime versioning typically looks\nlike `network-xxxx`, whereas the client versioning looks like `vx.x.xx`. For instance, the runtime\nversion shown on the top left section of Polkadot Developer Interface below is `kusama-9370`, and the client\n(node) version shown on the top right section is `v0.9.36`.\n\n![Runtime vs Client versioning](./../assets/runtime-node-version.png)\n\n!!!info \"Querying runtime and client versions\"\n    The runtime version can be queried on-chain through Polkadot Developer Interface by navigating to the Developer tab > Chain State > Storage > system and query `lastRuntimeUpgrade()`.\n    \n    The node version can be queried by navigating to the Developer tab > RPC calls > system and query `version()`."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#runtime-upgrades-for-various-users", "page_title": "Runtime Upgrades", "index": 4, "depth": 2, "title": "Runtime Upgrades for Various Users", "anchor": "runtime-upgrades-for-various-users", "start_char": 5771, "end_char": 5810, "estimated_token_count": 7, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Runtime Upgrades for Various Users"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#for-infrastructure-providers", "page_title": "Runtime Upgrades", "index": 5, "depth": 3, "title": "For Infrastructure Providers", "anchor": "for-infrastructure-providers", "start_char": 5810, "end_char": 6994, "estimated_token_count": 238, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### For Infrastructure Providers\n\nInfrastructure services include but are not limited to the following:\n\n- [Validators](../../node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node.md)\n- API services\n- Node-as-a-Service (NaaS)\n- General infrastructure management (e.g. block explorers, custodians)\n- Wallets\n\nFor validators, keeping in sync with the network is key. At times, upgrades will require validators\nto upgrade their clients within a specific time frame, for example, if a release includes breaking\nchanges to networking. It is essential to check the release notes, starting with the upgrade\npriority and acting accordingly.\n\nGeneral infrastructure providers, aside from following the runtime releases and upgrading in a\ntimely manner, should monitor changes to runtime events and auxiliary tooling, such as the\n[Substrate API Sidecar](https://github.com/paritytech/substrate-api-sidecar).\n\nTransactions constructed for runtime `n` will not work for any other runtime `>n`. If a runtime\nupgrade occurs before broadcasting a previously constructed transaction, you will need to\nreconstruct it with the appropriate runtime version and corresponding metadata."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#for-nominatorslearn-nominatormd", "page_title": "Runtime Upgrades", "index": 6, "depth": 3, "title": "For [Nominators](./learn-nominator.md)", "anchor": "for-nominatorslearn-nominatormd", "start_char": 6994, "end_char": 7301, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### For [Nominators](./learn-nominator.md)\n\nRuntime upgrades don't require any actions by a nominator, though it is always encouraged to keep\nup-to-date and participate with the latest runtime upgrade motions and releases while keeping an eye\non how the nodes on the network are reacting to a new upgrade."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-runtime-upgrades", "url": "https://developer.polkadot.com/wiki/learn/learn-runtime-upgrades/#monitoring-runtime-changes", "page_title": "Runtime Upgrades", "index": 7, "depth": 2, "title": "Monitoring Runtime Changes", "anchor": "monitoring-runtime-changes", "start_char": 7301, "end_char": 9655, "estimated_token_count": 491, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a95da60a3dccbb026c8b876ec1f2952bf22bba4fccf4f257bf45d7041e8b046c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Monitoring Runtime Changes\n\nYou can monitor the chain for upcoming upgrades. The client release notes include the hashes of any\nproposals related to any on-chain upgrades for easy matching. We recommend keeping track of the\nPolkadot Fellowship's\n[runtime upgrades](https://github.com/polkadot-fellows/runtimes/releases/latest) to be aware of\nchanges in the runtime logic.\n\nRuntime upgrades are voted on and executed via [Polkadot OpenGov](./learn-polkadot-opengov.md). You\nshould monitor the relay chain as follows to know when the next runtime upgrade will be enacted:\n\n1. Check each block for `referenda (Submitted)` events and check if the `track` is `0` or `1`, which\n   correspond to the `Root` and `whitelistedCaller` tracks, respectively. These are the only tracks\n   that can enact runtime upgrdes. Log the referendum's `index`; this will help you keep track of\n   the its progress. With the index you can look up the details of the proposal in\n   [Subsquare](https://polkadot.subsquare.io/referenda/tracks/1) to\n   see if it corresponds with a runtime upgrade.\n2. Ongoing referenda will have an `enactment` field under `referenda.ReferendumInfoFor` storage.\n   This is the block number that, if passed, the system will attempt to schedule the inner\n   proposal's execution for. Note that there are some constraints like a minimum enactment period\n   that could result in the proposal's execution occurring later. It is not possible for the\n   proposal to enact _before_ this block number.\n3. Check also for `referenda (DecisionDepositPlaced)` events where `index` matches the one\n   previously found. This means that the required deposit has been placed.\n4. `referenda (DecisionStarted)` indicates that the decision period has started for the referendum\n   of that `index`.\n5. `referenda (ConfirmStarted)` indicates that `index`'s referendum has entered the confirmation\n   period.\n   1. `referenda (Confirmed)` indicates that `index`'s referendum has been confirmed and will enter\n      the enactment period. With this and `enactment_moment`, you can calculate when the proposal\n      will be enacted.\n   2. `referenda (Rejected)` indicates that `index`'s referendum has been rejected and will not be\n      enacted.\n6. When the runtime upgrades, there will be a `system(CodeUpdated)` event confirming the execution\n   of the runtime upgrade."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-safrole", "url": "https://developer.polkadot.com/wiki/learn/learn-safrole/#resources", "page_title": "Polkadot Block Production: SAFROLE", "index": 0, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 1429, "end_char": 1691, "estimated_token_count": 69, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9b5911cfd603e1c52a93fc1005ba0d34f200cb1dc1d758ac06cd84070f5f3bf6", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\n- [The JAM Graypaper (see: **Block Production and Chain Growth**)](https://graypaper.com/graypaper.pdf)\n- [Web3 Foundation Research Page (SASSAFRAS)](https://research.web3.foundation/Polkadot/protocols/block-production/SASSAFRAS)\n  about SASSAFRAS."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#smart-contracts-vs-rollups", "page_title": "Smart Contracts on Polkadot", "index": 0, "depth": 2, "title": "Smart Contracts vs. Rollups", "anchor": "smart-contracts-vs-rollups", "start_char": 653, "end_char": 1293, "estimated_token_count": 123, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Smart Contracts vs. Rollups\n\nPolkadot offers two primary ways to build decentralized applications:\n\n- **Smart Contracts** - Deployed on existing blockchains, they are easier to develop but have limited flexibility in terms of governance and consensus.\n- **Rollups** - Independent blockchains connected to and secured by Polkadot, allowing full customization of business logic, consensus, and governance. They are also known as _parachains_.\n\nFor a deeper comparison, read:  \n[Smart Contracts vs. Rollup Development](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/runtime_vs_smart_contract/index.html)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#smart-contracts-on-polkadot", "page_title": "Smart Contracts on Polkadot", "index": 1, "depth": 2, "title": "Smart Contracts on Polkadot", "anchor": "smart-contracts-on-polkadot", "start_char": 1293, "end_char": 1898, "estimated_token_count": 124, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Smart Contracts on Polkadot\n\nPolkadot smart contracts will reside on the **Asset Hub**. When we talk about smart contracts on Polkadot, we're specifically referring to those deployed on the Asset Hub parachain, not the relay chain itself, whose main function stays securing parachain blocks and keeping the shared state. Smart contract functionality on the Hub is made possible thanks to the **pallet-revive**, an upgraded version of the original `pallet-contracts`. Unlike its predecessor (which used Wasm), `pallet-revive` executes contracts compiled to **Polkadot Virtual Machine (PVM)** bytecode."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#key-differences", "page_title": "Smart Contracts on Polkadot", "index": 2, "depth": 3, "title": "Key Differences:", "anchor": "key-differences", "start_char": 1898, "end_char": 2071, "estimated_token_count": 51, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Key Differences:\n- **pallet-contracts**: Uses **wasmi** (a WebAssembly interpreter).\n- **pallet-revive**: Executes **PVM bytecode**, optimized for RISC-V architecture."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#polkadot-hub", "page_title": "Smart Contracts on Polkadot", "index": 3, "depth": 3, "title": "Polkadot Hub", "anchor": "polkadot-hub", "start_char": 2071, "end_char": 2569, "estimated_token_count": 105, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Polkadot Hub\n\nIn this context, the smart-contract environment on the [Asset Hub](../learn/learn-assets.md) is commonly referred to as the **Polkadot Hub**. Polkadot Hub is best understood as a platform rather than a network: while contracts are technically deployed on the Asset Hub, their reach is not confined to that single chain. Through the shared security and cross-chain interoperability provided by the relay chain, contracts on the Hub can interact with the wider Polkadot ecosystem."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#wasm-vs-pvm", "page_title": "Smart Contracts on Polkadot", "index": 4, "depth": 2, "title": "Wasm vs. PVM", "anchor": "wasm-vs-pvm", "start_char": 2569, "end_char": 3464, "estimated_token_count": 168, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Wasm vs. PVM\n\nWhile WebAssembly (Wasm) is widely used in blockchain, it has limitations:\n    \n- **Non-deterministic execution** - The slight variations between Wasm binaries present a hurdle for blockchain protocols, which must achieve an identical state for consensus. While tools within the Polkadot ecosystem exist to address this, it remains an underlying limitation.\n- **High computational cost** - Translating Wasm bytecode to machine code is computationally expensive. Wasm instructions are stack-based, while most hardware architecture is register-based with finite number of registers. Register allocation is a known [NP problem](https://en.wikipedia.org/wiki/Register_allocation#Common_problems_raised_in_register_allocation). \n\nThe Polkadot Virtual Machine (PVM) solves both of these problems by using the RISC-V architecture, which is a very common and well-supported standard."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#risc-v-pvm", "page_title": "Smart Contracts on Polkadot", "index": 5, "depth": 3, "title": "RISC-V & PVM", "anchor": "risc-v-pvm", "start_char": 3464, "end_char": 4321, "estimated_token_count": 172, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "###  RISC-V & PVM\n **RISC-V** is an **Instruction Set Architecture (ISA)**, not a bytecode, making it closer to native CPU execution.\n\nPolkaVM (Parity's implementation of PVM) leverages RISC-V's register-based architecture, where operations use a finite set of CPU registers to pass arguments. This design mirrors modern hardware, enabling near 1:1 translation to native machine code. Unlike x86-64 (which suffers from register scarcity), PolkaVM's optimized register count simplifies compilation—reducing the complex register allocation problem to straightforward mapping. This is key to PolkaVM's rapid compilation speeds.\n\nInitially, smart contracts will be executed by the PolkaVM interpreter within the runtime itself. A later update will deliver a full PolkaVM JIT (Just in Time) compiler running inside the client with future optimizations planned."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#evm-vs-pvm", "page_title": "Smart Contracts on Polkadot", "index": 6, "depth": 2, "title": "EVM vs. PVM", "anchor": "evm-vs-pvm", "start_char": 4321, "end_char": 5694, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## EVM vs. PVM\n\nIt is important to note that while Polkadot will support Ethereum-compatible smart contracts (written in Solidity), it is incorrect to say that Polkadot is EVM-compatible, as no Ethereum Virtual machine implementations present in Polkadot's architecture including __pallet-revive__. There are multiple reasons why Polkadot chose to deviate from traditional EVM support and decided to run smart contracts on PolkaVM. \n\nLike Wasm, EVM is stack-based, resulting in slower execution time. EVM also uses a 256-bit word size, requiring all arithmetic operations to handle these large numbers. This design choice impacts performance, as each operation must be broken down into multiple native machine instructions. PolkaVM improves efficiency using a 64-bit word size that matches modern hardware capabilities. However, when compiling Solidity contracts through YUL (via Revive), operations remain at 256-bit precision since YUL operates at too low a level to optimize integer types automatically. EVM code can only be interpreted, while PVM code can be interpreted and compiled, which is optimal for larger multi-contract projects. EVM is also limited to Solidity, Vyper, and other languages explicitly developed for EVM, while PolkaVM supports any language that can be compiled to RISC-V, including Rust and C++. \n\nSome parachains support EVM smart contracts."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#revive-solidity-to-polkavm-recompiler", "page_title": "Smart Contracts on Polkadot", "index": 7, "depth": 2, "title": "Revive: Solidity to PolkaVM Recompiler", "anchor": "revive-solidity-to-polkavm-recompiler", "start_char": 5694, "end_char": 5945, "estimated_token_count": 59, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Revive: Solidity to PolkaVM Recompiler\n\n**Revive** is the overarching project for compiling Solidity contracts to PVM bytecode. It includes:\n- **resolc**: The Solidity-to-PVM compiler.\n- **solc**: The Ethereum Solidity compiler (used internally)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#compilation-flow", "page_title": "Smart Contracts on Polkadot", "index": 8, "depth": 3, "title": "Compilation Flow:", "anchor": "compilation-flow", "start_char": 5945, "end_char": 6469, "estimated_token_count": 148, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Compilation Flow:\n1. **Solidity (.sol)** → Compiled via `solc` to **YUL** intermediate representation. YUL code is usually then compiled to EVM, however, not on Polkadot.\n2. **YUL IR** → Processed by Revive into **LLVM** intermediate representation.\n3. **LLVM IR** → Optimized into **RISC-V ELF object**.\n4. **PVM Linker** → Generates **PVM blob** (executable bytecode).\n5. **Deployment** → PVM blob + metadata uploaded to `pallet-revive`.\n\nThis workflow ensures **deterministic**, **efficient** execution on Polkadot."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#learn-more", "page_title": "Smart Contracts on Polkadot", "index": 9, "depth": 2, "title": "Learn more", "anchor": "learn-more", "start_char": 6469, "end_char": 6628, "estimated_token_count": 36, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Learn more\n\nTo learn more about development of  Solidity contracts for PolkaVM, refer to the official [Polkadot developer documentation](../../index.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-smart-contracts", "url": "https://developer.polkadot.com/wiki/learn/learn-smart-contracts/#resources", "page_title": "Smart Contracts on Polkadot", "index": 10, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 6628, "end_char": 6850, "estimated_token_count": 68, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:bc5a435c9ec89c685661e543bcb412794c2b1dfd3359a4e5ebd0c618b2471340", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Resources\n- [Polkadot Developer Docs](../../index.md)\n- [Revive Compiler](https://github.com/paritytech/revive)\n- [Smart contracts roadmap discussion](https://forum.polkadot.network/t/contracts-on-assethub-roadmap/9513)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-snowbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-snowbridge/#random-sampling-beefy", "page_title": "Snowbridge", "index": 0, "depth": 2, "title": "Random-sampling BEEFY", "anchor": "random-sampling-beefy", "start_char": 945, "end_char": 2733, "estimated_token_count": 370, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b2ae6ced43bac09455510479b4647c6b5e58c5b5b4a2e1a0244fbbd1afd150ba", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Random-sampling BEEFY\n\nA trustless bridge always has a **prover** (needs to compute the proof), a **verifier** (asks the\nprover to compute the proof and verifies it), and relayers to relay messages. Snowbridge prover uses\n[BEEFY](./learn-consensus.md#bridging-beefy), a novel bridge protocol drastically reducing\noperational costs without compromising security.\n\nEven with simplifications ushered in by BEEFY, a smart contract updating Polkadot's state on\nEthereum has to perform 201 signature checks for every update since there are ~300 validators on\nPolkadot. This remains expensive (gas costs), especially as the validator set grows. The solution is\nrandom-sampling BEEFY that leverages\n[the RANDAO randomness beacon](https://eth2book.info/capella/part2/building_blocks/randomness/) as\nfollows:\n\n- **Commit:** Relayer submits a state commitment of a recently finalized block on Polkadot and\n  claims to have a super-majority of validator’s signatures to the light client deployed on\n  Ethereum. It also provides one validator signature backing the commitment, which can be slashed if\n  needed.\n- **Challenge:** Light client queries on-chain randomness (RANDAO) to subsample `m` (~25) signatures\n  from the list Relayer’s claimed list.\n- **Response:** Relayer responds by sharing exactly those `m` signatures that were randomly sampled\n  which the light client then verifies. If everything checks out, the finalized block is accepted.\n\nThe number of signature checks needed is significantly reduced and independent of the validator set\nsize, making the protocol more efficient. The number of subsampled signatures, `m,` is the parameter\nthat trades off security and efficiency (i.e., **security parameter**). The value of this parameter\nis derived using crypto-economic arguments."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-snowbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-snowbridge/#snowbridge-crypto-economic-security", "page_title": "Snowbridge", "index": 1, "depth": 2, "title": "Snowbridge Crypto-economic Security", "anchor": "snowbridge-crypto-economic-security", "start_char": 2733, "end_char": 3266, "estimated_token_count": 145, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b2ae6ced43bac09455510479b4647c6b5e58c5b5b4a2e1a0244fbbd1afd150ba", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Snowbridge Crypto-economic Security\n\nIf up to a third of the validators are malicious, the chance that all `m` signatures subsampled are\nfrom these bad actors is `(1/2)^m` (exponentially low). Any validator who supports a malicious\ncommitment [faces severe penalties](./learn-offenses.md). The expected value of an attack `E(A)` is:\n\n```\nE(A) = p * V + (1 - p)*(-S)\n```\n\nWhere `V` is the value of attack (bounded by market capitalization), `S` is the validator slashable\nstake, and `p` is the probability of a successful attack."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-snowbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-snowbridge/#snowbridge-assumptions", "page_title": "Snowbridge", "index": 2, "depth": 3, "title": "Snowbridge Assumptions", "anchor": "snowbridge-assumptions", "start_char": 3266, "end_char": 3947, "estimated_token_count": 139, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b2ae6ced43bac09455510479b4647c6b5e58c5b5b4a2e1a0244fbbd1afd150ba", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Snowbridge Assumptions\n\nSnowbridge relies on two major assumptions:\n\n- The crypto-economic assumption that an adversary is rational, i.e., an attack is launched only if\n  the expected value of an attack is positive. Hence, we derive our security parameter `m` by\n  ensuring the expected value of an attack is negative, i.e., `E(A) < 0`.\n\n- RANDAO unpredictability. The Web3 Foundation research team performed a thorough analysis of RANDAO\n  bias and extended the state-of-the-art in analysing the last-revealer attack on RANDAO. Assuming\n  1/3rd of Ethereum validators are malicious, the effect of such bias is mitigated by proportionally\n  increasing the security parameter."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-snowbridge", "url": "https://developer.polkadot.com/wiki/learn/learn-snowbridge/#resources", "page_title": "Snowbridge", "index": 3, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 3947, "end_char": 4239, "estimated_token_count": 64, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b2ae6ced43bac09455510479b4647c6b5e58c5b5b4a2e1a0244fbbd1afd150ba", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Resources\n\n- Medium article\n  [\"Random Sampling BEEFY: Pillaring the trust-less Snowbridge\"](https://medium.com/@bhargav_22496/18a43a2cba9b)\n  by Bhargav Bhatt at Web3 Foundation\n- [Snowbridge GitHub repository](https://github.com/Snowfork/snowbridge)\n- Web3 Foundation Research Repository"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-spree", "url": "https://developer.polkadot.com/wiki/learn/learn-spree/#origin", "page_title": "SPREE", "index": 0, "depth": 2, "title": "Origin", "anchor": "origin", "start_char": 675, "end_char": 1131, "estimated_token_count": 85, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0f912f0b5b35fa9837762088a6d6ba4d9ef6494232119c04d56046380ecba793", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Origin\n\nOn 28 March, 2019 u/Tawaren, a member of the Polkadot community observed that XCMP had a complication in that it was difficult to verify and prove\ncode was executed on a parachain without trust. A solution was to install the SmartProtocols in the\nrelay chain that would be isolated blobs of code with their own storage per instance that could only\nbe changed through an interface with each parachain. SmartProtocols are the precursor to SPREE."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-spree", "url": "https://developer.polkadot.com/wiki/learn/learn-spree/#what-is-a-spree-module", "page_title": "SPREE", "index": 1, "depth": 2, "title": "What is a SPREE module?", "anchor": "what-is-a-spree-module", "start_char": 1131, "end_char": 3231, "estimated_token_count": 409, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0f912f0b5b35fa9837762088a6d6ba4d9ef6494232119c04d56046380ecba793", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## What is a SPREE module?\n\nSPREE modules are fragments of logic (in concrete terms they are blobs of\n[WebAssembly](https://webassembly.org/) code) that are uploaded onto Polkadot through a governance mechanism or\nby parachains. Once the blob is uploaded to the relay chain, all other parachains can decide to\nopt-in to the logic. The SPREE module would retain its own storage independent of the parachain, but\nwould be callable through an interface with the parachain. Parachains will send messages to the\nSPREE module synchronously.\n\nSPREE modules are important to the overall XCMP architecture because they give a guarantee to the\ncode that will be executed on destination parachains. While XCMP guarantees the delivery of a\nmessage, it does not guarantee what code will be executed, i.e. how the receiving parachain will\ninterpret the message. While XCMP accomplishes trustless message passing, SPREE is the trustless\ninterpretation of the message and a key part of the usefulness of XCMP.\n\nSPREE modules are like recipes in cookbooks. For example, if we give an order to a cook to make a\nsoufflé, and we’re decently confident in the ability of the cook, we have a vague idea of what will\nbe made but no actual surety of how it will be made. However, let’s say that a cook has the “Soufflé\nMaker’s Manual” on their bookshelf and has committed themselves to only make souffles from this\nbook. Now we can also consult the same book that the cook has, and we have a precise understanding\nof what will happen when we tell the cook to make a soufflé. In this example, “make a soufflé” was\nthe message in XCMP and the cookbook was the SPREE module.\n\nIn concrete terms, SPREE modules could be useful for various functionality on Polkadot. One\nsuggested use case of SPREE modules is for a trustless decentralized exchange that is offered as\nfunctionality to any parachain without any extra effort from parachain developers. One can imagine\nthis working by having a SPREE module that exposes the interface for the incrementing and\ndecrementing of balances of various assets based on a unique identifier."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-spree", "url": "https://developer.polkadot.com/wiki/learn/learn-spree/#why", "page_title": "SPREE", "index": 2, "depth": 2, "title": "Why?", "anchor": "why", "start_char": 3231, "end_char": 4156, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0f912f0b5b35fa9837762088a6d6ba4d9ef6494232119c04d56046380ecba793", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Why?\n\nSending messages across parachains in XCMP only ensures that the message will be delivered but does\nnot specify the code that will be executed, or how the message will be interpreted by the receiving\nparachain. There would be ways around this such as requesting a verifiable receipt of the execution\nfrom the receiving parachain, but in the naked case, the other parachain would have to be trusted.\nHaving shared code that exists in appendices that the parachain can opt-in to resolves the need for\ntrust and makes the execution of the appendices completely trustless.\n\nSPREE would be helpful to ensure that the same logic is shared between parachains in the SPREE\nmodules. An especially relevant use case would revolve around the use of token transfers across\nparachains in which it is important that the sending and receiving parachains agree about how to\nchange the total supply of tokens and a basic interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-spree", "url": "https://developer.polkadot.com/wiki/learn/learn-spree/#example", "page_title": "SPREE", "index": 3, "depth": 2, "title": "Example", "anchor": "example", "start_char": 4156, "end_char": 5706, "estimated_token_count": 316, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:0f912f0b5b35fa9837762088a6d6ba4d9ef6494232119c04d56046380ecba793", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## Example\n\n![spree example](../assets/SPREE/spree_module.png)\n\nThe diagram above is a simplification of the Polkadot system.\n\nIn this diagram, we see that the Wasm code for SPREE module \"X\" has been uploaded to the relay\nchain. The two cylinders \"A\" and \"B\" represent two distinct parachains that have both opted-in to\nthis SPREE module creating two distinct instances of it with their own XCMP endpoints \"A.X\" and\n\"B.X\".\n\nIn the example, we assume that this SPREE module \"X\" contains the functionality for incrementing or\ndecrementing the balance of a particular asset that is unique to this module.\n\nBy initiating a transaction at A.X to decrease a particular balance by 1, a message over XCMP can be\ntrustlessly sent to B.X to increase a balance by 1.\n\nCollators, represented as the green triangle are responsible for relaying this message from\nparachain A to parachain B, as well as maintaining the storage for each particular instance of A.X\nand B.X for their respective parachains. They provide proofs of valid state transitions to the Relay\nChain validators represented as blue diamonds.\n\nValidators can validate the correct state transitions of SPREE modules A.X and B.X by being provided\nwith the previous state root of the SPREE module instances, the data of the XCMP message between the\ninstances, and the next state root of the instance. They do this validation by checking it against\nthe `validate` function as provided by the SPREE module API. Collators are expected to be able to\nprovide this information to progress their parachains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#staking-proxies", "page_title": "Advanced Staking Concepts", "index": 0, "depth": 2, "title": "Staking Proxies", "anchor": "staking-proxies", "start_char": 791, "end_char": 3236, "estimated_token_count": 503, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking Proxies\n\nPolkadot allows creating accounts with special permissions, called **proxy\naccounts**. For more details about proxy accounts, visit this wiki's [dedicated page](./learn-proxies.md).\n\nProxy accounts are special accounts that can sign\n[**extrinsic calls**](./learn-transactions.md#pallets-and-extrinsics) made to specific **pallets**\non behalf of the proxied account. There is the possibility of creating staking proxy accounts\nthat can be used to sign extrinsic calls specific to the staking and utility pallets. Session keys must be set by the stash account.\n\nStaking is not a set-and-forget action; as a nominator, you will need to monitor the performance of\nyour validators and make changes if required. There will be transactions, such as changing nominations, that\nmust be regularly signed. Each time you sign with an account, in the case of hot accounts,\nyou expose the private key of that account to the internet\nstash will be exposed all the time a transaction is\nwith a Ledger device, signing with the stash will build a transaction history that might tell\nsomething about your habits and preferences, or even your location.\n\nIdeally, accounts with high economic power, like the stash, must be and remain as isolated as\npossible. With a staking proxy, the stash account is fully isolated when signing for staking-related\ntransactions. The proxy private key will be used to sign staking-related transactions, the stash\nprivate key will stay isolated, and the proxy will build the transaction history.\n\n![stash-stakingProxy](../assets/stash-vs-stash-and-staking-proxy.png)\n\nFor a practical perspective, we need to use only one account and remember one password to sign for\nall staking-related transactions. From a security perspective, who controls the staking proxy\ncontrols our staking actions.\n\nIt is important to remember that actions that the proxy accounts can perform are limited,\nand in the case of a staking proxy, extrinsic calls to the balances pallet cannot be signed. This\nmeans doing balance transfers on the proxied account is impossible through a staking proxy.\n\nNote that to change the staking proxy, you must sign with the stash or an _any_ proxy.\n\n!!!info \"Staking Migration to Asset Hub\"\n    **Staking proxies** are automatically migrated to Asset Hub along with other proxy types (except the \"Any\" type). However, **proxy announcements are not migrated** and will be deleted from the Relay Chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#bags-list", "page_title": "Advanced Staking Concepts", "index": 1, "depth": 2, "title": "Bags List", "anchor": "bags-list", "start_char": 3236, "end_char": 11208, "estimated_token_count": 1778, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Bags List\n\n!!!info\n    On Polkadot and Kusama, the instance of the pallet [Bags-List](https://paritytech.github.io/substrate/master/pallet_bags_list/) is named as 'voterList'.\n    \n    For a bags list demo, see [this video tutorial](https://youtu.be/hIIZRJLrBZA).\n\nIn Polkadot's [Nominated Proof-of-Stake (NPoS)](../learn/learn-consensus.md#nominated-proof-of-stake), nomination intents are placed in a semi-sorted list called the bags list. The [Bags-List pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_bags_list/index.html) in the Polkadot SDK is\ndesigned to be self-maintaining, with minimal effort from the blockchain, making it highly\nscalable. The bags list has two primary components, bags and nodes (or nominators' accounts), with\nbags containing the nodes with bonded balance within a specific range. In the figure below, the 1st\nempty bag will contain nominators whose bonded balance is in the range of 21 - 30 DOT, the 2nd bag\n11 - 20 DOT, and the 3rd bag 0-10 DOT. The nomination intents are the nominators' accounts with\nbonded tokens (in the example shown below, there are eight nomination intents) that will be put\ninside each of those three bags depending on their stake.\n\n![bags list example 0](../assets/bags-list-example-0.png)\n\nThe bags list is semi-sorted, meaning that sorting is only partially done. When the nomination\nintents are submitted to the network, they are automatically put into each bag based on the number\nof bonded tokens. Still, within each bag, those nodes are arranged based on the time they are inserted\nand not based on their stake (see figure below). When the nomination intent of 19 DOT is submitted,\nit gets placed at the last spot in the 2nd bag (shown in the green circle). The same scenario\napplies for the node with 8 DOT (yellow circle) in the 3rd bag. Placing the node above all nodes\nwith a lesser stake requires an additional step (more on this later).\n\n![bags list example 1](../assets/bags-list-example-1.png)\n\nThe mentioned two nodes (19 DOT and 8 DOT) can move up in their respective bags,\nputting them in front of the nodes with less stake (see figure below). This action\nmust be done manually by submitting the **`putInFrontOf`** extrinsic within the `voterList` pallet\ninstance. Moreover, if the node with 19 DOT bonds an additional 2 DOT, that node will be put\nautomatically in the 1st bag (i.e., automatic `rebag`) because the total number of bonded tokens will\nnow be within the range of the 1st bag. That node with now 21 DOT will be put at the tail end of the\n1st bag with the possibility to manually put itself in front of \"older\" nodes with less than 21 DOT\n(if there are any). Anyone can issue the **`putInFrontOfOther`** permissionless extrinsic to sort dislocated accounts.\n\n![bags list example 2](../assets/bags-list-example-2.png)\n\nIf one decides to send staking rewards to the stash account and automatically bond them (i.e.\ncompounding the staking rewards), the position within a bag does not change. The same\nscenario applies to a slashing event, i.e., when a nominator gets slashed, their position within a\nbag does not change. This might result in a scenario where the node is in the wrong bag and needs to\nbe placed in the right bag. To address this issue, any account on-chain can submit the\npermissionless extrinsic **`rebag`** within the `voterList` pallet instance to update the positions of\nthe nodes that do not belong to their bag and place them in the correct one. Note that rebag works in both ways, i.e., rebag in a higher or lower bag, and the Polkadot Developer Interface rebags all accounts in your bag that need rebagging. To reiterate, **actions like bonding and unbonding tokens automatically rebag the nominator node, but events like compounding staking rewards and slashing do not**. See the [bags-list](learn-nominator.md#bags-list) section for more\ninformation.\n\n!!!info \"Important Notes\"\n      The `putInFrontOf` extrinsic does not check which account is the lightest (i.e., the account with the least tokens where you can move in front of), as opposed to `rebag`, which automatically puts you in the right bag. Suppose you have the account with 7 DOT and your bag configuration is 8 3 4 9 1 7 5. You can move in front of 1 or 4 (i.e., lighter accounts) or in front of 3 (i.e., lightest account). Ideally, you need to find the lightest account and give it as an argument to the extrinsic. This is what Polkadot Developer Interface does for you: it finds the \"lightest\" account in the bag and puts you in front of it.\n\n      If you want the best placement in the bags list, the recommended order of actions is first to rebag yourself (if possible) and then issue the `putInFrontOf` extrinsic.\n\n      `Rebagging` and `putInFrontOf` only matter if you are in the last bag, close to the minimum active bond. If you bond way above that value, you do not need to issue those extrinsics.\n\n      Note that `putInFrontOf` only moves a node ahead of a lighter node within the same bag and therefore does not by itself guarantee rewards: the node it is placed in front of may itself fall outside the electing set. A node bonded above the dynamic minimum active bond should, however, begin earning rewards from the following era.\n\nThe bags list can include unlimited nodes, subject to the chain's runtime\nstorage. In the current staking system configuration, at most 22500 nominators in the bags list (12500 on Kusama) come out as the electing nominators. See\n[Staking Election Stages](learn-nominator.md#staking-election-stages) section for more info.\n\nThis means that only a portion of the nomination intents is kept. Once the nomination period ends,\nthe NPoS election system inputs all nomination intents and associated votes and \noutputs a set of validators. The bags are iterated from the most staked to the least staked. The algorithm will stop once it has selected 22500 nodes, so the last touched bag will probably be only partially iterated. As such, the order in the last bag matters.\n\nContinuing with the example used in the previous figures, there are 8 nomination intents of which only 7 will be kept. If the bags list stays semi-sorted (i.e., no accounts call the `putInFrontOf` and `rebag`\nextrinsics), the nomination of the node with 8 DOT in the 3rd bag will not be considered, while that\nof the preceding node with 5 DOT will be. Nomination of the node with 8 DOT will be kept only if it\nputs itself in front of the one with 5 DOT. Note how the nomination of the node with 19 DOT in the\n2nd bag will be considered regardless of changing its position inside the bag. `Rebag` and `putInFrontOf` only matter if you're in the last bag (i.e., close to the 22500 nomination threshold). The sorting\nfunctionality of nomination intents using bags is essential for the\n[long-term improvements](https://gist.github.com/kianenigma/aa835946455b9a3f167821b9d05ba376) of the\nstaking/election system.\n\n![bags list example 3](../assets/bags-list-example-3.png)\n\n!!!caution \"Minimum active nomination threshold to earn rewards is dynamic\"\n      Submitting a nomination intent does not guarantee staking rewards. The stake of the top 22500 nominators (12500 on Kusama) is applied to the validators in the active set. To avail of staking rewards, ensure that the number of tokens bonded is higher than the minimum active bond. For more information, see the [nominator guide](learn-nominator.md).\n\nThe \"election solution”, a connected graph between nominators and validators with the stake\nas edge weights, has to meet specific requirements, such as maximizing the amount of stake to\nnominate validators and distributing the stake backing validators as evenly as possible. This election mechanism aims to maximize the network's security and achieve fair\nrepresentation of the nominators. If you want to know more about how NPoS works (e.g., election,\nrunning time complexity, etc.), please read\n[here](https://research.web3.foundation/en/latest/polkadot/NPoS.html)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#rewards-distribution", "page_title": "Advanced Staking Concepts", "index": 2, "depth": 2, "title": "Rewards Distribution", "anchor": "rewards-distribution", "start_char": 11208, "end_char": 17433, "estimated_token_count": 1360, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Rewards Distribution\n\n!!!info\n    The general rule for rewards across validators is that two validators get paid essentially the same amount of tokens for equal work, i.e. they are not paid proportional to their total stakes. There is a probabilistic component to staking rewards in the form of [era points](../../node-infrastructure/run-a-validator/staking-mechanics/rewards.md#era-points) and [tips](./learn-guides-transfers.md#calculating-fees-with-polkadot-js) but these should average out over time.\n\nValidators are paid the same regardless of stake backing them. Validators with less stake will\ngenerally pay more to nominators per-token than the ones with more stake. This gives nominators an\neconomic incentive to gradually shift their preferences to lower-staked validators that gain a\nsufficient amount of reputation. A consequence of this is that the stake across validators will be\nas evenly distributed as possible which avoids concentration of power among a few validators. In the\nlong term, validators will have similar levels of stake, with the stake being higher for validators\nwith higher reputation. A nominator who is willing to risk more by backing a validator with a lower\nreputation will get paid more, provided there are no slashing events.\n\nBefore distributing rewards to nominators, validators can create a cut of the reward (a commission)\nthat is not shared with the nominators. This cut is a percentage of the block reward, not an\nabsolute value. After the commission gets deducted, the remaining portion is distributed pro-rata\nbased on their staked value and split between the validator and all of the nominators whose stake\nhas backed this validator.\n\nFor example, assume the block reward for a validator is 10 DOT. A validator may specify\n`validator_commission = 50%`, in which case the validator would receive 5 DOT. The remaining 5 DOT\nwould then be split between the validator and their nominators based on the proportion of stake each\nnominator had. Note that for this calculation, validator's self-stake acts just as if they were\nanother nominator.\n\nThus, a percentage of the reward goes thus to pay the validator's commission fees and the remainder\nis paid pro-rata (i.e. proportional to stake) to the nominators and validator. If a validator's\ncommission is set to 100%, no tokens will be paid out to any of the nominators. Notice in particular\nthat the validator is rewarded twice: once in commission fees for validating (if their commission\nrate is above 0%), and once for nominating itself with own stake.\n\nThe following example should clarify the above. For simplicity, we have the following assumptions:\n\n- These validators do not have a stake of their own.\n- They each receive the same number of era points.\n- There are no tips for any transactions processed.\n- They do NOT charge any commission fees.\n- Total reward amount is 100 DOT tokens.\n- The current minimum amount of DOT to be a validator is 350 (note that this is _not_ the actual\n  value, which fluctuates, but merely an assumption for purposes of this example; to understand how\n  the actual minimal stake is calculated, see\n  [here](../general/faq.md#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator)).\n\n|               | **Validator A** |                             |         |\n| :-----------: | :-------------: | :-------------------------: | :-----: |\n| Nominator (4) |   Stake (600)   | Fraction of the Total Stake | Rewards |\n|      Jin      |       100       |            0.167            |  16.7   |\n|    **Sam**    |       50        |            0.083            |   8.3   |\n|     Anson     |       250       |            0.417            |  41.7   |\n|     Bobby     |       200       |            0.333            |  33.3   |\n\n|               | **Validator B** |                             |         |\n| :-----------: | :-------------: | :-------------------------: | :-----: |\n| Nominator (4) |   Stake (400)   | Fraction of the Total Stake | Rewards |\n|     Alice     |       100       |            0.25             |   25    |\n|     Peter     |       100       |            0.25             |   25    |\n|     John      |       150       |            0.375            |  37.5   |\n|   **Kitty**   |       50        |            0.125            |  12.5   |\n\n_Both validators A & B have 4 nominators with a total stake 600 and 400 respectively._\n\nBased on the above rewards distribution, nominators of validator B get more rewards per DOT than\nthose of validator A because A has more overall stake. Sam has staked 50 DOT with validator A, but\nhe only gets 8.3 in return, whereas Kitty gets 12.5 with the same amount of stake.\n\nTo estimate how many tokens you can get each month as a nominator or validator, you can use this\n[tool](https://www.stakingrewards.com/earn/polkadot/calculate) as a reference and play around with\nit by changing some parameters (e.g. how many days you would like to stake with your DOT, provider\nfees, compound rewards, etc.) to have a better estimate. Even though it may not be entirely accurate\nsince staking participation is changing dynamically, it works well as an indicator.\n\n#### Commission Fees & Slashes\n\nThe network [slashes](./learn-offenses.md) a validator for a misbehavior. The slashed amount is a\nfixed percentage (and not a fixed amount), which means that validators with more stake get slashed\nmore DOT. Again, this is done to provide nominators with an economic incentive to shift their\npreferences and back less popular validators whom they consider to be trustworthy.\n\nAlso, note that each validator candidate is free to name their desired commission fee (as a\npercentage of rewards) to cover operational costs. Since validators are paid the same, validators\nwith lower commission fees pay more to nominators than validators with higher fees. Thus, each\nvalidator can choose between increasing their fees to earn more, or decreasing their fees to attract\nmore nominators and increase their chances of being elected. In the long term, we expect that all\nvalidators will need to be cost-efficient to remain competitive, and that validators with higher\nreputation will be able to charge slightly higher commission fees (which is fair)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#simple-payouts", "page_title": "Advanced Staking Concepts", "index": 3, "depth": 2, "title": "Simple Payouts", "anchor": "simple-payouts", "start_char": 17433, "end_char": 18478, "estimated_token_count": 190, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Simple Payouts\n\nPolkadot makes stakers claim their rewards for past eras by submitting a transaction. This naturally\nleads to spreading out reward distribution, as people make transactions at disparate times, rather\nthan updating the accounts of all stakers in a single block.\n\nEven if everyone submitted a reward claim at the same time, the fact that they are individual\ntransactions would allow the block construction algorithm to process only a limited number per block\nand ensure that the network maintains a constant block time. If all rewards were sent out in one\nblock, this could cause serious issues with the stability of the network.\n\nSimple payouts require one transaction per validator, per [era](../general/glossary.md#era), to\nclaim rewards. The reason Polkadot requires this is to avoid an attack where someone has several\nthousand accounts nominating a single validator. The major cost in reward distribution is mutating\nthe accounts in storage, and Polkadot cannot pay out several thousand accounts in a single\ntransaction."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#claiming-rewards", "page_title": "Advanced Staking Concepts", "index": 4, "depth": 3, "title": "Claiming Rewards", "anchor": "claiming-rewards", "start_char": 18478, "end_char": 19647, "estimated_token_count": 243, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Claiming Rewards\n\nThe relay chain stores the last 84 eras of reward information (e.g. maps of era number to validator\npoints, staking rewards, nomination exposure, etc.). Rewards will not be claimable more than 84 eras\nafter they were earned. This means that all rewards must be claimed within a maximum of 84 eras,\nalthough under certain circumstances (described below) this may be as low as 28 eras.\n\nIf a validator kills their stash, any remaining rewards will no longer be claimable. Before doing\nthis, however, they would need to first stop validating and then unbond the funds in their stash,\nwhich takes 28 eras. If a validator were to immediately chill and start unbonding after rewards are\ncalculated, and nobody issued a payout for that era from that validator in the next 28 eras, the\nreward would no longer be claimable.\n\n!!!info \"Advanced How-to Guides\"\n    In order to be absolutely sure that staking rewards can be claimed, users should trigger a payout before 28 eras have passed. See [this page](./learn-guides-nominator.md#claiming-rewards-with-polkadot-js) for more information about how to claim rewards using the Polkadot Developer Interface."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#faq-and-cautionary-notes", "page_title": "Advanced Staking Concepts", "index": 5, "depth": 3, "title": "FAQ and Cautionary Notes", "anchor": "faq-and-cautionary-notes", "start_char": 19647, "end_char": 20946, "estimated_token_count": 263, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### FAQ and Cautionary Notes\n\n1. Rewards expire after 84 eras. On Polkadot, that's about 84 days. On Kusama, it is approximately\n   21 days. Validators should claim all pending rewards before killing their stash in the event the\n   validator decides to `chill` -> `unbonds all` -> `withdraws unbonded`. Nominators will not miss\n   out on rewards if they claim the pending rewards for a validator within 28 days. Essentially, the\n   deadline to ensure you get staking rewards is 28 eras. If the validator verifies its intent and\n   does not unbond and withdraw, the 84 era timeline holds.\n2. Claiming rewards (or neglecting to claim rewards) does not affect nominations in any way.\n   Nominations will persist after claiming rewards or after the rewards expire.\n3. Rewards are not minted until they are claimed. Therefore, if your reward destination is \"stash,\n   increasing amount at stake\", then your staked amount does not reflect your rewards until you\n   claim them. If you want to maximize compounding, then you will need to claim often or nominate\n   validators which regularly claim for you.\n4. Staking operations at the end of an era are closed to allow the off-chain validator election to\n   take place. See [Off-chain Phragmén](learn-phragmen.md#off-chain-phragmen) for more information."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#staking-miner", "page_title": "Advanced Staking Concepts", "index": 6, "depth": 2, "title": "Staking Miner", "anchor": "staking-miner", "start_char": 20946, "end_char": 23293, "estimated_token_count": 484, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking Miner\n\n!!!caution\n      The staking-miner code is experimental and it is still in the development phase. Use is at your own discretion, as there is a risk of losing some funds.\n\nAt the end of each era on Polkadot and Kusama, using [NPoS](learn-phragmen.md), a new set of validators\nmust be elected based on the nominator preferences. This is a computationally intensive process,\nhence the usage of the term \"mining\" for computing the solution. The validators use\n[off-chain workers](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/frame_offchain_workers/index.html) to compute\nthe result and submit a transaction to propose the set of winners. This can also be delegated to\nstand-alone programs, whose task is to mine the optimal solution. Staking miners compete with each\nother to produce election solutions which consist of a validator set, stake distribution across that\nset, and a score indicating how optimal the solution is. Staking miners run any given staking\nalgorithms (as of now, sequential Phragmén or PhragMMS, subject to change if improved algorithms are\nintroduced) to produce results, which are then sent as a transaction to the relay chain via a normal\nsigned extrinsic. The transaction requires a bond and a transaction fee. The best solution is\nrewarded, which the least covers the transaction fee, and the bond is returned to the account.\n[The bond and the fee](./learn-staking-advanced.md#deposit-and-reward-mechanics) are lost if the\nsolution is invalid.\n\nStaking miner uses a pallet called `pallet_election_provider_multi_phase` and can only produce\nsolutions during the\n[`SignedPhase`](https://crates.parity.io/pallet_election_provider_multi_phase/index.html#signed-phase)\nof the pallet's life cycle. Once the `SignedPhase` is over and the\n[`UnsignedPhase`](https://crates.parity.io/pallet_election_provider_multi_phase/index.html#unsigned-phase)\nstarts, only the off-chain workers can provide election results.\n\nRunning the staking miner requires passing the seed of a funded account in order to pay the fees for\nthe transactions that will be sent. The same account's balance is used to reserve deposits as well.\nThe best solution in each round is rewarded. All correct solutions will get their deposit back and\nthe ones that submit invalid solutions will lose their deposit."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#npos-election-optimization", "page_title": "Advanced Staking Concepts", "index": 7, "depth": 3, "title": "NPoS election optimization", "anchor": "npos-election-optimization", "start_char": 23293, "end_char": 24054, "estimated_token_count": 142, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### NPoS election optimization\n\n![NPoS election optimization](../assets/staking-miner/NPoS-election-optimization.png)\n\nA basic election solution is a simple distribution of stake across validators, but this can be\noptimized for better distribution equaling a higher security score. The staking miner does not act\nas a validator and focuses solely on the election result and optimization of the solution. It\nconnects to a specified chain and keeps listening to new signed phase of the election pallet in\norder to submit solutions to the NPoS election. When the correct time comes, it computes its\nsolution and submits it to the chain. The default miner algorithm is sequential Phragmén with a\nconfigurable number of balancing iterations that improve the score."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#signed-phase-of-the-election-pallet", "page_title": "Advanced Staking Concepts", "index": 8, "depth": 3, "title": "Signed Phase of the election pallet", "anchor": "signed-phase-of-the-election-pallet", "start_char": 24054, "end_char": 27455, "estimated_token_count": 951, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Signed Phase of the election pallet\n\nThe election provider pallet `pallet_election_provider_multi_phase` is divided into two phases,\n**signed** and **unsigned**. At the end of the pallet's timeline, the function `elect()` is called.\n\n```\n                                                                   elect()\n                +   <--T::SignedPhase-->  +  <--T::UnsignedPhase-->   +\n  +-------------------------------------------------------------------+\n   Phase::Off   +       Phase::Signed     +      Phase::Unsigned      +\n```\n\nSolutions provided by the staking miner can only be submitted during the signed phase. Solutions are\nsubmitted and queued on the chain as a `RawSolution`. Once submitted, a solution cannot be retracted\nby the originating account.\n\n`RawSolution` struct definition:\n\n```\npub struct RawSolution<S> {\n    pub solution: S, // The solution itself\n    pub score: ElectionScore, // The claimed score of the solution.\n    pub round: u32, // The round at which this solution should be submitted.\n}\n```\n\nA maximum of\n[`pallet::Config::SignedMaxSubmissions`](https://github.com/paritytech/polkadot-sdk/blob/f610ffc05876d4b98a14cee245b4cc27bd3c0c15/runtime/polkadot/src/lib.rs#L390)\nwill be stored on-chain and they will be sorted based on score. Higher the score the more optimal\nthe election solution is. The\n[`SignedMaxSubmissions`](../general/chain-state-values.md) variable\ncan be modified through governance.\n\nUpon arrival of a new solution:\n\n1. If the queue is not full, it is stored in the appropriate sorted index.\n2. If the queue is full but the submitted solution is better than one of the queued ones, the worse\n   solution is discarded, the deposit of the outgoing solution is returned, and the new solution is\n   stored in the correct index.\n3. If the queue is full and the solution is not an improvement compared to any of the queued ones,\n   it is instantly rejected and no deposit is reserved.\n\nUpon the end of the `SignedPhase`, no more solutions can be submitted and the solutions in the queue\nwill be checked using\n[`Pallet::feasibility_check`](https://paritytech.github.io/substrate/master/pallet_election_provider_multi_phase/pallet/struct.Pallet.html#method.feasibility_check)\nwhich ensures the score is indeed correct, and marks them as valid or invalid. By checking each\nsolution in the queue, the queue will be reorganized by score. The highest valid score will be\nrewarded. Invalid solutions with higher score than the winning solution will be slashed. The rest of\nthe solutions will be discarded and their deposit will be returned. Once the staking miner with a\nwinning solution is ready to be rewarded the runtime will automatically execute\n[`finalize_signed_phase_accept_solution`](https://github.com/paritytech/substrate/blob/f2bc08a3071a91b71fec63cf2b22c707411cec0e/frame/election-provider-multi-phase/src/signed.rs#L453-L474)\nwhich reward account associated with the winning solution.\n\n```\nQueue\n+-------------------------------+\n|Solution(score=20, valid=false)| +-->  Slashed\n+-------------------------------+\n|Solution(score=15, valid=true )| +-->  Rewarded, Saved\n+-------------------------------+\n|Solution(score=10, valid=true )| +-->  Discarded\n+-------------------------------+\n|Solution(score=05, valid=false)| +-->  Discarded\n+-------------------------------+\n|             None              |\n+-------------------------------+\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#deposit-and-reward-mechanics", "page_title": "Advanced Staking Concepts", "index": 9, "depth": 3, "title": "Deposit and reward mechanics", "anchor": "deposit-and-reward-mechanics", "start_char": 27455, "end_char": 27836, "estimated_token_count": 80, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Deposit and reward mechanics\n\nThe staking miners are required to pay a deposit to post their solutions. Deposit amount is the sum\nof `SignedDepositBase` +`SignedDepositByte` + `SignedDepositWeight`. All good solutions are subject\nto receiving a `SignedRewardBase`. For more information about deposit values see the\n[Chain State Values page](../general/chain-state-values.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#further-resources", "page_title": "Advanced Staking Concepts", "index": 10, "depth": 3, "title": "Further Resources", "anchor": "further-resources", "start_char": 27836, "end_char": 28344, "estimated_token_count": 116, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Further Resources\n\nIf you want to run a staking miner on your validator, refer to the repository provided in the\nresources section below.\n\n- [Staking Miner repository](https://github.com/paritytech/staking-miner-v2)\n- [Election Pallet definition](https://crates.parity.io/pallet_election_provider_multi_phase/index.html)\n- [Signed phase parameter configuration on Polkadot](https://github.com/paritytech/polkadot-sdk/blob/f610ffc05876d4b98a14cee245b4cc27bd3c0c15/runtime/polkadot/src/lib.rs#L389:L397)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking-advanced", "url": "https://developer.polkadot.com/wiki/learn/learn-staking-advanced/#how-to-guides", "page_title": "Advanced Staking Concepts", "index": 11, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 28344, "end_char": 28519, "estimated_token_count": 50, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:88f5359cb7fedb90eec74373f501d19dcfc231c10f1d63ed6559f489559d99eb", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [How to Rebond Tokens During the Unbonding Period](how-to/rebond-tokens.md)\n- [How to Change Your Controller Account](how-to/change-controller-account.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#proof-of-stake-pos", "page_title": "Staking on Polkadot", "index": 0, "depth": 2, "title": "Proof-of-Stake (PoS)", "anchor": "proof-of-stake-pos", "start_char": 1140, "end_char": 3911, "estimated_token_count": 584, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Proof-of-Stake (PoS)\n\nBlockchain networks use [consensus](../general/faq.md#why-do-we-need-consensus) mechanisms to\nfinalize blocks on the chain. Consensus is the process of agreeing on something, in this case, the\nprogression of the blockchain or how blocks are added to the chain. Consensus consists of two\nactions:\n\n- **Block production**, i.e. the way multiple blocks candidates are produced, and\n- **Block finality**, i.e. the way only one block out of many candidates is selected and added to\n  the canonical chain (see [this](./learn-consensus.md#probabilistic-vs-provable-finality) article\n  for more information about finality).\n\nProof-of-Work (PoW) and Proof-of-Stake (PoS) are well-known mechanisms used to reach consensus in a\nsecure and trustless way on public blockchains, where there are many participants who do not know\neach other (and probably never will). In PoW, network security relies on the fact that the miners\nwho are responsible for adding blocks to the chain must compete to solve difficult mathematic\npuzzles to add blocks - a solution that has been criticized for the wastage of energy. For doing\nthis work, miners are typically rewarded with tokens.\n\nIn PoS networks like Polkadot, the security of the network depends on the amount of capital locked\non the chain: the more the capital locked, the lower the chance of an attack on the network, as the\nattacker needs to incur a heavy loss to orchestrate a successful attack (more on this later on). The\nprocess of locking tokens on the chain is called **staking**.\n\nSimilar to the miners in PoW networks, PoS networks have **validators**, but they do not have to\ncompete with each other to solve mathematical puzzles. They are instead pre-selected to produce the\nblocks based on the stake backing them. Token holders can lock funds on the chain and for doing so,\nthey are getting **staking rewards**. There is thus an economic incentive for token holders to\nbecome active participants who contribute to the economic security and stability of the network. PoS\nnetworks in general are therefore more inclusive than PoW networks, as participants do not need to\nhave either technical knowledge about blockchain technology or experience in running mining\nequipment.\n\nPoS ensures that everybody participating in the staking process has \"skin in the game\" and thus can\nbe held accountable. In case of misbehavior, participants in the staking process can be punished or\n[**slashed**](./learn-offenses.md), and depending on the gravity of the situation, their stake can\nbe partly or fully confiscated by the network. It is not in a staker's economic interest to\norchestrate an attack and risk losing tokens. Any\nto get rewarded, and the PoS network rewards good behavior and punishes bad behavior."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#nominated-proof-of-stake-npos", "page_title": "Staking on Polkadot", "index": 1, "depth": 2, "title": "Nominated Proof-of-Stake (NPoS)", "anchor": "nominated-proof-of-stake-npos", "start_char": 3911, "end_char": 6480, "estimated_token_count": 560, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Nominated Proof-of-Stake (NPoS)\n\nPolkadot implements\n[Nominated Proof-of-Stake (NPoS)](./learn-consensus.md#nominated-proof-of-stake), a relatively novel\nand sophisticated mechanism to select the validators who are allowed to participate in its\n[consensus](learn-consensus.md) protocol. NPoS encourages token holders to participate as\n**nominators**.\n\nAny potential validators can indicate their intention to be a validator candidate. Their candidacies\nare made public to all nominators, and a nominator, in turn, submits a\n[capped list of candidates](../general/chain-state-values.md) that it\nsupports, and the network will automatically distribute the stake among validators in an even manner\nso that the economic security is maximized. In the next era, a certain number of validators having\nthe highest backing get elected and become active. For more information about the election algorithm\ngo to [this](learn-phragmen.md) page on the wiki or\n[this](https://research.web3.foundation/Polkadot/protocols/NPoS/Paper) research article. As a\nnominator, a [minimum bond](../general/chain-state-values.md)\nis required to submit an intention to nominate, which can be thought of as registering to be a\nnominator. Note that in NPoS the stake of both nominators and validators can be\n[slashed](./learn-offenses.md). For an in-depth review of NPoS see\n[this](https://research.web3.foundation/Polkadot/protocols/NPoS/Overview) research article.\n\n!!!caution \"Minimum Nomination to Receive Staking Rewards\"\n    [The minimum nomination intent](../general/chain-state-values.md) does not guarantee staking rewards. The nominated amount has to be greater than [minimum active nomination](../general/chain-state-values.md), which is a dynamic value that can be much higher than the minimum nomination intent. This dynamic value depends on the amount of tokens being staked, in addition to the selected nominations.\n\nThe number of nominators included in the election solution of any given era is capped (approximately 22,500 on Polkadot), because the optimal validator selection must be computed within a single block's execution time. This is the reason the minimum active bond is dynamic: it is effectively set by the stake of the lowest-ranked electing nominator. Submitting a nomination intent above the strict minimum only adds an account to a waitlist for this electing subset, providing flexibility when higher-staked nominators unbond. Accounts whose stake falls below this dynamic minimum can still earn rewards by joining a [nomination pool](learn-nomination-pools.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#nominating-validators", "page_title": "Staking on Polkadot", "index": 2, "depth": 3, "title": "Nominating Validators", "anchor": "nominating-validators", "start_char": 6480, "end_char": 8434, "estimated_token_count": 367, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Nominating Validators\n\nNominating requires 2 actions:\n\n- Locking tokens on-chain.\n- Selecting a set of validators, to whom these locked tokens will automatically be allocated to.\n\nHow many tokens you lock up is completely up to you - as are the validators you wish to select. The\naction of locking tokens is also known as **bonding**. You can also refer to your locked tokens as\nyour bonded tokens, or staked tokens. Likewise, selecting validators is also known as backing or\nnominating validators. These terms are used interchangeably by the community. From now on locked\ntokens will be referred to as bonded tokens.\n\nOnce the previous 2 steps are completed and you are nominating, your bonded tokens could be\nallocated to one or more of your selected validators, and this happens every time the active\nvalidator set changes. This validator set is updated every era.\n\nUnlike other staking systems, Polkadot automatically chooses which of your selected validators will\nbe backed by your bonded tokens. Selecting a group of validators increases your chances of\nconsistently backing at least one who is active. This results in your bonded tokens being allocated\nto validators more often, which means more network security and more rewards. This is in strong\ncontrast to other staking systems that only allow you to back one validator; if that validator is\nnot active, you as a staker will also not be.\n\nPolkadot's nomination model solves this. It uses tools ranging from election theory to game theory\nto discrete optimization, to develop an efficient validator selection process that offers fair\nrepresentation and security, thus avoiding uneven power and influence among validators. The election\nalgorithms are based on the Proportional Justified Representation (PJR) methods like\n[Phragmen](learn-phragmen.md). For more information about PJR methods visit\n[this](https://research.web3.foundation/Polkadot/protocols/NPoS/Overview) research article."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#eras-and-sessions", "page_title": "Staking on Polkadot", "index": 3, "depth": 3, "title": "Eras and Sessions", "anchor": "eras-and-sessions", "start_char": 8434, "end_char": 9387, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Eras and Sessions\n\nThe stake from nominators is used to increase the number of tokens held by such candidates,\nincreasing their chance of being selected by the election algorithm for block production during a\nspecific **era**. An era is a period of 24 hours (6 hours on Kusama) during which an **active set**\nof validators is producing blocks and performing other actions on the chain. This means that not all\nvalidators are in the active set and such set changes between eras. Each era is divided into 6\nepochs or **sessions** during which validators are assigned as block producers to specific time\nframes or **slots**. This means that validators know the slots when they will be required to produce\na block within a specific session, but they do not know all the slots within a specific era. Having\nsessions adds a layer of security because it decreases the chance of having multiple validators\nassigned to a slot colluding to harm the network."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#staking-rewards", "page_title": "Staking on Polkadot", "index": 4, "depth": 3, "title": "Staking Rewards", "anchor": "staking-rewards", "start_char": 9387, "end_char": 10476, "estimated_token_count": 223, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Staking Rewards\n\nValidators who produce a block are rewarded with tokens, and they can share rewards with their\nnominators. Both validators and nominators can stake their tokens on chain and receive staking\nrewards at the end of each era. The staking system pays out rewards equally to all validators\nregardless of stake. Thus, having more stake in a validator does not influence the amount of block\nrewards it receives. This avoids the centralization of power to a few validators. There is a\nprobabilistic component in the calculation of rewards, so they may not be exactly equal for all\nvalidators. In fact, during each era validators can earn **era points** by doing different tasks on\nchain. The more the points, the higher the reward for a specific era. This promotes validators'\nactivity on chain. To know more about era points, and how and on which basis they are distributed\nvisit the [dedicated page](../../node-infrastructure/run-a-validator/staking-mechanics/rewards.md). Distribution of the\nrewards is pro-rata to all stakers after the validator's commission is deducted."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#skin-in-the-game-when-staking", "page_title": "Staking on Polkadot", "index": 5, "depth": 3, "title": "Skin in the game when Staking", "anchor": "skin-in-the-game-when-staking", "start_char": 10476, "end_char": 11312, "estimated_token_count": 153, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Skin in the game when Staking\n\nThe security of PoS networks depends on the amount of staked tokens. To successfully attack the\nnetwork, a malicious actor would need to accrue a large number of tokens or would need different\nparticipants to collude and act maliciously. If there is an attack in the case of NPoS, both the\nvalidator(s) and nominators will be slashed resulting in their stake being partially or fully\nconfiscated by the network and then deposited to the treasury. There is little interest for a\nrational network participant to act in a harmful way because NPoS ensures that all participants can\nbe held accountable for their bad actions. In NPoS, validators are paid equal rewards regardless of\nthe amount of stake backing them, thus avoiding large payouts to few large validators which might\nlead to centralization."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#being-a-nominator", "page_title": "Staking on Polkadot", "index": 6, "depth": 2, "title": "Being a Nominator", "anchor": "being-a-nominator", "start_char": 11312, "end_char": 11334, "estimated_token_count": 5, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Being a Nominator"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#tasks-and-responsibilities-of-a-nominator", "page_title": "Staking on Polkadot", "index": 7, "depth": 3, "title": "Tasks and Responsibilities of a Nominator", "anchor": "tasks-and-responsibilities-of-a-nominator", "start_char": 11334, "end_char": 13880, "estimated_token_count": 588, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Tasks and Responsibilities of a Nominator\n\n**Validators.** Since validator slots are limited, most of those who wish to stake their tokens and\ncontribute to the economic security of the network will be nominators, thus here we focus on the\nrole of nominators. However, it is worth mentioning that validators do most of the heavy lifting:\nthey run the validator nodes and manage\n[session keys](https://research.web3.foundation/Polkadot/security/keys/session), produce new block\ncandidates in [BABE](./learn-consensus.md#block-production-babe), vote and come to consensus in\n[GRANDPA](./learn-consensus.md#finality-gadget-grandpa), validate the state transition function of\nparachains, and possibly some other responsibilities regarding data availability and\n[XCM](learn-xcm.md). For more information, you can take a look at the\n[validator docs](learn-validator.md) to understand what you need to do as a validator. If you want\nto become a validator you can consult\n[this](../../node-infrastructure/run-a-validator/requirements.md#running-a-validator) guide.\n\n**Nominators.** Nominators have far fewer responsibilities than validators. These include selecting\nvalidators and monitoring their performance, keeping an eye on changing commission rates (a\nvalidator can change commission at any time), and general health monitoring of their validators'\naccounts. Thus, while not being completely set-it-and-forget-it, a nominator's experience is\nrelatively hands-off compared to that of a validator, and even more with\n[nomination pools](./learn-nomination-pools.md). For more information, you can take a look at the\nnominator [guide](learn-nominator.md) to understanding your responsibilities as a nominator.\n\nIf you want to become a nominator, see [this](../learn/learn-nominator.md) guide. If you are a\nbeginner and would like to securely stake your tokens using the Polkadot Developer Interface, refer to\n[this](how-to/stake-nominate.md)\narticle. The tutorial presented in the article is demonstrated on Polkadot, but the\nprocedure is the same for Kusama.\n\n!!!info \"Polkadot Staking Dashboard\"\n    The [Staking Dashboard](https://staking.polkadot.cloud/) provides a more user-friendly alternative to staking. See the [Staking Dashboard overview](../general/dashboards/staking-dashboard.md) and the [dashboard documentation](https://docs.staking.polkadot.cloud/) to learn how to stake with it.\n\n**Pools.** Pools are \"built\" on top of NPoS to provide a very low barrier to entry to staking,\nwithout sacrificing Polkadot's strict security model."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#selection-of-validators", "page_title": "Staking on Polkadot", "index": 8, "depth": 3, "title": "Selection of Validators", "anchor": "selection-of-validators", "start_char": 13880, "end_char": 18858, "estimated_token_count": 1005, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Selection of Validators\n\nThe task of choosing validators is not simple, as it should take into account nominator reward and\nrisk preferences. Ideally one aims to maximize the reward-to-risk ratio by maximizing rewards and\nminimizing risks, with sometimes having to compromise between the two, as minimizing risks might\ndecrease rewards as well. Nominators should pay attention, especially to six criteria when\nnominating validators (not in order of importance):\n\n- recent history of the era points earned across eras\n- validator's self stake (shows skin in the game)\n- total stake backing the validator (which is the sum of self stake and the stake coming from\n  nominators)\n- commission fees (i.e. how much validators charge nominators)\n- verified identity\n- previous slashes\n\nThe diagram below shows how the selection of those criteria affects the reward-to-risk ratio.\n\n![rewards and risks diagram](../assets/reward-risk.png)\n\n#### Validator Selection Criteria\n\nTo maximize rewards and minimize risk, one could select those validators that:\n\n- have era points above average (because they will get more rewards for being active),\n- have the total stake backing the validator below the average active validator stake (because they\n  will pay out more rewards per staked token),\n- have high own stake (because if slashed they have something to lose),\n- have low commission fees but not 0% (because it makes sense that for doing the heavy lifting,\n  validators ask for a small commission),\n- have on-chain registered identity (because it adds a layer of trust and possibly provides access\n  to their website and contact details),\n- and have not been slashed (meaning that their on-chain behavior is genuine).\n\n#### Network Providers\n\nFor successful operation, a Validator node should always be ensured to meet the required\n[software, hardware, and network bandwidth specifications](../../node-infrastructure/run-a-validator/requirements.md#minimum-hardware-requirements).\nUnderstandably, most of the validator nodes run on cloud service providers that guarantee high\nhardware specifications and high levels of availability and connectivity. Keep in mind that a\nvalidator in the active set is supposed to be fully online and available for producing blocks. If\nthe active validator node goes offline due to network interruptions or a power outage, that\nvalidator will get fewer rewards.\n\n!!!tip \"Checking Validators using Network Providers\"\n    You can connect your stash account to the [Polkawatch app](https://polkawatch.app/). The app will show your rewards earned in the past 60 eras divided by network provider and country. You will be able to see networks used by each validator and verify if your validators are using providers who support PoS. This is also a great tool to explore how decentralized your nominations are and act accordingly.\n\n#### Keeping Track of Nominated Validators\n\n!!!caution \"Nominators must periodically check their validators\"\n    Nominating is _not_ a \"set and forget\" operation. The whole NPoS system is dynamic and nominators should periodically monitor the performance and reputation of their validators. Failing to do so could result in applied slashes and/or rewards not being paid out, possibly for a prolonged period.\n\nAlthough the theory can be used as a general guideline, in practice it is more complicated and\nfollowing the theory might not necessarily lead to the desired result. Validators might have the\ntotal stake backing them below average, low commission and above average era points in one era and\nthen have a different profile in the next one. Selection based on the criteria like on-chain\nidentity, slash history and low commission make the staking rewards deterministic. But some criteria\nvary more than others, with era points being the most variable and thus one of the key probabilistic\ncomponents of staking rewards. Part of this probability is directly related to the fact that a\nvalidator can produce blocks for a parachain (i.e. para-validators) or the relay chain, with\npara-validators earning more era points per unit time (see\n[this](../../node-infrastructure/run-a-validator/staking-mechanics/rewards.md#era-points) page for more information). The\nrole can switch between sessions, and you can look at\n[the staking tab on the Polkadot Developer Interface](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async) to know which\nvalidator is producing blocks for the relay chain or parachains.\n\nIt is not recommended to change nominations because of the low era points of a validator in a single\nera. Variability in rewards due to the era points should level out over time. If a validator\nconsistently gets era points below average, it makes sense to nominate a better-performing validator\nfor the health of the network and increased staking rewards. See\n[this](how-to/choose-validators.md)\narticle to understand in detail how to select the set of validators to nominate."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#stash-account-and-staking-proxy", "page_title": "Staking on Polkadot", "index": 9, "depth": 3, "title": "Stash Account and Staking Proxy", "anchor": "stash-account-and-staking-proxy", "start_char": 18858, "end_char": 21725, "estimated_token_count": 588, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Stash Account and Staking Proxy\n\nTwo different accounts can be used to securely manage your funds while staking.\n\n- **Stash:** This account holds funds bonded for staking, but delegates some staking functions to a\n  staking proxy account. You may actively participate in staking with a stash private key kept in a\n  cold wallet like Ledger, meaning it stays offline all the time. Having a staking proxy will allow\n  you to sign most staking-related transactions with the proxy instead of using your Ledger device.\n  This will allow you:\n\n  - to avoid carrying around your Ledger device just to sign staking-related transactions, and\n  - to keep the transaction history of your stash clean\n\n- **Staking Proxy:** This account acts on behalf of the stash account, signalling decisions about\n  nominating and validating. It can set preferences like commission (for validators) and the staking\n  rewards payout account. The earned rewards can be bonded (locked) immediately for bonding on your\n  stash account, which would effectively compound the rewards you receive over time. You could also\n  choose to have them deposited to a different account as a free (transferable) balance. Staking\n  proxies only need sufficient funds to pay for the transaction fees.\n\n!!!warning\n    Never leave a high balance on a proxy account which are usually \"hot\" as their private key is stored on the device (PC, phone) and it is always exposed to the internet for potential hacks and scams. It is good practice to deposit rewards on the stash account or to send them to another account on a cold wallet.\n\n![staking](../assets/stash-and-staking-proxy.png)\n\nThis hierarchy of separate keys for stash and staking accounts was designed to add a layer of\nprotection to nominators and validator operators. The more often one exposes and uses a private key,\nthe higher its vulnerability for hacks or scams. So, if one uses a key for multiple roles on a\nblockchain network, it is likely that the account can get compromised. Note that the damage linked\nto stolen private keys is different depending on the type of account derivation. In the case of soft\nderivation, all derived accounts are compromised. More information about account derivation can be\nfound [here](./learn-account-advanced.md#derivation-paths).\n\n!!!info\n    For Ledger users staking directly on Ledger Live, there is no option to use separate stash and staking proxy accounts.\n\nLedger devices are now supported in [SubWallet](https://www.subwallet.app/download.html),\n[Talisman](https://talisman.xyz/), and [PolkaGate](https://polkagate.xyz/) extension. Users can\nimport their Ledger accounts in the extension and use them as a stash in staking. You can find more\ninformation about, SubWallet, Talisman, PolkaGate and other wallets that officially secured funding\nfrom the treasury [here](https://polkadot.com/ecosystem)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#claiming-staking-rewards", "page_title": "Staking on Polkadot", "index": 10, "depth": 3, "title": "Claiming Staking Rewards", "anchor": "claiming-staking-rewards", "start_char": 21725, "end_char": 24746, "estimated_token_count": 657, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Claiming Staking Rewards\n\nNote that Kusama runs approximately 4x as fast as Polkadot, except for block production times.\nPolkadot will also produce blocks at approximately six-second intervals.\n\nRewards are calculated per era (approximately six hours on Kusama and twenty-four hours on\nPolkadot). These rewards are calculated based on era points, which have a probabilistic component.\nIn other words, there may be slight differences in your rewards from era to era, and even amongst\nvalidators in the active set at the same time. These variations should cancel out over a long enough\ntimeline. See the page on [Validator Payout Guide](../../node-infrastructure/run-a-validator/staking-mechanics/rewards.md).\n\n!!!info \"Staking Rewards\"\n     You must claim your staking rewards from Polkadot Hub, not the relay chain.\n\nThe distribution of staking rewards to the nominators is not automatic and needs to be triggered by\nsomeone. Typically the validators take care of this, but anyone can permissionlessly trigger rewards\npayout for all the nominators whose stake has backed a specific validator in the active set of that\nera. Staking rewards are kept available for\n[a limited amount of time](../general/chain-state-values.md). Staking rewards are claimed on Asset Hub.\n\nFor more information on why this is so, see the page on [simple payouts](learn-staking-advanced.md).\n\n!!!info \"Payouts\"\n    Payouts are unclaimed rewards waiting to be paid out to both validators and nominators. If you go to the Staking payouts page on [Polkadot-JS](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-asset-hub-rpc.polkadot.io#/staking-async), you will see a list of all validators that you have nominated in the past 84 eras and for which you have not yet received a payout. The payout page is visible only to stakers.\n\nEach validator as well as their nominators have the option to trigger the payout for all unclaimed\neras. Note that this will pay everyone who was nominating that validator during those eras.\nTherefore, you may not see anything in this tab, yet still have received a payout if somebody\n(generally, but not necessarily, another nominator or the validator operator) has triggered the\npayout for that validator for that era.\n\n!!!warning \"Time limit to claim staking rewards\"\n    If nobody claims your staking rewards within 84 eras, then you will not be able to claim them and they will be lost. Additionally, if the validator unbonds all their own stake, any pending payouts will also be lost.\n\nRewards can be directed to the same account used to sign the payout or to a completely unrelated\naccount. It is also possible to top-up / withdraw some bonded tokens without having to un-stake all\nstaked tokens.\n\nIf you wish to know if you received a payout, you will have to check via a block explorer. See\n[the relevant page](how-to/see-staking-rewards.md)\nfor details. For specific details about validator payouts, please see\n[this guide](../../node-infrastructure/run-a-validator/staking-mechanics/rewards.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#chilling", "page_title": "Staking on Polkadot", "index": 11, "depth": 3, "title": "Chilling", "anchor": "chilling", "start_char": 24746, "end_char": 25428, "estimated_token_count": 152, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Chilling\n\nChilling is the act of stepping back from any nominating or validating. It can be done by a\nvalidator or nominator at any time, taking effect in the next era.\n\nChilling can be validator-initiated, e.g. if there is a planned outage in the validator's\nsurroundings or hosting provider, and the validator wants to exit to protect themselves against\nslashing. Chilling will keep the validator active in the current era, but will move them to the\ninactive set in the next. The validator will not lose their nominators.\n\nFor more on chilling, see the [How to Chill](../../node-infrastructure/run-a-validator/operational-tasks/pause-validating.md) page on the main website."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#why-and-why-not-to-stake", "page_title": "Staking on Polkadot", "index": 12, "depth": 3, "title": "Why and Why not to Stake?", "anchor": "why-and-why-not-to-stake", "start_char": 25428, "end_char": 25459, "estimated_token_count": 10, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Why and Why not to Stake?"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#pros-of-staking", "page_title": "Staking on Polkadot", "index": 13, "depth": 3, "title": "Pros of Staking", "anchor": "pros-of-staking", "start_char": 25459, "end_char": 26012, "estimated_token_count": 133, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Pros of Staking\n\n- Earn rewards for contributing to the network's security through staking.\n- Low barrier of entry through [Nomination Pools](learn-nomination-pools.md).\n- Can choose [multiple validators](../general/chain-state-values.md)\n  which can help to decentralize the network through the sophisticated\n  [NPoS system](./learn-consensus.md#nominated-proof-of-stake)\n- 85% of inflation/year of the tokens is primarily intended for staking rewards. Check the\n  [inflation](learn-DOT.md#dot-inflation) section on the Wiki for more information."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#cons-of-staking", "page_title": "Staking on Polkadot", "index": 14, "depth": 3, "title": "Cons of Staking", "anchor": "cons-of-staking", "start_char": 26012, "end_char": 27479, "estimated_token_count": 329, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Cons of Staking\n\n- Tokens will be locked during the\n  [unbonding period](../general/chain-state-values.md) and no rewards will be\n  earned if you unbond.\n- Possible punishment in case of the active validator found to be misbehaving (see\n  [slashing](./learn-offenses.md)).\n- Lack of liquidity i.e. You would not be able to use the tokens for participating in crowdloans or\n  transfer them to different account etc.\n\n#### Unbonding Period Length\n\nThe [unbonding period](../general/chain-state-values.md) provides a safety net\nfor slashing offenses identified in\n[past eras](https://research.web3.foundation/Polkadot/security/slashing/npos#slashing-in-past-eras),\nwhich can hold the respective validators and their nominators accountable. The unbonding period is\ncrucial in mitigating ex post facto slashing, particularly in guarding against long-range attacks.\nWhen a client encounters a chain finalized by\n[GRANDPA](./learn-consensus.md#finality-gadget-grandpa) that originates more than one\n[unbonding period](../general/chain-state-values.md) in the past, it lacks the\nsecurity of slashing protection.\n\nEssentially, this period establishes a cadence for synchronizing with the chain or acquiring a\ncheckpoint within a timeframe that engenders trust. It's worth noting that while the choice of\n[unbonding period length](../general/chain-state-values.md) is somewhat\narbitrary, it unquestionably provides a higher level of security compared to a shorter period."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#how-many-validators", "page_title": "Staking on Polkadot", "index": 15, "depth": 2, "title": "How many Validators?", "anchor": "how-many-validators", "start_char": 27479, "end_char": 27862, "estimated_token_count": 84, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How many Validators?\n\nThe top bound on the [number of validators](../general/chain-state-values.md)\nhas not been determined yet, but should only be limited by the bandwidth strain of the network due\nto peer-to-peer message passing.\n\nThe estimate of the number of validators that Polkadot will have at maturity is around 1000, while\nKusama is already operating at this threshold."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#why-am-i-not-receiving-rewards", "page_title": "Staking on Polkadot", "index": 16, "depth": 2, "title": "Why am I not receiving rewards?", "anchor": "why-am-i-not-receiving-rewards", "start_char": 27862, "end_char": 33408, "estimated_token_count": 1637, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Why am I not receiving rewards?\n\nNominating is not a set-and-forget action. Nominators need to monitor their nominations and ensure\nthey are eligible to receive staking rewards. Otherwise, they would be risking their funds to secure\nthe chain with no reward. If you are bonding significantly more than the Minimum Active Bond and yet\nnot receiving rewards, your nominations are all waiting, or your active validator has 100%\ncommission. However, if you bond funds close to the Minimum Active Bond, there could be several\npossibilities for not receiving staking rewards. The table below can be used to troubleshoot why you\nmight not be receiving staking rewards using Polkadot Developer Interface.\n\nRewards also do not begin immediately after nominating. A new nomination only starts earning once\nthe stake is applied to a validator that enters the active set at the next election, which can take\nup to roughly 48 hours (one to two eras). In addition, unless the amount staked is very large, in\neach era a nominator's entire stake typically backs only a single active validator rather than all\nselected validators; having multiple inactive or waiting validators is expected and not a problem as\nlong as at least one is active.\n\n|                   Nomination Status                   |                                                                                                                                               What's happening?                                                                                                                                                |                                                                                                                                                    Causes                                                                                                                                                    |                                                                                                                                                What to do?                                                                                                                                                |\n| :---------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |\n|    Nominated validators are all in waiting status.    |                                                                                           Your stake has not been assigned to any of the nominated validators. You cannot earn rewards, nor be slashed in that era.                                                                                            |                                                                   Waiting validators are not in the active set in the current era and the stake backing them is not used to secure the network. In simple words, NPoS \"does not see them\".                                                                   |                                                                                    Change your nominations. Try to select validators (with reasonable commission) that have high chances to end up in the active set.                                                                                     |\n| You have some inactive, and some waiting nominations. | Validators shown as \"Inactive\" in your staking dashboard are still in the active set and are producing blocks in the current era, but your stake has not been assigned to any of them. You will not earn rewards if your stake is not backing an active validator. In this case, you cannot be slashed either. | **Scenario 1:** You have bonded less than the Minimum Active Bond. **Scenario 2:** You have more than the Minimum Active Bond, but your account is at the tail end of the [bags list](learn-staking-advanced.md#bags-list) and within your bag there are accounts with less stake than you, in front of you. | **Scenario 1:** Try bonding more funds. **Scenario 2:** Try to put your account in front of the accounts with less stake than you. Instructions available [here](learn-staking-advanced.md) |\n\n!!!tip \"Join a Nomination Pool\"\n    By joining a [nomination pool](learn-nomination-pools.md) that is active and earning rewards, you can start earning staking rewards with as low as 1 DOT. The nomination pools typically have a dedicated pool operator who ensures that the pool's stake is always backing an active validator and is receiving rewards.\n\n!!!info \"Bags List & Minimum Active Bond\"\n    You can find information about why you might not receive staking rewards on [this page](learn-staking.md) and [this video tutorial](https://youtu.be/hIIZRJLrBZA)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#staking-faq", "page_title": "Staking on Polkadot", "index": 17, "depth": 2, "title": "Staking FAQ", "anchor": "staking-faq", "start_char": 33408, "end_char": 33499, "estimated_token_count": 26, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Staking FAQ\n\n!!!info\n    See [this page](learn-staking.md) for the FAQs about staking."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#resources", "page_title": "Staking on Polkadot", "index": 18, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 33499, "end_char": 34262, "estimated_token_count": 188, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Resources\n\n- [How Nominated Proof of Stake will work in Polkadot](https://medium.com/web3foundation/how-nominated-proof-of-stake-will-work-in-polkadot-377d70c6bd43) -\n  Blog post by Web3 Foundation researcher Alfonso Cevallos covering NPoS in Polkadot.\n- [Validator setup](../../node-infrastructure/run-a-validator/operational-tasks/general-management.md#secure-your-validator)\n- [Polkadot validator selector tool](https://decentradot.com/polkadot-validator-selector/) - A tool\n  that helps nominators find reliable validators that meet quality-control criteria, including\n  commission rates, verified identity, etc.\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about staking](./learn-guides-nominator.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-staking", "url": "https://developer.polkadot.com/wiki/learn/learn-staking/#how-to-guides", "page_title": "Staking on Polkadot", "index": 19, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 34262, "end_char": 34471, "estimated_token_count": 71, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:adfe5ce3519eb7c7c9f339d9f0b07ee50b543ce2cfb77067ec90df60c2b5ab87", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [How to Unstake Your Tokens](how-to/unstake-tokens.md)\n- [How Do I Stake (Nominate) on Polkadot?](how-to/stake-nominate.md)\n- [How to See My Staking Rewards](how-to/see-staking-rewards.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-system-chains", "url": "https://developer.polkadot.com/wiki/learn/learn-system-chains/#overview", "page_title": "System Chains", "index": 0, "depth": 2, "title": "Overview", "anchor": "overview", "start_char": 660, "end_char": 2054, "estimated_token_count": 288, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c6850691908ade099d9610a1d8e5c884670b88f833377e9d861486db3a563cdd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Overview\n\nSystem parachains are those that contain core Polkadot protocol features, but in parachains rather\nthan the relay chain. Rather than purchasing coretime on a marketplace, execution cores for system\nchains are allocated through the network [governance](./learn-guides-polkadot-opengov.md).\n\nBy hosting core protocol logic in parachains instead of the relay chain, Polkadot uses its own\nscaling technology -- namely, parallel execution -- to host _itself_. System parachains remove\ntransactions from the relay chain, allowing more relay chain\n[blockspace](https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/) to be used for Polkadot's\nprimary purpose: validating parachains.\n\nSystem parachains always defer to on-chain governance to manage their upgrades and other sensitive\nactions. That is, they do not have their own native tokens or governance systems separate from DOT\nKSM. In fact, there will likely be a system parachain specifically for network governance.\n\n!!!note\n    In the past, these were often called \"Common Good Parachains\", so you may come across articles and discussions using that term. As the network has evolved, that term has been confusing in many cases, so \"System Parachains\" is preferred now. A discussion on this evolution can be found in [this forum thread](https://forum.polkadot.network/t/polkadot-protocol-and-common-good-parachains/866)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-system-chains", "url": "https://developer.polkadot.com/wiki/learn/learn-system-chains/#existing-system-chains", "page_title": "System Chains", "index": 1, "depth": 2, "title": "Existing System Chains", "anchor": "existing-system-chains", "start_char": 2054, "end_char": 8805, "estimated_token_count": 1345, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:c6850691908ade099d9610a1d8e5c884670b88f833377e9d861486db3a563cdd", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Existing System Chains\n\n=== \"Polkadot\"\n\n    ### Asset Hub\n\n    The [Asset Hub](https://github.com/paritytech/polkadot-sdk/tree/master/cumulus#asset-hub-) on both\n    Polkadot and Kusama are the first system parachains.\n\n    The Asset Hub was initially designed as an asset portal for the Polkadot network. Over time, its role expanded, and it has evolved into the primary technical host for most user-facing functionalities within the ecosystem.\n\n    When users interact with Polkadot - such as creating an account, transferring tokens, or staking - they are, in practice, interacting with the Asset Hub. Although this is abstracted away in most wallets and interfaces, the underlying account data, balances, and staking mechanisms are managed by Asset Hub. It serves as the operational backbone for these activities, even if users are not directly aware of it.\n\n    Core functionalities such as balances, transfers, staking, and asset management are executed on Asset Hub. Users can also issue and manage their own assets, including non-fungible tokens (NFTs), directly on the network.\n\n    The Asset Hub provides tools for asset creators, such as reserve-backed stablecoin issuers, to monitor the total issuance of their assets across the entire network, including amounts transferred to other parachains. It also enables them to perform on-chain actions such as minting, burning, and asset administration.\n\n    In the future the Asset Hub is expected to be upgraded to support [smart contracts](./learn-smart-contracts.md). This upgrade will extend its role beyond native runtime logic, enabling developers to deploy and interact with smart contracts directly on the Asset Hub in Solidity and Rust. \n\n    Unlike smart contract-based systems, asset management, staking and transfer logic on Asset Hub is embedded directly in the chain’s runtime. Due to the efficiency of parachain execution, transaction fees and required deposits are approximately one-tenth of those on the relay chain. \n\n    ### Collectives\n\n    The Polkadot Collectives parachain was added in\n    [Referendum 81](https://polkadot.subsquare.io/democracy/referenda/81) and exists only on Polkadot (i.e.,\n    there is no Kusama equivalent). The Collectives chain hosts on-chain collectives that serve the\n    Polkadot network.\n\n    Some of these collectives are the\n    [Polkadot Alliance](https://polkadot.subsquare.io/democracy/referenda/94) and the Polkadot Technical\n    [Fellowship](./learn-polkadot-technical-fellowship.md). These on-chain collectives will play\n    important roles in the future of network stewardship and decentralized governance.\n\n    Networks themselves can act as collectives and express their legislative voices as single opinions\n    within other networks. This is achieved with the assistance from a [bridge hub](#bridge-hub).\n\n    ### Bridge Hub\n\n    Before Polkadot and Kusama supported their first parachains, the only way to design a bridge was to\n    put the logic onto the relay chain itself. Since both networks now support parachains, it makes\n    sense to have a parachain on each network dedicated to bridges. This is because of the execution\n    isolation provided by parachains.\n\n    The Bridge Hub system parachain operates on the relay chain, and is responsible for facilitating\n    bridges to the wider Web3 space. It contains the required bridge\n    [pallets](../general/glossary.md#pallet) in its runtime, which enable trustless bridging with other\n    blockchain networks like Polkadot, Kusama and Ethereum. The Bridge Hub uses the native token of the\n    relay chain.\n\n    See the [Bridges page](learn-bridges.md) for information on the latest bridge projects.\n\n    ### People Chain\n\n    The People Chain allows users to manage their account [identity](./learn-identity.md).\n\n    ### Coretime Chain\n\n    The Coretime system chain allows users to buy coretime to access Polkadot's computation.\n    [Coretime marketplaces](./learn-guides-coretime-marketplaces.md) run on top of the Coretime chain.\n    For more information about agile coretime, see [here](./learn-agile-coretime.md).\n\n=== \"Kusama\"\n\n    Compared to Polkadot, Kusama does not have the Collectives system chain, and it has the\n    [Encointer](https://encointer.org/encointer-for-web3/) system chain.\n\n    ### Encointer\n\n    Encointer is a blockchain platform for self-sovereign ID and a global universal basic income. With\n    [referendum 158](https://kusama.subsquare.io/democracy/referenda/158) Encointer was registered as the\n    second system parachain on Kusama's network. The functionality of Encointer adds logic to the Relay\n    Chain that aims to bring financial inclusivity to Web3 and mitigate Sybil attacks with a novel Proof\n    of Personhood (PoP) system for unique identity.\n\n    Encointer offers a framework that, in principle, allows for any group of real people to create,\n    distribute, and use their own digital community tokens.\n    [Referendum 187](https://kusama.subsquare.io/democracy/referenda/187) introduced a runtime upgrade\n    bringing governance and full functionality for communities to be able to use the protocol.\n\n    Encointer aims to invert the\n    [Cantillon Effect](https://www.newworldencyclopedia.org/entry/Richard_Cantillon), where money is\n    issued at the bottom, and not as credit to businesses or creditworthy individuals. This way, every\n    individual gets a [universal basic income (UBI)](https://book.encointer.org/economics-ubi.html).\n\n    To resist Sybil attacks, the Encointer protocol uses a PoP mechanism to foster a unique identity\n    system. The notion is that a person can only be present at one place at a given time. Participants\n    are requested to attend physical key-signing ceremonies with small groups of random people at\n    randomized locations, where these local meetings are part of one global ceremony that co-occur.\n    Participants use the Encointer wallet app to participate in these ceremonies, and the wallet enables\n    the management of local community currencies. Watch an Encointer ceremony in action in\n    [this video](https://www.youtube.com/watch?v=tcgpCCYBqko).\n\n    The protocol involves [other mechanisms](https://book.encointer.org/ssi.html#privacy-considerations)\n    to protect the privacy of users in addition to the physical key-signing ceremonies.\n\n    Encointer was accepted as a system chain based on its offer of a Sybil defense mechanism as a basis\n    for digital democracy. This can also be adapted by other chains, which can use the unique identity\n    system to prevent Sybil attacks and use PoP for token airdrops or faucets.\n\n    !!!tip\n        To learn more about Encointer, check out the official [Encointer book](https://book.encointer.org/introduction.html)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-teleport", "url": "https://developer.polkadot.com/wiki/learn/learn-teleport/#how-teleports-work", "page_title": "Teleporting Assets", "index": 0, "depth": 2, "title": "How Teleports work", "anchor": "how-teleports-work", "start_char": 809, "end_char": 1160, "estimated_token_count": 76, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19ab73329ed2eca12f2f30b89a9c8a29e2df8720952d0e4bdf705f5cd283cf22", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How Teleports work\n\n![teleport](../assets/asset-hub/teleport-asset.png)\n\nAs you can see from the diagram above, there are only two actors within this model: the source and\nthe destination. How we transfer assets between the source and the destination is briefly summarized\nin the numbered labels on the diagram and explained in more detail below."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-teleport", "url": "https://developer.polkadot.com/wiki/learn/learn-teleport/#initiate-teleport", "page_title": "Teleporting Assets", "index": 1, "depth": 3, "title": "Initiate Teleport", "anchor": "initiate-teleport", "start_char": 1160, "end_char": 1370, "estimated_token_count": 43, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19ab73329ed2eca12f2f30b89a9c8a29e2df8720952d0e4bdf705f5cd283cf22", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Initiate Teleport\n\nThe source gathers the assets to be teleported from the sending account and **takes them out** from\nthe circulating supply, taking note of the total amount of assets that was taken out."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-teleport", "url": "https://developer.polkadot.com/wiki/learn/learn-teleport/#receive-teleported-assets", "page_title": "Teleporting Assets", "index": 2, "depth": 3, "title": "Receive Teleported Assets", "anchor": "receive-teleported-assets", "start_char": 1370, "end_char": 1749, "estimated_token_count": 74, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19ab73329ed2eca12f2f30b89a9c8a29e2df8720952d0e4bdf705f5cd283cf22", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Receive Teleported Assets\n\nThe source chain then creates an [XCM](learn-xcm.md) instruction called `ReceiveTeleportedAssets`\ncontaining the receiving account and the amount of assets taken out from circulation as parameters.\n\nIt then sends this instruction over to the destination chain, where it gets processed, and new\nassets are **put back into** the circulating supply."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-teleport", "url": "https://developer.polkadot.com/wiki/learn/learn-teleport/#deposit-asset", "page_title": "Teleporting Assets", "index": 3, "depth": 3, "title": "Deposit Asset", "anchor": "deposit-asset", "start_char": 1749, "end_char": 2863, "estimated_token_count": 211, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19ab73329ed2eca12f2f30b89a9c8a29e2df8720952d0e4bdf705f5cd283cf22", "last_updated": "2026-10-28T08:43:55+00:00", "text": "### Deposit Asset\n\nThe destination deposits the assets to the receiving account. The actions of **taking out** from the\ncirculating supply and **putting back** into the circulating supply show the great flexibility that\nan [XCM](learn-xcm.md) executor has in regulating the flow of an asset without changing its\ncirculating supply. Assets are transferred to an inaccessible account to remove them from\ncirculation. Likewise, for putting assets back into circulation, assets are released from a\npre-filled and inaccessible treasury, or perform a mint of the assets. This process requires mutual\ntrust between the source and destination. The destination must trust the source of having\nappropriately removed the sent assets from the circulating supply, and the source must trust the\ndestination of having put the received assets back into circulation. The result of an asset\nteleportation should result in the same circulating supply of the asset, and failing to uphold this\ncondition will result in a change in the asset's total issuance (in the case of fungible tokens) or\na complete loss/duplication of an NFT."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-teleport", "url": "https://developer.polkadot.com/wiki/learn/learn-teleport/#how-to-guides", "page_title": "Teleporting Assets", "index": 4, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 2863, "end_char": 2940, "estimated_token_count": 28, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19ab73329ed2eca12f2f30b89a9c8a29e2df8720952d0e4bdf705f5cd283cf22", "last_updated": "2026-10-28T08:43:55+00:00", "text": "## How-to guides\n\n- [How to Teleport DOT or KSM](how-to/teleport-dot-ksm.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transaction-construction", "url": "https://developer.polkadot.com/wiki/learn/learn-transaction-construction/#transaction-format", "page_title": "Transaction Construction and Signing", "index": 0, "depth": 2, "title": "Transaction Format", "anchor": "transaction-format", "start_char": 435, "end_char": 3963, "estimated_token_count": 741, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dc6c3286a8eae43e01d1bd1779398f4fae766bd58fc1acae957873c9454b609a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transaction Format\n\nPolkadot has some basic transaction information that is common to all transactions.\n\n- Address: The SS58-encoded address of the sending account.\n- Block Hash: The hash of the [checkpoint](./learn-transactions.md#mortal-and-immortal-extrinsics) block.\n- Block Number: The number of the checkpoint block.\n- Genesis Hash: The genesis hash of the chain.\n- Metadata: The SCALE-encoded metadata for the runtime when submitted.\n- Nonce: The nonce for this transaction.\\*\n- Spec Version: The current spec version for the runtime.\n- Transaction Version: The current version for transaction format.\n- Tip: Optional, the [tip](./learn-transactions.md#transaction-fees) to increase transaction priority.\n- Mode: The flag indicating whether to verify the metadata hash or not.\n- Era Period: Optional, the number of blocks after the checkpoint for which a transaction is valid.\n  If zero, the transaction is [immortal](./learn-transactions.md#mortal-and-immortal-extrinsics)\n- MetadataHash: Optional, the metadata hash which should match the RUNTIME_METADATA_HASH environment\n  variable.\n\n!!!caution\n    There are risks to making a transaction immortal. If an account is reaped and a user re-funds the\n    account, then they could replay an immortal transaction. Always default to using a mortal extrinsic.\n\n\\*The nonce queried from the System module does not account for pending transactions. You must track\nand increment the nonce manually if you want to submit multiple valid transactions at the same time.\n\nEach transaction will have its own (or no) parameters to add. For example, the `transferKeepAlive`\nfunction from the Balances pallet will take:\n\n- `dest`: Destination address\n- `#[compact] value`: Number of tokens (compact encoding)\n\nRefer to [the protocol specifications](https://spec.polkadot.network/id-extrinsics), for the\nconcrete specifications and types to build a transaction.\n\n**Mode and MetadataHash**\n\nThe mode and metadataHash fields were introduced in transaction construction to support the optional\n[`CheckMetadataHash` Signed Extension](https://github.com/polkadot-fellows/RFCs/blob/main/text/0078-merkleized-metadata.md).\nThis enables trustless metadata verification by allowing the chain to verify the correctness of the\nmetadata used without the need of a trusted party. This functionality was included in\n[v1.2.5](https://github.com/polkadot-fellows/runtimes/releases/tag/v1.2.5) runtime release by the\nFellowship. A user may up out of this functionality by setting the mode to `0`. When the mode is 00,\nthe `metadataHash` field is empty/None.\n\n**Serialized transactions and metadata**\n\nBefore being submitted, transactions are serialized. Serialized transactions are hex encoded\nSCALE-encoded bytes. The relay chain runtimes are upgradable and therefore any interfaces are\nsubject to change, the metadata allows developers to structure any extrinsics or storage entries\naccordingly. The metadata provides you with all of the information required to know how to construct\nthe serialized call data specific to your transaction. You can read more about the metadata, its\nformat and how to get it in the\n[Substrate documentation](../../reference/parachains/chain-data.md#use-subxt).\n\n**Summary**\n\nThe typical transaction workflow is as follows:\n\n1. Construct an unsigned transaction.\n2. Create a signing payload.\n3. Sign the payload.\n4. Serialize the signed payload into a transaction.\n5. Submit the serialized transaction.\n\nParity provides the following tools to help perform these steps."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transaction-construction", "url": "https://developer.polkadot.com/wiki/learn/learn-transaction-construction/#polkadot-js-tools", "page_title": "Transaction Construction and Signing", "index": 1, "depth": 2, "title": "Polkadot-JS Tools", "anchor": "polkadot-js-tools", "start_char": 3963, "end_char": 5743, "estimated_token_count": 397, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dc6c3286a8eae43e01d1bd1779398f4fae766bd58fc1acae957873c9454b609a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Polkadot-JS Tools\n\n[Polkadot-JS Tools](https://github.com/polkadot-js/tools) contains a set of command line tools for\ninteracting with a Substrate client, including one called \"Signer CLI\" to create, sign, and\nbroadcast transactions.\n\nThis example will use the `signer submit` command, which will create and submit the transaction. The\n`signer sendOffline` command has the exact same API, but will not broadcast the transaction.\n`submit` and `sendOffline` must be connected to a node to fetch the current metadata and construct a\nvalid transaction. Their API has the format:\n\n```bash\nyarn run:signer <submit|sendOffline> --account <from-account-ss58> --ws <endpoint> <module.method> [param1] [...] [paramX]\n```\n\nSigning:\n\n```bash\nyarn run:signer sign --account <from-account-ss58> --seed <seed> --type <sr25519|ed25519> <payload>\n```\n\nFor example, let's send 0.5 DOT from `121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2` to\n`15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y`.\n\n```bash\nyarn run:signer submit --account 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2 --ws ws://127.0.0.1:9944 balances.transferKeepAlive 15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y 5000000000\n```\n\nThis will return a payload to sign and an input waiting for a signature. Take this payload and use\nyour normal signing environment (e.g. air gapped machine, VM, etc.). Sign the payload:\n\n```bash\nyarn run:signer sign --account 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2 --seed \"pulp gaze fuel ... mercy inherit equal\" --type sr25519 0x040300ff4a83f1...a8239139ff3ff7c3f6\n```\n\nSave the output and bring it to the machine that you will broadcast from, enter it into `submit`'s\nsignature field, and send the transaction (or just return the serialized transaction if using\n`sendOffline`)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transaction-construction", "url": "https://developer.polkadot.com/wiki/learn/learn-transaction-construction/#tx-wrapper", "page_title": "Transaction Construction and Signing", "index": 2, "depth": 2, "title": "Tx Wrapper", "anchor": "tx-wrapper", "start_char": 5743, "end_char": 8932, "estimated_token_count": 699, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dc6c3286a8eae43e01d1bd1779398f4fae766bd58fc1acae957873c9454b609a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Tx Wrapper\n\nIf you do not want to use the CLI for signing operations, Parity provides an SDK called\n[TxWrapper Core](https://github.com/paritytech/txwrapper-core) to generate and sign transactions\noffline. For Polkadot, Kusama, and select parachains, use the `txwrapper-polkadot` package. Other\nSubstrate-based chains will have their own `txwrapper-{chain}` implementations. See the\n[examples](https://github.com/paritytech/txwrapper-core/blob/main/packages/txwrapper-examples/README.md)\nfor a guide.\n\n**Import a private key**\n\n```ts\nimport { importPrivateKey } from '@substrate/txwrapper-polkadot';\n\nconst keypair = importPrivateKey(“pulp gaze fuel ... mercy inherit equal”);\n```\n\n**Derive an address from a public key**\n\n```ts\nimport { deriveAddress } from '@substrate/txwrapper-polkadot';\n\n// Public key, can be either hex string, or Uint8Array\nconst publicKey = “0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235”;\nconst address = deriveAddress(publicKey);\n```\n\n**Construct a transaction offline**\n\n```ts\nimport { methods } from \"@substrate/txwrapper-polkadot\";\n\nconst unsigned = methods.balances.transferKeepAlive(\n  {\n    dest: \"15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y\",\n    value: 5000000000,\n  },\n  {\n    address: \"121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2\",\n    blockHash: \"0x1fc7493f3c1e9ac758a183839906475f8363aafb1b1d3e910fe16fab4ae1b582\",\n    blockNumber: 4302222,\n    genesisHash: \"0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636\",\n    metadataRpc, // must import from client RPC call state_getMetadata\n    nonce: 2,\n    specVersion: 1019,\n    tip: 0,\n    eraPeriod: 64, // number of blocks from checkpoint that transaction is valid\n    transactionVersion: 1,\n  },\n  {\n    metadataRpc,\n    registry, // Type registry\n  }\n);\n```\n\n**Construct a signing payload**\n\n```ts\nimport { methods, createSigningPayload } from '@substrate/txwrapper-polkadot';\n\n// See \"Construct a transaction offline\" for \"{...}\"\nconst unsigned = methods.balances.transferKeepAlive({...}, {...}, {...});\nconst signingPayload = createSigningPayload(unsigned, { registry });\n```\n\n**Serialize a signed transaction**\n\n```ts\nimport { createSignedTx } from \"@substrate/txwrapper-polkadot\";\n\n// Example code, replace `signWithAlice` with actual remote signer.\n// An example is given here:\n// https://github.com/paritytech/txwrapper-core/blob/b213cabf50f18f0fe710817072a81596e1a53cae/packages/txwrapper-core/src/test-helpers/signWithAlice.ts\nconst signature = await signWithAlice(signingPayload);\nconst signedTx = createSignedTx(unsigned, signature, { metadataRpc, registry });\n```\n\n**Decode payload types**\n\nYou may want to decode payloads to verify their contents prior to submission.\n\n```ts\nimport { decode } from \"@substrate/txwrapper-polkadot\";\n\n// Decode an unsigned tx\nconst txInfo = decode(unsigned, { metadataRpc, registry });\n\n// Decode a signing payload\nconst txInfo = decode(signingPayload, { metadataRpc, registry });\n\n// Decode a signed tx\nconst txInfo = decode(signedTx, { metadataRpc, registry });\n```\n\n**Check a transaction's hash**\n\n```ts\nimport { getTxHash } from ‘@substrate/txwrapper-polkadot’;\nconst txHash = getTxHash(signedTx);\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transaction-construction", "url": "https://developer.polkadot.com/wiki/learn/learn-transaction-construction/#submitting-a-signed-payload", "page_title": "Transaction Construction and Signing", "index": 3, "depth": 2, "title": "Submitting a Signed Payload", "anchor": "submitting-a-signed-payload", "start_char": 8932, "end_char": 9413, "estimated_token_count": 121, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dc6c3286a8eae43e01d1bd1779398f4fae766bd58fc1acae957873c9454b609a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Submitting a Signed Payload\n\nThere are several ways to submit a signed payload:\n\n1. Signer CLI (`yarn run:signer submit --tx <signed-transaction> --ws <endpoint>`)\n1. [Substrate API Sidecar](../../reference/tools/sidecar.md#sidecar-api)\n1. [RPC](../../chain-interactions/index.md) with `author_submitExtrinsic` or\n   `author_submitAndWatchExtrinsic`, the latter of which will subscribe you to events to be notified\n   as a transaction gets validated and included in the chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transaction-construction", "url": "https://developer.polkadot.com/wiki/learn/learn-transaction-construction/#notes", "page_title": "Transaction Construction and Signing", "index": 4, "depth": 2, "title": "Notes", "anchor": "notes", "start_char": 9413, "end_char": 10431, "estimated_token_count": 175, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:dc6c3286a8eae43e01d1bd1779398f4fae766bd58fc1acae957873c9454b609a", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Notes\n\nSome addresses to use in the examples. See\n[Subkey documentation](../../reference/parachains/accounts.md#using-subkey).\n\n```bash\n$ subkey --network polkadot generate\nSecret phrase `pulp gaze fuel ... mercy inherit equal` is account:\n  Secret seed:      0x57450b3e09ba4598 ... ... ... ... ... ... ... .. 219756eeba80bb16\n  Public key (hex): 0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235\n  Account ID:       0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235\n  SS58 Address:     121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2\n\n$ subkey --network polkadot generate\nSecret phrase `exercise auction soft ... obey control easily` is account:\n  Secret seed:      0x5f4bbb9fbb69261a ... ... ... ... ... ... ... .. 4691ed7d1130fbbd\n  Public key (hex): 0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243\n  Account ID:       0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243\n  SS58 Address:     15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#pallets-and-extrinsics", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 0, "depth": 2, "title": "Pallets and Extrinsics", "anchor": "pallets-and-extrinsics", "start_char": 1, "end_char": 1194, "estimated_token_count": 240, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Pallets and Extrinsics\n\nPolkadot is built using [Substrate](../../reference/parachains/index.md#substrate), a modular framework to efficiently build\nblockchains. Substrate's FRAME development environment provides modules called pallets and support\nlibraries that you can use, modify, and extend to build the runtime logic to suit the needs of your\nblockchain. You can explore Substrate's FRAME pallets on\n[this dedicated page](../../reference/parachains/index.md#frame).\n\nWithin each functional **pallet** on the blockchain, one can **call** its functions and execute them\nsuccessfully, provided they have the permission to do so. Because these calls originate outside of\nthe blockchain runtime, such transactions are referred to as **extrinsics**. Extrinsics normally\ncontain a signature, some data to describe if the extrinsic has passed some validity checks and a\nreference to the pallet and call that it is intended for. For example, the Staking pallet contains\nall functions related to staking. A nominator can bond funds and nominate validators by issuing the\nrespective extrinsics. Some extrinsics might also trigger an event on the chain such as a reward\npayout to the nominators."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#types-of-extrinsics", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 1, "depth": 2, "title": "Types of Extrinsics", "anchor": "types-of-extrinsics", "start_char": 1194, "end_char": 3944, "estimated_token_count": 507, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Types of Extrinsics\n\nNow that we introduced the term _extrinsic_, let us dive deeper and understand what extrinsics\nreally are. Extrinsics can be one of 3 distinct types:\n\n- **Signed transactions:** these must contain the signature of the account sending the inbound\n  request to the runtime. With signed transactions, the account used to submit the request typically\n  pays the transaction fee and must sign it using the account's private key.\n- **Unsigned transactions:** these don't carry any information about who submitted the transaction,\n  since the format of this type of transaction doesn't require a signature. You can define what\n  conditions must be met for such a transaction to be valid.\n- **Inherents:** are a special type of unsigned transaction made by block authors which carry\n  information required to build a block such as timestamps, storage proofs and uncle blocks.\n\nSigned transactions is the way that most users will interact with Polkadot. Signed transactions come\nfrom an account that has funds, and therefore Polkadot can charge a transaction fee as a way to\nprevent spam.\n\nUnsigned transactions are for special cases where a user needs to submit an extrinsic from a key\npair that does not control funds. For example, validator's [session keys](learn-cryptography.md)\nnever control funds. Unsigned transactions are only used in special cases because, since Polkadot\ncannot charge a fee for them, each one needs its own, custom validation logic.\n\nInherents are pieces of information that are not signed or included in the transaction queue. As\nsuch, only the block author can add inherents to a block. Inherents are assumed to be \"true\" simply\nbecause a sufficiently large number of validators have agreed on them being reasonable. For example,\nthe relay chain blocks include a timestamp inherent. There is no way to prove that a timestamp is\ntrue the way one proves the desire to send funds with a signature. Rather, validators accept or\nreject the block based on how reasonable they find the timestamp. In Polkadot, it must be within\nsome acceptable range of their own system clocks.\n\nHere are some key differences between the different types of extrinsics:\n\n- Contrary to signed transactions, unsigned transaction types require implementing custom validation\n  logic which can consume more resources for checking validity compared to signed transactions.\n- Unsigned transactions have no economic deterrent to prevent spam or replay attacks, so custom\n  logic must account for protecting the network from these types of transactions being misused.\n- Inherents exist to address the need of adding some data to a block, whereas signed or unsigned\n  transactions exist to potentially change the state of the blockchain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#mortal-and-immortal-extrinsics", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 2, "depth": 3, "title": "Mortal and Immortal Extrinsics", "anchor": "mortal-and-immortal-extrinsics", "start_char": 3944, "end_char": 4916, "estimated_token_count": 200, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Mortal and Immortal Extrinsics\n\nTransactions are generally irreversible once confirmed and added to the blockchain, an immutable\nledger of all transactions. This means users must exercise caution, as mistakes such as sending DOT\nto the wrong address cannot be reverted. The permanence of transactions highlights the importance of\ncareful verification before signing any transaction on a blockchain network. It is usually a\n[good practice not to blind sign transactions](../general/transaction-attacks.md) to avoid being\nvictim of an attack.\n\nIn blockchain terms, transactions can be **mortal** extrinsics (i.e. valid within a defined block\ninterval, usually short), or **immortal** extrinsics (i.e. always valid). It is possible to make\nimmortal transactions on Polkadot. However,\n[for security reasons](../general/transaction-attacks.md#replay-attack), it is highly recommended\nnot to do so and most wallet software will not allow you to make an immortal extrinsic."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#balance-transfers", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 3, "depth": 3, "title": "Balance Transfers", "anchor": "balance-transfers", "start_char": 4916, "end_char": 5054, "estimated_token_count": 26, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Balance Transfers\n\nBalance transfers are transfers of token balances between accounts. This is the most well-known type of transfer."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#vested-transfers", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 4, "depth": 3, "title": "Vested Transfers", "anchor": "vested-transfers", "start_char": 5054, "end_char": 5622, "estimated_token_count": 126, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Vested Transfers\n\nDOT may have a lock to account for vesting funds. Like other types of\n[locks](./learn-account-balances.md#locks), these funds cannot be transferred but can be used in\nother parts of the protocol such as voting in governance or being staked as a validator or\nnominator.\n\nVesting funds are on a release schedule that unlocks a constant number of tokens at each block\n(**linear vesting**) or the full amount after a specific block number (**cliff vesting**). In all\nvesting cases, the lock decreases over time until all the funds are transferable."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#batch-transactions", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 5, "depth": 3, "title": "Batch Transactions", "anchor": "batch-transactions", "start_char": 5622, "end_char": 7055, "estimated_token_count": 388, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Batch Transactions\n\nBatch transactions are single transactions that \"batch together\" multiple calls. The `utility` pallet is used to dispatch batched calls, and there are three types of batch calls:\n\n- `utility.batch()`: Stops execution if it encounters an error.\n- `utility.batchAll()`: Atomic batch execution, meaning that if any call within the batch fails, everything is rolled back as if nothing happened.\n- `utility.forceBatch()`: If any transaction fails, it is ignored, and the rest of the transactions are executed.\n\n| Function | Stops on Error | Atomic |\n|--------|--------|--------|\n| `batch` | Yes | No | \n| `batchAll` | Yes | Yes |\n| `forceBatch` | No | No |\n\nFor more detailed information about the arguments accepted by each of these calls, see [the Metadata Explorer](../general/metadata.md). The emitted events for each call are summarized below:\n\n| Event | Emitted When | part of `batch` | part of `batchAll` | part of `forceBatch` |\n|--------|--------|--------|--------|--------|\n| `ItemCompleted` | After each batched call succeeds | Yes | Yes | Yes |\n| `ItemFailed` | When a batched call fails | No | No | Yes |\n| `BatchCompleted` | After all batched calls succeed | Yes | Yes | Yes |\n| `BatchCompletedWithErrors` | After all batched calls have been executed, but some were not successful | No | No | Yes |\n| `BatchInterrupted` | When a batched call fails and remaining calls are skipped | Yes | No | No |"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#verifying-extrinsics", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 6, "depth": 2, "title": "Verifying Extrinsics", "anchor": "verifying-extrinsics", "start_char": 7055, "end_char": 7541, "estimated_token_count": 99, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Verifying Extrinsics\n\n!!!danger\n    Do not sign a transaction if you can't verify what you are signing or you suspect you might be signing a different extrinsic than the one intended.\n\nVerifying the extrinsic you are signing can take some more time before signing for a transaction but\nit allows you to add an extra security step. There are\n[a multitude of possible attacks](../general/transaction-attacks.md) that will prevent you to send\nfunds to the desired destination account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#transaction-fees", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 7, "depth": 2, "title": "Transaction Fees", "anchor": "transaction-fees", "start_char": 7541, "end_char": 8953, "estimated_token_count": 318, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Transaction Fees\n\nStorage and computation are limited resources in a blockchain network. Transaction fees prevent\nindividual users from consuming too many resources. Polkadot uses a **weight-based fee model** as\nopposed to a gas-metering model. As such, fees are charged before transaction execution. Once the\nfee is paid, nodes will execute the transaction.\n\nPolkadot fees consist of three parts:\n\n- `Base fee`: a fixed fee applied to every transaction and set by the runtime.\n- `Length fee`: a fee that gets multiplied by the length of the transaction in bytes.\n- `Weight fee`: a fee for each varying runtime function. Runtime implementers must implement a\n  conversion mechanism that determines the corresponding currency amount for the calculated weight.\n\nThe final fee can be summarized as:\n\n```\nfee = base_fee + length_of_transaction_in_bytes * length_fee + weight_fee\n```\n\nwhere:\n\nBase fee: 1 milliDOT\n\nLength fee: 0.1 DOT per byte\n\nThe weight-to-fee conversion is calculated as follows:\n\n```\nweight_fee = weight/1.26 * (10−8)\n```\n\nA weight of 126,000 nS is mapped to 1 mDOT. This fee will always be, at most, the max size of an\nunsigned 128-bit integer.\n\nSee\n[the Polkadot specification](https://spec.polkadot.network/id-weights#id-definitions-in-polkadot)\nand [the Substrate documentation](../../reference/parachains/blocks-transactions-fees/fees.md#transactions-weights-and-fees) for more\ndetails."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#fee-multiplier", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 8, "depth": 3, "title": "Fee Multiplier", "anchor": "fee-multiplier", "start_char": 8953, "end_char": 9950, "estimated_token_count": 196, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Fee Multiplier\n\nPolkadot can add an additional fee to transactions if the network becomes too busy and starts to\ndecelerate the system. This additional fee is known as the `Fee Multiplier` and its value is defined\nby the runtime. The multiplier compares the saturation of blocks; if the previous block is less\nsaturated than the current block (implying an uptrend in usage), the fee is slightly increased.\nSimilarly, the fee is decreased if the previous block is more saturated than the current block\n(implying a downtrend in usage).\n\nThe multiplier can create an incentive to avoid the production of low-priority or insignificant\ntransactions. In contrast, those additional fees will decrease if the network calms down and\ntransactions can be executed without overheads.\n\nThe final fee is calculated as follows:\n\n```\nfinal_fee = fee * fee_multiplier\n```\n\nSee\n[the documentation about the Polkadot specifications](https://spec.polkadot.network/id-weights#id-fee-multiplier)\nfor more details."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#other-resource-limitation-strategies", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 9, "depth": 3, "title": "Other Resource Limitation Strategies", "anchor": "other-resource-limitation-strategies", "start_char": 9950, "end_char": 11024, "estimated_token_count": 215, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Other Resource Limitation Strategies\n\nTransaction weight must be computable before execution and can only represent fixed logic. Some\ntransactions warrant limiting resources with other strategies. For example:\n\n- Bonds: Some transactions, like voting, may require a bond that will be returned or\n  [slashed](./learn-offenses.md) after an on-chain event. In the voting example, returned at the end\n  of the election or slashed if the voter tried anything malicious.\n- Deposits: Some transactions, like setting an [identity](learn-identity.md) or claiming an index,\n  use storage space indefinitely. These require a deposit to be returned if the user decides to\n  clear their identity and free the storage.\n- Burns: A transaction may burn funds internally based on its logic. For example, a transaction may\n  burn funds from the sender if it creates new storage entries, thus increasing the state size.\n- Limits: Some limits are part of the protocol. For example, nominators can only nominate 16\n  validators. This limits the complexity of [Phragmén](learn-phragmen.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#parachain-transactions", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 10, "depth": 2, "title": "Parachain Transactions", "anchor": "parachain-transactions", "start_char": 11024, "end_char": 11841, "estimated_token_count": 166, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Parachain Transactions\n\nThe transactions that take place within parachains do not incur relay chain transaction fees. Users\nof shard applications do not even need to hold DOT tokens, as each shard has its own economic model\nand may or may not have a token. There are, however, situations where shards themselves make\ntransactions on the relay chain.\n\n[Parachains](learn-parachains.md) have a dedicated core on the relay chain for execution, so their\ncollators do not need to own DOT in order to include blocks. The parachain will make some\ntransactions itself, for example, opening or closing an [XCM](learn-xcm.md) channel, renew its time\non a core, or upgrading its runtime. Parachains have their own accounts on the relay chain and will\nneed to use those funds to issue transactions on the parachain's behalf."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#block-limits-and-transaction-priority", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 11, "depth": 2, "title": "Block Limits and Transaction Priority", "anchor": "block-limits-and-transaction-priority", "start_char": 11841, "end_char": 12739, "estimated_token_count": 181, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Block Limits and Transaction Priority\n\nRelay chain blocks have both a maximum length (in bytes) and a maximum weight. Block producers will\nfill blocks with transactions up to these limits. The 25% of block capacity is\nreserved for critical transactions that are related to the chain's operation. Block producers will\nonly fill up to 75% of a block with normal transactions. Some examples of operational transactions:\n\n- Misbehavior reports\n- Council operations\n- Member operations in an election (e.g. renouncing candidacy)\n\nBlock producers prioritize transactions based on each transaction's total fee. Since a portion of\nthe fee will go to the block producer, producers will include the transactions with the highest fees\nto maximize their reward.\n\n---\n\n!!!info \"Polkadot-JS Guides\"\n    If you are an advanced user, see the [Polkadot-JS guides about transfers](./learn-guides-transfers.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-transactions", "url": "https://developer.polkadot.com/wiki/learn/learn-transactions/#how-to-guides", "page_title": "Types of Transactions (a.k.a. Extrinsics)", "index": 12, "depth": 2, "title": "How-to guides", "anchor": "how-to-guides", "start_char": 12739, "end_char": 13588, "estimated_token_count": 275, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:b20b6a64e012326da8f19f7c05d3a5802d468f462c71cdf0cabe4a5662a60a46", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## How-to guides\n\n- [How to Send / Transfer Funds](how-to/transfer-funds.md)\n- [Why Can't I Transfer My DOT?](how-to/why-cant-i-transfer-dot.md)\n- [How to Verify What Extrinsic You're Signing](how-to/verify-extrinsic.md)\n- [How to Sign a Transaction (Developer Signer)](how-to/sign-transaction-signer.md)\n- [Error 'Frozen' — I Can't Transfer All My DOT](how-to/error-frozen-cant-transfer.md)\n- [How to Sign a Transaction](how-to/sign-transaction.md)\n- [How to Send All of Your Funds Out of Your Account](how-to/send-all-funds.md)\n- [Where Can I See My Transaction History?](how-to/view-transaction-history.md)\n- [How to Export Your Transaction History to CSV](how-to/export-transaction-history.md)\n- [How to See Transaction Costs Before a Transfer](how-to/transaction-costs.md)\n- [I Sent Funds to the Wrong Address](how-to/sent-to-wrong-address.md)"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#in-core-validators", "page_title": "Validator", "index": 0, "depth": 2, "title": "In-Core Validators", "anchor": "in-core-validators", "start_char": 928, "end_char": 2878, "estimated_token_count": 390, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## In-Core Validators\n\nIn-core validators (or para-validators) participate in the\n[Parachain Phase of the AnV Protocol](./learn-parachains-protocol.md#parachain-phase), and submit\n[candidate receipts](./learn-parachains-protocol.md#candidate-receipts) to the relay chain\ntransaction queue so that a [block author](#block-authors) can include information on the rollup blocks in a fork of the relay chain.\n\nIn-core validators work in groups and are selected by the runtime in every epoch to validate rollup blocks for all rollups connected to Polkadot cores. In-core validators are part of the [active validators](../general/chain-state-values.md) randomly selected (per\nepoch) to participate in the validation process.\n\nIn-core validators verify that the information contained in an assigned set of rollup block candidates is valid. The validators are required to check the validity of submitted candidates,\nfollowed by issuing and collecting statements about the validity of candidates to other validators.\nThis process is known as **candidate backing** and is described on [the Polkadot's Security Protocol page](./learn-parachains-protocol.md). Validators receive an arbitrary number of rollup block candidates with associated PoV from untrusted collators. A candidate is considered _backable_ when at least 2/3 of all assigned in-core validators have issued a valid statement about that candidate.\n\nThe in-core validator must successfully verify the following conditions in the following order:\n\n1. The candidate does not exceed any parameters in the persisted validation data.\n\n2. The signature of the collator is valid.\n\n3. Validate the candidate by executing the rollup runtime stored on the relay chain.\n\nOnce a rollup block candidate meets the criteria for backing, the selected relay chain block author\nchooses any backable candidates for each rollup chain and adds them to the relay\nchain block. We say the candidate blocks are _backed_."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#block-authors", "page_title": "Validator", "index": 1, "depth": 2, "title": "Block Authors", "anchor": "block-authors", "start_char": 2878, "end_char": 3849, "estimated_token_count": 191, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Block Authors\n\nThere are validators on the relay chain who participate in the consensus mechanism to produce the\nrelay chain blocks based on validity statements from other validators. These validators are called\nblock authors. They are selected by [BABE](./learn-consensus.md#block-production-babe) and can note\nup to one backable candidate for each rollup chain to include in the relay chain. A backable candidate added to a relay chain block is considered _backed_ in that chain fork.\n\nIn a relay chain block, block authors will only include\n[candidate receipts](./learn-parachains-protocol.md#candidate-receipts) that have a parent candidate\nreceipt in an earlier relay chain block. This ensures the rollup chain follows a valid relay chain. Also, the\nblock authors will only include a receipt for which they have an erasure coding chunk (from the data availability scheme), ensuring that\nthe system can perform the next round of availability and validity checks."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#data-availability", "page_title": "Validator", "index": 2, "depth": 2, "title": "Data Availability", "anchor": "data-availability", "start_char": 3849, "end_char": 4526, "estimated_token_count": 129, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Data Availability\n\nOnce the\ncandidate is backed in a fork of the relay chain, it is still _pending availability_, i.e., it is not\nfully included (only tentatively included) as part of the relay chain until it is proven available\n(together with the PoV). Validators also contribute to the so-called **availability distribution**. The data availability scheme consists in the distribution by in-core validators of the candidate block information in the form of erasure codes. Information regarding the candidate's availability will be noted in\nthe following relay chain blocks. Only when there is enough information the candidate is considered available and can be included."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#secondary-checkers", "page_title": "Validator", "index": 3, "depth": 2, "title": "Secondary Checkers", "anchor": "secondary-checkers", "start_char": 4526, "end_char": 5239, "estimated_token_count": 144, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Secondary Checkers\n\nValidators also participate in the so-called\n[**approval process**](./learn-parachains-protocol.md#approval-process). Once the parablock is\nconsidered available and included, it is still _pending approval_. Because\nin-core validators are a small subset of all validators, there is a risk that the majority of those validators assigned to a core might be dishonest by chance. It is thus necessary to run a secondary verification of the rollup block before it can be considered **approved**. Having a secondary verification step avoids the allocation of more in-core validators that will ultimately reduce the system's throughput. If no disputes arise, the candidate block will be approved."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#disputes", "page_title": "Validator", "index": 4, "depth": 2, "title": "Disputes", "anchor": "disputes", "start_char": 5239, "end_char": 5780, "estimated_token_count": 115, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Disputes\n\nAny instances of non-compliance with the consensus algorithms result in\n[**disputes**](./learn-parachains-protocol.md#disputes) with the [punishment](./learn-offenses.md) of the validators on the\nwrong side by removing some or all their staked tokens, thereby discouraging bad actors. Good\nperformance, however, will be rewarded, with validators receiving block rewards (including\ntransaction fees) in the form of native tokens in exchange for their activities. These rewards are paid out and must be claimed on the Asset Hub."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#deterministic-finality", "page_title": "Validator", "index": 5, "depth": 2, "title": "Deterministic Finality", "anchor": "deterministic-finality", "start_char": 5780, "end_char": 6299, "estimated_token_count": 103, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Deterministic Finality\n\nFinally, validators participate in the\n[chain selection process within GRANDPA](./learn-parachains-protocol.md#chain-selection), ensuring that only available and valid blocks end within the finalized relay chain, and all histories converge on one canonical chain.\n\n!!!info \"Within an era, roles can change.\"\n    Within the same era, a validator can be on a core or a block author and participate in the availability distribution or approval process. Those roles can change between sessions."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#path-of-a-rollup-chain-block", "page_title": "Validator", "index": 6, "depth": 2, "title": "Path of a Rollup Chain Block", "anchor": "path-of-a-rollup-chain-block", "start_char": 6299, "end_char": 8066, "estimated_token_count": 358, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Path of a Rollup Chain Block\n\nThe start of a new block candidate is initiated with a block creation time. The [collator](./learn-collator.md) aggregates\nall new transactions and puts them into a rollup chain block candidate. When doing so, the collator signs the _rollup chain block candidate_ and produces state transition proofs (Proof-of-Validity, PoV), a summary\nof the final account balances caused by the transactions in the candidate block. The collator sends\nthe candidate block and PoV to the [in-core validators](#in-core-validators) on a Polkadot core that has been reserved by the rollup chain via [coretime](./learn-agile-coretime.md). The in-core validators verify the transactions within the block candidate. Upon verification, and\nif all is well, the candidate becomes _backable_, and some in-core validators share the candidate block with other in-core validators for additional checking. Upon successful checks by 2/3 of in-core validators, a block author can back the candidate into the relay chain. The data availability scheme ensures all validators can verify the validity of the candidate. If no disputes arise, the block can be included in the relay chain every 6 seconds after secondary checks.\n\nThe validators on the relay chain will try to reach a consensus on the block candidate. Upon\nreaching consensus, the now validated block candidate is shared with the validators and collators,\nand the process repeats for new transactions. With the new [pipelining feature (also called asynchronous backing)](./learn-async-backing.md), a collator can continue building new blocks on a rollup while the previous block candidate they proposed to the relay chain validators is being backed. A block is included in the relay chain every 6 seconds."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#further-readings", "page_title": "Validator", "index": 7, "depth": 2, "title": "Further Readings", "anchor": "further-readings", "start_char": 8066, "end_char": 9294, "estimated_token_count": 310, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Further Readings\n\n- [How to Validate on Polkadot](../../node-infrastructure/run-a-validator/requirements.md#running-a-validator) - Guide on\n  how to set up a validator on the Polkadot live network.\n- [Validator Payout Overview](../../node-infrastructure/run-a-validator/staking-mechanics/rewards.md) - A short overview on\n  how the validator payout mechanism works.\n- [How to run your validator as a systemd process](../../node-infrastructure/run-a-validator/onboarding-and-offboarding/start-validating.md#run-a-validator-using-systemd) -\n  Guide on running your validator as a `systemd` process so that it will run in the background and\n  start automatically on reboots.\n- [How to Upgrade your Validator](../../node-infrastructure/run-a-validator/operational-tasks/upgrade-your-node.md) - Guide for\n  securely upgrading your validator when you want to switch to a different machine or begin running\n  the latest version of client code.\n- [How to Use Validator Setup](../../node-infrastructure/run-a-validator/requirements.md#running-a-validator) - Guide on\n  how to use Polkadot / Kusama validator setup.\n- [Slashing Consequences](./learn-offenses.md) - Learn more about slashing consequences for running a validator node."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-validator", "url": "https://developer.polkadot.com/wiki/learn/learn-validator/#other-references", "page_title": "Validator", "index": 8, "depth": 3, "title": "Other References", "anchor": "other-references", "start_char": 9294, "end_char": 9976, "estimated_token_count": 178, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9f308497c38977024f8d806cdae3e60ec455d72267a351d9ad9d0439644a0ca6", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Other References\n\n- [VPS list](../../node-infrastructure/run-a-validator/onboarding-and-offboarding/set-up-validator.md)\n- [Polkadot Validator Lounge](https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation) -\n  A place to chat about being a validator.\n- [Polkadot Telemetry Service](https://telemetry.polkadot.io/) - Network\n  information, including what nodes are running on a given chain, what software versions they are\n  running, and sync status.\n- [Subscan Validators Page](https://kusama.subscan.io/validator/) - Displays information on the\n  current validators - not as tailored for validators as the other sites."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-instructions", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-instructions/#xcvm-registers", "page_title": "XCM Instructions & Register Specification", "index": 0, "depth": 2, "title": "XCVM Registers", "anchor": "xcvm-registers", "start_char": 385, "end_char": 622, "estimated_token_count": 38, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f3d8531bd21e2a062505e802348f9253988724fc5e55f6a7b60fe5b049137a6f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## XCVM Registers\n\n- _Programme_\n- _Programme Counter_\n- _Error_\n- _Error Handler_\n- _Appendix_\n- _Origin_\n- _Holding_\n- _Surplus Weight_\n- _Refunded Weight_\n- _Transact Status_\n- _Topic_\n- _Transact Status Register_\n- _Topic Register_"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-instructions", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-instructions/#xcvm-instruction-set", "page_title": "XCM Instructions & Register Specification", "index": 1, "depth": 2, "title": "XCVM Instruction Set", "anchor": "xcvm-instruction-set", "start_char": 622, "end_char": 1411, "estimated_token_count": 165, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f3d8531bd21e2a062505e802348f9253988724fc5e55f6a7b60fe5b049137a6f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## XCVM Instruction Set\n\n- `WithdrawAsset`\n- `ReserveAssetDeposited`\n- `ReceiveTeleportedAsset`\n- `QueryResponse`\n- `TransferAsset`\n- `TransferReserveAsset`\n- `Transact`\n- `HrmpNewChannelOpenRequest`\n- `HrmpChannelAccepted`\n- `HrmpChannelClosing`\n- `ClearOrigin`\n- `DescendOrigin`\n- `ReportError`\n- `DepositAsset`\n- `DepositReserveAsset`\n- `ExchangeAsset`\n- `InitiateReserveWithdraw`\n- `InitiateTeleport`\n- `QueryHolding`\n- `BuyExecution`\n- `RefundSurplus`\n- `SetErrorHandler`\n- `SetAppendix`\n- `ClearError`\n- `ClaimAsset`\n- `Trap`\n- `SubscribeVersion`\n- `UnsubscribeVersion`\n- `BurnAsset`\n- `ExpectAsset`\n- `ExpectError`\n- `ExpectOrigin`\n- `QueryPallet`\n- `ExpectPallet`\n- `ReportTransactStatus`\n- `ClearTransactStatus`\n- `LockAsset`\n- `UnlockAsset`\n- `NoteUnlockable`\n- `RequestUnlock`"}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-instructions", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-instructions/#instructions-application-example", "page_title": "XCM Instructions & Register Specification", "index": 2, "depth": 2, "title": "Instructions Application Example", "anchor": "instructions-application-example", "start_char": 1411, "end_char": 3683, "estimated_token_count": 469, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:f3d8531bd21e2a062505e802348f9253988724fc5e55f6a7b60fe5b049137a6f", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Instructions Application Example\n\nThe following presents the practical mapping of instructions to some\n[core functionality in XCM](./learn-xcm.md#core-functionality-of-xcm).\n\n=== \"Program\"\n\n    These are the primary instructions that enable programmability and branching to be possible.\n    Branching in this context is the ability for errors and logic to be handled as needed when dealing\n    with a message.\n\n    - [`ExpectAsset(MultiAssets)`](https://github.com/paritytech/xcm-format/tree/master#expectassetmultiassets) -\n      Checks if the Holding register has a specific amount of assets, throws an error if it doesn't.\n    - [`ExpectError(Option<(u32, Error)>)`](https://github.com/paritytech/xcm-format/tree/master#expecterroroptionu32-error) -\n      Ensures the Error register contains the given error, and throws an error if it doesn't.\n    - [`ExpectOrigin(MultiLocation)`](https://github.com/paritytech/xcm-format/tree/master#expectoriginmultilocation) -\n      Ensures the Origin register contains the expected origin, and throws an error if it doesn't.\n    - `QueryPallet` - Queries the existence of a particular pallet type.\n\n    - `ExpectPallet` - Ensure that a particular pallet with a particular version exists.\n\n    - `ReportTransactStatus(QueryResponseInfo)` - Send a `QueryResponse` message containing the value of\n      the Transact Status Register to some destination.\n\n    - `ClearTransactStatus` - Set the Transact Status Register to its default, cleared, value.\n\n=== \"fmd\"\n\n    These instructions highlight the key instructions focused on Functional Multichain Decomposition.\n\n    - `LockAsset(MultiAsset, MultiLocation)` - Lock the locally held asset and prevent further transfer\n      or withdrawal.\n\n    - `UnlockAsset(MultiAsset, MultiLocation)` - Remove the lock over `asset` on this chain and (if\n      nothing else is preventing it) allow the asset to be transferred.\n\n    - `NoteUnlockable(MultiAsset, MultiLocation)` - Asset (`asset`) has been locked on the `origin`\n      system and may not be transferred. It may only be unlocked with the receipt of the `UnlockAsset`\n      instruction from this chain.\n\n    - `RequestUnlock(MultiAsset, MultiLocation)` - Send an `UnlockAsset` instruction to the `locker` for\n      the given `asset`."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-pallet", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-pallet/#primitive-extrinsics", "page_title": "XCM FRAME Pallet Overview", "index": 0, "depth": 2, "title": "Primitive Extrinsics", "anchor": "primitive-extrinsics", "start_char": 1336, "end_char": 3003, "estimated_token_count": 362, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9f330821f0f11fa622b7da39c07f1850d8af95f243f1b1d81897e261448ef54", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Primitive Extrinsics\n\nThere are two primary primitive extrinsics. These extrinsics handle sending and executing XCVM\nprograms as dispatchable functions within the pallet.\n\n1. [`execute`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L902) -\n   This call contains direct access to the XCM executor. It is the job of the executor to check the\n   message and ensure that no barrier/filter will block the execution of the XCM. Once it is deemed\n   valid, the message will then be _locally_ executed, therein returning the outcome as an event.\n   This operation is executed on behalf of whichever account has signed the extrinsic. It's possible\n   for only a partial execution to occur.\n2. [`send`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L769) -\n   This call specifies where a message should be sent\n   ([via a transport method](./learn-xcm-transport.md)) externally to a particular destination, i.e.\n   a parachain, smart contract, or any system which is governed by consensus. In contrast to\n   `execute`, the executor is not called locally, as the execution will occur on the destination\n   chain.\n\n!!!info\n    The XCM pallet needs the `XcmRouter` to send XCMs. It is used to dictate where XCMs are allowed to be sent, and which XCM transport protocol to use. For example, Kusama, the canary network, uses the `ChildParachainRouter` which only allows for Downward Message Passing from the relay to parachains to occur.\n\nYou can read more about [XCM transport protocols here](./learn-xcm-transport.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-pallet", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-pallet/#asset-transfer-extrinsics", "page_title": "XCM FRAME Pallet Overview", "index": 1, "depth": 2, "title": "Asset Transfer Extrinsics", "anchor": "asset-transfer-extrinsics", "start_char": 3003, "end_char": 4058, "estimated_token_count": 220, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9f330821f0f11fa622b7da39c07f1850d8af95f243f1b1d81897e261448ef54", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Asset Transfer Extrinsics\n\nSeveral extrinsics within the pallet handle asset transfer logic. They define a predetermined set of\ninstructions for sending and executing XCMs. Two variants of these functions are prefixed with\n`limited_`. They have the same functionality but can specify a weight to pay for the XCM fee.\n\nOtherwise, the fee is taken as needed from the asset being transferred.\n\n1. [`reserve_transfer_assets`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L872) -\n   Transfer some assets from the local chain to the sovereign account of a destination chain and\n   forward an XCM containing a\n   [`ReserveAssetDeposited`](https://github.com/paritytech/xcm-format#reserveassetdeposited)\n   instruction, which serves as a notification.\n\n2. [`teleport_assets`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L827) -\n   Teleport some assets from the local chain to some destination chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-pallet", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-pallet/#transfer-reserve-vs-teleport", "page_title": "XCM FRAME Pallet Overview", "index": 2, "depth": 3, "title": "Transfer Reserve vs. Teleport", "anchor": "transfer-reserve-vs-teleport", "start_char": 4058, "end_char": 5814, "estimated_token_count": 339, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9f330821f0f11fa622b7da39c07f1850d8af95f243f1b1d81897e261448ef54", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Transfer Reserve vs. Teleport\n\nWhile both extrinsics deal with transferring assets, they exhibit fundamentally different behavior.\n\n- **Teleporting** an asset implies a two-step process: the assets are taken out of circulating\n  supply (typically by burning/destroying) in the origin chain and re-minted to whatever account is\n  specified at the destination. Teleporting should only occur if there is an inherent and bilateral\n  trust between the two chains, as the tokens destroyed at the origin _could not_ necessarily be\n  guaranteed to have the same properties when minted at the destination. There has to be **trust**\n  that the a particular chain burned, or re-minted the assets.\n- **Transferring** or **reserving** an asset implies that **equivalent** assets (i.e, native\n  currency, like `DOT` or `KSM`) are withdrawn from _sovereign account_ of the origin chain and\n  deposited into the sovereign account on the destination chain. Unlike teleporting an asset, it is\n  not destroyed and re-minted.  Rather a trusted entity such as Asset Hub is used to\n  **reserve** the assets, wherein the sovereign account of the destination chain on the reserve\n  chain obtains ownership of these assets. Asset Hub serves as the primary reserve location for DOT\n  in the Polkadot ecosystem.\n\n  It's worth noting that this means that some other mechanism is needed to ensure that the balance\n  on the destination does not exceed the amount being held in reserve chain.\n\n!!!info\n    A sovereign account refers to an account within a particular consensus system. Even though accounts may be different in terms of factors such as an address format, XCM agnostic nature enables communication between these sovereign accounts that are in other consensus systems."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-pallet", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-pallet/#version-negotiation-extrinsics", "page_title": "XCM FRAME Pallet Overview", "index": 3, "depth": 2, "title": "Version Negotiation Extrinsics", "anchor": "version-negotiation-extrinsics", "start_char": 5814, "end_char": 7230, "estimated_token_count": 315, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9f330821f0f11fa622b7da39c07f1850d8af95f243f1b1d81897e261448ef54", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Version Negotiation Extrinsics\n\nThe following extrinsics require root, as they are only used when bypassing XCM version negotiation.\nThey change any relevant storage aspects that enforce anything to do with XCM version negotiations.\n\n1. [`force_xcm_version`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L934) -\n   Modifies the `SupportedVersion` storage to change a particular destination's stated XCM version.\n2. [`force_default_xcm_version`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L957) -\n   Modifies the `SafeXcmVersion` storage, which stores the default XCM version to use when the\n   destination's version is unknown.\n3. [`force_subscribe_version_notify`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L972) -\n   Sends an XCM with a\n   [`SubscribeVersion`](https://github.com/paritytech/xcm-format#subscribeversion) instruction to a\n   destination.\n4. [`force_unsubscribe_version_notify`](https://github.com/paritytech/polkadot-sdk/blob/a808a3a0918ffbce314dbe00e03761e7a8f8ce79/polkadot/xcm/pallet-xcm/src/lib.rs#L996) -\n   Sends an XCM with a\n   [`UnsubscribeVersion`](https://github.com/paritytech/xcm-format#unsubscribeversion) instruction\n   to a destination."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-pallet", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-pallet/#fees-in-the-xcm-pallet", "page_title": "XCM FRAME Pallet Overview", "index": 4, "depth": 2, "title": "Fees in the XCM Pallet", "anchor": "fees-in-the-xcm-pallet", "start_char": 7230, "end_char": 8310, "estimated_token_count": 217, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:a9f330821f0f11fa622b7da39c07f1850d8af95f243f1b1d81897e261448ef54", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Fees in the XCM Pallet\n\nMessage fees are only paid if the interior location does not equal the interpreting consensus system\n(known as Here in the context of an XCM `Multilocation`). Otherwise, the chain bears the fees. If\napplicable, fees are withdrawn from the assets from the specified `MultiLocation` and used as\npayment to execute any subsequent instructions within the XCM.\n\nFees are generally dependent on several factors within the `XcmConfig`. For example, the barrier may\nnegate any fees to be paid at all.\n\nBefore any XCM is sent, and if the destination chain’s barrier requires it, a\n[`BuyExecution`](https://github.com/paritytech/xcm-format#buyexecution) instruction is used to buy\nthe necessary weight for the XCM. XCM fee calculation is handled by the Trader, which iteratively\ncalculates the total fee based on the number of instructions.\n\nThe Trader used to calculate the weight (time for computation in consensus) to include in the\nmessage. Fee calculation in XCM is highly configurable and, for this reason, subjective to whichever\nconfiguration is in place."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-transport", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-transport/#xcmp-cross-chain-message-passing", "page_title": "XCM Transport Methods (XCMP, HRMP, VMP)", "index": 0, "depth": 3, "title": "XCMP (Cross-Chain Message Passing)", "anchor": "xcmp-cross-chain-message-passing", "start_char": 653, "end_char": 2072, "estimated_token_count": 280, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:053d260f04e706434ca1339065d97f25fe1ee190be375565018c8c728a9cbfe0", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### XCMP (Cross-Chain Message Passing)\n\n!!!caution\n    XCMP is under development, and most cross-chain messages currently pass through HRMP channels.\n\nXCM is related to XCMP in the same way that REST is related to RESTful.\n\n_Cross-Consensus Message Passing_ secure message passing between parachains. There are two variants:\n_Direct_ and _Relayed_.\n\n- With _Direct_, message data goes direct between parachains and is O(1) on the side of the relay\n  chain and is very scalable.\n- With _Relayed_, message data is passed via the relay chain, and piggy-backs over VMP. It is much\n  less scalable, and on-demand parachains in particular may not receive messages due to excessive\n  queue growth.\n\nCross-chain transactions are resolved using a simple queuing mechanism based around a Merkle tree to\nensure fidelity. It is the task of the relay chain validators to move transactions on the output\nqueue of one parachain into the input queue of the destination parachain. However, only the\nassociated metadata is stored as a hash in the relay chain storage.\n\nThe input and output queue are sometimes referred to in the Polkadot codebase and associated\ndocumentation as `ingress` and `egress` messages, respectively.\n\n!!!info\n    For detailed information about VMP see dedicated section in [The Polkadot Parachain Host Implementers' Guide](https://paritytech.github.io/polkadot/book/messaging.html#horizontal-message-passing)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-transport", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-transport/#vmp-vertical-message-passing", "page_title": "XCM Transport Methods (XCMP, HRMP, VMP)", "index": 1, "depth": 3, "title": "VMP (Vertical Message Passing)", "anchor": "vmp-vertical-message-passing", "start_char": 2072, "end_char": 2842, "estimated_token_count": 167, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:053d260f04e706434ca1339065d97f25fe1ee190be375565018c8c728a9cbfe0", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### VMP (Vertical Message Passing)\n\n_Vertical Message Passing_ message passing between the relay chain itself and a parachain. Message\ndata in both cases exists on the relay chain and are interpreted by the relay chain according to\n[XCM](./learn-xcm.md#cross-consensus-message-format-xcm-format) standards. This includes:\n\n- #### UMP (Upward Message Passing)\n\n  _Upward Message Passing_ message passing from a parachain to the relay chain.\n\n- #### DMP (Downward Message Passing)\n  _Downward Message Passing_ message passing from the relay chain to a parachain.\n\n!!!info\n    For detailed information about VMP see dedicated section in [The Polkadot Parachain Host Implementers' Guide](https://paritytech.github.io/polkadot/book/messaging.html#vertical-message-passing)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-transport", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-transport/#hrmp-xcmp-lite", "page_title": "XCM Transport Methods (XCMP, HRMP, VMP)", "index": 2, "depth": 3, "title": "HRMP (XCMP-Lite)", "anchor": "hrmp-xcmp-lite", "start_char": 2842, "end_char": 3650, "estimated_token_count": 187, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:053d260f04e706434ca1339065d97f25fe1ee190be375565018c8c728a9cbfe0", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### HRMP (XCMP-Lite)\n\nWhile XCMP is still being implemented, a stop-gap protocol (see definition below) known as\n**Horizontal Relay-routed Message Passing (HRMP)** exists in its place. HRMP has the same interface\nand functionality as XCMP but is much more demanding on resources since it stores all messages in\nthe relay chain storage. When XCMP has been implemented, HRMP is planned to be deprecated and phased\nout in favor of it.\n\n![xcm](../assets/cross-consensus/hrmp-ex.png)\n\n!!!note\n    A stop-gap protocol is a temporary substitute for the functionality that is not fully complete. While XCMP proper is still in development, HRMP is a working replacement.\n\nA tutorial on how to open an HRMP channel on a parachain can be found\n[here](../../parachains/interoperability/channels-between-parachains.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-transport", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-transport/#xcmp-cross-consensus-message-passing-design-summary", "page_title": "XCM Transport Methods (XCMP, HRMP, VMP)", "index": 3, "depth": 3, "title": "XCMP (Cross Consensus Message Passing) Design Summary", "anchor": "xcmp-cross-consensus-message-passing-design-summary", "start_char": 3650, "end_char": 7285, "estimated_token_count": 774, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:053d260f04e706434ca1339065d97f25fe1ee190be375565018c8c728a9cbfe0", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### XCMP (Cross Consensus Message Passing) Design Summary\n\n<div className=\"row\">\n  <div className=\"col text--center\">\n    <a href=\"https://www.youtube.com/watch?v=tOnzk4AROUY\">\n      <img src=\"https://img.youtube.com/vi/tOnzk4AROUY/0.jpg\" width=\"350\" style=\"borderRadius: 10, border: '1px solid slategrey'\" />\n    </a>\n    <p>\n      <a href=\"https://www.youtube.com/watch?v=tOnzk4AROUY\">XCMP Explained</a>\n    </p>\n  </div>\n</div>\n\n!!!note\n    XCMP is not yet fully implemented. The following illustrates the overall design goals and expectations for XCMP.\n    \n- Cross-chain messages will _not_ be delivered to the relay chain.\n- Cross-chain messages will be constrained to a maximum size specified in bytes.\n- Parachains are allowed to block messages from other parachains, in which case the dispatching\n  parachain would be aware of this block.\n- Collator nodes are responsible for routing messages between chains.\n- Collators produce a list of `egress` messages and will receive the `ingress` messages from other\n  parachains.\n- On each block, parachains are expected to route messages from some subset of all other parachains.\n- When a collator produces a new block to hand off to a validator, it will collect the latest\n  ingress queue information and process it.\n- Validators will check the proof that the new candidate for the next parachain block includes the\n  processing of the expected ingress messages to that parachain.\n\nXCMP queues must be initiated by first opening a channel between two parachains. The channel is\nidentified by both the sender and recipient parachains, meaning that it's a one-way channel. A pair\nof parachains can have at most establish two channels between them, one for sending messages to the\nother chain and another for receiving messages. The channel will require a deposit in DOT to be\nopened, which will get returned when the channel is closed.\n\n#### The Anatomy of an XCMP Interaction\n\nA smart contract that exists on parachain `A` will route a message to parachain `B` in which another\nsmart contract is called that makes a transfer of some assets within that chain. With Asset Hub\nserving as the primary reserve for DOT, many cross-chain transfers route through Asset Hub.\n\nCharlie executes the smart contract on parachain `A`, which initiates a new cross-chain message for\nthe destination of a smart contract on parachain `B`.\n\nThe collator node of parachain `A` will place this new cross-chain message into its outbound\nmessages queue, along with a `destination` and a `timestamp`.\n\nThe collator node of parachain `B` routinely pings all other collator nodes asking for new messages\n(filtering by the `destination` field). When the collator of parachain `B` makes its next ping, it\nwill see this new message on parachain `A` and add it into its own inbound queue for processing into\nthe next block.\n\nValidators for parachain `A` will also read the outbound queue and know the message. Validators for\nparachain `B` will do the same. This is so that they will be able to verify the message transmission\nhappened.\n\nWhen the collator of parachain `B` is building the next block in its chain, it will process the new\nmessage in its inbound queue as well as any other messages it may have found/received.\n\nDuring processing, the message will execute the smart contract on parachain `B` and complete the\nasset transfer as intended.\n\nThe collator now hands this block to the validator, which itself will verify that this message was\nprocessed. If the message was processed and all other aspects of the block are valid, the validator\nwill include this block for parachain `B` into the relay chain."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-usecases", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-usecases/#example-use-cases", "page_title": "XCM Use-cases & Examples", "index": 0, "depth": 3, "title": "Example Use-Cases", "anchor": "example-use-cases", "start_char": 412, "end_char": 1600, "estimated_token_count": 239, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa7711f4fcb0257fea4e679cf6be65043d387478f9d0ada0a37b64479e12adcf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Example Use-Cases\n\n- Request for specific operations to occur on the recipient system such as governance voting.\n- Enables system chains e.g. the [Asset Hub](./learn-guides-assets-create.md) as the primary\n  asset management parachain\n- Optionally include payment of fees on a target network for requested operation.\n- Provide methods for various asset transfer models:\n  - **Remote Transfers**: control an account on a remote chain, allowing the local chain to have an\n    address on the remote chain for receiving funds and to eventually transfer those funds it\n    controls into other accounts on that remote chain.\n  - **Asset Teleportation**: movement of an asset happens by destroying it on one side and creating\n    a clone on the other side.\n  - **Reserve Asset Transfer**: Asset Hub serves as the primary reserve location for DOT, where\n    parachains can hold derivative forms of DOT that are fully backed by the underlying asset on\n    Asset Hub, allowing the derivative asset to be exchanged for the underlying asset on the reserve\n    chain backing it.\n\nLet's review two of these example asset transfer use cases: **Asset Teleportation** and **Reserve\nAsset Transfer**."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-usecases", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-usecases/#asset-teleportation", "page_title": "XCM Use-cases & Examples", "index": 1, "depth": 3, "title": "Asset Teleportation", "anchor": "asset-teleportation", "start_char": 1600, "end_char": 2661, "estimated_token_count": 217, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa7711f4fcb0257fea4e679cf6be65043d387478f9d0ada0a37b64479e12adcf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Asset Teleportation\n\nAn asset teleport operation from a single source to a single destination.\n\n![Diagram of the usage flow while teleporting assets](../assets/cross-consensus/xcm-asset-teleportation.png)\n\n1. [InitiateTeleport](https://github.com/paritytech/xcm-format#initiateteleport)\n\nThe source gathers the assets to be teleported from the sending account and takes them out of the\ncirculating supply, taking note of the total amount of assets that was taken out.\n\n2. [ReceiveTeleportedAsset](https://github.com/paritytech/xcm-format#receiveteleportedasset)\n\nThe source then creates an XCM instruction called `ReceiveTeleportedAssets` and puts the amount of\nassets taken out of circulation and the receiving account as parameters to this instruction. It then\nsends this instruction over to the destination, where it gets processed and new assets gets put back\ninto circulating supply accordingly.\n\n3. [DepositAsset](https://github.com/paritytech/xcm-format#depositasset)\n\nThe destination then deposits the assets to the receiving account of the asset."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm-usecases", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm-usecases/#reserve-asset-transfer", "page_title": "XCM Use-cases & Examples", "index": 2, "depth": 3, "title": "Reserve Asset Transfer", "anchor": "reserve-asset-transfer", "start_char": 2661, "end_char": 4251, "estimated_token_count": 324, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:aa7711f4fcb0257fea4e679cf6be65043d387478f9d0ada0a37b64479e12adcf", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Reserve Asset Transfer\n\nWhen consensus systems do not have a established layer of trust over which they can transfer assets,\nthey can opt for a trusted 3rd entity to store the assets.\n\n![xcm-reserve-asset-transfer](../assets/cross-consensus/xcm-reserve-asset-transfer.png)\n\n1. [InitiateReserveWithdraw](https://github.com/paritytech/xcm-format#initiatereservewithdraw)\n\nThe source gathers the derivative assets to be transferred from the sending account and burns them,\ntaking note of the amount of derivatives that were burned.\n\n2. [WithdrawAsset](https://github.com/paritytech/xcm-format#withdrawasset)\n\nThe source sends a WithdrawAsset instruction to the reserve, instructing the reserve to withdraw\nassets equivalent to the amount of derivatives burned from the source's sovereign account.\n\n3. [DepositReserveAsset](https://github.com/paritytech/xcm-format#depositreserveasset)\n\nThe reserve deposits the assets withdrawn from the previous step to the destination's sovereign\naccount, taking note of the amount of assets deposited.\n\n4. [ReserveAssetDeposited](https://github.com/paritytech/xcm-format#reserveassetdeposited)\n\nThe reserve creates a ReserveAssetDeposited instruction with the amount of assets deposited to the\ndestination's sovereign account, and sends this instruction onwards to the destination. The\ndestination receives the instruction and processes it, minting the derivative assets as a result of\nthe process.\n\n5. [DepositAsset](https://github.com/paritytech/xcm-format#depositasset)\n\nThe destination deposits the derivative assets minted to the receiving account."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm/#a-format-not-a-protocol", "page_title": "Introduction to Cross-Consensus Message Format (XCM)", "index": 0, "depth": 2, "title": "A Format, Not a Protocol", "anchor": "a-format-not-a-protocol", "start_char": 3266, "end_char": 4863, "estimated_token_count": 308, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19035f488dc6975b96b111a9dc6629eba2084a9f41e2fb602c49d94a15b9edc9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## A Format, Not a Protocol\n\nWhat started as an approach to _cross-chain communication_, has evolved into a format for**Cross-Consensus Communication** that is not only conducted between chains, but also between smart contracts, pallets, bridges, and even sharded enclaves like [SPREE](learn-spree.md).\n\nXCM cannot actually send messages between systems. It is a format for how message transfer should be\nperformed, similar to how RESTful services use REST as an architectural style of development, where\nHTTP requests contain specific parameters to perform some action.\n\nSimilar to UDP, out of the box XCM is a \"fire and forget\" model, unless there is a separate XCM\nmessage designed to be a response message which can be sent from the recipient to the sender. All\nerror handling should also be done on the recipient side.\n\n!!!info\n    XCM is not designed in a way where every system supporting the format is expected to be able to interpret any possible XCM message. Practically speaking, one can imagine that some messages will not have reasonable interpretations under some systems or will be intentionally unsupported.\n\nFurthermore, it's essential to realize that XCM messages by themselves are _not_ considered\ntransactions. XCM describes how to change the state of the target network, but the message by itself\ndoesn't perform the state change.\n\nThis partly ties to what is called **asynchronous composability**, which allows XCM messages to\nbypass the concept of time-constrained mechanisms, like on-chain scheduling and execution over time\nin the correct order in which it was intended."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm/#xcm-tech-stack", "page_title": "Introduction to Cross-Consensus Message Format (XCM)", "index": 1, "depth": 3, "title": "XCM Tech Stack", "anchor": "xcm-tech-stack", "start_char": 4863, "end_char": 5049, "estimated_token_count": 47, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19035f488dc6975b96b111a9dc6629eba2084a9f41e2fb602c49d94a15b9edc9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### XCM Tech Stack\n\n![xcm tech stack](../assets/cross-consensus-tech-stack.png)\n\nXCM can be used to express the meaning of the messages over each of these three communication\nchannels."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm/#core-functionality-of-xcm", "page_title": "Introduction to Cross-Consensus Message Format (XCM)", "index": 2, "depth": 2, "title": "Core Functionality of XCM", "anchor": "core-functionality-of-xcm", "start_char": 5049, "end_char": 6938, "estimated_token_count": 365, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19035f488dc6975b96b111a9dc6629eba2084a9f41e2fb602c49d94a15b9edc9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Core Functionality of XCM\n\nXCM opens the doors to a multi-hop, multi-network communications.\n\nXCM introduces some key features and additions to cross-consensus messaging, including:\n\n1. **Programmability** - the ability to have **expectations** for messages, which allow for more\n   comprehensive use cases, safe dispatches for version checking, branching, and NFT/Asset support.\n\n2. **Functional Multichain Decomposition** - the ability to define mechanisms to cross-reference and\n   perform actions on other chains on behalf of the origin chain (remote locking), context/id for\n   these messages, and asset namespacing.\n\n3. **Bridging** - introduces the concept of a universal location, which allows for a base reference\n   for global consensus systems for multi-hop setups. This location is above the parent relay chain\n   or other consensus systems like Ethereum or Bitcoin.\n\nA core part of the vision that XCM provides is improving communication between the chains to make\n**system parachains** a reality. System parachains alleviate core responsibilities from the relay chain using a\nstandard format like XCM.\n\nAsset Hub, a system parachain, serves as the primary reserve location for DOT and manages cross-chain\nasset transfers, while other system parachains handle specialized functions like governance or identity.\n\n!!!info\n    XCM bridging, functional multichain decomposition, and programmability upgrades are crucial to bringing ecosystems together using a common communication abstraction.\n\nFor more information on the specific instructions used for these key features, head over to the\n[instructions and registers page](./learn-xcm-instructions.md).\n\n#### Cross-Consensus Message Format (XCM Format)\n\nFor an updated and complete description of the cross-consensus message format please see the\n[xcm-format repository on GitHub](https://github.com/paritytech/xcm-format)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcm/#resources", "page_title": "Introduction to Cross-Consensus Message Format (XCM)", "index": 3, "depth": 2, "title": "Resources", "anchor": "resources", "start_char": 6938, "end_char": 8774, "estimated_token_count": 470, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:19035f488dc6975b96b111a9dc6629eba2084a9f41e2fb602c49d94a15b9edc9", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Resources\n\n- [Shawn Tabrizi: XCM - The Backbone Of A Multichain Future | Polkadot Decoded 2022](https://www.youtube.com/watch?v=cS8GvPGMLS0) -\n  High level overview which should answer “What is XCM?\n\n- [XCM: The Cross-Consensus Message Format](https://medium.com/polkadot-network/xcm-the-cross-consensus-message-format-3b77b1373392) -\n  Detailed blog post by Dr. Gavin Wood about the XCM Format.\n\n- [XCM Format specification](https://github.com/paritytech/xcm-format) - The best starting point for\n  understanding the XCM API at a technical level.\n\n- [Gavin Wood, Polkadot founder: XCM v3 | Polkadot Decoded 2022](https://www.youtube.com/watch?v=K2c6xrCoQOU&t=1196s) -\n  High level overview of XCM and specifically the new features available in XCM v3.\n\n- [XCMP Scheme](https://medium.com/web3foundation/polkadots-messaging-scheme-b1ec560908b7) - An\n  overall overview of XCMP describing a number of design decisions.\n\n- [Messaging Overview](https://paritytech.github.io/polkadot/book/types/messages.html) - An overview\n  of the messaging schemes from the Polkadot Parachain Host Implementor's guide.\n\n- [Sub0 Online: Getting Started with XCM - Your First Cross Chain Messages](https://www.youtube.com/watch?v=5cgq5jOZx9g) -\n  Code focused workshop on how XCM v1 works, and the core concepts of XCM.\n\n- [XCM: Cross-Consensus Messaging Audit](https://blog.quarkslab.com/resources/2022-02-27-xcmv2-audit/21-12-908-REP.pdf) -\n  Technical audit report by Quarkslab prepared for Parity.\n\n- [XCM pallet code](https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/xcm/pallet-xcm/src/lib.rs) -\n  The pallet that contains XCM logic from the Polkadot code repository\n\n- [XCM Config & Pallet-XCM | Polkadot Deep Dives](https://www.youtube.com/watch?v=bFMvWmU1pYI) - A\n  technical deep dive into `pallet-xcm` and the XCM configuration."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#xcms-are-xcvm-programs", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 0, "depth": 2, "title": "XCMs are XCVM Programs", "anchor": "xcms-are-xcvm-programs", "start_char": 1469, "end_char": 2210, "estimated_token_count": 169, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## XCMs are XCVM Programs\n\nA cross consensus message (XCM) is just a program that runs on the `XCVM`: in other words, one or\nmore XCM instructions that are executed by an XCVM implementation, such as the `xcm-executor`. To\nlearn more about the XCVM and the XCM format, see the latest\n[blog post on XCM](https://medium.com/polkadot-network/xcm-part-iii-execution-and-error-management-ceb8155dd166)\nby Dr. Gavin Wood.\n\nXCM instructions might change a register, the state of the consensus system, or both. Depending on\nthe program's goal, whether it is to teleport assets from one chain to another or call a smart\ncontract on another chain, XCMs usually require changes to the registers before any changes to the\nconsensus system can be made."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#xcm-executor-configuration", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 1, "depth": 2, "title": "XCM Executor & Configuration", "anchor": "xcm-executor-configuration", "start_char": 2210, "end_char": 3246, "estimated_token_count": 244, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## XCM Executor & Configuration\n\nThe XCM Executor's implementation centers around a core piece: the XCM configuration. Each instance\nof the Executor must have a valid configuration, which specifies a multitude of options on how a\nchain may treat incoming messages via\n[Barriers](https://github.com/paritytech/polkadot/blob/26b0c4f6273190f4538b24939a56b6a0b51a344c/xcm/xcm-executor/src/config.rs#L52),\ncalculate weight for a message via the\n[Weigher](https://github.com/paritytech/polkadot/blob/26b0c4f6273190f4538b24939a56b6a0b51a344c/xcm/xcm-executor/src/config.rs#L55),\nhow much weight to purchase via the\n[Trader](https://github.com/paritytech/polkadot/blob/26b0c4f6273190f4538b24939a56b6a0b51a344c/xcm/xcm-executor/src/config.rs#L58),\n[configure fees](https://github.com/paritytech/polkadot/blob/26b0c4f6273190f4538b24939a56b6a0b51a344c/xcm/xcm-executor/src/config.rs#L89),\nhow to\n[convert origins](https://github.com/paritytech/polkadot/blob/26b0c4f6273190f4538b24939a56b6a0b51a344c/xcm/xcm-executor/src/config.rs#L40),\nand more."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#cross-consensus-message-xcm-anatomy-flow", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 2, "depth": 2, "title": "Cross Consensus Message (XCM) Anatomy & Flow", "anchor": "cross-consensus-message-xcm-anatomy-flow", "start_char": 3246, "end_char": 4592, "estimated_token_count": 284, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Cross Consensus Message (XCM) Anatomy & Flow\n\nAn XCM is made up of a list of instructions that are executed in order. There are four different\nkinds of XCM instructions:\n\n1. **Instruction** - Results in a state change in the local consensus system or some state change.\n2. **Trusted Indication** - Tells the XCVM, or the Executor, that some action has been done before\n   already - meaning, this action is now trusted and can be acted on, i.e., in a teleport scenario.\n3. **Information** - Provides additional information about a particular origin, usually the result\n   of a query, i.e., a `QueryResponse` instruction.\n4. **System Notification** - Typically used in the context of when an HRMP channel is being opened,\n   closed, or accepted.\n\nTypically, an XCM takes the following path through the XCVM:\n\n1.  Instructions within an XCM are read one-by-one by the XCVM. An XCM may contain one or more\n    instructions.\n2.  The instruction is executed. This means that the current values of the _XCVM registers_, the\n    _instruction type_, and the _instruction operands_ are all used to execute some operation, which\n    might result in some registers changing their value, or in an error being thrown, which would\n    halt execution.\n3.  Each subsequent instruction within the XCM is read until the end of the message has been\n    reached."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#example-register-the-holding-register", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 3, "depth": 3, "title": "Example Register: The Holding Register", "anchor": "example-register-the-holding-register", "start_char": 4592, "end_char": 5535, "estimated_token_count": 174, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Example Register: The Holding Register\n\nThere are many instructions that depend on the _Holding register_. The _Holding register_ is an XCVM\nregister that provides a place for any assets that are in an intermediary state to be held until\nthey are taken out of the Holding register. It requires an instruction to place assets within it and\nanother to withdraw them. The simplest example of this occurring is the `DepositAsset` instruction,\nwhich in its Rust form looks like this:\n\n```rust\nenum Instruction {\n    DepositAsset {\n        assets: MultiAssetFilter,\n        beneficiary: MultiLocation,\n    },\n    /* snip */\n}\n```\n\nThis instruction specifies which assets (asset type and amount), already present in the Holding\nregister, are going to be taken from it and deposited to the specified beneficiary (recipient). It\nis very common for instructions to remove and place assets into the Holding register when\ntransacting between chains."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#example-transferasset", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 4, "depth": 3, "title": "Example: TransferAsset", "anchor": "example-transferasset", "start_char": 5535, "end_char": 6806, "estimated_token_count": 253, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### Example: TransferAsset\n\nAn example below illustrates how a chain may transfer assets locally, or locally on a remote chain\n(as part of another instruction) using an XCM. In this message, the `TransferAsset` instruction is\ndefined with two parameters: `assets`, which are the assets to be transferred, and the\n`beneficiary`, whoever will be the sole beneficiary of these assets. More complex instructions,\nespecially those which perform actions that target a location other than the interpreting consensus\nsystem may make use of XCVM registers.\n\n```rust\nenum Instruction {\n    TransferAsset {\n        assets: MultiAssets,\n        beneficiary: MultiLocation,\n    }\n    /* snip */\n}\n```\n\n- A `MultiAsset` is a general identifier for an asset. It may represent both fungible and\n  non-fungible assets, and in the case of a fungible asset, it represents some defined amount of the\n  asset.\n\n- A `MultiLocation` is a relative identifier, meaning that it can only be used to define the\n  relative path between two locations, and cannot generally be used to refer to a location\n  universally.\n\n`TransferAsset` is one of the many instructions that can be contained within an XCM. For more\ninformation, please read [XCM Instructions in the wiki](./learn-xcm-instructions.md)."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#locations-in-xcm", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 5, "depth": 2, "title": "Locations in XCM", "anchor": "locations-in-xcm", "start_char": 6806, "end_char": 8402, "estimated_token_count": 338, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Locations in XCM\n\nXCM's generic nature involves specifying a wide array of \"locations\", or any body that is governed\nby consensus (parachains, solochains, smart contracts, accounts, etc). These are relatively abstract\nnotions that point to _where_ but also _to who_ a particular action may affect. The `MulitLocation`\ntype is what XCM uses to define these locations.\n\nA `MultiLocation` is a relative identifier that defines a **relative** path into some state-bearing\nconsensus system.\n\nIt is used to define the relative path between two locations, and cannot generally be used to refer\nto a location universally. It is very much akin to how a **relative** filesystem path works and is\ndependent on which consensus system the location expression is being evaluated.\n\n![XCM MultiLocation](../assets/cross-consensus/multilocation.png)\n\n`MultiLocation` has two primary fields:\n\n- A series of paths, called `Junctions`, which define an interior portion of state to descend into\n  it (sometimes called a \"sub-consensus\" system, such as a smart contract or pallet). An interior\n  location may also be used to refer to a Junction, used in the context of \"a parachain is an\n  **interior location** of the relay chain\", or how a UTXO is interior to Bitcoin's consensus.\n- The number of parent junctions at the beginning of a `MultiLocation`'s formation - in other words,\n  the number of parent consensus systems above it.\n\nThere are a number of various `Junction` variants that may be used to describe a particular\nlocation - whether it's a 32 byte account, a Substrate pallet, or a pluralistic body."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#multilocation-scenario-example", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 6, "depth": 3, "title": "MultiLocation Scenario Example", "anchor": "multilocation-scenario-example", "start_char": 8402, "end_char": 9603, "estimated_token_count": 289, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### MultiLocation Scenario Example\n\nIn this scenario, assume an XCM is to be sent from our parachain to the Asset Hub\n(`Parachain 1000`). This XCM references an account on the Asset Hub. As a general path, the\n`MultiLocation` would look like this:\n\n```\n../Parachain(1000)/AccountId32(<some_account_id>)\n```\n\nOr, as a Rust enum:\n\n```rust\nMultiLocation {\n  parents: 1,\n  interior: X2(Parachain(1000), <some_account_id>.into())\n}\n```\n\n- In the first field, `parents`, there is a parent of `1`. This is because our parachain has the\n  relay chain as a parent - in other words, it will go **up** by one consensus system to the relay\n  chain. This is also illustrated by the `../` of the \"file path\" representation.\n\n- The second field, `interior`, defines where to go after the relay chain. In this case, from the\n  relay chain this message will go to the Asset Hub (`Parachain 1000`), then reference the account\n  (`some_account_id`) located within.\n\nKeep in mind that this location is specific to this interaction. The identities may need to change\nif this location was defined on another consensus system, such as Kusama. On other consensus\nsystems, such as Ethereum, it won't be able to interpret it."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#universallocation-in-xcm", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 7, "depth": 3, "title": "UniversalLocation in XCM", "anchor": "universallocation-in-xcm", "start_char": 9603, "end_char": 10469, "estimated_token_count": 163, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "### UniversalLocation in XCM\n\nA `UniversalLocation` refers to any global consensus system. A global consensus system is an entity\nthat provides its top-level consensus through some non-derivative consensus algorithm that can exist\nwithout reference to any other singleton data system. Such global consensus systems include Polkadot\n(or other relay chains), Bitcoin, or Ethereum. It provides a point of reference for overarching\nconsensus systems.\n\nThe `GlobalConsensus` junction refers to a global consensus system and takes a `NetworkId` that\nspecifies a particular remote network. A `UniversalLocation` allows overarching consensus systems to\ncommunicate using this junction. Sub-consensus systems (i.e., a parachain on Polkadot) may refer to\nother _remote_ sub-consensus systems (i.e., a parachain on Kusama) using a relative path defined via\na `MultiLocation`."}
{"source": "polkadot-docs", "page_id": "wiki-learn-learn-xcvm", "url": "https://developer.polkadot.com/wiki/learn/learn-xcvm/#simulating-xcvm-using-the-xcm-simulator", "page_title": "XCM Virtual Machine (XCVM) & XCM Executor", "index": 8, "depth": 2, "title": "Simulating XCVM using the xcm-simulator", "anchor": "simulating-xcvm-using-the-xcm-simulator", "start_char": 10469, "end_char": 10762, "estimated_token_count": 67, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:94c5b7ee76066e551ed821bda2743330f5be744966647b406194358bf8eef99c", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Simulating XCVM using the xcm-simulator\n\nWithin the Polkadot repository exists the\n[`xcm-simulator`](https://github.com/paritytech/polkadot-sdk/tree/master/polkadot/xcm/xcm-simulator),\nwhich allows developers to experiment with building, executing, and simulating various XCM use\nscenarios."}
{"source": "polkadot-docs", "page_id": "wiki-learn-maintain-guides-async-backing", "url": "https://developer.polkadot.com/wiki/learn/maintain-guides-async-backing/#async-backing-prerequisites", "page_title": "Async Backing Upgrade", "index": 0, "depth": 2, "title": "Async Backing Prerequisites", "anchor": "async-backing-prerequisites", "start_char": 773, "end_char": 1190, "estimated_token_count": 93, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e8b204b44886991223c6881175c17295b0cf189a995273d4a4a554e95ac449e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Async Backing Prerequisites\n\n!!!info\n    For more contextual information about asynchronous backing, see\n    [this page](../learn/learn-async-backing.md).\n\nPull the latest version of Cumulus for use with your parachain. It contains necessary changes for\nasync backing compatibility. Latest on master branch of\n[Polkadot-SDK](https://github.com/paritytech/polkadot-sdk) is should work as well as any 2024 release."}
{"source": "polkadot-docs", "page_id": "wiki-learn-maintain-guides-async-backing", "url": "https://developer.polkadot.com/wiki/learn/maintain-guides-async-backing/#async-backing-terminology-and-parameters", "page_title": "Async Backing Upgrade", "index": 1, "depth": 2, "title": "Async Backing Terminology and Parameters", "anchor": "async-backing-terminology-and-parameters", "start_char": 1190, "end_char": 4594, "estimated_token_count": 636, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e8b204b44886991223c6881175c17295b0cf189a995273d4a4a554e95ac449e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Async Backing Terminology and Parameters\n\nTime for a bit of context before we get started. The following concepts will aid in demystifying the\ncollator side of Async Backing and establish a basic understanding of the changes being made:\n\n- **Unincluded segment** - From the perspective of a parachain block under construction, the\n  unincluded segment describes a chain of recent block ancestors which have yet to be included on\n  the relay chain. The ability to build new blocks on top of the unincluded segment rather than on\n  top of blocks freshly included in the relay chain is the core of asynchronous backing.\n- **Capacity** - The maximum size of the unincluded segment. The longer this is, the farther ahead a\n  parachain can work, producing new candidates before the ancestors of those candidates have been\n  seen as included on-chain. Practically, a capacity of 2-3 is sufficient to realize the full\n  benefits of asynchronous backing, at least until the release of elastic scaling.\n- **Velocity** - The base rate at which a parachain should produce blocks. A velocity of 1 indicates\n  that 1 parachain block should be produced per relay chain block. In order to fill the unincluded\n  segment with candidates, collators may build up to `Velocity + 1` candidates per aura slot while\n  there is remaining capacity. When elastic scaling has been released velocities greater than 1 will\n  be supported.\n- **AllowMultipleBlocksPerSlot** - If this is `true`, Aura will allow slots to stay the same across\n  sequential parablocks. Otherwise the slot number must increase with each block. To fill the\n  unincluded segment as described above we need this to be `true`.\n- **FixedVelocityConsensusHook** - This is a variety of `ConsensusHook` intended to be passed to\n  `parachain-system` as part of its `Config`. It is triggered on initialization of a new runtime. An\n  instance of `FixedVelocityConsensusHook` is defined with both a fixed capacity and velocity. It\n  aborts the runtime early if either capacity or velocity is exceeded, as the collator shouldn’t be\n  creating additional blocks in that case.\n- **AsyncBackingParams.max_candidate_depth** - This parameter determines the maximum unincluded\n  segment depth the relay chain will support. Candidates sent to validators which exceed\n  `max_candidate_depth` will be ignored. `Capacity`, as mentioned above, should not exceed\n  `max_candidate_depth`.\n- **AsyncBackingParams.allowed_ancestry_len** - Each parachain block candidate has a `relay_parent`\n  from which its execution and validation context is derived. Before async backing the\n  `relay_parent` for a candidate not yet backed was required to be the fresh head of a fork. With\n  async backing we can relax this requirement. Instead we set a conservative maximum age in blocks\n  for the `relay_parent`s of candidates in the unincluded segment. This age, `allowed_ancestry_len`\n  lives on the relay chain and is queried by parachains when deciding which block to build on top\n  of.\n- **Lookahead Collator** - A collator for Aura that looks ahead of the most recently included\n  parachain block when determining what to build upon. This collator also builds additional blocks\n  when the maximum backlog is not saturated. The size of the backlog is determined by invoking the\n  AuraUnincludedSegmentApi. If that runtime API is not supported, this assumes a maximum backlog\n  size of 1."}
{"source": "polkadot-docs", "page_id": "wiki-learn-maintain-guides-async-backing", "url": "https://developer.polkadot.com/wiki/learn/maintain-guides-async-backing/#prerequisite", "page_title": "Async Backing Upgrade", "index": 2, "depth": 2, "title": "Prerequisite", "anchor": "prerequisite", "start_char": 4594, "end_char": 5078, "estimated_token_count": 95, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e8b204b44886991223c6881175c17295b0cf189a995273d4a4a554e95ac449e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Prerequisite\n\nThe relay chain needs to have async backing enabled so double-check that the relay chain\nconfiguration contains the following three parameters (especially when testing locally e.g. with\nZombienet):\n\n```json\n\"async_backing_params\": {\n    \"max_candidate_depth\": 3,\n    \"allowed_ancestry_len\": 2\n},\n\"scheduling_lookahead\": 2\n```\n\n\n!!!warning  \n    `scheduling_lookahead` must be set to 2, otherwise parachain block times will degrade to worse than with sync backing!"}
{"source": "polkadot-docs", "page_id": "wiki-learn-maintain-guides-async-backing", "url": "https://developer.polkadot.com/wiki/learn/maintain-guides-async-backing/#phase-1-update-parachain-runtime", "page_title": "Async Backing Upgrade", "index": 3, "depth": 2, "title": "Phase 1 - Update Parachain Runtime", "anchor": "phase-1-update-parachain-runtime", "start_char": 5078, "end_char": 11996, "estimated_token_count": 1405, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e8b204b44886991223c6881175c17295b0cf189a995273d4a4a554e95ac449e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Phase 1 - Update Parachain Runtime\n\nThis phase involves configuring your parachain’s runtime to make use of async backing system.\n\n1. Establish constants for `capacity` and `velocity` and set both of them to 1 in\n   `/runtime/src/lib.rs`.\n\n2. Establish a constant relay chain slot duration measured in milliseconds equal to `6000` in\n   `/runtime/src/lib.rs`.\n\n   ```rust\n   /// Maximum number of blocks simultaneously accepted by the Runtime, not yet included into the\n   /// relay chain.\n   pub const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1;\n   /// How many parachain blocks are processed by the relay chain per parent. Limits the number of\n   /// blocks authored per slot.\n   pub const BLOCK_PROCESSING_VELOCITY: u32 = 1;\n   /// Relay chain slot duration, in milliseconds.\n   pub const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000;\n   ```\n\n3. Establish constants `MILLISECS_PER_BLOCK` and `SLOT_DURATION` if not already present in\n   `/runtime/src/lib.rs`.\n\n   ```rust\n\n   /// BLOCKSkkhasd will be produced at a minimum duration defined by `SLOT_DURATION`.\n   /// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked\n   /// up by `pallet_aura` to implement `fn slot_duration()`.\n   ///\n   /// Change this to adjust the block time.\n   pub const MILLISECS_PER_BLOCK: u64 = 12000;\n   pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;\n   ```\n\n4. Configure `cumulus_pallet_parachain_system` in `runtime/src/lib.rs`\n\n   - Define a `FixedVelocityConsensusHook` using our capacity, velocity, and relay slot duration\n     constants. Use this to set the parachain system `ConsensusHook` property.\n\n   ```rust\n   impl cumulus_pallet_parachain_system::Config for Runtime {\n   \ttype RuntimeEvent = RuntimeEvent;\n   \ttype OnSystemEvent = ();\n   \ttype SelfParaId = parachain_info::Pallet<Runtime>;\n   \ttype OutboundXcmpMessageSource = XcmpQueue;\n   \ttype DmpQueue = frame_support::traits::EnqueueWithOrigin<MessageQueue, RelayOrigin>;\n   \ttype ReservedDmpWeight = ReservedDmpWeight;\n   \ttype XcmpMessageHandler = XcmpQueue;\n   \ttype ReservedXcmpWeight = ReservedXcmpWeight;\n   \ttype CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases;\n    // highlight-next-line\n   \ttype ConsensusHook = ConsensusHook;\n   \ttype WeightInfo = weights::cumulus_pallet_parachain_system::WeightInfo<Runtime>;\n   }\n   // highlight-start\n   type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook<\n   \tRuntime,\n   \tRELAY_CHAIN_SLOT_DURATION_MILLIS,\n   \tBLOCK_PROCESSING_VELOCITY,\n   \tUNINCLUDED_SEGMENT_CAPACITY,\n   >;\n   // highlight-end\n   ```\n\n   - Set the parachain system property `CheckAssociatedRelayNumber` to\n     `RelayNumberMonotonicallyIncreases`\n\n   ```rust\n   impl cumulus_pallet_parachain_system::Config for Runtime {\n   \ttype RuntimeEvent = RuntimeEvent;\n   \ttype OnSystemEvent = ();\n   \ttype SelfParaId = parachain_info::Pallet<Runtime>;\n   \ttype OutboundXcmpMessageSource = XcmpQueue;\n   \ttype DmpQueue = frame_support::traits::EnqueueWithOrigin<MessageQueue, RelayOrigin>;\n   \ttype ReservedDmpWeight = ReservedDmpWeight;\n   \ttype XcmpMessageHandler = XcmpQueue;\n   \ttype ReservedXcmpWeight = ReservedXcmpWeight;\n    // highlight-next-line\n   \ttype CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases;\n   \ttype ConsensusHook = ConsensusHook;\n   \ttype WeightInfo = weights::cumulus_pallet_parachain_system::WeightInfo<Runtime>;\n   }\n   type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook<\n   \tRuntime,\n   \tRELAY_CHAIN_SLOT_DURATION_MILLIS,\n   \tBLOCK_PROCESSING_VELOCITY,\n   \tUNINCLUDED_SEGMENT_CAPACITY,\n   >;\n   ```\n\n5. Configure `pallet_aura` in `runtime/src/lib.rs`\n\n   - Set `AllowMultipleBlocksPerSlot` to `false` (don't worry, we will set it to `true` when we\n     activate async backing in phase 3).\n   - Define `pallet_aura::SlotDuration` using our constant `SLOT_DURATION`\n\n   ```rust\n   impl pallet_aura::Config for Runtime {\n   \ttype AuthorityId = AuraId;\n   \ttype DisabledValidators = ();\n   \ttype MaxAuthorities = ConstU32<100_000>;\n    // highlight-start\n   \ttype AllowMultipleBlocksPerSlot = ConstBool<false>;\n   \t#[cfg(feature = \"experimental\")]\n   \ttype SlotDuration = ConstU64<SLOT_DURATION>;\n    // highlight-end\n   }\n   ```\n\n6. Update `aura_api::SlotDuration()` to match the constant `SLOT_DURATION`\n\n   ```rust\n   impl_runtime_apis! {\n   \timpl sp_consensus_aura::AuraApi<Block, AuraId> for Runtime {\n   \t\tfn slot_duration() -> sp_consensus_aura::SlotDuration {\n            // highlight-next-line\n   \t\t\tsp_consensus_aura::SlotDuration::from_millis(SLOT_DURATION)\n   \t\t}\n\n   \t\tfn authorities() -> Vec<AuraId> {\n   \t\t\tAura::authorities().into_inner()\n   \t\t}\n   \t}\n   ...\n   ```\n\n7. Implement the `AuraUnincludedSegmentApi`, which allows the collator client to query its runtime\n   to determine whether it should author a block.\n\n   - Add the dependency `cumulus-primitives-aura` to the `runtime/Cargo.toml` file for your runtime\n\n```rust\ncumulus-pallet-aura-ext = { path = \"../../../../pallets/aura-ext\", default-features = false }\ncumulus-pallet-parachain-system = { path = \"../../../../pallets/parachain-system\", default-features = false, features = [\"parameterized-consensus-hook\"] }\ncumulus-pallet-session-benchmarking = { path = \"../../../../pallets/session-benchmarking\", default-features = false }\ncumulus-pallet-xcm = { path = \"../../../../pallets/xcm\", default-features = false }\ncumulus-pallet-xcmp-queue = { path = \"../../../../pallets/xcmp-queue\", default-features = false, features = [\"bridging\"] }\n// highlight-next-line\ncumulus-primitives-aura = { path = \"../../../../primitives/aura\", default-features = false }\n```\n\n- In the same file, add `\"cumulus-primitives-aura/std\",` to the `std` feature.\n\n- Inside the `impl_runtime_apis!` block for your runtime, implement the `AuraUnincludedSegmentApi`\n  as shown below.\n\n```rust\nimpl cumulus_primitives_aura::AuraUnincludedSegmentApi<Block> for Runtime {\n\tfn can_build_upon(\n\t\tincluded_hash: <Block as BlockT>::Hash,\n\t\tslot: cumulus_primitives_aura::Slot,\n\t) -> bool {\n\t\tConsensusHook::can_build_upon(included_hash, slot)\n\t}\n}\n```\n\n**Note:** With a capacity of 1 we have an effective velocity of ½ even when velocity is configured\nto some larger value. This is because capacity will be filled after a single block is produced and\nwill only be freed up after that block is included on the relay chain, which takes 2 relay blocks to\naccomplish. Thus with capacity 1 and velocity 1 we get the customary 12 second parachain block time.\n\n8. If your `runtime/src/lib.rs` provides a `CheckInherents` type to `register_validate_block`,\n   remove it. `FixedVelocityConsensusHook` makes it unnecessary. The following example shows how\n   `register_validate_block` should look after removing `CheckInherents`.\n\n```rust\ncumulus_pallet_parachain_system::register_validate_block! {\n\tRuntime = Runtime,\n\tBlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>,\n}\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-maintain-guides-async-backing", "url": "https://developer.polkadot.com/wiki/learn/maintain-guides-async-backing/#phase-2-update-parachain-nodes", "page_title": "Async Backing Upgrade", "index": 4, "depth": 2, "title": "Phase 2 - Update Parachain Nodes", "anchor": "phase-2-update-parachain-nodes", "start_char": 11996, "end_char": 15228, "estimated_token_count": 726, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e8b204b44886991223c6881175c17295b0cf189a995273d4a4a554e95ac449e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Phase 2 - Update Parachain Nodes\n\nThis phase consists of plugging in the new lookahead collator node.\n\n1. Import `cumulus_primitives_core::ValidationCode` to `node/src/service.rs`\n\n```rust\nuse cumulus_primitives_core::{\n// highlight-next-line\n\trelay_chain::{CollatorPair, ValidationCode},\n\tParaId,\n};\n```\n\n2. In `node/src/service.rs`, modify `sc_service::spawn_tasks` to use a clone of `Backend` rather\n   than the original\n\n```rust\nsc_service::spawn_tasks(sc_service::SpawnTasksParams {\n\trpc_builder,\n\tclient: client.clone(),\n\ttransaction_pool: transaction_pool.clone(),\n\ttask_manager: &mut task_manager,\n\tconfig: parachain_config,\n\tkeystore: params.keystore_container.keystore(),\n  // highlight-next-line\n\tbackend: backend.clone(),\n\tnetwork: network.clone(),\n\tsync_service: sync_service.clone(),\n\tsystem_rpc_tx,\n\ttx_handler_controller,\n\ttelemetry: telemetry.as_mut(),\n})?;\n```\n\n3. Add `backend` as a parameter to `start_consensus()` in `node/src/service.rs`\n\n```rust\nfn start_consensus(\n    client: Arc<ParachainClient>,\n    // highlight-next-line\n    backend: Arc<ParachainBackend>,\n    block_import: ParachainBlockImport,\n    prometheus_registry: Option<&Registry>,\n    telemetry: Option<TelemetryHandle>,\n    task_manager: &TaskManager,\n```\n\n```rust\nif validator {\n    start_consensus(\n    client.clone(),\n    // highlight-next-line\n    backend.clone(),\n    block_import,\n    prometheus_registry.as_ref(),\n```\n\n4. In `node/src/service.rs` import the lookahead collator rather than the basic collator\n\n```rust\nuse cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams};\n```\n\n5. In `start_consensus()` replace the `BasicAuraParams` struct with `AuraParams`\n   - Change the struct type from `BasicAuraParams` to `AuraParams`\n   - In the `para_client` field, pass in a cloned para client rather than the original\n   - Add a `para_backend` parameter after `para_client`, passing in our para backend\n   - Provide a `code_hash_provider` closure like that shown below\n   - Increase `authoring_duration` from 500 milliseconds to 1500\n\n```rust\nlet params = AuraParams {\n    create_inherent_data_providers: move |_, ()| async move { Ok(()) },\n    block_import,\n    para_client: client.clone(),\n    para_backend: backend.clone(),\n    relay_client: relay_chain_interface,\n    code_hash_provider: move |block_hash| {\n        client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash())\n    },\n    sync_oracle,\n    keystore,\n    collator_key,\n    para_id,\n    overseer_handle,\n    relay_chain_slot_duration,\n    proposer,\n    collator_service,\n    // highlight-next-line\n    authoring_duration: Duration::from_millis(1500),\n    reinitialize: false,\n};\n```\n\n**Note:** Set `authoring_duration` to whatever you want, taking your own hardware into account. But\nif the backer who should be slower than you due to reading from disk, times out at two seconds your\ncandidates will be rejected.\n\n6. In `start_consensus()` replace `basic_aura::run` with `aura::run`\n\n```rust\nlet fut = aura::run::<\n    Block,\n    sp_consensus_aura::sr25519::AuthorityPair,\n    _,\n    _,\n    _,\n    _,\n    _,\n    _,\n    _,\n    _,\n    _,\n    >(params);\ntask_manager.spawn_essential_handle().spawn(\"aura\", None, fut);\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-maintain-guides-async-backing", "url": "https://developer.polkadot.com/wiki/learn/maintain-guides-async-backing/#phase-3-activate-async-backing", "page_title": "Async Backing Upgrade", "index": 5, "depth": 2, "title": "Phase 3 - Activate Async Backing", "anchor": "phase-3-activate-async-backing", "start_char": 15228, "end_char": 17861, "estimated_token_count": 568, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e8b204b44886991223c6881175c17295b0cf189a995273d4a4a554e95ac449e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Phase 3 - Activate Async Backing\n\nThis phase consists of changes to your parachain’s runtime that activate async backing feature.\n\n1. Configure `pallet_aura`, setting `AllowMultipleBlocksPerSlot` to true in `runtime/src/lib.rs`.\n\n```rust\nimpl pallet_aura::Config for Runtime {\n    type AuthorityId = AuraId;\n    type DisabledValidators = ();\n    type MaxAuthorities = ConstU32<100_000>;\n    // highlight-next-line\n    type AllowMultipleBlocksPerSlot = ConstBool<true>;\n    #[cfg(feature = \"experimental\")]\n    type SlotDuration = ConstU64<SLOT_DURATION>;\n}\n```\n\n2. Increase the maximum `UNINCLUDED_SEGMENT_CAPACITY` in `runtime/src/lib.rs`.\n\n```rust\n/// Maximum number of blocks simultaneously accepted by the Runtime, not yet included into the\n/// relay chain.\npub const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3;\n/// How many parachain blocks are processed by the relay chain per parent. Limits the number of\n/// blocks authored per slot.\npub const BLOCK_PROCESSING_VELOCITY: u32 = 1;\n```\n\n3. Decrease `MILLISECS_PER_BLOCK` to 6000.\n\n- Note: For a parachain which measures time in terms of its own block number rather than by relay\n  block number it may be preferable to increase velocity. Changing block time may cause\n  complications, requiring additional changes. See the section “Timing by Block Number”.\n\n  ```rust\n  /// This determines the average expected block time that we are targeting.\n  /// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`.\n  /// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked\n  /// up by `pallet_aura` to implement `fn slot_duration()`.\n  ///\n  /// Change this to adjust the block time.\n  pub const MILLISECS_PER_BLOCK: u64 = 6000;\n  ```\n\n4. Update `MAXIMUM_BLOCK_WEIGHT` to reflect the increased time available for block production.\n\n```rust\n/// We allow for 2 seconds of compute with a 6 second average block.\npub const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(\n    WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2),\n    cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64,\n);\n```\n\n5. Add a feature flagged alternative for `MinimumPeriod` in `pallet_timestamp`. The type should be\n   `ConstU64<0>` with the feature flag experimental, and `ConstU64<{SLOT_DURATION / 2}>` without.\n\n```rust\nimpl pallet_timestamp::Config for Runtime {\n    type Moment = u64;\n    type OnTimestampSet = Aura;\n    #[cfg(feature = \"experimental\")]\n    type MinimumPeriod = ConstU64<0>;\n    #[cfg(not(feature = \"experimental\"))]\n    type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>;\n    type WeightInfo = weights::pallet_timestamp::WeightInfo<Runtime>;\n}\n```"}
{"source": "polkadot-docs", "page_id": "wiki-learn-maintain-guides-async-backing", "url": "https://developer.polkadot.com/wiki/learn/maintain-guides-async-backing/#timing-by-block-number", "page_title": "Async Backing Upgrade", "index": 6, "depth": 2, "title": "Timing by Block Number", "anchor": "timing-by-block-number", "start_char": 17861, "end_char": 18532, "estimated_token_count": 130, "token_estimator": "heuristic-v1", "page_version_hash": "sha256:9e8b204b44886991223c6881175c17295b0cf189a995273d4a4a554e95ac449e", "last_updated": "2026-11-01T15:55:43+00:00", "text": "## Timing by Block Number\n\nWith asynchronous backing it will be possible for parachains to opt for a block time of 6 seconds\nrather than 12 seconds. But modifying block duration isn’t so simple for a parachain which was\nmeasuring time in terms of its own block number. It could result in expected and actual time not\nmatching up, stalling the parachain.\n\nOne strategy to deal with this issue is to instead rely on relay chain block numbers for timing.\nRelay block number is kept track of by each parachain in `pallet-parachain-system` with the storage\nvalue `LastRelayChainBlockNumber`. This value can be obtained and used wherever timing based on\nblock number is needed."}
